讀Nature文章,看AlphaGo養成

博主是圍棋小白,下棋規則都記不清楚,也沒有設計過棋類AI程序。這篇文章主要是閱讀《Nature》論文及關於AlphaGo的相關文章的學習心得。本文的主要目的是增進分享,交流學習,方便初學者瞭解AlphaGo中的算法,以及一些機器學習中的常見思路。真正的工程實現過程遠比本文介紹得複雜。

本文更多是啓發式地進行闡述與分析,包括一些作者結合自己的理解進行的簡化處理。文章中不嚴謹和理解不當之處,歡迎大家批評指出,我們努力修改完善。機器學習的第一步都是先了解業務。圍棋的業務特點包括其基本規則、對弈特性和下棋的典型思路。根據這些業務特點,我們可以分階段實現我們的圍棋算法。

2.1 圍棋的基本規則

使用方形格狀棋盤及黑白二色圓形棋子進行對弈,棋盤上有縱橫各19條直線將棋盤分成361個交叉點,棋子走在交叉點上,雙方交替行棋,落子後不能移動,以圍地多者爲勝。並且雙方可以相互喫子(提子),只要我方棋子將對方某一片緊鄰的棋子周圍圍住,就可以將對方這片棋子喫掉。

2.2 對弈特性

基於以上規則,圍棋對弈過程中有以下特性:

不像象棋、軍棋那樣盤面上的棋子越走越少,而是越走越多。所以一局棋從開始到結束,用一張標記好走棋順序的棋譜就能保存絕大部分下棋的信息,是一個時間序列。如下圖就是《Nature》論文中的樊麾與AlphaGo對弈的一個棋譜:

對弈從開局到中局變化都很大,尤其是中局,往往是一着不慎,滿盤皆輸。用數學的描述叫做估值函數(得分函數)非常不平滑。

到收尾階段,由於棋盤上總體的棋子是越來越多的,其變化就越來越少。可以看成是一個動態收斂的過程。狀態空間非常大,約爲2×10170,超過目前的計算機的計算能力,無法通過暴力窮舉解決。

2.3 下圍棋的基本思路

而人類不需要搜索這麼多狀態空間也能夠下好圍棋,說明還是有規律的,只是這些規律比較抽象。我們機器學習算法就是要儘量找出人類下圍棋的一些規律。我們可以簡單總結一些人類下圍棋典型思路如下:

首先是明確基本規則,這個方便。其次是掌握一些基本定式,也就是在一個給定的局面下人類一般會怎麼走,這個過程不涉及優劣的判斷,也比較難以用確定性的規則描述。基於對棋局未來演化情況的評估,決定當今當下的下棋策略。所謂手下一着子,心想三步棋。這是圍棋最複雜的情況。

2.4 分階段實現下棋算法

基於以上這些初步瞭解,我們可以分階段實現我們的下棋算法:

第一步是學會人類下棋的一般定式,形成一些優秀考慮的下棋策略。

第二步是對落子之後的棋局演化做出有效評估,基於評估的結果優化自己的最終落子策略。

現在我們思路大概有了,但仍然不知道模型的最終樣子應該是怎樣。此時我們建議先動簡單手做一個baseline,然後在模型調優的過程中不斷地分析問題、解決問題。這樣就很有可能更快找到問題的最佳解決方案。設計baseline思路基本如下:

3.1 抽象成數學問題:多分類

通過以上分析可知,下圍棋的過程就是一個不斷地決策在哪個位置落子的過程。在落子之前,你已知棋盤上所有已落子的情況。而棋盤上總共就19×19=361個位置,所以落子就是一個3611的多分類問題。將多分類問題轉換成簡單的2分類問題來處理,(採用one-to-rest的思路,)則需要3612分類的分類器,每個分類器只評估落在361個位置中某1個具體位置的分數,再從這361個結果中中挑選分數最大的位置來落子。 

3.2 哪些特徵,如何選擇?

