1 概述
在該系列上一篇中介紹的基於價值的深度強化學習方法有它自身的缺點,主要有以下三點:
1)基於價值的強化學習無法很好的處理連續空間的動作問題,或者時高維度的離散動作空間,因為通過價值更新策略時是需要對每個動作下的價值函數的大小進行比較的,因此在高維或連續的動作空間下是很難處理的。
2)在基於價值的強化學習中我們用特征來描述狀態空間中的某一狀態時,有可能因為個體觀測的限制或者建模的局限,導致真實環境下本來不同的兩個狀態卻再我們建模后擁有相同的特征描述,進而很有可能導致我們的value Based方法無法得到最優解。如下圖:

當有些個體選擇比較容易觀測的特征來描述狀態空間時,比如顏色,則在上圖中兩個灰色格子(代表着兩個不同的狀態)的特征表示是一樣的,倘若我們的最終目的是要獲得金幣,則當你在左邊的灰色格子時,你需要往右移;當你在右邊的灰色格子時,你需要往左移。而在基於價值的強化學習方法中,策略往往時確定的,也就是你的狀態確定了,動作就確定了,那么在這里如果兩個灰色格子的狀態是一樣,則執行的動作是一樣的。這顯然是不行的。
3)無法解決隨機策略問題,基於價值的強化學習的策略是確定的(當然也可以用$\epsilon-greedy$,但是隨機性沒那么強),而基於策略的強化學習是具有隨機性的。
2 策略梯度
首先來從似然率的角度推到策略梯度:
給定一組狀態-動作序列$\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$出現的概率,則策略梯度的目標函數可以表示為:
$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) 判斷是否是最終狀態,如果是則將這條采樣得到的序列用來更新策略函數中的參數;否則繼續循環采樣。
