# 李宏毅_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的變化會比較慢,訓練上也會比較穩定。