Human-level control through deep reinforcement learning
Nature 2015 Google DeepMind
Abstract
RL 理論 在動物行為上,深入到心理和神經科學的角度,關於在一個環境中如何使得 agent 優化他們的控制,提供了一個正式的規範。為了利用RL成功的接近現實世界的複雜度的環境中,然而,agents 遇到了一個難題:他們必須從高維感知輸入中得到環境的有效表示,然後利用這些來將過去的經驗應用到新的場景中去。顯著地,人類和其他動物看起來可以通過一個和諧的RL 和 層次感知處理系統的有效組合進而解決這個問題。前者通過豐富的神經資料解釋了由
The Methods:
Preprocessing:直接處理 Atari 2600 幀,影像大小是 210*160。我們為了降低輸入的維度,採取了一個基礎的預處理的步驟,用 Atari 2600 模擬器來進行人為處理。首先,為了編碼單張影像,我們採用當前編碼幀和前一幀每一個畫素點色彩值的最大值。移除閃爍是很有必要的,因為一些物體僅僅出現在奇數幀,而有一些則只出現在偶數幀,由於有限數量的精靈導致的 artefact 會立馬顯現。 第二,我們然後提取 Y 通道,也就是經常說的 亮度,然後將其resize成 84*84的。
Code availability. 程式碼連結:https://sites.google.com/a/deepmind.com/dqn
Model architecture. 利用神經網路,有好幾種不同的方法來引數化 Q。因為 Q 對映了 歷史-動作對(history-action pairs)到他們的Q值,歷史 和 動作 已經在之前的方法中被用於神經網路的輸入。這種結構的主要缺點是:一個單獨的前向傳播需要計算每一個動作的Q值,導致計算代價和動作的數量成比例上升。我們則使用這樣的一個結構,即:每一個可能的動作有一個單獨的輸出,僅僅將狀態表示輸入給神經網路。輸出對應了每一個動作為每一個狀態預測的Q值。這種結構的優勢是:在一個給定的狀態下,對於所有可能動作的Q值的計算,在網路中僅僅需要一個前向傳播即可。
圖1中展示的結構,給出如下的描述:傳入給神經網路的輸入是預處理對映完畢後的 84*84*4 的影像。
第一個隱層:卷積核大小為 8*8 , 然後有 32個filter,步長為4;後面跟一個非線性啟用函式;
第二個隱層:卷積核大小為 4*4, 然後有 64個filter,步長為2;後面跟一個非線性啟用函式;
第三個卷積層,64個filter,卷積核大小為 3*3,步長為1,後面也跟著一個 rectifier;
最後的隱層是:全連線層,由512個rectifier units 構成;
輸出層是 一個全連線,每一個有效地動作對應一個輸出。
作者考慮在遊戲中,有效動作的數量 從4~18之間變換。
Training details:
每一個遊戲,一個網路:所有的遊戲都用同樣的網路結構,學習演算法,以及超引數設定。由於遊戲的分數都不一樣,所以作者將所有的 positive reward 設定為1,negative reward 設定為 -1,不變化的則設定為0.
訓練過程中行為策略是 貪心演算法。
像之前的演算法一樣,本文也是採用 跳幀技術,即: the agent 看並且選擇動作每隔 k 幀,而不是每一幀都做。其最後一個動作在跳過的幀上重複。
Algorithm:
我們考慮這樣的任務,在一個由動作,觀察 和 獎勵構成的序列中,agent 和環境互動。每一個時間步驟, the agent 從合法的遊戲動作中選擇一個動作 $a_t$。然後將此動作傳輸給模擬器,以修改其內部狀態 和 遊戲得分。總的來說,該環境可能是隨機的。agent 看不到模擬器的內部狀態;但是可以看到從模擬器傳來的影像,即:代表當前螢幕影像資訊的由畫素構成的向量。此外,其還接收到代表遊戲得分變換的獎勵 $r_t$。既然總的來說,遊戲得分可能依賴於之前序列的動作和觀察;關於某動作的反饋,可能經過幾千次的時間步驟才會接收到。
因為 agent 僅僅觀察到當前的螢幕,所以該任務是部分觀測的,許多模擬器的狀態是有感官上的鋸齒現象的(即,僅僅從當前螢幕 $x_t$ 不可能完全的明白當前的情況)。所以,動作和觀察的序列,$s_t = x_1, a_1, x_2, ... , a_{t-1}, x_t$, 輸入給演算法,然後依賴於這些序列進行遊戲策略的學習。模擬器中的所有序列,都假設會在有限時間步驟內結束。這種形式就構成了一個大而有限的 馬爾科夫決策過程(MDP),其中的每一個序列都是單獨的狀態。簡單地將完整的序列 $s_t$ 作為第 t 個時刻的狀態描述。
agent 和 模擬器互動的目標是能夠獲得最大的累積獎勵。我們做出一個標準的假設,即:獎勵的獎勵都被一個衰減因子 $\gamma$ 相乘,(設定 $\gamma = 0.99$),定義時刻t的折扣反饋為:
其中,T 是遊戲結束的時刻。
我們定義 最優的 動作-值函式 $Q^*(s, a)$,作為最大的期待反饋,在觀察了一些序列 s 之後,然後才去一些動作 a, $Q^*(s, a) = max_{\pi} E[R_t|S_t = s, a_t = a, \pi]$,其中 $\pi$ 是對映序列到動作的一個策略。
最優的動作-值函式遵循一個重要的等式,即:貝爾曼等式(Bellman equation)。這是基於如下的觀察:如果序列 s‘ 在下一個時間步驟最優的值 $Q^*(s', a') $ 對於所有動作 a’ 來說都是已知的,那麼最優的策略應該是選擇這麼一個動作 a',從而可以得到最大的期望值 $r + \gamma Q^*(s', a')$:
$Q^*(s, a) = E_{s'}[r + \gamma max_{a'} Q^*(s', a')|s, a]$
許多RL 演算法基本的idea都是:利用貝爾曼等式來預測 動作-值函式 作為一次迭代更新,$Q_{i+1}(s, a) = E_{s'}[r + \gamma max_{a'} Q_i(s', a')|s, a]$。隨著 i 趨於無窮大,這樣的值迭代演算法收斂到最優動作值函式,$Q_i -> Q^*$。實際上,這些基礎的方法是不切合實際的,因為每一個動作值函式分別預測給每一個序列,沒有任何 generalization。 實際上,用一個函式估計來預測 動作值函式是很common的。在RL領域經常利用線性函式逼近器,有時候也會用非線性函式,如:神經網路。我們提到 帶權重的神經網路函式逼近器稱為:Q-network。一個Q-network 可以通過在第 i 次迭代來調整引數 $\theta_i$而得到訓練,以此降低貝爾曼等式中的均方誤差 (mean-squared error),其中最優目標值 $r + \gamma max_{a'}Q^*(s' , a')$ 利用之前一些迭代得到的引數 $\theta_i^-$ 替換為估計目標值 $y = r + \gamma max_{a'}Q(s', a'; \theta_i^-)$。這就會使得 損失函式 $L_i(\theta_i)$ 的序列隨著迭代次數 i 而改變:
注意到,目標依賴於網路的權重;而有監督的學習,在學習開始之前是固定的。在每一個優化階段,當優化第 i 個損失函式 $L_i(\theta_i)$時,固定之前迭代的引數 $\theta_i^-$,就會有一系列定義好的優化問題。最後一項是 目標的方差,不依賴於我們當前優化的引數 $\theta_i$,所以可以暫時忽略。區分不同的損失函式及其對應的權重,我們有如下的梯度:
注意到,本文的演算法是:model-free and off-policy。
Model-free:因為本文演算法是直接從模擬器中得到的樣本來解決強化學習任務,而沒有顯示的預測獎賞和轉移概率 $P(r, s'|s, a)$。
Off-policy:學習貪婪策略 $a = argmax_{a'} Q(s, a'; \theta)$,與此同時,採用一個確保有足夠狀態空間探索的行為分佈。實際上,該行為分佈是經常被選中通過一個 $\epsilon-greedy$ 策略,有 $1-\epsilon$的概率來選擇一個貪婪策略,有 $\epsilon$ 的概率隨機的選擇一個 action。
其實,off-policy 更主要的是講:策略評估 和 策略改進的不是同一個策略。例如:Q-learning 評估的是 貪心策略,而改進的是 原始策略(即,沒有采用貪心演算法策略)。這裡比較容易懵逼啊。。。呃呃呃。。。
Training algorithm for deep Q-networks.
訓練深度 Q-network 的演算法在 Algorithm 1中。基於Q,根據 貪心策略來指導 agent 選擇和執行動作。由於,將任意長度的歷史作為神經網路的輸入是有困難的,我們的 Q-function 作用於 利用上述函式 產生的固定長度表示的歷史。該演算法從兩個角度 修改了 Q-learning,使其適合大型神經網路的訓練並且不會發散。
首先,我們利用稱為 Experience Replay 的技術,儲存每一個時間步驟 agent的經歷,$e_t = (s_t, a_t, r_t, s_{t+1})$,在該演算法的內部迴圈中,我們對 experience 樣本 採用 Q-learning 更新,或者 minibatch updates,$(s,a,r,s') ~ U(D)$,從儲存的樣本池子中隨機的抽取。
該方法對比傳統的 online Q-learning演算法有以下幾個優勢:
1. Experience 的每一個步驟經常用到許多權重更新中去,允許更好的資料效率。
2. 由於樣本之間強烈的相關性,直接從連續的樣本中進行學習是 inefficient的;樣本的隨機化破壞了該相關性,從而減少了更新的方差。
3. 當 on-policy 的學習時,當前的引數決定了用來訓練引數的下一個資料樣本。(when learning on-policy the current parameters determine the next data sample that the parameters are trained on.)
例如:如果最大動作是向左移動,然後訓練樣本就由左邊的樣本主宰;如果向右移動,訓練樣本的分佈也會交換。
很容易發現,不想要的反饋迴圈(feeback loops)是如何產生的,引數也可能在一個 poor 的區域性最小困住,或者直接就悲劇的發散了。
第二個改動是:
為了改善我們方法的穩定性,在 Q-learning 更新的過程中,我們使用了額外的 目標網路(target network)來產生目標 $y_j$。
確切的講,每執行 C 次迭代,我們將網路 Q 克隆下來,然後得到一個目標網路(target network Q'),然後用這個目標網路Q' 來在接下來的 C 次迭代中來產生 Q-learnng的目標 $y_j$。這個改變,使得演算法相對標準的 online Q-learning 來講,更加穩定,因為 普通的 Q-learning 一次更新增加了 $Q(s_t, a_t)$ 經常對於所有的 a 來講,也增加了 $Q(s_{t+1}, a)$,所以就增加了目標 $y_j$,可能會導致震盪或者策略的發散。用一組較老的係數來產生 target,增加了 更新Q的時間 和 更新能夠影響到目標 $y_j$ 的時間的延遲,使得不容易發散。
還有一個“黑科技”,即:
此外,作者還發現將更新 限制在 -1 到 1之間 能夠提升演算法的有效性。因為所有的 |x| 的 positive value 的梯度是1,而 negative value 的值為 -1,將平方差剪下到 -1 和 1 之間就對應了 利用一個絕對值損失函式來處理 在(-1,1)間隔之外的誤差(error )。這種 error clipping 方式進一步的改善了演算法的穩定性。
總的演算法流程如下: