強化學習-學習筆記5 | AlphaGo

climerecho發表於2022-07-06

本文不是論文閱讀筆記,只是一個學習筆記,重在理解,在嚴謹程度上可能稍差。

AlphaGo 論文指路:

  1. Mastering the game of Go with deep neural networks and tree search. Nature, 2016.https://www.nature.com/articles/nature16961
  2. Mastering the game of Go without human knowledge.Nature,2017.https://www.nature.com/articles/nature24270

5. AlphaGo

5.1 圍棋介紹

如果用強化學習的語言,圍棋如何表達:

標準的圍棋盤是一個 19 × 19 的網格,一共361個交點。State 即為一個 19 × 19 × 2 的 tensor.

2 的意思是 該位置的狀態是 黑子/白子/空,眾所周知,2位二進位制可以編碼 4 個狀態

實際上 state 為 19 × 19 × 48 的一個 tensor,記錄了更多的資訊。

Action 就是在空白位置上放棋子,動作空間 \(\mathbb{A}\in\{ 1,2,3,...,361\}\)隨著遊戲的進行,action 的空間越來越小。

圍棋的複雜度很高,每一步有 100餘種 動作,要走上百步,所以總計可能有 \(10^{170}\) 次方 種。國際象棋的“深藍”採用的暴力搜尋方法,面對圍棋完全不適用,圍棋的複雜度要比國際象棋高很多。

5.2 主要思路

訓練

  1. 模仿學習:從大規模的已知對局,模仿人類行為來初始化策略網路,這是一種監督學習,即多分類。
  2. 策略網路:用策略梯度演算法訓練 Policy Network,通過兩個策略網路進行對局,用勝負結果訓練策略網路。
  3. 價值網路:與 Actor-Critic 不同,先訓練 第2步 策略網路,再用策略網路訓練價值網路。

執行(與棋手對局)

  • 採用蒙特卡洛樹搜尋 (MCTS),不是暴力搜尋,使用了 策略網路和價值網路來指導搜尋。

5.3 策略網路

為了簡單起見,採用 相對較新的 Alpha zero 論文中的策略網路進行理解。這個網路中使用了 19 × 19 ×17 的 tensor來表徵狀態 state。

解釋:

19 × 19 是大小,17是矩陣的個數,把當前黑色棋子的位置用一張矩陣來表示,放置了黑子則為1,未放置為0。再用另外7張矩陣來存放前 7 步的黑子情況;總計 8 張。

同理,白子也需要 8 張。

至於為什麼是 8 張,可認為是一個嘗試出來的超引數。

最後一張矩陣用來表徵黑白狀態,如果該下黑子,則為全1矩陣,而如果該下白子,則為全0矩陣。

策略網路應該如何設計?

1個tensor表示狀態,作為策略網路的輸入,用 restnet 提取特徵 feature,用1個或者多個全連線層,輸出一個361維的向量,為了滿足概率求和為,輸出層的啟用函式需為 softmax 。

Alpha zero 的策略網路就是這樣的思路。

5.4 模仿學習/初始化策略網路

這個步驟在2016的版本中出現,較新的 Alpha zero 中沒有使用。

一開始,策略網路的引數是隨機初始化的,如果跳過模仿學習這一步,直接進行自我博弈,agent 會做出純隨機的動作,因此需要摸索很長時間才能使行為變得稍微合理一點。這就是模仿學習這一步存在的意義。

a. Behavior Cloning

Behavior Cloning 不是強化學習,是一種 Imitation learning。agent 看不到獎勵,也不需要獎勵,只是讓策略網路模仿人的動作,更泛化的講是分類迴歸問題。

與強化學習的區別就是 沒有獎勵。

