# 李宏毅_ATDL_Lecture_23
###### tags: `Hung-yi Lee` `NTU` `Advance Topics in Deep Learning`
[課程撥放清單](https://www.youtube.com/channel/UC2ggjtuuWvxrHHHiaDH1dlQ/playlists)
## A3C
[課程連結](https://www.youtube.com/watch?v=O79Ic8XBzvw&list=PLJV_el3uVTsPMxPbjeX7PicgWbY7F8wW9&index=23)
### Approaches
![](https://i.imgur.com/dV9qlUw.png)
Deep Reinforcement Learning分為兩大類:
1. Model-free Approach
* 適用於無法窮舉的環境
* 兩大類:
* Policy-based
* 訓練一個Actor,負責執行動作。
* Value-based
* 訓練一個Critic,負責對目前的狀況給予評價。
* 也可以混合使用
* Actor + Critic
3. Model-based Approach
* Agent採取一個動作之後會預測接下來發生什麼事。
* AlphaGo內就有使用到Model-based,下一步棋之後計算勝率。
* 限制較多,使用之前要對環境先建立模型,因此可以預測環境下一步會發生的事情。
* 如果是電玩場景,環境無法窮舉,雖然圍棋的下一步變化多端,但還是可以窮舉。
目前(2017年)較多使用的是A3C,而不是DQN。
### On-policy v.s. Off-policy
![](https://i.imgur.com/h8rQnrU.png)
On-policy,要學習的Agent跟與環境互動的Agent是同一個Agent。
Off-policy,要學習的Agent跟與環境互動的Agent並不是同一個Agent,意味著要學習的那個Agent是在一邊看著另一個Agent與環境互動,以它們互動的狀況來進行學習。使用這個方法要特別注意兩個Agent之間的差距。好比你看著Joradn空間停留三秒,但是你上場的時候根本學不起來。
### Actor is a Neural network
![](https://i.imgur.com/Norv406.png)
[論文連結_Asynchronous Methods for Deep Reinforcement Learning](https://arxiv.org/abs/1602.01783)
A3C=Asynchronous Advantage Actor-Critic
Actor是一個Neural Network:
* input:observation,可以是vector,也可以是matrix。
* output:你有那些可以被採取的action
以遊戲來說明的話,observation就是你看到的遊戲畫面,而output的action就是機器看到observation之後決定的動作,左、右、開火...等,每一個action都會有一個分數,你可以用argmax的方式看那一個機率最高就採用,或者可以用隨機選擇。
要讓Actor可以採取連續動作也是可行的,所謂的連續動作指的是,假設機器人是一個多軸訊號控制,那你要一次針對多個軸做訊號輸出,假設有十軸,那你的輸出就會是十維的向量。
### Actor - Goodness of an Actor
![](https://i.imgur.com/IWMZ2wP.png)
有了Actor,就需要衡量這個Actor有多好。假設每一個Actor就是一個function-$\pi(s)$,上面已經定義它是一個`nn`,它的參數就是$\pi^\theta$。
接下來我們拿這個Actor去玩遊戲,有了一連串的操作記錄,記錄著state-$S$,action-$a$,reward-$r$。遊戲的總體reward我們寫為$R=\sum^T_{t=1}r_t$,記錄每一個時間點$t$的reward。
即使拿相同的Actor去玩兩次遊戲,結果不一定會是一樣,這有兩個理由:
1. 有時候Actor可能是隨機性的,即使相同的observation也不一定會有一樣的output。
* 上面提到過,我們可以將output視為distribution,再從裡面sample出一個action。
2. 即使Actor看到相同的observation有一樣的action,但是遊戲中的AI也存在著隨機性。
我們可以定義expected total reward(期望值)為$\bar{R}_{\theta^\pi}$,也就是參數為$\theta^\pi$的情況下,我們期望得到的reward有多少。
現在,我們可以拿這個$\bar{R}_{\theta^\pi}$來估測Actor有多好。
### Actor - Policy Gradient
![](https://i.imgur.com/S9Imy7q.png)
有了評估Actor的定義,就可以做Policy Gradient,相關推導在之前課程有,可以回頭看。
直觀說明如下:
* $\theta^{\pi^{'}}=\theta^\pi+\eta\nabla\bar{R}_{\theta^\pi}$
* $\eta\nabla\bar{R}_{\theta^\pi}$:計算$\theta^\pi$對expected total reward的gradient,以此更新$\theta^\pi$得到$\theta^{\pi^{'}}$
* $\nabla\bar{R}_{\theta^\pi} \approx \dfrac{1}{N}\sum^N_{n=1}R(\tau^n)\nabla\log P(\tau^n\vert\theta^\pi)=\dfrac{1}{N}\sum^N_{n=1}R(\tau^n)\sum_{t=1}^{T_n}\nabla\log p(a^n_t\vert s^n_t,\theta^\pi)=\dfrac{1}{N}\sum^N_{n=1}\sum^{T_n}_{t=1}R(\tau^n)\nabla\log p(a^n_t \vert s^n_t,\theta^\pi)$
上面做的事簡單的說就是,假設在某次的遊戲記錄$\tau^n$中,Actor看到某一個state-$s^n_t$而執行某一個action-$a^n_t$。整個遊戲玩完之後它的reward-$R(\tau^n)$是好的,那機器就會試著去更新參數-$\theta$讓$p(a^n_t\vert s^n_t)$出現的機率變大,反之如果最後的reward-$R(\tau^n)$是不好的,那機器就會試著降低$p(a^n_t\vert s^n_t)$出現的機率。
要注意到一點是,我們考慮的不是單一個state-action得到的reward,而是整場遊戲所得到的reward。
### Critic
![](https://i.imgur.com/5sqnZd8.png)
Critic本身是不做事,它的角色就是給定一個actor-$\pi$,然後衡量這個actor有多好或多不好。Critic有很多種,這次課程說明的是State value function-$V^\pi(s)$:
* 給定一個actor-$\pi$
* 看到某一個observation(state)-$s$,然後評估接下來一直到遊戲結束,我們會得到的reward有多大。
* 這個期望值即為$V^\pi(s)$,為數值。
以小蜜蜂之類的遊戲來看,遊戲初始怪物多,那$V^\pi(s)$所得較大,而後期因為怪物殺的差不多了,因此$V^\pi(s)$所得會較小。
從這邊可以發現,State value function是與actor有關,因此定義之前一定要先給定actor。
### Critic
![](https://i.imgur.com/aDuXlfV.png)
將阿光想為actor,而佐為是critic,過往阿光較弱的時候下大馬步飛那可能會有較大的機會出錯,因此是不好的,而變強之後的阿光反而應該是走大馬步飛而不是小馬步飛。
這個案例說明著不同actor即使遇到相同的state也會有不同的結果。
### How to estimate $V^\pi(s)$
![](https://i.imgur.com/07opdIO.png)
有兩種方式可以評估$V^\pi(s)$:
1. Monte-Carlo
* 讓Critic觀察目前的actor-$\pi$的行為,讓actor-$\pi$與環境互動,然後統計actor-$\pi$會得到的reward
* 舉例來說,它在看到$s_a$之後會得到的reward-$G_a$,注意到,這邊所統計的reward是一直到遊戲結束的reward總合,這樣子機器才有辦法看的長遠。
* 因此,機器要學習的就是當看到$s_a$的時候,其$V^\pi(s)$要跟$G_a$愈接近愈好。
### How to estimate $V^\pi(s)$
![](https://i.imgur.com/VZtWq33.png)
2. Temporal-difference
* 我們只看整個互動的其中一小段,某一個$s_t$採取什麼樣的$a_t$而得到多少的$r_t$..
* 假設我們已經知道$V^\pi(s_t)$,它跟下一個時間點$s_{t+1}$之間差了一個$r_t$
* 即$V^\pi(s_t)+r_t=V^\pi(s_{t+1})$
* 機器要學習的就是,$V^\pi(s_t)-V^\pi(s_{t+1})$要愈接近$r_t$愈好。
這麼做的理由在於,有些情況下我們無法計算整個過程的reward,好比有一個機器人,它沒有開始與結束,就只有不斷的與環境互動,這種情況之下就無法使用Monte-Carlo來計算,只能取片段來估測而以。
### MC v.s. TD
![](https://i.imgur.com/fdA8E1Q.png)
| MC | TD |
| -------- | -------- |
| 考慮累計reward-$G$ | 考慮單一reward-$r$ |
|variance較大|variance較小|
|unbiased|May be biased|
這非常直觀,如果每一個step的reward都加入一個noise,TD僅考慮一個step,只加一個noise,而MC是考慮整個step,加入的noise自然較大,因此會擁有較大的Variance。
### MC v.s. TD
![](https://i.imgur.com/wK2Aq6G.png)
這邊案例給出兩個不同模式下的差異,假設你是一個critic,你有上表所列的8筆記錄,其中$s_a$僅出現1次,其reward=0。
此案例的$V^\pi(s_b)$很直觀的就是出現8次,其reward為6,期望值為$\frac{6}{8}$,但$V^\pi(s_a)$就會依你所採用的方式不同而有不同的答案:
* Monte-Carlo:這種情況下,就是統計它的期望值,僅1次且reward=0,因此$V^\pi(s_a)=0$
* Temporal-difference:$V^\pi(s_a)+r=V^\pi(s_b)$,因此$V^\pi(s_a)=\frac{3}{4}$
實際應該取決於你的真實環境,如果$s_b$是一個不受$s_a$干擾的情況,那$s_b=\frac{3}{4}$,但如果是會受干擾的話,那除非$s_b$是放在互動的開頭那才會有reward。
### Actor-Critic
![](https://i.imgur.com/cuX2Cka.png)
現在我們也有Critic,利用Critic來估測Actor:
1. 你有一個Policy-$\pi$
2. 利用$\pi$與環境互動收集到很多的資料
3. 選擇利用TD或MC的方式來學到$V^\pi(s)$
4. 依據$V^\pi(s)$來找到新的$\pi{'}$
5. 再利用$\pi{'}$與環境互動
6. $\vdots$
### Advantage Actor-Critic
![](https://i.imgur.com/yJvzmtP.png)
$\theta^{\pi^{'}}=\theta^\pi+\eta\nabla\bar{R}_{\theta^\pi}$
* $\eta\nabla\bar{R}_{\theta^\pi}$:計算$\theta^\pi$對expected total reward的gradient,以此更新$\theta^\pi$得到$\theta^{\pi^{'}}$
$\nabla\bar{R}_{\theta^\pi}=\dfrac{1}{N}\sum^N_{n=1}\sum^{T_n}_{t=1}R(\tau^n)\nabla\log p(a^n_t \vert s^n_t,\theta^\pi)$
* $R(\tau^n)$:在第$n$次的互動中得到多少的reward
* 原本是讓Actor自己統計自己在整個互動中得到的reward,現在我們要改成讓Critic來幫忙算
* 建議作法:$r^n_t-(V^\pi(s^n_t)-V^\pi(s^n_{t+1}))$
* 這只是A3C論文中的其中一種作法
原本Actor是針對整個過程的reward做計算,得到$R$,但如果採用A3C的話作法如下:
* $r^n_t-(V^\pi(s^n_t)-V^\pi(s^n_{t+1}))$
* $r^n_t$:在state-$s^n_t$的時候採取action-$a^n_t$會得到的reward-$r^n_t$
* $(V^\pi(s^n_t)-V^\pi(s^n_{t+1}))$:這個項目是根據critic估測出來的。
* 依據目前的Policy-$\pi$,其$V^\pi(s^n_t)$與$V^\pi(s^n_{t+1}))$的accumulate value差距有多少
Advantage Actor-Critic告訴我們的就是,當Advantage function的值是正的,那就要增加採取action-$a^n_t$的機率,反之為負則減少。
### Advantage Actor-Critic
![](https://i.imgur.com/E0yjeJE.png)
實作中的小技巧:
1. critic-$V^\pi(s)$與actor-$\pi(s)$的參數是可以共享的
* 如果是玩遊戲,那輸入的前幾層可能利用CNN,這部份是可以共用的
2. 論文中提到,希望actor output的entropy是大的,以entropy來做正規化
* 讓actor output的distribution不要過於集中,而是平滑。這麼做的好處是讓actor在與環境互動的時候能多點探索,過於集中可能就只會回應幾個固定模式。
### Asynchronous
![](https://i.imgur.com/eZogKsA.png)
[image source_Simple Reinforcement Learning with Tensorflow Part 8: Asynchronous Actor-Critic Agents (A3C)](https://medium.com/emergent-future/simple-reinforcement-learning-with-tensorflow-part-8-asynchronous-actor-critic-agents-a3c-c88f72a5e9f2#.68x6na7o9)
Asynchronous的意思指,我們有一個共同參數$\theta^1$,然後同時有很多actor<sub>(簡報上的Worker)</sub>與環境互動,每一個Worker都包含著一個actor與critic:
1. 首先,Worker先將global parameters-$\theta^1$複製過來
2. 利用複製過來的參數$\theta^1$與環境互動
3. 計算更新actor與critic的參數的梯度
4. 資訊送回global parameters更新
這個過程中其它的Worker也同時與環境做互動,其它的Worker也有它們的參數更新回傳至global parameters,因此,也許Worker回傳的global的時候它已經不是原始的$\theta_1$而是$\theta_2$,雖然這麼聽起來有點怪,但實作上確實可行。這麼做的好處是可以增加訓練的速度。
### Pathwise Derivative Policy Gradient
![](https://i.imgur.com/r7YViPq.png)
Pathwise Derivative Policy Gradient與Actor-critic的差異在於,Actor-critic只會回應好壞,但是Pathwise Derivative Policy Gradient是會有建議的。
### Anthor Critic
![](https://i.imgur.com/QZTGiza.png)
這是一個與上面所介紹Critic不同的function,$Q^\pi(s,a)$:
* 輸入為state與action的pair
* 不同於$V^\pi(s)$僅考慮state之後計算期望的reward,$Q^\pi(s,a)$考慮state與action來計算接下來可能得到的reward
* 輸出為scalar,告讓你接下來會得到的reward有多大
如果你的action可以窮舉的話就可以讓$Q^\pi$的輸入單純的只有state,而輸出的部份就可以帶action,每一個dimension都帶有一個action,每一個action會有多少的reward,但再次的說明,這只針對discrete action可行。
### Another Way to use Critic
![](https://i.imgur.com/yoghjVy.png)
假設,$Q^\pi(s,a)$的趨勢是如藍線般,很明顯的$a_1$能得到的reward是低於$a_2$的,這時候機器會讓$a_1$出現的機率降低,而讓$a_2$的機率增加。
但這會有一個問題,那就是機器對於沒有sample過的action,機器並不會知道該增加或是減少它出現的機率。圖示來看,紅線所能得到的reward是最好的,但沒有sample到的話,機器並不會知道,而且actor本身是有隨機性的,除了真的取樣取到,否則不會知道。這種問題在action是很大或者是continuous比較常見。
因此,有一種方法,基本上這個function-$Q^\pi(s,a)$是我們所擬合出來的`nn`,因此我們是知道它的參數,既然知道它的參數那當然知道它的最高點在那。前提是假設這個`nn`的估測是準的。
當我們sample到$a$的時候,只需要將它向左移得到$a'$,就可以得到較大的reward,而不用苦等某年某月某一天去sample到它,這種方式稱為Q-learning。
### Q-Learning
![](https://i.imgur.com/StC38dH.png)
Q-learning與Actor-Critic類似:
* 你有Policy-$\pi$
* Policy-$\pi$與環境互動收集很多資料
* 利用收集到的資料估測$Q^\pi(s,a)$
* 這邊我們估測的是$Q$而不是$V$,因為我們是借由$Q$來產生Policy,而不是$V$
* 找一個比$\pi$還要好的新的$\pi'$
註:說Policy的時候就是指Actor
### Q-Learning
![](https://i.imgur.com/nP12Dvg.png)
所謂比$\pi$還要好的$\pi'$的定義是:
* 對於所有的state而言,$V^{\pi'}(s) \geq V^\pi(s)$
* $V^\pi(s)$:假設我們現在actor是$\pi$,在state-$s$的時候,我們預期接下來的reward有多少
* $V^{\pi'}(s)$:假設我們現在actor是$\pi'$,在state-$s$的時候,我們預期接下來的reward有多少
* 這意昧著不管現在的state是什麼,在actor為$\pi'$的情況下,它的reward都會比actor-$\pi$還要大
$\pi'(s)=arg\max Q^\pi(s,a)$:
* state為給定,為actor的input
* 拿Q-function來看,那一個action可以給Q-function的值最大即為$\pi'$的Output
兩點注意:
1. $\pi'$本身沒有參數,參數是在Q-function(本身為`nn`),要採取那一個action是由Q-function的參數決定。
2. 不適用於action性質為continuous的情況,如果是連續函數,那代表我們需要用gradient ascent來求出最大值,每次都要計算一次,曠日費時。(後續說明)
### Q-Learning
![](https://i.imgur.com/G2edrbf.png)
現在要證明$\pi'(s)=arg\max Q^\pi(s,a)$可以滿足$V^{\pi'}(s) \geq V^\pi(s)$ for all state-$s$這件事是對的:
* $V^\pi(s)=Q^\pi(s,\pi(s))$
* $V^\pi(s)$:在state-$s$,用actor-$\pi$與環境互動期望得到的reward
* $Q^\pi(s,\pi(s))$:在state-$s$採取action-$\pi(s)$會得到的reward,如果actor為$\pi$,那它採取的action就是$\pi(s)$
* $V^\pi(s)=Q^\pi(s,\pi(s)) \leq \max_aQ^\pi(s,a)$
* Q-function不變情況下,窮舉所有可能的action-$a$帶入$Q^\pi(s,a)$。很明顯的,$\max Q^\pi(s,a)$是一個upper bound。
* $V^\pi(s)=Q^\pi(s,\pi(s)) \leq \max_aQ^\pi(s,a)=Q^\pi(s,\pi'(s))$
* 那一個actor會採取一個讓$Q^\pi(s,a)$的值最大,那它就是$\pi'$,即$Q^\pi(s,\pi'(s))$
* 直觀來看就是,在state-$s$,用$\pi(s)$這個action來與環境互動,剩下的都用$\pi$與環境互動,其所得的reward會比沒有使用action-$\pi'(s)$還要大。
將數學式展開:
* $V^\pi(s) \leq Q^\pi(s, \pi'(s))$
* $=E_{\pi'}\left[r_{t+1} + V^\pi(s_{t+1}) \vert s_t = s\right]$
* 假設$s = s_t$,$Q$就等於$r_{t+1} + V^\pi(s_{t+1})$
* $\leq E_{\pi'}\left[r_{t+1} + Q^\pi(s_{t+1},\pi'(s_{t+1})) \vert s_t = s\right]$
* 帶入上面推導出來的upper bound
* $=E_{\pi'}\left[r_{t+1} + r_{t+2} + V^\pi(s_{t+2}) \vert s_t = s\right]$
* $\leq E_{\pi'}\left[r_{t+1} + r_{t+2} + Q^\pi(s_{t+2},\pi'(s_{t+2})) \vert s_t = s\right]$
* $\dots \leq V^{\pi'}(s)$
假如給我們一個Actor-$\pi$,我們可以計算出它的Q-function,那我們就可以找到另外一個$\pi'$,它比原來的$\pi$還要更好。還要更好所指的就是$V^\pi(s) \leq V^{\pi'}(s)$。
### Estimate $Q^\pi(s,a) by TD$
![](https://i.imgur.com/A9hFcVI.png)
找$Q$可以用MC,也可以用TD。
假設現在的序列為$s_t, a_t, r_t, s_{t+1}$:
* 我們可以計算出$Q^\pi(s_t,a_t)$
* 只知道$s_{t+1}$,但不知道機器會採取那一個action-$a_{t+1}$,但我們可以預期機器會採取的action-$\pi(s_{t+1})$
* 兩個時步中間會有一個差距,即$r_t$
* 利用Gradient descent來求解
* $Q^\pi(s_t,a_t)$與$r_t + Q^\pi(s_{t+1}, \pi(s_{t+1}))$愈接近愈好
實作上這兩個Q是相同的function,相同的參數,如果同時訓練會讓結果較不穩定,因此訓練的時候會將其中一個凍結,視為target,讓沒凍結的那個Q-function去擬合另一個已凍結的Q的Output,幾次迭代之後再將參數copy給另一個凍結的Q。
### Double DQN
![](https://i.imgur.com/W7KvTzz.png)
實作Q-learning的時候很容易高估Q值,假設有四個action,其$Q(s_{t+1},a)$如下圖:
![](https://i.imgur.com/1ZRBlZK.png)
因為$Q(s_{t+1},a)$是估測出來的值,因此可能存在誤差,其誤差值有大有小,有正有負,而我們每次選擇都會選擇最大的那個:
![](https://i.imgur.com/rO6DdUR.png)
我們就發現到,當Q值有誤差的時候,我們通常都會選到高估的那個action,這時候訓練出來的結果也會是高估的。
### Double DQN
![](https://i.imgur.com/y94N0dZ.png)
[論文連結_Double Q-learning](https://papers.nips.cc/paper/3964-double-q-learning)
[論文連結_Deep Reinforcement Learning with Double Q-learning](https://arxiv.org/abs/1509.06461?context=cs)
對於這種高估的問題有一種處理技巧-Doule DQN,這個技巧需要兩個Q-function,$\mathsf{Q}$與$\mathsf{Q}'$:
* 一個計算Q value($\mathsf{Q}'$),一個決定採取那一個action($\mathsf{Q}$)
* 原始作法是用同一個Q-function來決定action,以及估測reward期望值
直觀來看,如果Q-value被高估,那代表$\mathsf{Q}$選出來的action是被估高的,但只要$\mathsf{Q}'$沒有高估$\mathsf{Q}$選出來的action就可以了。即使$\mathsf{Q}'$高估某一個action,但只要$\mathsf{Q}$沒有選到那個action就沒事了,兩者互相制衡。
### Dueling DQN
![](https://i.imgur.com/HMVWP1g.png)
[論文連結_Dueling Network Architectures for Deep Reinforcement Learning](http://proceedings.mlr.press/v48/wangf16.pdf)
Dueling是決鬥的意思,與原始DQN的差異僅在Output前:
* 最後的Output之前會分叉會兩條路,其中一條只會Output一個value-$V(s)$,另一條會Output一個Vector-$\mathsf{A}$,其維度與最終輸出的action-$\mathsf{a}$一致,而$\mathsf{A}(s,a)+\mathsf{V}(s)=\mathsf{Q}(s,a)$。
* 論文中對於實作有另外的技巧避免$\mathsf{V}(s)=0$,這部份有興趣的話可以直接閱讀論文。
* $\mathsf{A}(s,a)$:在state-$s$採取action-$a$,它比原來的Policy還要好多少。
Dueling DQN實作上比DQN的效果還要好,其中一點有趣的是它的可視化,它可以計算如何改變輸入(image)對$\mathsf{V}(s)$以及$\mathsf{A}(s,a)$的影響最大,這樣就可以看的出什麼樣的事情是與action有關,而什麼是無關的。
### Dueling DQN - Visualization
![](https://i.imgur.com/Wo9Xmho.png)
[論文影片連結](https://www.youtube.com/playlist?list=PLVFXyCSfS2Pau0gBh0mwTxDmutywWyFBP)
影片可以看的到,左邊會一直有紅色的閃光出來,這意味著這邊的pixel改變的時候對$\mathsf{V}(s)=0$的影響最大。而右邊是顯示對$\mathsf{A}(s,a)$(Advantage-function)影響最大的改變。
可以看的到,Advantage-function在車子出現在眼前的時候才會紅,因為車子靠近之後採取不同的action才會對結果有影響。但左邊的Value是每通過一輛車就會紅,它跟有沒有車有關,只要地平線的那端出現車子就會紅。
另一段打磚塊遊戲也是一樣的道理,左邊Value幾乎都有值,而接近下面的時候Advantage-function才會紅。
### Pathwise Derivative Policy Gradient
![](https://i.imgur.com/8QmQkqk.png)
稍早的Q-learning中提到,只要有$\mathsf{Q}$,我們就找的到$\pi'$,不需要任何的actor。但如果現在我們有一個actor,而它的output就是我們要採取的action-$a$,那是什麼情況?
假設我們有一個actor-$\pi$,input-$s$,output-$a$,然後要更新$\pi$為$\pi'$,而且我們希望$Q^\pi(s,a)$的值愈大愈好。
實務上,如下圖所示,我們可以將整個串接起來視為一個較大的神經網路即可:
![](https://i.imgur.com/mZkwFjv.png)
當我們在更新actor的時候,就將$Q^\pi$的參數固定住,再用Gradient Ascent來更新actor的參數:
* $\theta^{\pi'} \leftarrow \theta^\pi + \eta \nabla_{\theta^\pi}Q^\pi(s,a)$
* 計算$\theta_\pi$對Q-function的梯度再加上$\theta_\pi$得到$\theta^{\pi'}$
整個架構看起來跟GAN非常類似,但這種作法稱為Pathwise Derivative Policy Gradient
### Pathwise Derivative Policy Gradient
![](https://i.imgur.com/DXy29Jb.png)
與Q-Learning一樣有三步驟,在估測Q-function的時候與一般的DQN是一樣的,不同的地方是在估測$\pi'$的部份。原始DQN中只需要有Q-function就夠,但在Pathwise Derivative Policy Gradient中是需要一個actor(`nn`)來得到action,然後透過調整actor的參數讓Q-function的Output愈大愈好。
這種情況下即使action是連續的也沒有關係,因為在testing的時候我們並不需要解一個$arg\max$的問題,這部份是在training的時候處理掉了,testing的時候只需要input state就可以。
有一個通用的小技巧,就是Replay Buffer。意思是將過去與環境互動的所有資訊通通存下來放到一個Buffer內,訓練Q-function過程中再從這個Buffer中取值出來,並不單純只取$\pi$與環境互動的經驗,還會包含過去其它的actor與環境互動的經驗也都在裡面,這樣訓練過程會比較穩定。
另外一個小技巧,就是對actor的output加上noise,這可以幫助actor探索不同的環境。
### DDPG Alogrithm
![](https://i.imgur.com/lACJ0W2.png)
DDPG=Deep Deterministic Policy Gradient
DDPG也是我們稍早所提到的Pathwise Derivative Policy Gradient的其中一種方式:
* 有一個actor與critic,其初始化參數分別為critic-$\theta^Q$與actor-$\theta^\pi$
* 有一個target critic-$\theta^{Q'}$與有一個target actor-$\theta^{\pi'}$
* 這是估測Q-function的時候用的
* 初始化一個replay buffer R
* 每次的迭代
* 用actor-$\pi$與環境互動,input-s,output-a,即$\pi(s)$,再針對Output加上noise,即$\pi(s)$ + noise來幫助actor探索環境,並收集一堆訓練資料,將它們存放到Reply buffer-R。
* 訓練資料結構為$\left\{s_t,a_t,r_t,s_{t+1}\right\}$
* 從Reply buffer-R中sample出N筆資料
* 利用取出的N筆資料訓練critic-Q
* 調整Q的參數讓它與目標函數$L=\sum_n(\hat{y}_n-Q(s_n,a_n))^2$愈接近愈好
* target-$\hat{y}_n=r_n+Q'(s_{n+1},\pi'(s_{n+1}))$
* 以target actor-$\theta^{\pi'}$根據$s_{n+1}$決定要採取什麼樣的action,得到$Q'$之後加上$r_n$
* 更新actor-$\pi$的參數,讓Q-function的值增加
* 更新target network
* $\theta^{\pi'} \leftarrow m\theta^\pi + (1-m)\theta^{\pi'}$
* $\theta^{Q'} \leftarrow m\theta^Q + (1-m)\theta^{Q'}$
* 理論上可以直接讓$\theta^\pi=\theta^{\pi'},\theta^{Q'}=\theta^Q$,但實務上我們會讓target networks乘上一個weight再與critic、actor做計算。
* 這麼做的好處是,target networks的變化會比較慢,訓練上也會比較穩定。