【李宏毅深度強化學習筆記】3、Q-learning(Basic Idea)

【李宏毅深度強化學習筆記】1、策略梯度方法(Policy Gradient)

【李宏毅深度強化學習筆記】2、Proximal Policy Optimization (PPO) 算法

【李宏毅深度強化學習筆記】3、Q-learning(Basic Idea)(本文)

【李宏毅深度強化學習筆記】4、Q-learning更高階的算法

【李宏毅深度強化學習筆記】5、Q-learning用於連續動作 (NAF算法)

【李宏毅深度強化學習筆記】6、Actor-Critic、A2C、A3C、Pathwise Derivative Policy Gradient

【李宏毅深度強化學習筆記】7、Sparse Reward

【李宏毅深度強化學習筆記】8、Imitation Learning

-------------------------------------------------------------------------------------------------------

【李宏毅深度強化學習】視頻地址:https://www.bilibili.com/video/av63546968?p=3

課件地址:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS18.html

-------------------------------------------------------------------------------------------------------

Q-learning

Q-learning 是 value-based 的方法,在這種方法中我們不是要訓練一個 policy,而是要訓練一個critic網絡。critic 並不直接採取行爲,只是對現有的 actor \pi,評價它的好壞。

Value-Fuction

critic 給出了一個 value function V^\pi(s),代表在遇到遊戲的某個 state 後,採取策略爲\pi的actor  一直玩到遊戲結束,所能得到的 reward 之和

 V^\pi(s)(即critic)的輸入是某個state,輸出是一個scalar標量。上圖遊戲畫面中左邊的 V^\pi(s) 很大,因爲當前怪物比較多,防護罩也沒被摧毀,從此時玩到遊戲結束得到的 reward 就會比較多;而相對的右邊的 V^\pi(s) 就比較小。綜上 critic 的輸出取決於兩點:

  1. state,這個就是左右圖對比,剛纔說過了
  2. actor 的策略 \pi,如果是個很弱的actor即便左圖可能也得到很低的reward。

 

怎麼計算V^\pi(s)呢?

 

計算V^\pi(s)的2種方式:

 1、Monte-Carlo (MC) based approach

S_a作爲V^\pi(s)的輸入最終輸出 V^\pi(S_a),而實際上應該得到的cumulative reward是G_a。這其實和 regression problem 很相似,因爲我們的目標就是通過訓練讓 V^\pi(S_a) 越來越接近 G_a ,即理想情況下V^\pi(S_a) =G_a(這裏爲了方便,假設學習率\alpha爲1,原始的公式爲V(S_t) = V(S_t) + \alpha (G_t-V(s_t)))。

注意V^\pi(s)是一個網絡,因爲在遊戲中,不可能所有的image都看過,所以V^\pi(s)做成網絡來提高泛化性

2、Temporal-difference (TD) approach

MC based的方法要求遇到 S_a後把遊戲玩到結束,如果遊戲太長的話,那就可能收集不到多少數據去讓網絡去擬合G_a

而 TD 只需要從 S_t 玩到 S_{t+1} 就行,因此只需要算V^\pi(S_t) = V^\pi(S_{t+1}) + r_t (這裏爲了方便,假設學習率\alpha和衰減係數\gamma都爲1,原始的公式爲V(S_t) = V(S_t) + \alpha (r_t+\gamma V(S_{t+1})-V(s_t)))。

那麼V^\pi(S_t+1) - V^\pi(S_t) 應該要越接近r_t纔是正確的結果,所以將網絡往這個方向去train,就可以把這個function訓練出來。

MC v.s. TD :

MC 方法的問題在於最後得到的 G_a 的方差很大( G_a 是 在遇到S_a 的情況下使用策略 \pi的actor一直玩遊戲直到結束得到的實際 reward,是一個隨機變量,因爲遊戲是有隨機性的,所以每一次得到 G_a 是不一樣的)。 

假設G_a 是k步 reward 的求和,而根據公式 Var[kX]=k^2Var[X]最終會相差 k^2。所以最後 G_a 的方差很大,即每次算出來的  V^\pi(S_a) 都會相差很多。

而用 TD base 中有隨機性的部分是 r它的方差比較小。但 TD 的問題在於 V^\pi(S_{t+1}) 可能不準確。

下面舉個例子看它們的區別:

可以看出,同一個actor,用MC based和TD,算出來的結果是不一樣的,兩種結果沒有絕對的正確與否

其中,在第一個episode中,S_a出現後S_b的reward變爲0。

在Monte-Carlo方法中,就會認爲S_a是一個不好的state,才導致後來的S_b的reward變爲0,所以 V^\pi(S_a) 爲0.