b. 訓練網路

  1. 觀察棋盤狀態 \(s_t\),這是一個 tensor。
  2. 把狀態作為 策略網路 \(\pi\) 的一個輸入, \(\pi\) 會輸出一個361維的向量\(p_t=[\pi(1|s_t,\theta),...,\pi(361|s_t,\theta)]\in(0,1)_{361}\),這個向量就是放置在361個位置每個動作的概率。
  3. 而假設人類棋手真實的動作是 \(a_t^*=281\),意為下在了281號位置;經過獨熱編碼,變為一個361維的向量 \(y_t\),只在第281位為1,其他全0。
  4. 用Loss = CrossEntropy(\(y_t,p_t\)) 衡量人類玩家的動作\(y_t\) 和 預測 \(p_t\) 之間的差異。
  5. 求損失函式Loss 關於神經網路關於引數 θ 的梯度。用梯度下降來更新策略網路 θ。

從這個過程來講,就是一個多分類,即有 361 個類別。這跟影像分類極其相似。

通過 behavior cloning 訓練的策略網路,其實已經可以打敗業餘玩家了......比如當前的狀態 \(s_t\) 在訓練資料裡已經出現過了,那麼策略網路就會模仿人類玩家做出預測 \(a_t\) 。只要訓練資料質量足夠高,數量足夠,就可以達到很好的下棋效果了

然而,Behavior Cloning 雖然容易做,但是效果不如強化學習:

即 當前狀態 \(s_t\) 沒有出現在訓練資料中的情況,這時 policy network作的動作 \(a_t\) 就不會很好,並且圍棋會把每一步的效果累計起來,一步怪棋,後續棋譜就更不太可能出現在從人類玩家對局中獲取的訓練資料中了;接著正反饋,越來越糟糕。

而圍棋的情況恰恰特別多,Behavior Cloning 用到的訓練資料小於全集,所以很容易失敗。

5.5 用RL繼續訓練策略網路

根據 5.4 中最後的分析,為了應對訓練資料中不存在的情況,使用強化學習繼續訓練策略網路,通過獎勵使 agent 在某一狀態下做出更合理的動作。

根據5.2 主要思路,AlphaGo 用兩個策略網路來做博弈,一個是 Player / Agent,另一個是 Opponent / Environment,前者使用最新的模型引數,每下一局,靠獎勵來更新Player的模型引數;而後者是環境,引數不需要學習,隨即從舊引數中選一個出來作為策略網路的引數就可以。

a. Rewards

AlphaGo的獎勵是這樣定義的:

假設一局遊戲用T步結束,在沒結束的時候,每一步的獎勵都是0。當遊戲結束,最後一步的獎勵為 +1(win),或是 -1(lose)。

回想一下 回報Return 的概念:

\(u_t=\sum_{i=t}^Tr_i\),(不考慮折扣)

如果 agent 贏了,那麼 \(u_1=u_2=...=u_T=+1\);相反如果 agent 輸了,\(u_1=u_2=...=u_T=-1\)

即:只要贏了,認定每一步棋都好,如果輸了,每一步都是臭棋。

b. Policy Gradient

RL步驟中用於訓練策略網路的演算法是策略梯度演算法。

首先回憶一下策略梯度:

是狀態價值函式 \(V(s;\theta)\) 關於策略網路的引數 θ 的梯度,具體的推導在強化學習筆記第三篇:https://www.cnblogs.com/Roboduster/p/16445811.html

策略梯度 =$ ∂V(s;θ)∂θ=\frac{\partial\log\pi(A|s;θ)}{\partial\theta}\cdot{Q_\pi(s,a)}$

動作價值函式定義如下:

\(Q_\pi(s_t,a_t)=\mathbb{E}[U_t|s_t,a_t]\),即隨機變數 \(U_t\) 的期望。

假如觀測到了隨機變數 Ut的值ut,就可以拿 ut 近似 Ut的期望:

策略梯度 =$ \frac{\partial{V(s;θ)}}{\partialθ}=\frac{\partial\log\pi(A|s;θ)}{\partial\theta}\cdot{u_t}$

下完一盤棋,就可以知道 u的值,進而計算出策略梯度。

