Value-Based Reinforcement Learning : 價值學習
其實就是用一個神經網路來近似 \(Q*\) 函數。
agent 的目標是打贏遊戲,如果用強化學習的語言來講,就是在遊戲結束的時候拿到的獎勵總和 Rewards 越大越好。
問題:假設知道了 \(Q^*(s,a)\) 函數,哪個是最好的動作?
顯然,最好的動作是\(a^* = \mathop{argmax}\limits_{a}Q^*(s,a)\) ,
\(Q^*(s,a)\)可以給每個動作打分,就像一個先知,能告訴你每個動作帶來的平均回報,選平均回報最高的那個動作。
但事實是,每個人都無法預測未來,我們並不知道\(Q^*(s,a)\)。而價值學習就在於學習出一個函數來近似\(Q^*(s,a)\) 作決策。
對於不同的案例,DQN 的結構會不一樣。
如果是玩超級瑪麗
DQN 的具體執行過程如下:
分步解釋:
如何訓練 DQN ?最常使用的是 Temporal Difference Learning。TD學習的原理可以用下面這個例子來展示:
要開車從紐約到亞特蘭大,有一個模型\(Q(w)\)預測出開車出行的開銷是1000分鐘。這個預測可能不準,需要更多的人提供資料來訓練模型使得預測更準。
出發之前讓模型做一個預測,記作\(q\),\(q=Q(w)\),比如\(q=1000\)。到了目的地,發現其實只用了860分鐘,獲取真實值 \(y=860\)。
實際值\(y\)與預測值\(q\)有偏差,這就造成了 loss 損失
loss 定義為實際值與預測值的平方差:\(L=\frac{1}{2}(q-y)^2\)
對損失 \(L\)關於引數\(w\)求導並用鏈式法則展開:
\(\frac{\partial L}{\partial w} = \frac{\partial q}{\partial w} \cdot \frac{\partial L}{\partial q} =(q-y)\cdot\frac{\partial Q(w)}{\partial w}\)
梯度求出來了,可以用梯度下降來更新模型引數 w :\(w_{t+1} = w_t - \alpha \cdot \frac{\partial L}{\partial w} \vert _{w=w_t}\)
缺點:這種演演算法比較 naive,因為要完成整個旅程才能完成對模型做一次更新。
那麼問題來了:假如不完成整個旅行,能否完成對模型的更新?
可以用 TD 的思想來考慮這件事情。比如我們中途路過 DC 不走了,沒去亞特蘭大,可以用 TD 演演算法完成對模型的更新,即
出發前預測:NYC -> Atlanta 要花1000分鐘,這是預測值。
到了 DC 時,發現用了 300 分鐘,這是真實觀測值,儘管它是針對於部分的。
模型這時候又告知,DC -> Atlanta 要花 600 分鐘。
模型原本預測:$Q(w) = 1000 $,而到 DC 的新預測:300 + 600 = 900,這個新的 900 估值就叫 TD target 。
這些名詞要記住,後面會反覆使用,TD target 是使用了 TD演演算法的道德整體預測值。
TD target \(y=900\)雖然也是個估計預測值,但是比最初的 1000 分鐘更可靠,因為有事實成分。
把 TD target \(y\) 就當作真實值:\(L = \frac{1}{2}(Q(w)-y)^2\), 其中$Q(w) - y $稱為TD error。
求導:\(\frac{\partial L}{\partial w} =(1000-900)\cdot\frac{\partial Q(w)}{\partial w}\)
梯度下降更新模型引數 w :\(w_{t+1} = w_t - \alpha \cdot \frac{\partial L}{\partial w} \vert _{w=w_t}\)
換個角度來想,TD 的過程就是這樣子的:
模型預測 NYC -> Atlanta = 1000, DC -> Atlanta = 600,兩者差為400,也就是NYC -> DC = 400,但實際只花了300分鐘預計時間與真實時間之間的差就是TD error:\(\delta = 400-300 = 100\)。
TD 演演算法目標在於讓 TD error 儘量接近 0 。
即我們用部分的真實 修改 部分的預測,而使得整體的預測更加接近真實。我們可以通過反覆校準 可知的這部分真實 來接近我們的理想情況。
上述例子中有這樣一個公式:$T_{NYC\rightarrow ATL} \approx T_{NYC\rightarrow DC} + T_{DC\rightarrow ATL} $
想要用 TD 演演算法,就必須要用類似這樣的公式,等式左邊有一項,右邊有兩項,其中有一項是真實觀測到的。
而在此之前,在深度強化學習中也有一個這樣的公式:\(Q(s_t,a_t;w)=r_t+\gamma \cdot Q(s_{t+1},a_{t+1};w)\)。
公式解釋:
- 左邊是 DQN 在 t 時刻做的估計,這是未來獎勵總和的期望,相當於 NYC 到 ATL 的預估總時間。
- 右邊 \(r_t\)是真實觀測到的獎勵,相當於 NYC 到 DC 。
- \(Q(s_{t+1},a_{t+1};w)\) 是 DQN 在 t+1 時刻做的估計,相當於 DC 到 ATL 的預估時間。
為什麼會有一個這樣的公式?
回顧 Discounted return: \(U_t=R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+\gamma^3 R_{t+3}+\cdots\)
提出 \(\gamma\) 就得到 $ = R_t + \gamma(R_{t+1}+ \gamma R_{t+2}+ \gamma^2 R_{t+3}+\cdots) $
後面這些項就可以寫成\(U_{t+1}\),即 \(=R_t+\gamma U_{t+1}\)
這樣就得到:\(U_t = R_t + \gamma \cdot U_{t+1}\)
直觀上講,這就是相鄰兩個折扣演演算法的數學關係。
現在要把 TD 演演算法用到 DQN 上
有了 prediction 和 TD target ,就可以更新 DQN 的模型引數了。
t 時刻模型做出預測 \(Q(s_t,a_t;w_t)\);
到了 t+1時刻,觀測到了真實獎勵 \(r_t\) 以及新的狀態 \(s_{t+1}\),然後算出新的動作 \(a_{t+1}\)。
這時候可以計算 TD target 記作 \(y_t\),其中\(y_t=r_t+\gamma \cdot Q(s_{t+1},a_{t+1};w)\)
t+1 時刻的動作 \(a_{t+1}\)怎麼算的?DQN 要對每個動作打分,取分最高的,所以等於Q 函數關於a求最大化:$ y_t = r_t + \gamma \cdot \mathop{max}\limits_{a} Q(s_{t+1},a;w_t)$
我們希望預測\(Q(s_{t},a_{t};w)\)儘可能接近 TD target \(y_t\) ,所以我們把兩者之差作為 Loss :
\(L_t=\frac{1}{2}[Q(s_{t},a_{t};w)-y_t]^2\)
做梯度下降:\(w_{t+1} = w_t - \alpha \cdot \frac{\partial L}{\partial w} \vert _{w=w_t}\)更新模型引數 w,來讓 Loss 更小
價值學習(本講是DQN)基於最優動作價值函數 Q-star :
\(Q^*(s_t,a_t) = \mathbb{E}[U_t|S_t=s_t,A_t=a_t]\)
對 \(U_t\) 求期望,能對每個動作打分,反映每個動作好壞程度,用這個函數來控制agent。
DQN 就是用一個神經網路\(Q(s,a;w)\)來近似$Q^*(s,a) $
TD 演演算法過程
觀測當前狀態 $S_t = s_t $ 和已經執行的動作 \(A_t = a_t\)
用 DQN 做一次計算,輸入是狀態 \(s_t\),輸出是對動作 \(a_t\) 的打分
記作\(q_t\),\(q_t = Q(s_t,a_t;w)\)
反向傳播對 DQN 求導:\(d_t = \frac{\partial Q(s_t,a_t;w)}{\partial w} |_{ w=w_t}\)
由於執行了動作 \(a_t\),環境會更新狀態為 \(s_{t+1}\),並給出獎勵\(r_t\)。
求出TD target:\(y_t = r_t + \gamma \cdot \mathop{max}\limits_{a} Q(s_{t+1},a_t;w)\)
做一次梯度下降更新引數 w , \(w_{t+1} = w_t - \alpha \cdot (q_t-y_t) \cdot d_t\)
更新迭代...