# 李宏毅_ML_Lecture_23-1 ###### tags: `Hung-yi Lee` `NTU` `Machine Learning` [課程撥放清單](https://www.youtube.com/channel/UC2ggjtuuWvxrHHHiaDH1dlQ/playlists) ML Lecture 23-1: Deep Reinforcement Learning [課程連結](https://www.youtube.com/watch?v=W8XF3ME8G2I&list=PLJV_el3uVTsPy9oCRY30oBPNLCo89yu49&index=33) ### Scenario of Reinforcement Learning ![](https://i.imgur.com/nGguKmU.png) 談Reinforcement Learning之前要先瞭解: * Agent * Environment * Observation * 常見用語為State * 意指Environment的狀態,為Machine所看到的東西 * Action * Machine做的事情 * 與Environment互動來影響Environment * Reward * Machine在Action之後會對Environment造成影響並得到Reward 舉例來說,Machine看到一杯水,並打翻它,那就得到一個負值報酬,而因為水已經被打翻了,因此下一個時間點所看到的就是水被打翻的狀態,這時候它決定把地擦乾淨,因此得到一個正值報酬。 機器學習的目標就是根據過去的經驗讓Reward被最大化的Action。 ### Learning to paly Go ![](https://i.imgur.com/C5afZKW.png) 以AlphaGO為例 1. 機器的Observation(State)就是棋盤 * 棋盤用19x19的Matrix來描述它 2. 接著它take一個Action * 即落子的位置 3. 在圍棋中Environment就是對手,落子的位置影響對手的反應。 4. 機器看到下一個Observation,再決定它的Action,又影響Environment.... 在這個案例子,多數情況下Action之後的Reward是0,只有在最後才知道輸(-1)或贏(1),那時候才能決定Reward,因此它的困難點在於如何讓機器在只有少數情況下才會有Reward的情形中去發現正確的Action。 ### Learning to paly Go - Supervised v.s. Reinforcement ![](https://i.imgur.com/LR91i98.png) 如果是利用Supervised Learning,那就是看到什麼盤勢來決定下一子怎麼落子,雖然可以利用棋譜來學會下棋,但可能不是最強的,這種學習方式就像是Machine從一個老師身上學到如何下棋。 但利用Reinforcement的話卻不是這樣,它是從過去的經驗來學習怎麼下棋,沒有人教它。 在圍棋這個任務中,機器需要大量的訓練資料,也許下個三千萬盤棋之後它才會變的厲害,也因為沒有人可以跟電腦下三千萬盤,因此AlphaGo的做法是讓機器互下。 ### Learning a chat-bot - Supervised v.s. Reinforcement ![](https://i.imgur.com/qKXXiAz.png) 應用於Chat-bot上的話,Supervised會教機器聽到一句之後的下一句如何回覆,而Reinforcement不是,它會胡亂說到最後讓人爆氣,它就知道剛才可能有錯,但它也不知道是那一句錯,但慢慢的它真的就自己學習的到。 ### Learning a chat-bot - Reinforcement Learning ![](https://i.imgur.com/5Okcf0x.png) 作法上就是採用Alpha Go的方式,讓兩個機器人自己去胡亂對話。 ### Learning a chat-bot - Reinforcement Learning ![](https://i.imgur.com/FDezIYc.png) 但一個問題在於,兩個機器人胡亂說了一堆之後你也不知道到底說的好不好,因此要從幾百、千萬中對話中評核也是一個問題,未來或許有人會利用GAN,讓Discriminator來判斷對話像不像人,以此做為Reward。 ### More applicaitons ![](https://i.imgur.com/YipQ0oL.png) 也可以應用在交互式對話,使用者問了一個問題,機器反問想問的是否為某一個問題,以此來取得Reward,只是機器只要問一個問題就是一個Negative Reward,因為這造成了人的困擾。 ### More applications ![](https://i.imgur.com/dXkSQMm.png) ### Example: Playing Video Game ![](https://i.imgur.com/E7VJvO5.png) 目前強化學習最常應用在電玩領域中,這時候Agent跟遊戲內的AI並不相同,因為Agent的角色跟人一樣,以看到的內容為主。 後續會以小蜜蜂為例說明。 ### Example: Playing Video Game ![](https://i.imgur.com/VFcpdqa.png) Scenario如下: 1. Machine看到畫面($S_1$),即畫面中的Pixel * 這個畫面就是Observation(State) * Matrix,三維的tensor 2. Machine決定Action * 每次Action之後得到Reward * $a_1$:right * Reward:0 * 因為單純的向右 * Action之後影響Environment * Environment會有Random變化,但這個變化跟Machine take Action是沒有關係的 * 像畫面中外星人射出子彈,這跟Action無關 3. Machine看到畫面($S_2$),即向右一步之後的畫面 * $a_2$: 射擊 * 成功射殺,Reward:5 4. $S_3$為少一隻外星人的畫面 這個程序一直進行下去... ### Example: Playing Video Game ![](https://i.imgur.com/vHFXUUU.png) 程式會一直執行到$a_T$的時候,$r_T$進入另外的State,一個terminal state,代表遊戲結束。 遊戲的開始到結束稱為一個episode,機器學習的就是如何在一個episode中Maximize Reward。 ### Difficulties of Reinforcement Learning ![](https://i.imgur.com/Duyos1e.png) 強化學習的難處有幾點: 1. Reward的出現是有延遲的 * 小蜜蜂為例,只有在射擊的時候才會得到Reward,如果機器只學如何射擊的話,就不會左右移動了,但左右移動卻可以幫助機器在未來得到Reward。 * Agent的任何行為都會影響看到的東西,因此Agent要學會探索世界 * 如果小蜜蜂不射擊就永遠不知道射擊可以得到Reward。 ### Outline ![](https://i.imgur.com/uA6rdJF.png) 目前強化學習分成兩大塊: 1. Policy-based * 訓練一個負責做事的Actor 3. Value-based * 訓練一個不做事的Critic 兩個加起來就是Actor-Critic,課程中就會說明A3C<sub>(Asynchronous Advantage Actor-Critic)</sub> AlphaGo裡面涵蓋了policy-based、value-based、model-based Model-based: 對未來事件的理解,預測未來會發生什麼事,這種方式應用於棋類遊戲比較有用,電玩應用上沒見到較好的範例,棋類雖然未來狀況多,但還是可以窮舉,但電玩的話比較難以窮舉。 ### To learn deep reinforcement learning... ![](https://i.imgur.com/E943Gaa.png) ### Machine Learning - Looking for a Function ![](https://i.imgur.com/FHPJEmY.png) Reinforcement Learning也是Machine Learing的一種,做的事情也是找一個Function,Actor。 Actor就是一個Function: * input:機器看到的Observation * output:機器要採取的Action 利用Reward來協助找到這個Function,也就是Actor。 符號約定: $\pi$:表示Actor,部份文獻稱為Policy ### Three Steps for Deep Learning ![](https://i.imgur.com/wFjqllr.png) 強化學習三步驟: 1. 定義function * NN決定function space * Actor可以是一個NN * 如果Actor是NN,那就是Deep Reinforcement Learning 2. 決定function的好壞 * 衡量Actor的好壞 3. 選擇最好的Actor * 利用Gradient Ascent ### Neural network as Actor ![](https://i.imgur.com/XHaeYnn.png) 假設我們用NN來當做Actor: * Input就是機器看到的Observation,就是一堆Pixel,用一個vector或matrix來描述 * 理論上使用CNN * Output就是要採取的Action * 有幾個可以採取的Action,Output就有幾個Dimension 以小蜜蜂為例,它的Output就會有三個Dimension(左移、右移、射擊),Input就直接利用CNN將Observation輸入,最後輸出每一個Action的分數。 Policy Gradient通常假設Actor<sub>(Policy)</sub>是Stochastic<sub>(隨機)</sub>,意思就是,Policy的Output是機率,上圖為例,即是70%會left,20%會right,10%會fire。 部份時候採用Stochastic是有好處的,如果Actor是deterministic,那就可能跟小叮噹一樣一直出石頭。 後續的課程都假設Actor為Stochastic 相較於傳統作法使用table來記錄Observation與Action的對應,利用NN的優點在於它可以舉一反三,即使沒有看過的畫面,最終還是會有一個輸出。 ### Goodness of Actor ![](https://i.imgur.com/SXcJOi2.png) 在Supervised Learning中決定好壞的方式就是定義Loss,然後最小化Cost Function。 ### Goodness of Actor ![](https://i.imgur.com/T83CDO1.png) 強化學習中定義Actor的好壞也是類似的方式,Actor就是一個NN,它的參數是$\theta$,因此我們用$\pi_\theta$來表示Actor * Actor:$\pi_\theta$ * 一個Actor就是一個function * input:$S$ * Actor看到的Observation * $R_\theta$:遊戲結束之後的Total Reward * $r_1+r_2...+r_T$ * Total Reward就是我們要Maximize的對象 * 並非優化每一個step 即使相同的Actor,不同的episode也會有不同的結果<sub>(每次的$R_\theta$不同)</sub>,理由如下: 1. Actor採Stochastic,即使看到相同場景、相同參數也會採取不同的Action,因此每次得到的$R_\theta$也不同 2. 遊戲本身的隨機性,即使採取相同的Action,每次看到的Observation也不一樣,因此,$R_\theta$本身是一個Random-Variable 我們要做的並不是最大化某一次遊戲得到的$R_\theta$,而是$R_\theta$的期望值,$\bar{R}_\theta$。拿同一個Actor玩了N次遊戲之後,我們希望$\bar{R}_\theta$愈大愈好。 這個期望值,就是用來衡量Actor的好壞。 符號約定: $\bar{R}_\theta$:Actor的期望值 ### Goodness of Actor ![](https://i.imgur.com/Jm1PeCM.png) 期望值的計算方式: * 一場遊戲就是一個$\tau$ * $\tau$為sequence,包含Observation、看到Observation之後的Action、Action之後的Reward.... * $R(\tau)$代表這個trajectory<sub>(軌跡)</sub>在這場遊戲中最終得到的Total Reward * 加總所有的$r$ * 使用某一個Actor玩遊戲的時候,每一個$\tau$都會有一個出現的機率 * $\tau$代表某一種可能的從遊戲開始到結束的過程,這過程有千千百百種 * i.e. 某個較弱的Actor都會自己去吃子彈,那會看到這個Actor的每一個$\tau$都會自己控制去吃子彈自殺 * 每一個遊戲出現的過程都可以用機率來描述它,即$P(\tau|\theta)$ * 當Actor的參數是$\theta$的時候,這個$\tau$(遊戲過程)出現的機率 期望值$\bar{R}_\theta=\sum_\tau R(\tau)P(\tau|\theta)$ * 即加總所有可能的$\tau$(遊戲過程) * $\tau$的所有可能性難以窮舉,但我們假設可以窮舉 * 每一個$\tau$都有它的機率$P(\tau|\theta)$跟它的Reward$R(\tau)$ * 相乘之後加總,就可以得到這個Actor的期望Reward 實際上窮舉是不可能的,因此我們讓Actor去玩N場遊戲<sub>(代表擁有N筆訓練資料)</sub>,玩N場遊戲就像是從$P(\tau|\theta)$sample出N個$\tau$,如果某個$\tau$機率特別大,那它就很容易被取出。 最後將N個$\tau$的Reward計算出來平均,所得的值就可以近似我們的期望函數。 ### Gradient Ascent ![](https://i.imgur.com/bt1JJ7p.png) 我們的目標函數(Objective Function)就是找一個參數來最大化$\bar{R}_\theta$,解法就是利用Gradient Ascent<sub>(因為我們要最大化)</sub>。 作法如下: 1. 隨機初始$\theta^0$ 2. 計算使用$\theta^0$的Actor,$\theta^0$對$\bar{R}_{\theta^0}$的微分 3. 更新參數得到$\theta^1$ 4. 計算$\theta^1$對$\bar{R}_{\theta^1}$的微分 5. 更新參數得到$\theta^2$ 6. ..... ### Gradient Ascent ![](https://i.imgur.com/3RQvzfF.png) 因為$R(\tau)$對$\bar{R}_{\theta}$沒有影響,只需要計算$P(\tau|\theta)$,因此即使$R(\tau)$是不可微的也不影響,因為本來就不會計算它的微分。即使$R(\tau)$根本是個黑盒子,我們只知道它最終會給我們一個Reward。 推導過程如下: $\nabla\bar{R}_\theta=\sum_\tau R(\tau)\nabla P(\tau|\theta)=\sum_\tau R(\tau)P(\tau|\theta)\dfrac{\nabla P(\tau|\theta)}{P(\tau|\theta)}$ * 基本上這並沒有讓數學式不同,只是為了轉換過程使用,因為分子分母加入了$P(\tau|\theta)$ $\sum_\tau R(\tau)P(\tau|\theta)\dfrac{\nabla P(\tau|\theta)}{P(\tau|\theta)}=\sum_\tau R(\tau)P(\tau|\theta)\nabla logP(\tau|\theta)$ * 轉換如方框所示 之前提過,當看到紅框處的部份,我們可以將它視為Sampling,因此可以看成利用$\theta$玩N次遊戲得到$\tau^1...\tau^N$,因此近似如下: $\dfrac{1}{N}\sum^N_{n=1}R(\tau^n)\nabla logP(\tau^n|\theta)$ ### Gradient Ascent ![](https://i.imgur.com/HRUMStg.png) $\nabla logP(\tau^n|\theta)$ $P(\tau|\theta)=$ $p(s_1)$:遊戲開始畫面出現的機率 $p(a_1|s_1,\theta)$:根據$\theta$在$s_1$會有一定的機率採用$a_1$ $p(r_1,s_2|s_1,a_1)$:根據在$s_1$採取$a_1$,你得到了$r_1$然後跳到$s_2$ $p(a_2|s_2,\theta)$:根據$s_2$採取$a_1$,這取決於$\theta$ $p(r_2,s_3|s_2,a_2)$:看到$s_2,a_2$得到$r_2, s_3$ $=p(s_1)\prod_{t=1}^Tp(a_t|s_t,\theta)p(r_t,s_{t+1}|s_t,a_t)$ 其中兩項底線畫起的部份是與Actor無關,僅紅線底項是有關的 ### Gradient Ascent ![](https://i.imgur.com/EmOjzhC.png) $\nabla logP(\tau^n|\theta)$ $P(\tau|\theta)=p(s_1)\prod_{t=1}^Tp(a_t|s_t,\theta)p(r_t,s_{t+1}|s_t,a_t)$ 將所得數學式取log,如下: $logP(\tau|\theta)=logp(s_1)+\sum^T_{t=1}logp(a_t|s_t,\theta)+logp(r_t,s_{t+1}|s_t,a_t)$ 接著對$\theta$做Gradient,與$\theta$無關的項目就可以直接忽略,如下: $\nabla logP(\tau|\theta)=\sum^T_{t=1}\nabla logp(a_t|s_t,\theta)$ ### Gradient Ascent ![](https://i.imgur.com/U3bpOSc.png) 最終,$\bar{R}_\theta$就接近於取N個$\tau$,每一個$\tau$都計算出它的Reward,再乘上每一個$\tau$出現的機率的log的Gradient,如下: $\nabla \bar{R}_\theta \approx \dfrac{1}{N}\sum_{n=1}^NR(\tau^n)\nabla logP(\tau^n|\theta)$ 其中$\nabla logP(\tau^n|\theta)$可以視為加總在這個$\tau$內所有採取過的Action的機率取log的Gradient,如下: $\sum_{t=1}^{T_n}\nabla logp(a_t^n|S_t^n,\theta)$ 再調整順序之後得到最終的數學式如下: $\dfrac{1}{N}\sum_{n=1}^N\sum_{t=1}^{T_n}R(\tau^n)\nabla logp(a_t^n|s_t^n,\theta)$ * $\nabla logp(a_t^n|s_t^n,\theta)$:在資料集中,根據Model計算$s^n_t$這個State中,我們曾經採取$a^n_t$這個Action的機率取log計算梯度 * $R(\tau^n)$:在$s^n_t$採取$a^n_t$的遊戲中得到的Total Reward。 * 這邊計算是整個遊戲中所產生的Reward,而不是採取該Action所得到的Reward。 * 這麼做的原因在於,如果僅考慮該Action的Reward,那機器只會一直射擊而不會左右移動,因為只有射擊才會得到Reward。 直觀來看,在$\tau^n$的過程中,在$s^n_t$採取$a^n_t$,我們希望得到的Reward是一個正值,而且這個機率$p(a_t^n|s_t^n)$愈大愈好,因此我們會更新模型,讓機器在$s^n_t$的時候採取$a^n_t$的機率愈大愈好。 相反的,如果在$s^n_t$採取$a^n_t$得到的是一個負Reward,那我們就會希望後續在相同的Observation(State)的時候它採取$a^n_t$的機率愈小愈好。 ### Gradient Ascent ![](https://i.imgur.com/7phKIg1.png) $\nabla logp(a_t^n|s_t^n,\theta)=\dfrac{\nabla p(a_t^n|s_t^n,\theta)}{p(a_t^n|s_t^n,\theta)}$ 機率在取log之後得到數學式如上,對於取log原因說明如下: * 在相同的Observation情況下,因為Actor是Stochastic,因此即使相同的Observation也不會採取相同的Action,有三次決定採取Action-b-Reward:1,一次採取Action-a-Reward:2,即使Action-a所得Reward為2較高,但是我們所計算的是加總所有出現的結果<sub>(結果就是b出現的次數較多)</sub>,因此機器後續取樣的時候會偏好於Action-b。 * 除掉機率就如同做Normalization,當某一個Action出現機率較高,那它所除掉的值就較大,更新之後機器就不會偏好於出現機率較高的Action。 ### Add a Baseline ![](https://i.imgur.com/FeKQwTG.png) 理論來說,如果Reward皆為正數不會構成問題,假設某一個State可以採取三個Action,而三個Action得到的Reward皆為正,但所得有多有少,有大有小,假設a、c的$R(\tau)$較大,而b較小,在更新之後,ac出現的機率還是會較大b來的大。 但實作中,我們是隨機取樣,某一個Action是有可能不被採樣到,因此機器永遠不知道它的$R(\tau)$有多大,在更新之後它的機率自然就會減少,而被採取到的就會增加。 因此我們希望$R(\tau)$是有正負值,而不是單純的正值,作法上,可以直接將$R(\tau)$減掉一個bias-b-baseline,意思就是你的$R(\tau)$必須大過這個baseline,那它得到的才會是正值,它的Action機率才會增加,沒超過就得到負值,機率就減少,這樣就不會造成單純沒有被取樣到的機率減少。