1 概述算法
在該系列上一篇中介紹的基於價值的深度強化學習方法有它自身的缺點,主要有如下三點:網絡
1)基於價值的強化學習沒法很好的處理連續空間的動做問題,或者時高維度的離散動做空間,由於經過價值更新策略時是須要對每一個動做下的價值函數的大小進行比較的,所以在高維或連續的動做空間下是很難處理的。函數
2)在基於價值的強化學習中咱們用特徵來描述狀態空間中的某一狀態時,有可能由於個體觀測的限制或者建模的侷限,致使真實環境下原本不一樣的兩個狀態卻再咱們建模後擁有相同的特徵描述,進而頗有可能致使咱們的value Based方法沒法獲得最優解。以下圖:學習
當有些個體選擇比較容易觀測的特徵來描述狀態空間時,好比顏色,則在上圖中兩個灰色格子(表明着兩個不一樣的狀態)的特徵表示是同樣的,假若咱們的最終目的是要得到金幣,則當你在左邊的灰色格子時,你須要往右移;當你在右邊的灰色格子時,你須要往左移。而在基於價值的強化學習方法中,策略每每時肯定的,也就是你的狀態肯定了,動做就肯定了,那麼在這裏若是兩個灰色格子的狀態是同樣,則執行的動做是同樣的。這顯然是不行的。優化
3)沒法解決隨機策略問題,基於價值的強化學習的策略是肯定的(固然也能夠用$\epsilon-greedy$,可是隨機性沒那麼強),而基於策略的強化學習是具備隨機性的。spa
2 策略梯度blog
首先來從似然率的角度推到策略梯度:it
給定一組狀態-動做序列$\tau = s_0, a_0, s_1, a_1, ......, s_l, a_l。學習方法
則有$R(\tau) = \sum_{t=0}^l R(s_t, a_t)$表示序列$\tau$的回報。$P(\tau; \theta)$表示序列$\tau$出現的機率,則策略梯度的目標函數能夠表示爲:sed
$J(\theta) = E(\sum_{t=0}^l R(s_t, a_t); \pi_{\theta}) = \sum_{\tau} P(\tau; \theta)R(\tau)$
策略梯度的目標就是找到最優參數$\theta$,使得$J(\theta)$最大。所以策略梯度是一個優化問題,最簡單的就是用梯度上升法來求解:
$\theta = \theta + \alpha \nabla_{\theta}J(\theta)$
如今咱們來對目標函數求導:
$ \nabla_{\theta}J(\theta) = \nabla_{\theta}\sum_{\tau} P(\tau; \theta)R(\tau)$
$=\sum_{\tau} \nabla_{\theta}P(\tau; \theta)R(\tau)$
$=\sum_{\tau} \frac{P(\tau; \theta)}{P(\tau; \theta)} \nabla_{\theta}P(\tau; \theta)R(\tau)$
$=\sum_{\tau} P(\tau; \theta)\frac{\nabla_{\theta}P(\tau; \theta)R(\tau)}{P(\tau; \theta)}$
$=\sum_{\tau} P(\tau; \theta) \nabla_{\theta} \log{P(\tau; \theta)}R(\tau)$
所以最終的策略梯度就變成求$ \nabla_{\theta} \log{P(\tau; \theta)}R(\tau)$的指望了,這樣當採樣$m$條樣本序列時,就能夠利用$m$條序列的均值逼近策略梯度的指望:
$ \nabla_{\theta}J(\theta) = \frac{1}{m} \sum_{i=1}^m \nabla_{\theta} \log{P(\tau; \theta)}R(\tau)$
從上面的式子能夠看出第一項$\nabla_{\theta} \log{P(\tau; \theta)}$是軌跡$\tau$ 的機率隨參數$\theta$變化最陡的方向。第二項$R(\tau)$控制了參數更新的方向和步長。
對於每一條序列$\tau$的機率$P(\tau; \theta)$均可以表示成下面的形式:
$P(\tau^i; \theta) = \prod_{t=0}^l P(s_{t+1}^i | s_t^i, a_t^i) \pi_{\theta}(a_t^i | s_t^i)$
對上面的式子代入到梯度的式子中,經過對數展開能夠獲得:
$ \nabla_{\theta}J(\theta) = \frac{1}{m} \sum_{i=1}^m (\sum_{t=0}^l \nabla_{\theta} \log{\pi_{\theta} (a_t^i | s_t^i)}R(\tau^i))$
可是上面的式子有一個問題,就是後面的$R(\tau^i)$是對整條序列的回報,可是在$t$時刻的策略對應的回報不該該和$t$時刻以前的狀態-動做價值無關。所以對這個式子進行修改能夠獲得:
$\nabla_{\theta} J(\theta) = \mathbb{E}_{\pi_{\theta}}[\nabla_{\theta}log \pi_{\theta}(s,a) Q_{\pi}(s,a)]$
在上面的式子中$\nabla_{\theta}log \pi_{\theta}(s,a)$ 是不會改變的,這個通常稱爲分值函數,但後面的$Q_{\pi}(s,a)$是可能發生改變的。
除了這個問題以外,還有一個問題就是策略梯度$\nabla_{\theta}J(\theta)$的方差很大,這個時候通常引入一個常數基線b,即:
$\nabla_{\theta} J(\theta) = \mathbb{E}_{\pi_{\theta}}[\nabla_{\theta}log \pi_{\theta}(s,a) (Q_{\pi}(s,a) - b)]$
這個常數的引入不會影響到梯度的值(證實忽略),可是在某一個b值下可使得梯度的方差最小。
3 策略函數
咱們上面抽象的用一個函數表示了策略函數,那策略函數的具體形式是什麼樣子的呢?通常來講,對於離散的動做空間,用softmax函數來描述;對於連續的動做空間,用高斯函數來描述。
在離散的動做空間中,softmax函數描述了各個動做被選中的機率,在構建網絡時能夠看成是一個多分類的問題:
$\pi_{\theta}(s,a) = \frac{e^{\phi(s,a)^T\theta}}{\sum\limits_be^{\phi(s,b)^T\theta}}$
其中$\phi(s,a)$表示的是給定狀態s,動做a的特徵表示。
在連續的動做空間中,策略產生動做是遵循高斯分佈$\mathbb{N(\phi(s)^T\theta, \sigma^2)}%$的。
4 reinforce算法流程
在蒙特卡洛策略梯度reinforce算法,咱們用價值函數$v(s)$近似的替代上面的目標函數中的$Q(s, a)$。則整個流程以下:
假設迭代輪數爲EPISODES,採樣的序列最大長度爲L,學習速率爲$\alpha$,狀態集爲S,動做集爲A。
1)for episode in range(EPISODES): # 開始迭代
2)初始化狀態s,在這裏s爲狀態向量
3)for step in range(T): # 序列採樣
a) 將狀態向量s輸入到策略函數中,咱們能夠獲得softmax以後每一個動做的機率,根據機率去選擇動做(增長了隨機性,而不是每次選擇機率最大的動做);
b) 在狀態s下執行當前動做$a$,得到下一狀態$s‘$,當前獎勵$R$,是否終止狀態${is\_end}$;
c) 將當前的狀態$s$,動做$a$,獎勵$R$分別存儲在一個列表中;
d) 更新狀態,$s = s'$;
e) 判斷是不是最終狀態,若是是則將這條採樣獲得的序列用來更新策略函數中的參數;不然繼續循環採樣。