Q 在 Python 中學習:它是什麼,定義 [編碼示例]
已發表: 2020-03-26強化學習是指學習代理通過不斷的交互來學習根據其環境的最佳行為。 代理會經歷各種情況,這些情況也稱為狀態。 正如您已經猜到的那樣,強化學習在我們的世界中有很多應用。 如果您有興趣了解有關數據科學算法的更多信息,請了解更多信息。
此外,它有許多算法,其中最流行的是Q learning 。 在本文中,我們將討論這個算法是什麼以及它是如何工作的。
所以,事不宜遲,讓我們開始吧。
目錄
什麼是 Q 學習?
Q 學習是一種強化學習算法,它專注於為特定情況尋找最佳行動方案。 這是不符合策略的,因為 Q 學習函數從中學習的動作超出了現有策略,所以它不需要一個。 它專注於學習增加其總獎勵的策略。 這是一種簡單的強化學習形式,它使用動作值(或 Q 值)來增強學習代理的行為。
Q 學習是強化學習中最流行的算法之一,因為它易於理解和實現。 Q學習中的“Q”代表質量。 正如我們前面提到的,Q 學習側重於為特定情況找到最佳行動。 質量顯示了特定操作的有用性以及它可以幫助您獲得什麼獎勵。
重要定義
在我們開始討論它是如何工作的之前,我們應該首先看一下 q learning 的一些基本概念。 讓我們開始吧。
Q值
Q 值也稱為動作值。 它們由 Q(S, A) 表示,它們為您提供 A 在狀態 S 下採取的行動有多好的估計。模型將使用我們稍後討論的時間差異更新規則迭代地計算此估計在這個部分。
劇集和獎勵
一個代理從一個起始狀態開始,經過幾次轉換,然後根據它的動作和環境從它的當前狀態移動到下一個狀態。 每當代理採取行動時,它都會獲得一些獎勵。 當沒有可能的過渡時,這就是這一集的完成。
TD-Update(時間差)
這是 TD 更新或時間差異規則:
Q(S,A) Q(S,A) + (R + Q(S',A')-Q(S,A))
這裡,S 代表智能體的當前狀態,而 S' 代表下一個狀態。 A表示當前動作,A'表示根據Q值估計的下一個最佳動作,R表示根據當前動作的當前獎勵,代表折扣因子,並表示步長。
另請閱讀:數據科學的先決條件。 它如何隨時間變化?
Q學習Python示例
了解 Q 學習 Python 的最好方法是看一個例子。 在這個例子中,我們使用 OpenAI 的健身房環境並用它訓練我們的模型。 首先,您必須安裝環境。 您可以使用以下命令執行此操作:
點安裝健身房
現在,我們將導入此示例所需的庫:
進口健身房
導入迭代工具
導入 matplotlib
導入 matplotlib.style
將 numpy 導入為 np
將熊貓導入為 pd
導入系統
從集合導入 defaultdict
從 windy_gridworld 導入 WindyGridworldEnv
導入繪圖
matplotlib.style.use('ggplot')
如果沒有必要的庫,您將無法成功執行這些操作。 導入庫後,我們將創建環境:
env = WindyGridworldEnv()
現在我們將創建-greedy 策略:
def createEpsilonGreedyPolicy(Q, epsilon, num_actions):
“”
創建基於 epsilon-greedy 策略
在給定的 Q 函數和 epsilon 上。
返回一個接受狀態的函數
作為輸入並返回概率
對於 numpy 數組形式的每個動作
動作空間的長度(一組可能的響應)。
“”
定義策略函數(狀態):
Action_probabilities = np.ones(num_actions,
dtype = float) * epsilon / num_actions
best_action = np.argmax(Q[狀態])
Action_probabilities[best_action] += (1.0 – epsilon)
返回 Action_probabilities
退貨政策功能

