深度增強學習之Policy Gradient方法1

1 前言

在之前的深度增強學習系列文章中,我們已經詳細分析了DQN演算法,一種基於價值Value的演算法,那麼在今天,我們和大家一起分析深度增強學習中的另一種演算法,也就是基於策略梯度Policy Gradient的演算法。這種演算法和基於價值Value的演算法結合而成的Actor-Critic演算法是目前效果最好的深度增強學習演算法。

那麼關於Policy Gradient方法的學習,有以下一些網上的資源值得看:

  1. Andrej Karpathy blog: Deep Reinforcement Learning: Pong from Pixels

  2. David Silver ICML 2016:深度增強學習Tutorial

  3. John Schulman:Machine Learning Summer School

  4. David Silver的增強學習課程(有視頻和ppt): www0.cs.ucl.ac.uk/staff

那麼實際上Andrej Karpathy的blog已經很詳細的分析了Policy Gradient的方法,這裡我將綜合以上的內容根據我自己的理解來說以下Policy Gradient。

2 Why Policy Network?

我們已經知道DQN是一個基於價值value的方法。換句話說就是通過計算每一個狀態動作的價值,然後選擇價值最大的動作執行。這是一種間接的做法。那麼,更直接的做法是什麼?

能不能直接更新策略網路Policy Network呢?

什麼是策略網路Policy Network?就是一個神經網路,輸入是狀態,輸出直接就是動作(不是Q值)。

a = pi(s,theta)a = pi(s,theta)

或者輸出概率:a = pi(a|s,theta)

這裡要提一下概率輸出的問題。對於DQN來說,本質上是一個接近於確定性輸出的演算法。至多就是採用epsilon-greedy進行探索。但是有很多時候,在某一個特定狀態下,很多動作的選擇可能都是可以的。比如說我有20塊錢去買飯。那麼不管我買的是蛋炒飯還是土豆肉片蓋碼飯,結果都是一樣的填飽肚子。因此,採用輸出概率會更通用一些。而DQN並不能輸出動作的概率,所以採用Policy Network是一個更好的辦法。

3 Policy Gradient

要更新策略網路,或者說要使用梯度下降的方法來更新網路,我們需要有一個目標函數。對於策略網路,目標函數其實是比較容易給定的,就是很直接的,最後的結果!也就是

L(theta) = mathbb E(r_1+gamma r_2 + gamma^2 r_3 + ...|pi(,theta)) 所有帶衰減reward的累加期望

那麼問題就在於如何利用這個目標來更新參數theta呢?咋一看這個損失函數和策略網路簡直沒有什麼直接聯繫,reward是環境給出的,如何才能更新參數?換個說法就是如何能夠計算出損失函數關於參數的梯度(也就是策略梯度):

nabla_{theta} L(theta)

咋一看根本就沒有什麼思路是不是,所以先換一個思路來考慮問題。

4 就給我一個Policy Network,也沒有loss,怎麼更新?

改變動作的出現概率!

現在我們不考慮別的,就僅僅從概率的角度來思考問題。我們有一個策略網路,輸入狀態,輸出動作的概率。然後執行完動作之後,我們可以得到reward,或者result。那麼這個時候,我們有個非常簡單的想法:

如果某一個動作得到reward多,那麼我們就使其出現的概率增大,如果某一個動作得到的reward少,那麼我們就使其出現的概率減小。

當然,也顯然的,用reward來評判動作的好壞是不準確的,甚至用result來評判也是不準確的。畢竟任何一個reward,result都依賴於大量的動作才導致的。但是這並不妨礙我們做這樣的思考:

如果能夠構造一個好的動作評判指標,來判斷一個動作的好與壞,那麼我們就可以通過改變動作的出現概率來優化策略!

假設這個評價指標是f(s,a),那麼我們的Policy Network輸出的是概率。一般情況下,更常使用log likelihood log pi(a|s,theta)。原因的話看這裡Why we consider log likelihood instead of Likelihood in Gaussian Distribution。

因此,我們就可以構造一個損失函數如下:

L(theta) = sum logpi(a|s,theta)f(s,a)

怎麼理解呢?舉個簡單的AlphaGo的例子吧。對於AlphaGo而言,f(s,a)就是最後的結果。也就是一盤棋中,如果這盤棋贏了,那麼這盤棋下的每一步都是認為是好的,如果輸了,那麼都認為是不好的。好的f(s,a)就是1,不好的就-1。所以在這裡,如果a被認為是好的,那麼目標就是最大化這個好的動作的概率,反之亦然。

這就是Policy Gradient最基本的思想。

5 另一個角度:直接算

f(s,a)不僅僅可以作為動作的評價指標,還可以作為目標函數。就如同AlphaGo,評價指標就是贏或者輸,而目標就是結果贏。這和之前分析的目標完全沒有衝突。因此,我們可以利用評價指標f(s,a)來優化Policy,同時也是在優化的同時優化了f(s,a).那麼問題就變成對f(s,a)求關於參數的梯度。下面的公式直接摘自Andrej Karpathy的blog,f(x)即是f(s,a)

begin{align}nnabla_{theta} E_x[f(x)] &= nabla_{theta} sum_x p(x) f(x) & text{definition of expectation} n& = sum_x nabla_{theta} p(x) f(x) & text{swap sum and gradient} n& = sum_x p(x) frac{nabla_{theta} p(x)}{p(x)} f(x) & text{both multiply and divide by } p(x) n& = sum_x p(x) nabla_{theta} log p(x) f(x) & text{use the fact that } nabla_{theta} log(z) = frac{1}{z} nabla_{theta} z n& = E_x[f(x) nabla_{theta} log p(x) ] & text{definition of expectation}nend{align}

從公式得到的結論可以看到正好和上一小結分析得到的目標函數一致。

因此,Policy Gradient方法就這麼確定了。

6 小結

本篇blog作為一個引子,介紹下Policy Gradient的基本思想。那麼大家會發現,如何確定這個評價指標才是實現Policy Gradient方法的關鍵所在。所以,在下一篇文章中。我們將來分析一下這個評價指標的問題。


推薦閱讀:

有趣的演算法(1)排序
3/7 演算法題詳解:Reverse a Singly Sublist 反轉一個子單向鏈表
天天演算法 | Easy | 3. 去除有序數組中的重複元素
追MM的各種演算法
九章演算法 | Facebook面試題 : 迷你解析器

TAG:人工智能 | 强化学习ReinforcementLearning | 算法 |