Deep Reinforcement Learning (1) --- Policy Gradient (Review)
作為 Deep Reinforcement Learning 的第一堂課,主要是針對 Machine Learning 中 RL 的部分進行簡單的複習及補充。有些基礎的概念,在 MLDS GAN 系列課程中也已有提及,閱讀此篇筆記前可先看看 “ Reinforcement Learning “ 及 “ Generative Adversarial Network (9) — Sequence Generation “ 這兩篇筆記。
Reinforcement Learning
Reinforcement Learning 說穿了就是利用機器進行實作,並且從錯誤中自行學習應該採取什麼樣子的「策略」,可以讓自己在任務中得到最大的獎勵、分數。如果拿玩遊戲跟 AlphaGO 作為例子,我們可以將整個 Reinforcement Learning 分成三個主要的部份 : Actor, Environment 以及 Reward Function,其中 Environment 以及 Reward Function 是我們無法調整的部分。

機器進行 Actor 跟 Environment 的每一個 State 作互動會經過 Reward Function 得到 Reward。我們藉由這個 Reward Function 來調整 Actor 使 Reward 最大化。
機器決定怎麼進行 Actor 便是由 Policy $\pi$ 這個 Neural Network 來決定,當我們輸入一個 State 這個網路 $\pi$ 會輸出一個 Actor 分佈。利用這個分佈來決定我們要採用哪一個 Actor。
整個互動的過程就如同下圖所展示 :

我們通常將一整個得到最終 Reward 的過程稱為一個 Episode ( 舉例來說,遊戲從開始到 Game Over、棋盤從開始到分出勝負、… ),那麼一個 Episode 可以用以下的歷程 $trajectory$ 來表示
$$
trajectory\ \tau={s_1,a_1,r_1,s_2,a_2,r_2,\cdots\cdots s_T,a_T,r_T}
$$
所以這樣的 $trajectory$ 出現的機率是我們可以進行估算的
$$
P_{\theta}(\tau)=P(s_1)P_{\theta}(a_1\mid s_1)P(s_2\mid s_1,a_1)\cdot P_{\theta}(a_2\mid s_2)P(s_3\mid s_2,a_2)\cdots\
=P(s_1)\prod\limits_{t=1}^{T}P_{\theta}(a_t\mid s_t)P(s_{t+1}\mid s_t,a_t)
$$
每一個 Actor 過後,我們會得到一個 reward $r_t$,當一整個歷程結束後,reward 的總和是 $R(\tau)=\sum\limits_{t=1}^{T}r_t$,我們希望經過 Actor 這個網路的優化可以讓最後的 reward 總和盡量的高。也就是說,我們會希望藉由 $\theta$ 的調整下,使期望 reward $\bar{R}_{\theta}$ 可以盡可能的高。
$$
\bar{R}{\theta}=\sum\limits{\tau}R(\tau)P_{\theta}(\tau)=\mathbb{E}{\tau\sim P{\theta}(\tau)}\big[R(\tau)\big]
$$
Policy Gradient
我們將上面的 reward 期望值做一些調整
$$
\nabla\bar{R}{\theta}=\sum\limits{\tau}R(\tau)\nabla P_{\theta}(\tau)\
=\sum\limits_{\tau}R(\tau)P_{\theta}(\tau)\frac{\nabla P_{\theta}(\tau)}{P_{\theta}(\tau)}\
=\sum\limits_{\tau}R(\tau)P_{\theta}(\tau)\nabla\log P_{\theta}(\tau)\
=\mathbb{E}{\tau\sim P{\theta}(\tau)}\big[R(\tau)\nabla\log P_{\theta}(\tau)\big]\
\approx\frac{1}{N}\sum\limits_{i=1}^{N}R(\tau^n)\nabla\log P_{\theta}(\tau^n)\
=\frac{1}{N}\sum\limits_{i=1}^{N}\sum\limits_{t=1}^{T_n}R(\tau^n)\nabla\log P_{\theta}(a_t^n|s_t^n)
$$
在這邊想提一下 “Policy” 這樣的名詞,直接翻譯叫做「策略」。我想說的是,為什麼要特別提到 Policy 這樣的詞彙 ? 跟我們以前所了解的梯度下降到底有什麼不同 ?
上面的討論簡化了一些部分,如果依照以往的整個神經網路優化過程來看,我們應該要優化網路來使 Loss 盡可能的小。但在 Reinforcement Learning 中,我們卻沒辦法這樣做。
在 Reinforcement Learning 中,我們用的是 Reward Function 取代 Loss function,目標也從最小化 Loss 改成最大化 Reward。現在的問題就是,我們很無法對 Reward 進行梯度下降法來優化 Actor 這個神經網路。主要的原因是因為 Actor 輸出的是一個 Action ,並不是 Reward,而且最後得到的 Reward $R(\tau)$ 事實上我們會看不到與 Actor 的參數 $\theta$ 之關係。
因此我們會用上面的方式調整來進行梯度下降,雖然我們要求的是 $\nabla\bar{R}{\theta}$ 但其實是在求 $\nabla P{\theta}(\tau)$ 其實也就是對 「策略」本身求梯度。
在進行 Policy Gradient 必須要注意的是,每一次 Sample 的 Data 只能進行一次參數更新。當參數更新過後就必須要重新 Sample 一次 Data。