分類器的輸出我們知道了,就是361個標籤。那分類器的輸入又是哪些特徵呢?其實就是當前的棋盤分佈。

我們先考慮第一類特徵。圍棋一共是361個交叉點,每個交叉點有三種狀態(白子、黑子、無子):可以用1表示黑子,-1表示白字,0表示無子。於是一個361維度的向量就可以完全表示當前棋盤的情況。理論上說,只輸入這些特徵就可以了。如下圖就是演示用矩陣表示棋局狀態的情況,而矩陣拉長就是一個向量了: 

但是,因爲圍棋的極端複雜性,這些棋子(輸入特徵)的關係是非線性的。雖然理論上採用神經網絡的算法可以處理非線性特徵,但是計算量和對資源的消耗都太大。相反,如果有依據地增加一些新的特徵的維度,使特徵間的非線性關係不那麼複雜,將使得模型變得更加簡單、更加便於訓練,優勢還是很明顯的。

那怎麼增加更多的特徵呢?這就需要利用部分圍棋領域中的知識,比如圍棋中的術語:氣、目、空等概念都可以作爲我們構造新特徵的基礎。在AlphaGo的論文中就是採用了以下更多的特徵: 

所以,輸入模型的特徵是一個361×n維度的向量。基於這些向量來訓練模型。

最終,AlphaGo只依靠一個13層的卷積神經網絡就能訓練出一個比較好的落子分類器。比起圖像識別競賽用到的2030層的深層神經網絡還是比較淺了。這些都是特徵工程的功勞。

3.3 初步採用什麼樣的模型?

我們瞭解到,下圍棋的算法本質上就是一個分類器,而最簡單的分類器就是邏輯迴歸。可以預期它的分類效果不一定很好,但是速度非常快,在需要快速迭代的業務場景中可能有優勢。所以邏輯迴歸是我們考慮的一類模型。

但是在複雜的圍棋博弈中,需要更多高維度的抽象特徵,這些構造起來非常麻煩,而經過我們之前的博文介紹,神經網絡具有這樣抽象高維特徵的能力。但是神經網絡有許多種類,什麼卷積神經網絡、全連接神經網絡、反饋神經網絡等等,到底用哪一種呢?

我們可以繼續研究圍棋的業務特點來尋找啓發。我們發現,圍棋的棋盤本來就是個19×19的矩陣,真有點像一張19×19像素的照片。而處理圖像照片的最典型神經網絡就是卷積神經網絡。而且我們之前的博文專門介紹過卷積神經網絡,其最關鍵特質的在於假設圖像空間中局部的像素聯繫較爲緊密,所以其卷積層的每個神經元只關注上一層的一些局部區域,這樣能夠充分利用輸入數據的二維結構和局部特性,減少運算過程中的參數。你可以想象成,上一層的數據區,有一個滑動的窗口,只有這個窗口內的數據會和下一層的某個神經元有關聯。而這種 “局部連接性剛好與圍棋的一些特點相似,比如圍棋的大部分爭奪是在局部區域進行的,不同的局部爭奪共同組成了圍棋的全局性。所以卷積神經網絡也是我們考慮的一類模型。

3.4 採用哪些數據做訓練?

標籤、特徵、模型基本定好了,剩下的就是數據了。從哪裏得到數據呢?還是回到我們之前的棋譜,那本質上是個有時間順序的序列。如果我們能夠蒐集到大量標記好落子順序的棋譜,每一步落子之前的局面全都作爲特徵(s361×n維度的向量),這一步落子位置作爲標籤(a361維度的向量),那不就得到了大量的有標註的數據< s , a >嗎?

這還是得感謝網絡時代,如今網絡上有大量棋牌室,全都記錄了人類下棋的過程,每天都產生大量有標註的數據。DeepMind就是直接從圍棋對戰平臺KGS(可以理解成外國的聯衆圍棋遊戲大廳)獲得16萬局69段人類選手的圍棋對弈棋譜,總共有3000萬個的< s , a >位置,訓練出來了一個類似人類下棋行爲的模型。