而TD方法中, 會認爲S_a 後 S_b 得到 reward 爲 0 只是一個巧合,與 S_a 無關。大部分情況下 S_b 還是會得到 3/4 的 reward,所以認爲 V^\pi(S_a) 爲3/4。(因爲V^\pi(S_a) = V^\pi(S_b) + r_a

 

Q-function:

Q^\pi(s,a)的輸入是一個 (s, a) 的 pair,然後輸出一個cumulated reward的期望值。這裏的cumulated reward指的是在state s下強制採取 action a(不管這個actor認爲在state s下采取action a是不是好的,都強制採取a),然後用這個actor \pi 一直玩到遊戲結束所得到的cumulated reward。

Q(s_t,a_t) = r_t + \gamma maxQ(s_{t+1},a_{t+1})   (這裏爲了方便,假設學習率\alpha和衰減係數\gamma都爲1,原始的公式爲Q(s_t,a_t) = Q(s_t,a_t) + \alpha (r_t + \gamma maxQ(s_{t+1},a_{t+1})-Q(s_t,a_t))

 

以上是Q function的兩種常見的寫法。

如果action可以窮舉,則可以使用右邊的寫法;否則,使用左邊的寫法。

 

critic 看上去只能評價某個 action 的好壞,但是實際上可以直接用它來做 reinforcement learning。方法是隻要學到一個 \pi 的 Q function Q^\pi(s,a) ,就能有辦法找到一個更好的 actor \pi',這樣就能不斷更新policy  \pi 。

什麼叫 \pi' 比 π 好呢?

就是說面對所有 state s 時,使用策略 \pi' 得到的 value 一定比使用策略 \pi 得到的Q value 大,即:V^{\pi'}(s)\geqslant V^\pi(s) 

找 \pi' 的方法是,對於已經學到的 Q function  Q^\pi(s,a),在某個給定的 state 下,分別帶入可能的 action,看看哪一個 action 使得Q value最大,把使得函數值Q value最大的 a,作爲以後面對該 state 時採取的 action

下圖證明了 V^{\pi'}(s)\geqslant V^\pi(s)

Q-Learning使用技巧:

技巧1:使用Target network

Q-function的訓練,參考了TD的方法,即Q^\pi(s_t,a_t) = r_t + Q^\pi(s_{t+1},\pi(s_{t+1}))

現在以s_ta_t作爲輸入,則輸出的結果Q^\pi(s_t,a_t),由上圖可以得出,這個結果應該儘可能接近以s_{t+1}a_{t+1}作爲輸入,則輸出的結果Q^\pi(s_{t+1},\pi(s_{t+1}))再加上r_t的結果

也是一個類似迴歸的問題,但是這裏不同於前面的Monte-Carlo (MC) based approach和Temporal-difference (TD) approach的迴歸問題,這裏的Q^\pi(s_{t+1},\pi(s_{t+1}))是一直在變化的,即Q^\pi(s_t,a_t)要去擬合的目標,其實是一直在變化,這就對訓練產生很大的干擾。

所以

  1. 將以s_{t+1}a_{t+1}作爲輸入的網絡(也叫Target network)固定住,這樣r_t + Q^\pi(s_{t+1},\pi(s_{t+1}))也變成一個固定的值,然後讓以s_ta_t作爲輸入的網絡去擬合這個固定的值。
  2. 經過N次訓練後將左邊的網絡的參數覆蓋掉Target network,形成新的Target network

重複1、2的步驟一直訓練下去。

技巧2:使用exploration

Q-learning方法是根據查表來估值的,只有在狀態s_t執行過動作a_t之後,我們才能估得出Q^\pi(s_t,a_t)。即便是使用DQN(就是說將Q-function改爲一個network,把查表的過程變成network的輸入輸出)減緩了這個問題,但也可能存在一些狀態s_t沒執行過動作a_t,沒辦法估出Q^\pi(s_t,a_t)

現在在狀態s下,都沒有采取過action a_1a_2a_3,所以所有的Q-value都爲0。接下來與環境的互動中,sample到在狀態s下,採取動作a_2,會使得Q-value從0變成1。

可以知道,接下去在狀態s下就會一直採取動作a_2,而不會去嘗試可能未來會獲得更大reward的a_1a_3

爲了解決這個問題可以使用以下兩種方法:

1、Epsilon Greedy

假設\epsilon爲0.3,那就會有0.7(1-0.3)的機率會使用以往的經驗去執行動作,而剩下0.3的概率隨機去試探新的動作

\epsilon會隨着訓練的進行不斷減少,就是說在一開始的時候\epsilon的值會大一點,因爲還不知道哪個action是好的,所以還要提高探索(exploration)的次數。隨着訓練的進行,開始知道哪些action是好的哪些是不好的,就可以減少探索(exploration)的次數。

 2、Boltzmann Exploration

因爲Q-value可能有正有負,所以先取exp全部轉成正的。然後除以分母,做Normalization。

這樣就將所有動作的Q value轉化爲概率概率的大小和Q value的大小有關。然後通過概率的大小去選擇不同動作a,概率大的被選到的次數就會多,概率小的被選到的次數就會少,這樣即便Q value小的action也還是有可能會被選到。

技巧3:使用Replay Buffer

把actor的每筆experience (st,at,rt,st+1)放到一個buffer裏面,其中buffer裏面的exp可能來自採取不同policy的actor(假設actor和環境互動一萬次後就更新參數,而buffer裏面能存放5萬個的exp,就會導致buffer裏有5種不同的actor的exp),當buffer滿了再替換舊的exp。訓練過程時每次從buffer裏面sample一個batch(比如說100個exp)出來訓練

因爲buffer裏有采取不同policy的actor的exp,所以導致這個訓練過程變成off-policy的。但是因爲我們只用一個exp訓練,並不是整個trajectory,所以off-policy也沒關係

這樣做的好處:

1、訓練過程中與環境交互很耗時間,而Replay Buffer可以使得之前的actor的exp被反覆利用到,減少很Env互動次數;

2、增加數據多樣性,降低batch內相關性,提高泛化性能,訓練效果更好

 

最後放一張完整的Q-Learing的過程圖:

發佈了25 篇原創文章 · 獲贊 38 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章