c. 總結概括

  • 讓兩個策略網路下一盤棋。每下完一盤棋可以更新一次模型引數。

    注意 Player 的引數每局用策略梯度更新, 而Opponent 的引數每局隨機從舊引數抽樣。

  • 得到 一個trajectory(軌跡):\(s_1,a_1,s_2,a_2...s_T,a_T\)

  • 有了遊戲的軌跡和獎勵,就能更新 Player 的策略網路:

    近似的策略梯度:\(g_\theta=\sum_{t=1}^T\frac{\partial\log\pi(A|s;θ)}{\partial\theta}\cdot{u_t}\)

  • 策略梯度上升: \(\theta_{new}\leftarrow \theta_{old}+\beta\cdot{g_\theta}\)

而為了做蒙特卡洛樹搜尋 MCTS,還需要價值網路。

5.6 訓練價值網路

a.思路介紹

與之前的價值網路不同,這裡的價值網路是對 狀態價值函式 V 的近似,而不是對 Q 的近似

回顧一下狀態價值函式 \(V_\pi = \mathbb{E}[U_t|S_t=s]\),是回報\(U_t\)的條件期望。回報之前說過,取值只有+1和-1。

期望是對未來的狀態 A 和未來的狀態 S 求的,這樣就消去除了\(s_t\)之外的所有隨機變數。

\(V_\pi\) 越接近 1 ,說明快要贏了,相反越接近 -1,說明快要輸了。

MCTS 需要 價值網路的輔助(近似 \(V_\pi\))。

在最初版本的 AlphaGo 中,價值網路和策略網路是兩個分開的神經網路。而較新的 AlphaGo Zero 讓兩者共享了一些卷積層 Conv。

策略網路的輸出是一個361維的向量,每個維度對應一個動作的概率;價值網路的輸出是一個標量 scalar ,反映當前的勝算有多大。

策略網路和價值網路是分開訓練的,首先訓練策略網路 \(\pi\) ,接著在策略網路的幫助下,訓練 價值網路V。

這也是與Actor-Critic 的不同。因為A-C方法需要同時訓練兩個網路。

b.訓練過程

  • 還是讓兩個策略網路博弈,每下完一局更新網路,如果 win ,u全部等於+1,如果 lose,u全部等於-1。

    這一步就是用到策略網路的地方。

  • 接著,類似於迴歸問題,Loss : \(L =\sum_{t=1}^T\frac{1}{2}[v(s_t;w)-u_t]^2\)

    L 反應了 預測和真實情況的接近程度,越小說明越接近。

  • 接著用 L 關於模型引數 w 求梯度,做一次梯度下降。\(w\leftarrow w-\alpha\cdot\frac{\partial{L}}{\partial{w}}\)

5.7 蒙特卡洛樹搜尋 MCTS

真正到了跟專業棋手下棋的時候,AlphaGo用到的既不是價值網路也不是策略網路,而是蒙特卡洛樹搜尋,兩個神經網路只是用來幫助蒙特卡洛樹搜尋。

a. 人機下棋策略

對於人類棋手,下棋是通過多向前看幾步來作出合理決策的。越是高手看的步數會越多。當年深藍靠的就是暴力搜尋所有的情況,來做出決策戰勝人類的。

AlphaGo 同樣是向前看,搜尋未來可能發生的狀態,找出勝算最大的。

b. 搜尋思想

  1. 隨機選擇一個動作 a,不是均勻抽樣,而是按照動作的好壞程度以不同的概率選擇。

    用策略函式排除掉大多數的動作(概率低的動作),這些動作不夠好。

  2. 接著 AlphaGo 向前看,策略網路自我博弈,直到遊戲結束,根據勝負和價值函式來給動作打分。

  3. 重複步驟2多次,這樣每個動作都有很多個分數,累加起來或者取個期望。

  4. 選擇最高分數的動作 a來執行。

c. MCTS的步驟

有四步:

  1. Selection:按照動作的分數選出一個動作(還不執行,只是為了接下來的模擬);
  2. Expansion:用策略網路模擬對手的動作,根據 \(\pi\) 選一個概率較大的動作來走;
  3. Evaluation:給1中選出的動作打一個分,一部分是價值網路給當前狀態打一個分數 v;另一部分是策略網路自我博弈做到結束的獎勵 r;把 \(\frac{r+a}{2}\) 作為平均分數賦給 a。
  4. Backup:\(\frac{r+a}{2}\)來更新動作分數。