DeepMind團隊基於卷積神經網絡和邏輯迴歸做了兩個模型:一個叫做監督學習策略網絡”pσ supervisedlearning (SL) policy network pσ,田淵棟大神稱作走棋網絡),一個叫做快速策略”pπfast policy pπ,田淵棟大神稱作快速走子”**)。其實就是兩個版本的落子選擇器(分類器)。 

4.1 評估baseline的效果

這個兩個模型模型的效果如下:

監督學習策略網絡已經可以和業餘水平的人類選手過招,能正確符合57%的人類落子行爲,互有勝負。

可以把快速策略看做是監督學習策略網絡的輕量級版本,它能夠比監督學習策略網絡1000倍,但是隻能正確符合24%的人類落子行爲。總體來說還是蠻驚人的。但是距離職業棋手,還是有很大的距離。

4.2 分析其下棋水平不高的原因

爲什麼baseline的下棋水平不高呢?猜測可能有以下幾個原因:

我們主要是拿網絡棋牌室的數據去訓練,這些人的水平本來就離頂尖職業棋手就有相當大一段距離。俗話說:跟臭棋簍子下棋,越下越臭。與大量業餘選手下棋,訓練出來的行爲也難以達到職業水準。古往今來,真正頂尖的棋手本來就不多,頂尖的對局棋譜相應也就不多,拿這些數據做訓練遠遠不夠。更本質的問題是,我們的估值函數有問題。無論是卷積神經網絡還是邏輯迴歸,都可以近似理解爲基於3000萬個的有標註的數據< s , a >,評價在當前局面s下,落在某一位置a的概率,也就是p(a|s)。我們選擇p(a|s)取最大值情況下的落子位置a。但這個過程沒有考慮棋局的輸贏信息!也就是說贏棋的落子方案也學,輸棋的落子方案同樣學習。這樣的話,讓模型怎麼去分辨自己落子是贏棋還是輸棋的落子方案呢?即便分出了贏棋輸棋方的落子方案,贏棋者的落子不一定都是好棋(如兩個臭棋簍子下棋),輸棋者的落子不一定都是差棋(如兩個頂尖高手的精彩對弈)。那到底應該學習贏棋過程中的哪一步落子< s , a >呢?像baseline這樣的模型看來更適合學習對弈雙方都會走的棋路,也就是常見的定式。更進一步,落子之後的棋局演化情況在上面的模型中根本沒有體現。不把這樣的行爲考慮進來估計很難在棋力上有一個質的飛躍。

4.3 從對原因的分析中產生優化的思路

經過以上的原因分析,我們大致知道猜想到了問題的所在,由此可以進一步確定我們的優化思路:

核心目標是改進評估函數,使之更好地體現某一步落子對全局的輸贏結果的影響,以全局的輸贏爲目標進行優化。

一方面,可以基於歷史棋局的輸贏情況進行重新訓練。如果訓練數據不夠,可以考慮通過落子選擇器自己與自己對局來增加訓練樣本數或者強化學習。

另一方面,在下棋實戰的時候,需要對棋局的演化情況有一個評估,需要蒙特卡羅樹搜索(Monte Carlo TreeSearchMCTS)。具體展開內容見後文。

將兩個指標綜合評估,得到落子優劣情況的評判。指導我們落子。

5.1 採用新的標籤

在之前的模型中,我們是基於標註數據< s , a >進行訓練的,也就是以當前局面s作爲特徵,下一步落子a作爲標籤。現在我們要基於局面整體的輸贏進行訓練,就要對原有的標籤和特徵進行改造。需要增加新的標籤z,表示局面對應的勝負情況:可以用1表示贏棋,-1表示輸棋,0表示和棋(博主理解是多劫循環,也就是雙方可以無休止地走下去的情況)。而特徵就是(s,a),它表示在a處落子之後的新的局面(本質上還是一個局面,可以用s’表示,《Nature》原文就是這樣表示的)。也就是說基於有標註的數據<s,a),z>(表示當前局面爲s,下一步落子爲a的新局面下,輸贏情況爲z的數據)進行訓練。