Tips of Reinforcement Learning
Tip 1. Add baseline/threshold
$$
\nabla\bar{R}{\theta}\approx\frac{1}{N}\sum\limits{i=1}^{N}\sum\limits_{t=1}^{T_n}R(\tau^n)\nabla\log P_{\theta}(a_t^n|s_t^n)
$$
從上面的式子來看,當我們進行參數優化時,在意義上就是要將正的 $R(\tau^n)$ 之機率提升,然後將負的 $R(\tau^n)$ 之機率降低。
雖然這樣說,但大部分的 Reinforcement Learning 場景都不會有「負分」的狀況出現,在這樣恆正的 Reward 下,會出現一些問題。
在理想的狀態下,假設我們的 Actor 有三個選擇,各自能獲得不同的 $R(\tau)$ (綠色部分),在三個選擇都會被 sample 到的前提下,三個狀況都會被增加機率,擁有較大 $R(\tau)$ 的機率會被增加的較多,而較小 $R(\tau)$ 的機率會被增加的較少。經過 Normalization 後,是可以達到我們想要的效果( 增加較少 reward 被降低機率、增加較多 reward 的被增加機率 )。

但是問題出在,我們在 sample 的過程中,不可能 sample 到所有的可能性,如果我們沒有 sample 到擁有較大 $R(\tau)$ 的 actor,那麼這 actor 經過 Normalization 後反而會降機機率。

為了處理這樣的問題,我們在 $R(\tau)$ 的部份加上一個 threshold $b$,使整個 reward 可以變成有正有負的狀況以避開上述的問題。而這樣的 $b$ 通常是取 $R(\tau)$ 的平均值 (期望值)。
$$
\nabla\bar{R}{\theta}\approx\frac{1}{N}\sum\limits{i=1}^{N}\sum\limits_{t=1}^{T_n}\big(R(\tau^n)-b\big)\nabla\log P_{\theta}(a_t^n|s_t^n)
$$
Tip 2. Assign Suitable Credit
仔細看一下 Reward Function 仍是有不合理之處
$$
\nabla\bar{R}{\theta}\approx\frac{1}{N}\sum\limits{i=1}^{N}\sum\limits_{t=1}^{T_n}\big(R(\tau^n)-b\big)\nabla\log P_{\theta}(a_t^n|s_t^n)
$$
我們對每一個 state $s_t^n$ 跟 actor $a_t^n$ 都乘上同一個 total reward $R(\tau^n)$ 這顯然不合理。最後的 Reward 大,不見得在任一個 state 的 actor 都是好的,反之亦然。因此我們希望給每一個 actor 不同的 reward 權重。
這裡的想法是,每一個時間點的 state $s_t^n$ 跟 actor $a_t^n$ 的重要性,跟前面時間點的 state 與 actor 無關。這在直覺上還算好理解,每一個狀況下我們要採取動作會對最後的 Reward 產生的影響跟之前是無關的,因為之前的 actor 已經結束了。
因此我們不再給每一個 actor 同樣的 total reward 權重,而是將其與之後的 reward 作為權重( 之前的 reward 就不管了 )。

所以我們可以再把 reward function 進行更改
$$
\nabla\bar{R}{\theta}\approx\frac{1}{N}\sum\limits{i=1}^{N}\sum\limits_{t=1}^{T}\big(\sum\limits_{t’=t}^{T_n}r_{t’}^n-b\big)\nabla\log P_{\theta}(a_t^n|s_t^n)
$$
但這樣還不夠貼近現實,雖然我們說這樣的計算可以表徵在任一個時間點下做的決定,會影響到後面所有的決定,導致 reward 產生變化。但我們可以合理的假設,這樣的影響力會隨著時間拉長而造成衰減,因此我們可以在 $r_{t’}^n$ 上再加上一個小於 $1$ 的 decay $\alpha$。
$$
\nabla\bar{R}{\theta}\approx\frac{1}{N}\sum\limits{i=1}^{N}\sum\limits_{t=1}^{T}\big(\sum\limits_{t’=t}^{T_n}\alpha^{t’-t} r_{t’}^n-b\big)\nabla\log P_{\theta}(a_t^n|s_t^n)
$$