(1).Selection

在當前狀態 \(s_t\) 的情況下,給所有動作打一個分數 score(a),反映動作的好壞程度:

  • \(score(a) = Q(a)+\eta\frac{\pi(a|s;\theta)}{1+N(a)}\)

解釋:

引數方面;

  • Q(a)是搜尋計算出來的分數,動作價值,相當於一張表,記錄每個動作的分數;
  • η 是一個超引數,手動調整;
  • \(\pi\) 是策略網路給動作的分數;
  • N(a)是動作 a 被選中的次數,如果動作很好,選中這一動作的可能性就很大,相應 \(\pi\) 值就很大,而如果a被探索過很多次,N變大,避免重複探索過多次。

初始時Q值為0,此時完全由策略函式 \(\pi\) 來決定探索哪一動作,而探索次數增加到很大之後, 第二項變小,這時主要由第一項 Q(a) 來決定。

我們舉個例子繼續向後理解,有三個動作,我們選擇概率最大的這個\(a_t\)繼續向下。(並不執行,只是模擬)

(2).Expansion

根據策略網路模擬對手,假設把 \(a_t\) 執行了,用策略函式抽樣一個動作來代替對手回應。這時不是挑選概率最高的動作,所有可能的動作都有各自的概率被抽到。

引入一點數學概念:

狀態轉移函式\(p(s_{t+1}|s_t,a_t)\)

對手的動作 (相當於環境 environment) 會產生新的狀態 \(s_{t+1}\) ,但是我們並不知道對手要怎麼應對,所以不知道動作轉移函式。我們使用策略函式 \(\pi\) 來代替狀態轉移函式。

比如我們選中了概率為0.4的動作,產生了狀態\(s_{t+1}\)

(3).Evaluation

從狀態\(s_{t+1}\)開始,讓策略網路自我博弈,直到分出勝負(Fast Rollout)。在遊戲結束時拿到獎勵,贏則 \(r_T=+1\);輸則 \(r_T=-1\)

獎勵 \(r_T\) 被用來評價 \(s_{t+1}\) 的好壞,贏了增加評分,輸了減少評分。

同時,價值網路也被用來給 \(s_{t+1}\) 評分,這個價值網路之前就訓練好了。輸入 \(s_{t+1}\) ,輸出評分\(v(s_{t+1};w)\),也可以反映 \(s_{t+1}\) 情況下的勝算有多大。

綜合兩個方面的評價,即 \(V(s_{t+1})=\frac{1}{2}v(s_{t+1};w)+\frac{1}{2}r_T\),反映 \(s_{t+1}\) 的好壞程度。

(4).Backup

模擬的過程將重複很多次,所以每個狀態下都會有很多記錄:

而對於每個動作 \(a_t\) 都會有很多這樣的子節點,對 \(a_t\) 所有的記錄求平均,作為 \(a_t\) 新的價值 \(Q(a_t)\),作為對動作 \(a_t\) 的評價。

這個 Q 值就在第一步被用來選擇最好的 a。

Q值初始化為0,每搜尋一次會更新一下這個 Q。

在此處可以回顧一下第一步。

當上述四步被重複很多很多次,這時候動作的 好壞 已經很明顯,這樣就可以做真正的對局決策了。、

一個動作 a 的 Q 值和 \(\pi\) 值越大,被選中的次數N(a) 就越大,所以動作的好壞就通過 N(a) 來反映。AlphaGo就選擇N值最大的動作來對局。

(5).對局步驟

人類棋手下一步棋,AlphaGo會重來一次蒙特卡洛樹搜尋,重新把 Q 和 N 初始化為0,重新進行以上四步來做模擬作決策。

5.8 AlphGo Zero VS AlphaGo

這部分後續補充吧,AlphaGo Zero 比 AlphaGo強大更多,主要的區別在於:

  1. AlphaGo Zero 未採用 Behavior Cloning ,沒有學習人類經驗,反而更強。

  2. 在訓練策略網路的時候,就使用了 MCTS,讓策略網路模仿 MCTS 做出的動作。

    如何使用的,後續補充。

x. 參考教程

相關文章