5.2 採用更多的數據

既然要基於歷史棋局,可不可以直接以之前的16萬局棋譜的輸贏情況和落子情況一起進行訓練呢?DeepMind團隊試了一試,發現結果過擬合。

分析原因,大概就是我們剛纔說的贏棋者的落子不一定都是好棋(如兩個臭棋簍子下棋),輸棋者的落子不一定都是差棋(如兩個頂尖高手的精彩對弈)的情況。圍棋的落子是相互之間強烈相關(stronglycorrelated 的,有時候一兩着棋就覺得了整個棋局的輸贏。那到底應該學習贏棋過程中的哪一兩步落子< s , a >呢?

其實我們可以換一個思路。如果真存在一兩着決定勝負的棋,那就說明其他的走法很可能就會演化到輸棋,那把演化到輸棋的棋局也拿過來進行訓練,就可以在這一步棋上訓練出贏棋的概率很高的權重。而之前過擬合的原因很可能就是我們訓練數據當做仍未窮盡棋局演化的各種可能,把臭棋也當做好棋來學了。所以需要想一個辦法產生更多高質量的棋局演化可能用來訓練。既然靠人類對弈已經滿足不了機器的胃口,那就用機器自己與自己對局來增加訓練樣本數,這就是傳說中的左右互搏。比如開局,先用某個落子選擇器走n步,由於n是隨機的,這就產生出n個局面分支。覺得局面還不夠多樣化,再完全隨機擲m次骰子,就又在每個局面分支上產生m新的局面分支。如此循環往復,就得到了非常豐富的局面s和這些局面對應的結果z。有了這些訓練樣本< s , z >,再加上卷積神經網絡,就可以得到一個函數v(s),輸出在局面s下的贏棋概率。

按《Nature》原文的說法,他們通過自我博弈(self-play)產生了3000萬個標註樣本< s , z >,每個樣本的局面s都來自不同的一局棋(each sampledfrom a separate game),以此來防止過擬合(這些挑出來的樣本是否可能也是臭棋?)。注意,之前也是3000萬個標註樣本< s , z >,但它們只來自於16萬局人類博弈的棋譜。而基於此訓練出來的函數叫做估值網絡valuenetwork vθ),輸入的是361×n維度的向量,輸出的是一個值,也就是在該局面下勝利的概率。

5.3 估值網絡與走棋網絡下棋的對比

我們知道,走棋網絡輸入的s361×n維度的向量,下一步落子位置a361維度的向量。其下棋規則是判斷選擇p(a|s)取最大值情況下的落子位置ap(a|s)就是模型的估值函數。而估值網絡輸出的只是一個值v(s)。那判斷下一步棋的落子位置呢?其實只要將下一步落子產生的新局面(s,a)作爲輸入s’,求出各個新局面的v(s′),選擇v(s′)取最大值情況下的落子位置a就行了。v(s′)就是模型的估值函數。所以這兩個網絡作爲落子選擇器的差別本質上就是估值函數的算法不一樣。

5.4 增強學習

我們繼續分析,既然走棋網絡p(a|s)可以自己產生數據,那麼可否用自己產生的數據來訓練走棋網絡p(a|s)自己(而不是估值網絡v(s))呢?而這就是增強學習的思想。比如我們已經有了一個走棋網絡”pσ,先用對弈,比如1萬局,就得到了一萬個新棋譜,加入到訓練集當中,訓練出pσ1。然後再讓pσ1pσ1對局,得到另外一萬個新棋譜,這樣可以訓練出pσ2,如此往復,可以得到pσn。我們給pσn起一個新名字,叫做增強學習的策略網絡”pρreinforcementlearning (RL) policy network pρ )。這時,再讓對局,在不用任何搜索的情況下贏棋的概率可達80%,效果拔羣。當然,具體的訓練過程比較複雜。這裏先不展開,僅對其具體效果進行分析。既然這麼強,我們在實戰中直接用這個模型怎麼樣?可惜,這樣的方法反而不如之前的走棋網絡”pσ。《Nature》的論文中認爲這可能是因爲增強學習的策略網絡是落子選擇過於單一,基本就只選擇它認爲最好的那樣走法(the single bestmove),而人類的棋手更願意思考更多的有前途的路數(a diverse beamof promising moves)再決策。所以增強學習還有很長的路要走(田淵棟)。

