# 李宏毅_ATDL_DRL Lecture 3 ###### tags: `Hung-yi Lee` `NTU` `Deep Reinforcement Learning` [課程撥放清單](https://www.youtube.com/playlist?list=PLJV_el3uVTsODxQFgzMzPLa16h6B8kWM_) ## DRL Lecture 3: Q-learning (Basic Idea) [課程連結](https://www.youtube.com/watch?v=o_g9JUMw1Oc&list=PLJV_el3uVTsODxQFgzMzPLa16h6B8kWM_&index=3) ### Critic ![](https://i.imgur.com/YoBhvm6.png) Q-learning是value-based,訓練的並不是policy,而是critic。critic本身並不會有直接的行為,而是評價現在的行為actor-$\pi$有多好或多不好。 假設actor為$\pi$,以這個$\pi$與環境互動,假設這個actor-$\pi$看到某一個state-$s$,接下來一直到遊戲結束所累積的reward(cumulated reward)的期望值有多大,即為state value function-$V^\pi(s)$。 $V^\pi(s)$: * input state-$s$ * output scalar 畫面上兩個遊戲範例: * 左圖:遊戲初期,因此預期的reward會比較大 * 右圖:怪已不多,因此預期的reward會比較小 Critic的output有多大取決於state-$s$與actor-$\pi$,因此,一個critic一定綁定一個actor,因為它衡量的是actor的好壞,而不是state。 ### Critic ![](https://i.imgur.com/Jn7bqmw.png) 以棋靈王為例,以前佐為教阿光要下小馬步飛,但現在要阿光下大馬步飛,這是因為能力的不同。因此,如果阿光是actor的話,以前的阿光下大馬步飛,那critic所評估出來的reward會是不好的,但現在是變強的阿光做為actor,一樣下大馬步飛,critic所評估出來的reward反而會是好的。 這邊要說明的是,state value function是取決於你的actor,當actor改變的時候,state value function的output也會跟著變。 ### How to estimate $V^\pi(s)$ ![](https://i.imgur.com/wTW2grZ.png) 要估測$V^\pi(s)$有兩種方式,其中一種為Monte-Carlo(MC) based approach: * 讓actor與環境互動給critic看 * 當actor看到$s_a$,接下來所得到的cumulated reward-$G_a$有多大 * 當actor看到$s_b$,接下來所得到的cumulated reward-$G_b$有多大 * MC-based需要每次計算所有reward-$G$的總合,因此要遊戲結束才能做統計,遊戲時間太長的話可能收搜到的資料不多,也過於花費時間。 實際上我們並沒有辦法掃過所有的state,但$V^\pi(s)$是一個`nn`,因此即使是沒有看過的state,模型還是會給出一個值。在已經知道真正output的情況下,我們會希望$V^\pi(s)$的output愈接近$G$愈好,很明顯的這是一個迴歸問題。 ### How to estimate $V^\pi(s)$ ![](https://i.imgur.com/JdQue09.png) 另一種估測$V^\pi(s)$為Temporal-difference(TD) approach: * 不需要整個遊戲結束,只需要$\left\{ s_t, a_t, r_t, s_{t+1} \right\}$ * $V^\pi(s_t)=V^\pi(s_{t+1})+r_t$ * 這個時步所得的cumulated reward會是下一個時步的cumulated reward加上這個時步所得的reward * 將$s_t$的output-$v^\pi(s_t)$減掉$s_{t+1}$的output-$V^\pi(s_{t+1})$的值愈接近$r_t$愈好 ### MC v.s. TD ![](https://i.imgur.com/uki9ZyC.png) MC與TD的差別: * MC的variance較大 * 遊戲本身有隨機性,因此$G_a$可以想成是一個random variable * 相同的$s_a$所得到的$G_a$是不一樣的,而且每次所得的值差異也很大,因為$G_a$是很多不同時步的reward的總合 * TD的variance較小 * 有隨機性的是$r$,因為相同的$s_t$所得到的reward不一定是相同的,但這個隨機性只在$r$而不像MC是整個$G$ * state value function-$V$不見得估測的準,如果不準的話所得到結果也不一定是好的 後續會說明到MC、TD合併的版本。 ### MC v.s. TD ![](https://i.imgur.com/pWtQTvL.png) 範例是有一個actor-$\pi$與環境互動八次得到的遊戲結果,以此估測state vaule: * $V^\pi(s_b)=\dfrac{3}{4}$ * 以記錄來看,八次出現$s_b$總共得到六分,因此為$\dfrac{6}{8}$ * $V^\pi(s_b)=???? 0? \dfrac{3}{4}?$ * Monte-Carlo:$V^\pi(s_a)=0$ * 因為遊戲得到的reward為0 * Temporal-difference:$V^\pi(s_a)=\dfrac{3}{4}$ * $V^\pi(s_a)=V^\pi(s_b) + r$ 這邊可以看的出來,MC、TD兩種方法所估測出來的結果是不一樣的,即使是相同的資料集。 ### Another Critic ![](https://i.imgur.com/brLxcW2.png) 另一種作法為Q-function,State-action value function-$Q^\pi(s, a)$: * 不同於State value function僅考慮state,Q-function,考慮了state與action的pair * 在某一個state採取某一個action,假設使用actor-$\pi$的情況下,其cumulated reward的期望值有多少 * 需要注意的是,actor-$\pi$在看到state-$s$的時候,它採取的action不一定是$a$,但在Q-function的假設是,在state-$s$,強制執行action-$a$,然後以actor-$\pi$一直玩下去所得到的期望值才是$Q^\pi(s, a)$ Q-function有兩種的表示方式: 1. input state-action pair output scalar 2. input state output multi value,但這必需在action為discrete的情況下才可以,這時候的Q value所代表的是執行不同action所得到的reward。 ### State-action value function ![](https://i.imgur.com/oIiQDrK.png) [論文連結_MnihEtAlHassibis15NatureControlDeepRL.pdf](https://web.stanford.edu/class/psych209/Readings/MnihEtAlHassibis15NatureControlDeepRL.pdf) 上面的桌球範例: 1. 圖一說明,這個時間點所執行的三個動作(不動、上、下)一直到遊戲結束所預期得到的reward都不差多 2. 圖二說明,球已經彈上去了,要向上才會有reward 3. 圖三與圖二一樣,如果不向上接球,那就得不到reward 4. 圖四因為球彈回去了,而且已經贏了,因此那一個action都一樣 ### Another Way to use Critic: Q-Learning ![](https://i.imgur.com/2vTSdmg.png) 表面上Q-function只能用來評估actor的好壞,但實際上有Q-function就可以實作RL,就可以決定要採取的action。 假設有一個初始actor-$\pi$,很爛,隨機都沒有關係,與環境互動之後收集很多資料,接下來learn一個actor-$\pi$的Q-value($Q^\pi(s,a)$)來衡量actor-$\pi$在某一個state強制某一個action接下來會得到的expected reward。 只要能夠學習一個policy-$pi$的Q-function就保證可以找到一個新的policy-$\pi'$,而且$\pi'$一定比原來的$\pi$還要好。這樣的循環一直下去就可以讓policy愈來愈好。 ### Q-Learning ![](https://i.imgur.com/oANBpjs.png) 這邊說明剛才的為什麼一定找的到更好的$\pi'$: * 什麼叫做比較好? * 對同一個state-$s$而來$\pi$的value function一定小於$\pi'$的value function * 如何決定$\pi'$? * 依據$\pi'(s)=arg \max_a Q^\pi(s, a)$ * 假設已經訓練出$\pi$的Q-function,在state-$s$的時候,將所有可能的action-$a$都帶入,看那一個action可以讓Q-function的output最大 * 要注意到,Q-function的定義,在state-$s$的時候,policy-$\pi$並不一定會採取action-$a$。因此在某一個state-$s$的時候要強制採取某一個action-$a$,然後用$\pi$繼續互動下去,得到的expected reward。 * 再次強調,在state-$s$不一定會採取action-$a$。因此在$\pi'$在state-$s$所採取的action-$a$與$\pi$不一定一樣,但$\pi'$所採取的action會得到較大expected reward。 因此,實際上並沒有一個policy叫做$\pi'$,$\pi'$其實是由Q-function所推出來,並沒有另一個`nn`來決定$\pi'$怎麼interaction,只需要Q-function就可以找出$\pi'$ 後續會再說明如果action是continous的解法。 ### Q-Learning ![](https://i.imgur.com/qeK19oA.png) 這邊證明為什麼上述作法可以得到較好的結果。 * $\pi'(s)=arg \max_a Q^\pi(s, a)$ * $V^{\pi'}(s) \geq V^\pi(s)$ * 對同一個state而言,$V^{\pi'}$一定比$V^\pi$還要大 * $V^\pi(s) = Q^\pi(s, \pi(s)) \leq \max_a Q^\pi(s, a) = Q^\pi(s, \pi'(s))$ * $Q^\pi(s, \pi(s))$是選擇某一個action,而$\max_a Q^\pi(s, a)$是選擇最大值的action * $\max_a Q^\pi(s, a) = Q^\pi(s, \pi'(s))$,因為$\pi'(s)=arg \max_a Q^\pi(s, a)$ * $V^\pi(s) \leq Q^\pi(s, \pi'(s))$ * 在某一個state,按照policy-$\pi$一路做下去所得到的reward一定會小於等於不按$\pi$所給的方向。好比只有在第一步state-$s$按$\pi'$的方向走,其餘就按$\pi$的指示走,雖然只有一步之差,但得到的reward還是會比完全依照$\pi$所得的reward還要大 * $=E\left[ r_{t+1} + V^\pi(s_{t+1}) \vert s_t=s, a_t=\pi'(s_t) \right]$ * 在state-$s_t$按照policy-$\pi'$所採取的action-$a_t$,得到reward-$r_{t+1}$,然後跳到state-$s_{t+1}$,state-$s_{t+1}$根據actor-$\pi$所估測出來的value,即$V^\pi(s_{t+1})$ * 這邊的$r_{t+1}$意指$r_t$,即這個action所得到的reward * $\leq E\left[ r_{t+1} + Q^\pi(s_{t+1}, \pi'(s_{t+1})) \vert s_t=s, a_t=\pi'(s_t) \right]$ * 上面有提到$V^\pi(s)$一定小於等於$Q^\pi(s, \pi'(s))$,也就是一直根據$\pi$所得的reward一定是比其中一步跟著$\pi'$所得的reward還要小。 * $=E\left[ r_{t+1} + r_{t+2} + V^\pi(s_{t+2}) \vert \cdots \right]$ * $\leq E\left[ r_{t+1} + r_{t+2} + Q^\pi(s_{t+1}, \pi'(s_{t+2})) \vert \cdots \right]$ * $\leq V^\pi(s)$ 這邊要說明的是,可以估測某一個policy的Q-function,接下來就一定可以找的到另一個policy-$\pi'$,它一定比原來的policy-$\pi$還要更好 ### Target Network ![](https://i.imgur.com/pyaK4Kf.png) 後續說明Q-learning的tip 使用Q-learning的時候會應用到TD的概念: 假設現在收集到一個data,在stata-$s_t$的時候採取action-$a_t$而得到reward-$r_t$,接著跳到state-$s_{t+1}$,而根據Q-function我們知道,$Q^\pi(s_t, a_t)=r_t + Q^\pi(s_{t+1}, \pi(s_{t+1}))$,也就是$s_t$與$s_{t+1}$中間差了一個$r_t$,這概念與TD是一樣的。 但實務上在訓練的時候會發現,這樣的function不好訓練。如果這是一個regression問題的話,$Q^\pi(s_t, a_t)$是output,而目標(target)$r_t + Q^\pi(s_{t+1}, \pi(s_{t+1}))$是會變動的。如果硬要將兩個model一起訓練不是問題,兩個$Q^\pi$是一樣的模型,只要將結果加在一起就可以,但這樣的訓練方式是不穩定的,因為你要fit的target是不斷變動的。 因此,訓練的時候可以將其中一個$Q^\pi$固定住(通常為$s_{t+1}$固定),過程中不更新它的參數,而這個被固定參數的模型即稱為『Target Network』,它負責產生target給另一個模型去fit。 因為Target Network參數固定,因此它的output也是固定的,即$r_t + Q^\pi(s_{t+1}, \pi(s_{t+1}))$是固定的。那對另一個模型而言就是一個很單純的regression的問題,訓練幾次迭代之後再用這個模型去替換掉Target Network。 ### Exploration ![](https://i.imgur.com/ga9QTdR.png) 使用Q-function的時候,其Policy是完成取決於Q-function: * $a=arg \max_a Q(s,a)$,給定一個state,窮舉所有的action,看那一個action得到的Q value最大就採用它,這與Policy Gradient是不同的,Policy Gradient的output是隨機的,從distribution中sample出一個action 這種方式並不好,因為要估測某一個state採取的action得到的Q-value有多少必需要你在那個state採取過那個action才估測的出來,如果不是那是無法估測的。雖然如果使用`nn`的話可能比較不會有這種問題,但如果你的state-action pair是一個table,沒看過就估不出值的話,那就沒有值了。 舉例來說,一開始所有的action的Q value都是0,剛好在state-$s$的其中一個action-$a_2$剛好sample過,得到的結果是正值,這時候$Q(s, a_2)$會比其它的action選擇來的好,那之後就只會sample到action-$a_2$,因為$arg \max$就永遠是它。 這問題有兩個方法可以解: * Epsilon Greddy * 設置一個$\epsilon$,通常是一個很小的值,有$1 - \epsilon$的機率是採$arg \max$的方式執行,有$\epsilon$的機率採隨機 * 實作上$\epsilon$會隨著時間遞減,因為一開始還不是那麼確定怎麼樣的action是好的,因此隨著時間增長遞減 * Boltzmann Exploration * 這方法比較像是Policy Gradient,根據Q-value定義一個probability distribution,假設某一個action的Q value愈大代表它愈好,那我們採取這個action的機率就要越高,只是偶爾也會試一下那些Q-value較不好的action * Q-value有正有負,因此要弄成機率就先取exponential再做normalize,以此做為sample action的機率 * $P(a \vert s)=\dfrac{exp(Q(s, a))}{\sum_a exp(Q(s, a))}$ * Q是一個`nn`,一開始可能每一個action的output值都是差不多的,因此$Q(s, a)$在一開始會比較是uniform ### Replay Buffer ![](https://i.imgur.com/PRHla9w.png) 我們有某一個policy-$\pi$與環境互動,然後收集互動的資料,每一筆資料記錄著$s_t, a_t, r_t, s_{t+1}$,接下來將這些資料通通放置於Reply Buffer。 Reply Buffer裡面的experience可能是來自於不同的policy,可能每一個policy保存一萬筆,而你的Reply Buffer只能保存五萬筆,每次滿了就將舊的資料丟棄。 訓練的時候就直接從Buffer中取batch_size的資料出來更新Q-function,這麼做的時候變成是一個off-policy的作法,原本Q所觀察的是$\pi$的某一個action的value,但實際上Q所觀察的資料並不通通是來自於$\pi$,是很多不同$\pi$的experience,這麼做的好處有兩個,第一,在做RL的時候最花時間的部份通常在與環境互動並取得資料,使用Reply Buffer可以減少互動次數。第二,訓練`nn`的時候,每一個batch裡面的資料愈diverse愈好。 ### Typical Q-Leraning Algorithm ![](https://i.imgur.com/RPzr4Fy.png) * 初始化兩個`nn`,Q-function,以及target network-$\hat{Q}$,並且讓$\hat{Q}=Q$ * 每一個episode(每一次互動) * 每一個互動過程中 * 得到一個state-$s_t$,根據Q-function採取某一個action-$a_t$(記得Exploration) * 得到reward-$r_t$,跳到state-$s_{t+1}$ * 收集到一筆資料{$s_t, a_t, r_t, s_{t+1}$},保存到buffer * 如果buffer滿了,就把舊資料刪掉 * 從buffer sample batch_size的資料$\left\{s_i, a_i, r_i, s_{i+1} \right\}$ * 依sample出來的資料計算target,$y=r_i + max_a \hat{Q}(s_{i+1}, a)$ * $a$,就是看那一個action可以讓$\hat{Q}$的值最大 * 更新Q-function的參數,讓$Q(s_i, a)$的output愈接近$y$愈好,這是一個regression的問題 * 每$C$次的更新就讓$\hat{Q}=Q$