以下是構建 q-learning 模型的代碼:
def qLearning(env, num_episodes, discount_factor = 1.0,
阿爾法 = 0.6,ε = 0.1):
“”
Q-Learning 算法:Off-policy TD 控制。
在改進的同時找到最優貪心策略
遵循 epsilon-greedy 策略”””
# 動作價值函數
# 映射的嵌套字典
# state -> (action -> action-value)。
Q = defaultdict(lambda: np.zeros(env.action_space.n))
# 跟踪有用的統計信息
stats = plotting.EpisodeStats(
episode_lengths = np.zeros(num_episodes),
episode_rewards = np.zeros(num_episodes))
# 創建一個 epsilon 貪心策略函數
# 適合環境動作空間
策略 = createEpsilonGreedyPolicy(Q, epsilon, env.action_space.n)
# 每集
對於範圍內的 ith_episodes(num_episodes):
# 重置環境並選擇第一個動作
狀態 = env.reset()
對於 itertools.count() 中的 t:
# 從當前狀態獲取所有動作的概率
action_probabilities = 政策(狀態)
# 選擇動作根據
# 概率分佈
行動= np.random.choice(np.arange(
len(action_probabilities)),
p = action_probabilities)
# 採取行動並獲得獎勵,轉移到下一個狀態
next_state, 獎勵, 完成, _ = env.step(action)
# 更新統計
stats.episode_rewards[i_episode] += 獎勵
stats.episode_lengths[i_episode] = t
# TD 更新
best_next_action = np.argmax(Q[next_state])
td_target = 獎勵 + discount_factor * Q[next_state][best_next_action]
td_delta = td_target – Q[狀態][動作]
Q[狀態][動作] += alpha * td_delta
# 如果劇集終止,done 為 True
如果完成:
休息
狀態 = 下一個狀態
返回 Q,統計
現在讓我們訓練模型:
Q, stats = qLearning(env, 1000)
在我們創建並訓練模型之後,我們可以繪製相同的基本統計數據:
plotting.plot_episode_stats(統計)
使用此代碼運行模型並繪製圖形。 你看到什麼樣的結果? 與我們分享您的結果,如果您遇到任何困惑或疑問,請告訴我們。
另請閱讀:數據科學的機器學習算法
學習世界頂尖大學的數據科學課程。 獲得行政 PG 課程、高級證書課程或碩士課程,以加快您的職業生涯。
最後的想法
當您繪製圖表時,您會看到每集的獎勵隨著時間的推移逐漸增加。 在某些劇集之後,情節還反映了它拉平了每集的高獎勵限制。 這說明什麼?
這意味著您的模型已經學會通過確保其表現最佳來增加它在一個情節中可以獲得的總獎勵。 您一定也看到了為什麼 q learning Python 會在如此多的行業和領域中看到應用程序。
強化學習的缺點是什麼?
1. 過度強化學習可能會導致狀態過多,從而降低結果的質量。
2. 不推薦強化學習來輕鬆解決問題。
3.強化學習需要大量的數據和計算。
4. 強化學習有自己獨特且非常複雜的障礙,例如具有挑戰性的訓練設計設置以及探索和強化平衡的問題。
Q學習是基於模型的嗎?
不,Q 學習不依賴於模型。 Q-learning 是一種無模型強化學習技術,用於確定給定狀態下某個動作的價值。 Q 學習是當前幾種無模型的強化學習算法之一,這意味著它可以在各種環境中使用,並且可以快速適應新的和未知的條件。 它可以處理涉及隨機轉換和獎勵的問題,而不需要適應,也不需要環境模型。 Q-learning是一種基於價值觀的學習算法。 基於值的算法使用方程來更新值函數(尤其是貝爾曼方程)。
Q learning 和 SARSA 有何不同?
SARSA 在探索時學習接近最優的策略,而 Q-learning 直接學習最優策略。 Off-policy SARSA 學習與其遵循的策略相關的動作值,而 on-policy SARSA 學習與其遵循的策略相關的動作值。 關於貪婪策略,Q-Learning 做到了。 它們都在一些相似的條件下收斂到實值函數,但速度不同。 Q-Learning 需要更長的時間才能收斂,但它可能會在規則改變的同時繼續學習。 當與線性近似相結合時,Q-Learning 不能保證收斂。 SARSA 在接近收斂時會考慮探索性步驟的懲罰,而 Q-learning 不會。 如果沿著理想路徑有機會獲得顯著的負回報,Q-learning 會在探索時嘗試觸發它,但是 SARSA 會嘗試避免有風險的最優路徑,並且只有在探索參數減少後才學會使用它。