但是增強學習可以提供更多質量更好的樣本便於估值網絡v(s)去訓練。這樣,v(s)就可以給出下一步落子在棋盤上任意位置之後,如果雙方都使用來走棋,我方贏棋的概率。如果訓練v(s)的時候全部都使用走棋網絡”pσ而不用增強學習的策略網絡呢?實驗表明基於訓練的v(s),比基於訓練的v(s)的效果更好。

5.5 評估估值網絡的效果

實踐表明:估值網絡v(s)對棋局輸贏的預測效果要好於快速走子結合蒙特卡羅樹搜索接結果,也接近達到了走棋網絡結合蒙特卡羅樹搜索接效果,而且其計算量是後者的1/15000using 15,000times less computation)。注意這裏是對輸贏的預測效果,而不是對落子可能性的預測。

以上的方法我們都是基於當下的落子情況來評估落子路徑優劣的。但人類的下棋思維是手下一着子,心想三步棋selects actionsby lookahead search),要對之後的棋局有個評估。那怎麼讓機器去思考接下來的發展呢?這就需要傳說中的蒙特卡羅樹搜索(MCTS)。

6.1 基於估值網絡v(s)MCTS

我們就先不說蒙特卡羅樹搜索(MCTS)的術語吧,什麼選擇、擴展、模擬、反向傳播啥的的。這裏直接以下棋的思維方式來解釋這個過程,儘量生(shuo)(ren)(hua)

首先,我們有一個走棋網絡”pσ,它生成了一個當前局面s的下一步走棋位置a1的概率分佈。走棋網絡的特點是模擬人類的常見走棋行爲,但並不評估走棋之後的贏棋的概率(贏棋的概率與分佈概率是兩個不同的概念)。但可以假設,優秀的走棋路數應該在人類常見的走棋範圍內,這就大大減少了需要考慮的可能性。那怎麼從這些選擇中找出最優的那個落子呢?咱不是剛好有個估值網絡v(s′)嗎?直接用它篩選贏棋的概率較高的可能落子局面(s,a1)不就可以了嗎?這已經完成了一步落子選擇,但是距離手下一着子,心想三步棋的標準還差一些。那就繼續假設走了a1之後,再考慮對方最可能怎麼走。其思路與上面一樣。那這樣對方走了一招a2。緊接着可以再走一着a3。好了,現在走了3步棋了。是不是就夠了呢?未必。如果評估v(s,a1)的贏棋的概率是70%v(s,a1,a2)對方的贏棋的概率是60%(對應我方贏棋的概率是-60%),而走到第三步的時候評估的贏棋的概率v(s,a1,a2,a3)35%呢?那你還要不要走a1這個位置?這需要我們重新理解v(s)的實際意義:它用來預測該局面以增強學習的策略網絡的方式自我博弈後的贏棋的概率(predicts thewinner of games played by the RL policy network against itself)。而在我們蒙特卡羅樹搜索過程中,不是用的方式來選擇落子的,所以不符合v(s)的定義。這就需要用新的方法來評估局面s下的贏棋的概率,也就是要對原來位置的贏棋的概率v(s)進行更新。那怎麼更新呢?最簡單的方法就是加權平均。爲了不至於混淆,我們直接用v來表示某一局面的贏棋的概率估值函數。剛開始時v(s,a1)=70%,而下完第三步後其更新爲: v(s,a1)=(70%−60%+35%)/3=15% 。此時v(s,a1)已經變爲15%,已經不是之前的70%,也就是說a1的位置可能不是贏棋的概率最大的位置了。需要重新挑選出一個位置a′1,使得v(s,a′1)達到最大值,然後繼續推演並不斷更新不同位置的v(s)。(其實,在第2步對方落子的時候就應該更新v(s,a1)了,過程與上面類似。這裏只是做了一個簡化處理,便於理解。)這就是蒙特卡羅樹搜索的基本過程。可見,這套思路是可以不斷演化下去的,越到後面,算出來的v(s,a1)應該越準確,當時間限制到的時候(圍棋比賽有時限規則,因此時間規劃也是一門學問),就可以返回出最佳位置a1了。

