# 李宏毅_ATDL_DRL Lecture 4
###### tags: `Hung-yi Lee` `NTU` `Deep Reinforcement Learning`
[課程撥放清單](https://www.youtube.com/playlist?list=PLJV_el3uVTsODxQFgzMzPLa16h6B8kWM_)
## DRL Lecture 4: Q-learning (Advanced Tips)
[課程連結](https://www.youtube.com/watch?v=2-zGCx4iv_k&list=PLJV_el3uVTsODxQFgzMzPLa16h6B8kWM_&index=4)
### Double DQN

實作上Q-value往往是被高估的,簡報四張圖就是Double DQN的說明,橫軸為訓練的時間,縱軸就是Q-value,紅色線就是Q-function所估測出來的Q-value。線的走勢會愈來愈高是因為隨著訓練,我們的Policy會愈來愈強,所得的Q-value就會愈來愈高。
藍色的線就是Double DQN所估測出來的,它與實際的值(藍色水平線)確實是比較接近的。另一個值得觀察的是,不看估測值,單看兩條水平線可以發現到,Double DQN所訓練出來的Policy是比較強的。
### Double DQN

為什麼Q-value總是被高估?
我們的目標是希望$Q(s_t, a_t)$愈接近$r_t + max_aQ(s_{t+1}, a)$愈好,而實際在計算target network的output的時候,我們是在找看那一個$a$可以得到最大的Q-value,就以它做為target。
假設有四個action,它們的reward實際來說都是相同的,但是估測會有誤差<sub>(綠色為估測誤差值)</sub>,現在有一個action被高估,那target network就會選擇它加上$r_t$做為target。因此實做上總是會選擇到被高估的那一個action,target就會因此而大。
### Double DQN

[論文連結_Deep Reinforcement Learning with Double Q-learning](https://arxiv.org/abs/1509.06461)
Double DQN:
* $Q(s_t, a_t) \leftrightarrow r_t+ + Q'(s_{t+1}, arg \max_a Q(s_{t+1}, a))$
* 先用$Q$決定採取那一個action,再用$Q'$計算Q-value
* 即使$Q$選擇到一個高估的action,但只要$Q'$沒有高估,那計算出來的就是一個正常值
實作上,在上一堂課程裡面有提到,會有兩個`nn`,一個是Q-function,一個是$\hat{Q}$-target network。因此選擇action的以會更新參數的那個`nn`來選擇,計算Q-value的以固定參數不動的target network來計算。
### Dueling DQN

[論文連結_Dueling Network Architectures for Deep Reinforcement Learning](https://arxiv.org/abs/1511.06581)
Dueling DQN唯一做的事情就是調整`nn`的架構,在output的時候不再是直接output Q-value,而是分成兩個運算式:
1. 計算一個scalar-$V(s)$
2. 輸出一個vector-$A(s, a)$
* 每一個action都有一個value,因此dimension與action數目是相同的
3. 兩個相加得到Q-value
### Dueling DQN

假設state是discrete,只有四個,而action只有三個,其$Q(s,a)$由一個table來表示。
$V(s)$是對不同state都有一個值,$A(s,a)$是不同state對不同action都有一個值,將$V$的值加到$A$的每一個column就可以得到$Q(s, a)$就可以。
這麼做的好處在於,如果只有更動某一個state的兩個action的值,而模型最終決定更動的是$V(s)$,那最終受影響的不只是兩個action,所是三個action都會受到影響。這意味著即使你沒有sample過的action也會有相對應的影響,也沒有必要全部的state-action pair都一定要sample過,只要$V(s)$有異動就全部通通異動。這是一個比較有效率使用data的方式。
為了避免機器最後讓所有$V(s)$都是0而造成$Q(s,a)=A(s,a)$,實作上會對$A(s,a)$做一些約束,文獻上很多作上,上面範例給出的是每一個column的和為0。這樣的約束式會讓更新$A(s,a)$比較複雜,近而讓機器更新$V(s)$
### Dueling DQN

實作上約束項可以這麼做,假設輸出是7,3,2,先做normalization,7+3+2=12/3=4,每個項目都-4,得到3,-1,-2,再用這個值去加上$V(s)$就可以。
這個normalization的operation是`nn`的一部份,沒有參數的一個layer。
### Prioritized Reply

[論文連結_Prioritized Experience Replay](https://arxiv.org/abs/1511.05952?context=cs)
原本訓練的過程中,我們會從buffer中uniform的sample資料出來,但這麼不見得是好的,或許有某一筆資料的TD erro特別大<sub>(target network的output與Q-function的output差距)</sub>,這意味著過程中的對這筆資料的訓練是沒訓練好的,那就需要給它比較大的機率被sample。
實作上不止更改sampling的流程,也會調整更新參數的方法。這部份課程沒有提,可參考論文或考入台大聽助教講。
### Multi-step

在TD的記錄中,只保存$\left\{ s_t, a_t, r_t, s_{t+1} \right\}$,現在調整成保存大N筆資料,以這樣的記錄方式來結合MC、TD。
這時候的target value調整為$\sum_{t'=t}^{t+N} r_{t'} + \hat{Q}(s_{t+N+1}, a_{t+N+1})$,將從$t$到$t+N$的reward加起來做為target value,讓output愈接近它愈好:
* $\hat{Q}(s_{t+N+1}, a_{t+N+1})$:第N個step之後的state丟進來,計算會得到的reward
* $\sum_{t'=t}^{t+N} r_{t'}$:multiple step的reward
因為加入更多的step,因此有了MC的缺點,就是variance較大,但這部份可以透過調整$N$來控制,在variance與bias中取一個平衡。
$N$為超參數。
### Noisy Net

[論文連結_1_Parameter Space Noise for Exploration](https://arxiv.org/abs/1706.01905)
[論文連結_2_Noisy Networks for Exploration](https://arxiv.org/abs/1706.10295)
之前提過的Epsilon Greddy是在action的space上加noise,但另一種更好的作法,Noisy Net,它是在參數的space上加入noise。
在每一個episode開始的時候,也就是跟環境互動之前,將Q-function(`nn`)上的參數通通加上一個Gaussian noise,即$Q(s, a) \rightarrow \tilde{Q}(s, a)$。要注意的是,每次加入noise之後的參數就是固定不變,一直到整個結束到下一個episode開始之前才又重新sample一次noise。
兩篇論文,一篇是OpenAI、一篇是DeepMind,其中OpenAI的作法只是單純的加入Gaussian Noise,而DeepMind的作法是利用參數控制每次要加入的noise。
### Noisy Net

在原始的Epsilon Greddy中,即使是給定相同的state也不一定會得到相同的action,因為是用sample的方式來決定action。但真實事實中,相同的state理論上會給相同的action才對。
而在Q-function的network parameters上加noise的話,不會有這種情況,因為參數固定情況下,看到相同或相似的state就會採取相同的action,這種情況稱為State-dependent Exploration
### Demo

[影片連結](https://openai.com/blog/better-exploration-with-parameter-noise/)
左邊為Epsilon Greddy,右邊為Noisy Net
### Distributional Q-function

這個技巧比較少人,比較不好實作起來。
Q-function計算出來的是一個cumulated reward的期望值(expect),也就是在某一個state採取某一個action,將玩到遊戲結束的所有reward進行一個統計,這邊得到的其實是一個distribution,然後我們對這個distribution計算它的mean,就是Q-value。
我們計算出來的是expect cumulated reward,真正的cumulated reward是一個distribution,對它取expectation,再取mean所得到的才是Q-value。
但有趣的是,不同的distribution是可能擁有相同的mean的,簡報上來看,兩個不同的distribution擁有相同的mean,但它們背後所代表的distribution是不同的,因此如果用一個expect Q-value來代表整個reward的話,可能無法model reward的distribution。
### Distributional Q-function

Distributional Q-function要做的就是model distribution。
原始的作法中,input一個state,output多個value(範例假設有三個action,因此output三個value)代表action的Q-value,也就是distribution的期望值。
Distributional Q-function的想法就是,何不直接output distribution。假設distribution的值分佈在某一個區間內,再將這個區間拆成小bin(長條圖),簡報範例將reward的space拆成五個bin。Q-function的output要預測在某一個state採取某一個action得到的reward會落在某一個bin的機率。因此每一個顏色的bar的和為1,每一個顏色都是一個action,高度代表某一個state採取某一個action得到的reward會落在某一個bin的機率。
實際上執行的時候還是會以mean最大的action來執行,但如果可以model distribution的話,那也許可以計算它的variance,平均可能不錯,但風險較高,這是一個可行的應用。
### Distributional Q-function Demo

這邊的片連結被擋住了
### Rainbow

[論文連結_Rainbow: Combining Improvements in Deep Reinforcement Learning](https://arxiv.org/abs/1710.02298)
把剛才的所有技巧加起來就是Rainbow,橫軸為training process,縱軸是玩artri的平均分數的和,取的是median。
### Rainbow

這邊是將Rainbow內的技術拿掉其中一個,觀察那一個技術拿掉對效能的影響。
論文提到,當使用Distributional DQN的時候,本質上就不會over estimate reward,因此拿掉DDQN比較沒有影響。因為我們在設置Distributional的range的時候不會設置無限大,而是一個固定區間內,而超過的還是以左右極值來看待(假設設置-10,+10之間,那100還是視為+10),因此以Distributional實作就會有under estimate的情況。