# 李宏毅_ATDL_DRL Lecture 6
###### tags: `Hung-yi Lee` `NTU` `Deep Reinforcement Learning`
[課程撥放清單](https://www.youtube.com/playlist?list=PLJV_el3uVTsODxQFgzMzPLa16h6B8kWM_)
## DRL Lecture 6: Actor-Critic
[課程連結](https://www.youtube.com/watch?v=j82QLgfhFiY&list=PLJV_el3uVTsODxQFgzMzPLa16h6B8kWM_&index=6)
### Review - Pilicy Gradient

$\nabla \bar{R}_\theta \approx \dfrac{1}{N} \sum_{n=1}^N \sum_{t=1}^{T_n} \left( \sum_{t'=t}^{T_n} \gamma^{t'-t} r^n_{t'}-b \right) \nabla \log p_\theta(a_t^n \vert s_t^n)$
* 讓agent與環境互動,計算在某一個state-$s$採取某一個action-$a$的機率
* 計算從state-$s$採取action-$a$之後,一直到遊戲結束的時候,其accumulated reward有多大
* 從$t$到$T$加總
* $\gamma^{t'-t}$,這是一個discount factory,因為一個action對愈後面的影響愈小,可能是0.99或是0.9
* 減掉bias-$b$是希望括號項目內的所得的值有正有負,為正,代表增加這個state-action pair的機率,負的就減少。
* $\sum_{t'=t}^{T_n} \gamma^{t'-t} r^n_{t'}$,以$G_t^n$來表示
* $G$的不穩定是因為互動過程中的隨機性,為random variable,過程中從$G$ sample,然後用sample到的資料更新參數
* 即使是相同的state-action pair,最終得到的結果還是可能如上圖說明一般的存在很大的落差,因此我們希望可以直接估測$G$這個random variable的期望值,用期望值來代替sample的值
### Review - Q-Learning

直接估測$G$的方式就是value-based的方法:
* State value function $V^\pi(s)$
* input s output scalar
* State-action value function $Q^\pi(s, a)$
* input s output vector,每一個維度都是對應action的Q-value,只能用於discrete action
可用TD或MC來估測,TD較穩,MC較精確
### Actor-Critic

$G$這個random variable的期望值就是Q-value,在policy-$\pi$情況下,當state-$s$的時候執行action-$a$所得的accumulated reward有多大。因此,要做的事很簡單,如果要將$G$用期望值來表示,只要把Q-function套在這邊就可以將actor-critic兩個方法結合起來。
baseline的話,可以用value-function來表示,即是在policy-$\pi$的情況下,在某一個state-$s$一直互動到遊戲結束的excpected的reward有多大<sub>(V-function沒有考慮action,Q-function才有action考慮)</sub>。
直觀來看,就是將原始Policy Gradient中的項目以Q-value減掉V-value就結束了,只是缺點就是要估測的是兩個`nn`(Q-function與V-function)。
### Advantage Actor-Critic

事實上,在Actor-Critic的方法內,可以單純的估測V-function,將Q-value以V-value來表示:
* $Q^\pi(s_t^n, a^n_t) = E \left[ r^n_t + V^\pi(s^n_{t+1}) \right]$
* $r$是random variable,在某一個state採取action所得的rewrad是不確定,中間具有隨機性,因此要取期望值才會是Q-function
* $Q^\pi(s_t^n, a^n_t) - V^\pi(s^n_t)$
* $=r^n_t + V^\pi(s^n_{t+1}) - V^\pi(s^n_t)$
* 直接拿掉期望值,並取代原始的Q-function
* 原始取期望值是因為具有隨機性
* 這麼做的好處在於,只需要估測一個`nn`即可(V-function)
* 這麼做的壞處在於,引入随機性,因為$r$本身具有隨機性,但相較於G的accumulated reward來說可能還好,因為$r$是某一個step會得到的reward,而G是所有未來的step會得到的accumulated reward,因此相較於G的variance,$r$的variance可能較小。
### Advantage Actor-Critic

整體流程如下:
* 將G取代掉的部份稱為Advantage function
* $r^n_t + V^\pi(s^n_{t+1}) - V^\pi(s^n_t)$
1. 有一個$\pi$,初始化一個actor與環境互動收集資料
2. 不同於Policy Gradient直接更新參數,是利用收集到的資料來估測value function
* 可以使用TD或MC
3. 更新$\pi \rightarrow \pi'$
* 利用$\nabla \bar{R}_\theta \approx \dfrac{1}{N} \sum_{n=1}^N \sum_{t=1}^{T_n}(r^n_t + V^\pi(s^n_{t+1}) - V^\pi(s^n_t)) \nabla \log p_\theta(a_t^n \vert s_t^n)$
4. 利用$\pi'$再與環境互動收集資料
5. ....
### Advantage Actor-Critic

實作上有兩個tip:
1. 訓練過程中有兩個`nn`,一個是V-function,一個是Policy(即actor),其中V-function input state ,output scalar。而actor的話是input state,output action的distribution。因為兩個`nn`的input都是state,因此前面幾個layer的話是可以共用的。如果是影像的輸入的話,就可以將輸入的像素轉為較高階的資訊。
2. 一樣需要exploration的機制(參考Q-learning課程資訊),實作Actor-Critic的一種常見作法,就是對actor的output(action distribution)下一個constrain,讓distribution的entropy不要太小,讓不同的action被採用的機率平均。
### Asynchronous Advantage Actor-Critic(A3C)

A3C的精神就跟鳴人用影分身訓練自己的道理一樣。
### Asynchronous

A3C同時開很多Worker(影分身),再將所有的經驗通通集合在一起:
1. 有一個global network,包含policy、V-function,其參數為$\theta^1$
2. Worker工作前就是先copy global network的參數
3. Worker與環境互動
* 如果要收集到多樣性的資料的話,就要讓每一個Worker的初始化都不一樣
4. 利用收集到的資料計算梯度(梯度的符號錯誤)
5. 回傳梯度之後更新global network的參數$\theta^1 \rightarrow \theta^1 + \eta \nabla \theta$
要注意到的是,所有的actor都是平行執行,同時在執行計算,做完就回傳參數,即使原本取到的是$\theta^1$到回傳的時候已經變成是$\theta^2$的時候也沒有關係,一樣回傳之後計算。
### Pathwise Derivative Policy Gradient

[論文連結_Deterministic Policy Gradient Algorithms
](http://proceedings.mlr.press/v32/silver14.pdf)
這是一種用Q-learning來解continuous的方法,也可以視為是一種特別的actor-critic的方法。
以棋靈王來說明的話,阿光是Actor,佐為是Critic,一般的RL可能在阿光下一個棋之後,佐為只告訴阿光好,不好,就這樣,但如果是Pathwise Derivative Policy Gradient的話,佐為會同時告訴阿光應該採取什麼樣的action。critic會引導actor做什麼樣的action才能得到比較大的value。
以Q-learning的觀點來看,Q-learning較難以處理continuous的action,但我們可以用一個actor來解這個問題($a = \arg \max_a Q(s, a))$)。
假設actor是一個solver,它的工作是給定state-$s$,然後告訴我們那一個action可以得到最大的Q-value。這概念跟GAN非常相似,將Q視為discriminator,要依據discriminator決定action非常困難,那就另外learn一個`nn`來解這個問題,也就是actor,利用actor來決定action,解$\arg \max$的問題。
### Pathwise Derivative Policy Gradient

直觀來看如下:
* learn一個Q-function,input為state-$s$、action-$a$,output為$Q^\pi(s, a)$
* learn一個actor解$\arg \max$,input為state-$s$,output為action-$a$,這個output做為Q-function的input,希望可以讓Q-value愈大愈好
實作上會將兩個`nn`接起來,做為一個比較大的`nn`,訓練過程中會固定住Q-function的參數,單純的訓練actor的參數,以Gradient ascent來最大化。這似曾相識的概念,就是GAN,conditional GAN。Q為discriminator(cirtic),actor為generator。
### Q-Learning Algorithm

這是之前課程提過的原始Q-Learning演算法:
* 初始化Q-function與target network $\hat{Q}$,並且讓$\bat{Q}$=Q
* 每一個episode中
* 每一個time step t
* 給定state-$s_t$,由Q-function決定採用那一個action-$a_t$(記得加exploration)
* 得到reward-$r_t$,跳到下一個state-$s_{t+1}$
* 將$\left\{ s_t, a_t, r_t, s_{t+1} \right\}$寫入buffer
* 從buffer中sample batch-size的資料出來$\left\{ s_i, a_i, r_i, s_{i+1} \right\}$
* 利用target function-$\hat{Q}$計算$s_{i+1}$的值,再加上$r_i$得到target-$y$
* 更新Q-function,希望$Q(s_i, a_i)$的output與target-$y$愈接近愈好
* 每$C$個step之後重新讓$\hat{Q}$=Q
### Q-Learning Algorithm $\rightarrow$ Pathwise Derivative Policy Gradient

從Q-learning到Pathwise Derivative Policy Gradient只需要調整四個地方:
1. 原本是用Q-function決定採用那一個action,調整為直接用actor-$\pi$來決定,不需要再解$\arg \max$的問題
2. 不解$\arg \max$的問題之後,target-$y$也調整為$\hat{Q}(s_{i+1}, \hat{\pi}(s_{i+1}))$,原本由$\hat{Q}$決定那一個action,也直接由$\hat{\pi}$來決定
3. 利用更新$\pi$來最大化Q-function $Q(s_i, \pi(s_i))$,這原因跟GAN的generator一樣。
4. 每$C$個step就同步一次,即$\hat{\pi}=\pi$
與Q-learning有兩個`nn`一樣,pathwise Derivative Policy Gradient也有兩個actor,參數也一樣是固定住,在幾個time step之後才會同步一次。因為我們並不希望target value不斷的變動。
### Connection with GAN

[論文連結_Connecting Generative Adversarial Networks and Actor-Critic Methods](https://arxiv.org/abs/1610.01945)
因為GAN與actor-critic都是非常難訓練,因此論文上也提出那幾種作法在GAN上有實作錄記,那些在actor-critic上有,也許可以互相學習。