這種算法的一個好處是:可以並行化,因此可以大量提高計算速度。它還有一個好處,就是:它演化出來的各種狀態都可以保存起來,如果對方的落子就在自己的演化路徑之中,這些狀態就可以直接拿來用了。這就節省了大量運算時間。需要說明的是,這裏只是對蒙特卡羅樹搜索做一個原理性的簡化解釋。真實的搜索過程可以增加許多策略,遠比這裏複雜。

6.2 基於快速走子MCTS

其實,我們還有另一種蒙特卡羅樹搜索。基本演化過程與上面類似,但是選擇落子的方式是基於快速走子的。首先,我們還是有一個走棋網絡”pσ,還是由它先挑出一些人類常見的走棋可能。那我們對於各種可能狀態直接用快速走子一路走到底決出勝負。比如提供三種落子可能,都用快速走子模擬對局到底,得到的結果是21負。以1表示勝,-1表示負。則勝利的落子選項的估值函數v(s,a1)=1。然後,對手從勝利的落子選項中用走棋網絡”pσ再拓展出3個落子可能,同樣都用快速走子模擬對局到底,得到的結果是21負。此時可以更新v(s,a1)=(1+1−1)/3=1/3,我方再基於對方的落子局面用走棋網絡”pσ再拓展出一些走棋可能,同樣都可以繼續用快速走子模擬對局到底,得到結果後返回更新所通過的各個走子狀態的的估值函數v(s)。如此不斷反覆。這就體現出pπ 的快速反應速度的優越性了。速度越快,模擬出來的未來對局就越多,對落子之後的局面判斷就越準了。

6.3 綜合兩種搜索策略形成新的估值函數

這兩種搜索各有優劣,而且在一定程度上互補。所以DeepMind將這兩種策略組合到一起,效果就有質的飛躍了。以下是他們對比各種組合方式的結果: 

其組合方式非常簡單粗暴,就是做一個算術平均: v=vθ+z2(z就是快速走子後的返回的勝負結果)工程實現上,還對估值函數增加了一個附加值(bonus)。目的是在快速定位比較好的落子方案的同時,又給其他小概率位置一定的探索可能,增加搜索豐富性。其實蒙特卡羅樹搜索是一個很傳統的技術,但是如果不用先驗的知識隨機搜索,這棵樹的寬度和深度要非常巨大才能返回一個相對靠譜點的值,這樣的計算量是天文數字。但是通過16萬局人類對弈訓練出來的走棋網絡”pσ,能夠砍掉很多小概率的分支,減少搜索的寬度。而通過同樣數據訓練出來的快速走子”pπ,和通過3千萬局機器對弈訓練出來的估值網絡”v(s),能夠共同使得在探索深度比較小的情況下,返回比較好的局面估值效果,減少了搜索的深度。再加上一些細節的策略,整體的效果就是減少了計算量,提高了預測精度。到此爲止,AlphaGo的算法原理基本介紹完了。其實也並不複雜,而且這些都不是AlphaGo或者DeepMind團隊首創的。但是強大的DeepMind團隊將這些結合在一起,再加上Google公司的超級計算資源,成就了超越絕大部分頂尖棋手的人工智能。真令人讚歎不已,向這些背後的工程師致敬。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章