我們討論過怎麼更新強化學習中的行為者(Actor)的參數。當時我們忽略了一個問題:Actor應該要學什麼行為?
知道要贏,但是要怎麼贏?
在常見的強化學習的應用場景中,我們通常清楚的知道目的,但不太清楚達成目的的最佳手段是什麼。例如:賽車、運動、電子遊戲、交通路徑規劃等等。人類可以用經驗歸納出一些好技巧,但是卻很難證明哪些技巧是比較好的。而且技巧的好壞的因素相當複雜,不只跟玩家(player; agent)有關,也跟當時的環境或對手有關。例如每一個季度的爐石戰記的主流牌組都有所不同,甚至在同一季度內,前期與後期的主流牌組也不盡相同。因為最佳策略的變因很複雜,所以要怎麼評分每一個行為是一件不簡單的事。
思路一:能贏的行為就是好的行為
我不確定哪些行為是好的,所以我只讓能直接導致勝利的行為得到報酬(reward),換句話說,也就是勝利的前一個行為能獲得reward。為了方便討論,以下的討論將會基於Actor-Critic架構,如圖一:
Actor-Critic中具有兩個模型,一個能夠根據「環境資訊」與「行為」進行「評分」的模型稱為批評者(Critic), $Q$,如下式(1);另一個能夠根據「環境資訊」輸出「行為」的稱為行為者(Actor), $\pi$,如下式(2)。
$Q(s_{t}, a_{t}) = r_{t}$ -(1)
$a_t = \underset{a_{t}}{\mathrm{argmax}} \space \pi(a_{t}|s_{t})$ -(2)
Actor與Critic在強化學習上是互相幫助成長的。如果Critic很準的話,Actor就能知道哪些行為可以獲得比較高的reward。如果Actor很準的話,Critic就能夠從更好的環境中探索更好的策略。
思路二:預測哪些行為會導致好的行為
但是上述的方法並不完美。我舉Space Invader作為例子:在Space Invader中,只有「射擊」才能擊敗敵人並獲得分數,其餘的操作都不會有分數。若將目標訂為獲得最高分,套用上述的方法所練出來的模型只會不斷射擊,完全不會左右移動,因為左右移動是不可能直接得到分數的。但是不左右移動的話就無法瞄準敵人,所以這樣的模型必然不是最佳解。
為了解決這個問題,我們希望Critic的評分, $Q(s, a)$, 能夠預測時間點$t$之後的所有reward, $r$,如下式:
$Q(s_{t}, a_{t}) = r_{t} + r_{t+1} + … + r_{T}$ -(3)
其中$s_{t}$是環境資訊、$a_{t}$是行為、$T$是未來的某個遙遠的時間點。$Q(s_t, a_t)$可被視為行為$a_{t}$所擁有的潛力。然後我們稍微整理一下式(3),就可以變成損失函數。
$L = MSE(-Q(s_{t}, a_{t}) + r_{t} + r_{t+1} + … + r_{T})$ -(4)
$L$為潛力與真正能得到的reward的總和的平方差。為什麼$L$會冒出來呢?因為$Q$永遠不可能完美的預測reward,總是存在著差距。那個差距就是$L$,而式(3)只是我們理想中的Critic的評分。
值得注意的是,這個損失函數還有很多的毛病。其中一個是$Q(s_t, a_t)$並不收斂。現在的行為對未來的reward的貢獻應該要隨時間遞減,所以我們把式(4)改寫成式(5):
$L = MSE(-Q(s_{t}, a_{t}) + r_{t} + \gamma r_{t+1} + … + \gamma^{T-t} r_{T})$ -(5)
where $\gamma < 1$
未來的reward與行為策略的關係
式(5)已經是可以用於實戰中的Actor-Critic模型了,例如Proximal Policy Optimization(PPO),但是使用上不太方便。首先,因為計算損失函數式(5)需要「未來的reward」,所以在搜集資料的時候必須完整的完成一局遊戲後才能接著訓練模型。其問題不在「完成一局」而是在於「完整」。在現實生活中,短暫的斷線與延遲都會影響資料的完整性,不只code會很難寫,也降低訓練模型的效率。
另一個大問題在於式(5)是on-policy的演算法。所謂的on-policy是指「當前的潛力」的比較對象是否包含了當時的行為策略(policy)。仔細看式(5)就會發現,所謂的「未來的reward」並不是發生在最佳的未來,而是發生在某個policy下的未來。那樣的未來並不一定可以適用於其他policy,換句話說,on-policy演算法要求每次更新了一次模型之後,所有的資料都必須重新搜集,使得資料效率相當低下。
思路三:時序差分法
如果我們改使「當前的潛力, $Q_{t}$」去預測「下個時間點的潛力, $Q_{t+1}$」,就可以不依靠policy的同時預測未來了。在數學上這叫做Bellman equation,也稱作時序差分法(Temporal Difference Method),可以寫作下式(6):
$Q(s_{t}, a_{t}) = r_{t} + \gamma Q(s_{t+1}, a_{t+1})$ -(6)
可以被理解成:
$當前的潛力=當下的行為所獲得的reward+下個時間點的潛力$
將式(6)稍微移項一下,可以得到新的損失函數式(7):
$L = MSE(-Q(s_{t}, a_{t}) + r_{t} + \gamma Q(s_{t+1}, a_{t+1}))$ -(7)
其中$s_t$, $a_t$, $r_t$, $s_{t+1}$來自紀錄,$a_{t+1}$是由當前的policy產生的,而不是從紀錄中取得。所以$a_{t+1}$並沒有依靠過時的policy,進而使該演算法從on-policy變成off-policy。因為off-policy演算法可以利用來自其他policy的資料做訓練,資料效率因此大幅提高,也可以避免模型忘記曾經發生過的事情。
順帶一提,式(6)跟式(5)在數學上是等價的,使式(6)自己對自己展開第$t+1$項,我們可以得到式(8):
$Q(s_{t}, a_{t}) = r_{t} + \gamma (r_{t+1} + \gamma Q(s_{t+2}, a_{t+2}))$ -(8)
接著展開第$t+2$項, 第$t+3$項, … , 直到第無限項,就可以得到式(5)
時序差分法中,近年來最受關注之一的是Soft Actor Critic(SAC, [1], [2]),因為它使用行為$a_t$的熵平衡了探索(exploration)與探究(exploitation)的比例,大幅穩定了原先不穩定的損失函數。時序差分法也不是完全沒有缺點,因為該方法總是只比較前後的環境差,所以對於需要記憶的場景就不太擅長。例如需要透過特定順序才能通過的石兵八卦陣。目前已經有學者試著用Recurrent Network解決記憶相關的問題,篇幅有限我就不多做介紹。
既然Critic那麼厲害,為什麼還需要Actor?
因為Critic 沒有根據環境資訊$s$ 並取樣行為$a$ 的能力。換句話說,如果沒有Actor的話,Critic要把所有可能的行為都評估一遍,然後才能找到最佳的行為。這樣的做法在離散行為空間(Discrete Action Space) 還算可行,因為可能性是有限的。但是這會在連續行為空間(Continuous Action Space) 中遇到大問題,因為可能的行為有無限多,是測量不完的。即使是將行為離散化並降低解析度,當行為的種類或行為者的數量變多,還是會遇到「維度的詛咒」。正因為Actor可以避免掉這麼多麻煩,所以我們需要Actor。
小結
從「要贏」到「要怎麼贏」之間有很大的鴻溝。強化學習探究的就是填平這條鴻溝的藝術。先讓Critic學會預測未來,然後就可以知道哪些行為可以導向獲勝。預測未來的方法:第一、將當下的潛力與未來的reward相減,使兩者相差越少越好(e.g. PPO),第二、或是利用時序差分法(e.g. SAC)。兩種方法都有其優點,我建議讀者在進入下一步學習前可以找一些命題練習,因為接下來還有更多建立在這基礎之上的技巧要學。
所有文章分類