立場新聞 Stand News

淺說 AlphaGo

2016/3/13 — 20:18

youtube 片段截圖

youtube 片段截圖

(編刊:原文寫於3月12日,獲作者授權轉載)

首先,今日是李世石先生結婚十週年紀念日。多麼值得紀念的一天,先祝李先生李太太錫婚紀念日愉快,長長久久!李先生今日堅強戰鬥,雖然不敵電腦的蠻力,但是回到家還有太太溫暖的擁抱,還有女兒繞膝,還有無數我這樣遠遠關注比賽,為他搖旗吶喊,加油打氣的人,做人還是很美好的。李先生加油。

再說一件題外事。其實我不會下圍棋,平時也並不關心圍棋界的消息。這次比賽是從德國最大的科普新聞網站heise那裡看到的。當天去查了一下有關AlphaGo的資料,了解到她那套算法是用到經過海量棋譜深度學習以後的模擬神經網絡。而我是了解機器深度學習的原理,也見識過這一族算法的厲害的。在計算機視覺,計算機語音識別等等領域,這幾年都是大量用到這套工具。雖然是圍棋盲,但是當下就隱隱感覺到了AlphaGo來者不善。

廣告

我就在heise網站留言說:“AlphaGo的深度學習算法有學到人類最優秀棋手的think patterns,在實戰中還有強勁的實時運算能力找到致勝的道路。歸根到底其實李也是這樣子學習棋藝並且作戰的。但是,實戰中計算機不會累也不會漏看什麼局面,它的表現要比人類穩定得多。如果李在比賽中從頭到尾都處於極佳狀態,那他還有點機會。否則他會很難辦。我衷心祝李好運。”

就是這樣一個留言,有被德國的圍棋愛好者痛罵,說李一定會贏。基本上,heise的讀者已經是些技術宅人。也就是說,heise的讀者對新技術的理解和接受水平是高於德國民眾的平均水平的。由此可以窺得德國社會對於人工智能怎樣運作的理解度和接受度。所以人工智能很容易在德國社會引起無謂的恐慌和抵觸。所以自動駕駛汽車一類的先進工具注定會在德國遭遇阻力。所以科普工作者們必須還要做很多事。好的我今天就是來科普的。廢話講完,言歸正傳。

廣告

首先,簡單說下為什麼下好圍棋對計算機來說非常困難。通常,寫棋類對弈的程序,naive一點的算法,就是把每一步以及以後的所有可能出現的情況全部列出,在電腦的內存中建立一種所謂“搜索樹”的數據結構。搜索樹上的每一個分支,就代表一種走法的sequence,這個分支展開直到末端,就是對弈到底的情況,就可以看出勝負。某一個還沒有走到底的盤面,就對應於搜索樹上末端之前的某個節點。在這個節點上,可以根據它後面展開分支上的勝負情況,給出一個勝負概率。

比如,第100步上的某個節點,後面還有100個分支。這100個分支中,20個到最後是贏,80個是輸。那麼這個第100步節點上的勝率就是0.2。不是一個理想的選擇,程序應該看看第100步中另外的節點的勝率。後續步數越多,就代表搜索樹越“深”。假如圍棋在理論上是361步走完,那麼一開始的時候,它的搜索樹的深度是361。走到第300步的時候,因為前面的sequence已經完全確定,剩下的搜索深度就只有61層了。

那麼,這種搜索樹,假如全部分支都展開,可以有多大呢?據信息學家Claude Elwood Shannon計算,國際象棋每一步平均有20種不同的走法。也就是說,它的搜索樹的根部會有20個分支,第二步的每一個分支上,又有20個分支,依次類推。走三步就有多少個分支了呢?20*20*20=8000。走三十步就是2030個分支。而圍棋棋盤比國際象棋更大。假如要把所有對弈結果窮盡列舉,那麼它的搜索樹上會有多少個分支呢?科學家的計算結果,大約是10170個。而我們可以觀測到的宇宙中的所有原子,加起來也不過是1080個。每一個原子都用來代表圍棋下法的一個分支都不夠用。就算開動全世界所有大大小小的電腦一起搜索每一種走子結果,搜到地老天荒宇宙第二次大爆發都只剛剛搜了個開始。圍棋編程夠難吧?怎麼辦呢?

有些白痴走法,比如,第一步A1,第二步A2,第三步A3……是不可能去走的。於是,那些白痴程度類似A1-->A2-->A3的分支,全部可以砍掉。假如剩下的分支還是太多,那就只能隨機抽取一些分支搜到底,再來算一算某個節點上的獲勝概率了。這種隨機抽樣再計算的方法就是所謂的蒙特卡洛法。這種算法可以在有限的時間內保證給出一種解答,但不保證是最優解。國際象棋規則相對多,盤面上明顯的優劣比較好判斷,按著下棋規則和盤面優劣情況可以砍掉它的搜索樹中絕大部分的分支。接下來的隨機抽分支,樣本覆蓋面比較大,最後算出來的那幾個“下一步”的獲勝概率就比較準確。所以光靠這個蒙特卡洛搜索法,再配合一些局部優化算法,若干年前就已經戰勝人類。但是圍棋不同。她的搜索樹上的分支比國際象棋多出許多。然後,用來“砍樹”的,直接一些的規則很少。“用簡單規則把搜索分支減少到可控範圍”這條路在圍棋上是走不通的。

於是我們必須教給計算機程序一些“棋理”,讓她能在盤面上作出好的選擇。而圍棋的棋理十分玄奧,而且,有時同一個盤面同一個佈局,好壞也是眾說紛紜。現在的問題是,怎樣讓計算機來學習這些玄虛奧妙,說也說不清楚的棋理呢?

這裡,就可以用到模擬神經網絡和深度學習算法來讓計算機自動分析歸納出棋理來了。

所謂的“模擬神經網絡”也是一種數據結構。數據結構中的節點好比神經元,常常用來classify一些事情。連接節點之間的通道則常常代表某種觸發或者傳輸​​條件。下面我們來看一個最最簡單的,層數為2的模擬神經網絡:

上面這個兩層的神經網絡表達了一個布爾函數“異或XOR”。這個神經網絡,在第一層(玫紅色的那一層)上的節點裡輸入兩個布爾數X1和X2的值,通過布爾運算規則得出中間值Z1和Z2(藍色部分),這兩個中間值再與一下,得到函數的輸出結果y。這個例子只是給大家提供一個關於類神經網絡的感性認識。

因為我自己對圍棋一無所知,所以用計算機圖像識別作例子來簡單說明一下這種數據結構的應用。一張人臉照片上有許多特徵,比如嘴角,眼角,鼻翼等處有凹陷,照片上相應的這些點顏色就比較深。我們可以想像一下神經網絡的某一層就是用來儲存照片上這些深色的點的信息。然後,還可以找出這些點和點之間的約束條件,比如兩個深色點之間的直線距離,比如相對於頭寬的距離,諸如此類,就可以進一步確定“這是一隻眼睛”,“這是一張嘴”等等中間值。這就是所謂“模式識別”,即pattern recognition。

通常神經網絡中的每一層負責偵測圖上的一方面或者某些方面的特徵信息。最後綜合網絡中各層特徵信息,再經過一層或者幾層的線性回歸模型,計算機得出這張照片是不是一張人臉的結論。而這些“人臉的各個方面的特徵”,在訓練的時候則不必由人事先告訴計算機。只需給計算機一張照片並告訴它這是一張人臉,就可以。只要用來訓練的照片足夠多,算法就可以很好地歸納出所有這些特徵或者模式。

而計算機“歸納特徵”或者“歸納模式”的能力是驚人的。2012年的ImageNet計算機圖像識別競賽上,冠軍SuperVision小組訓練出來的神經網絡有8層,用到6000萬個參數(可以看成是6000萬個特徵)。那個神經網絡識別貓貓狗狗比我厲害多了。有些罕見貓狗,長得比較像對方,憑照片我無法判斷是貓還是狗,而算法的判斷則八九不離十。

至於說那6000萬個特徵,到底是些什麼呢?那些寫算法的科學家自己事先都不知道的,必須到那個神經網絡裡去查詢一下的。查詢出來的結果,很多都是連那個科學家自己都覺得匪夷所思。比如(例子我亂舉的,只是給大家一個印象),“耳朵頂部到耳朵底部的連線跟頭部弧線的某個切線的夾角的數值範圍”。一般人類不會去這樣看一張圖。

大家必須記住的是,海量照片訓練出來的神經網絡,並不是記住某張照片上是什麼,而是把照片上的特徵全部都分析歸納過。所以,你給它一張新的照片讓它判斷,它首先是分析這張照片的特徵,再根據特徵來判斷,而不是“背”照片。基本上這個神經網絡就是一個知識儲存庫。

所謂的“深度學習”,“深度”是指算法底下那個神經網絡的深度。這個網絡越深,被研究對象的特徵也就被分析得越透徹。比如Google的語音識別神經網絡,就深達30層,不得了的事。模擬神經網絡技術已經有50多年曆史,但是以前不被重視。這是因為,如果訓練用的數據太少的話,它給出的結果很不准確。但是,大數據時代的到來令這一族算法獲得了新生和極為廣泛的應用。

現在大家可以想像一下怎樣用深度學習算法來訓練AlphaGo.餵給它棋譜,並且告知最後勝負就可以。當中的棋理,就跟圖形識別中的特徵歸納類似,算法自己會去歸納總結的。這就它厲害的地方。

第一,他並不需要一個頂尖高手給他作教練。當然那個學習模塊內部還是需要一些用來歸納規律的數學模型。他的建模專家,只要是個中等程度的棋手,給那個學習算法適當程度的約束就可以。太白痴或者太高手都不適合。對圍棋一無所知的建模人員會讓那個深度學習模塊無所適從。而太高超的棋手,可能會把太多自己的想法加到那個選擇模型中去,而他的判斷未必是最優的。

黃士傑這樣的棋手,給深度學習模塊作一些指導性的約束,不太少也不太多,其實很合適。

第二,經過海量的棋局對弈訓練,一些玄妙高深而難以言傳的所謂“棋理”,會被AlphaGo的深度學習模塊整理歸納出來的。這中間,有些是我們人類已經知道的,而有些可能是人類並不知道,並沒有探索過的“致勝棋理”,或者說“致勝圍棋哲學”。圍棋對弈中,雙方的發揮空間那麼大,發生這樣的事(電腦歸納出人類未知的圍棋哲學)其實很正常。換句話說,AlphaGo經過幾千萬局的對弈,對圍棋棋理的“理解”程度,很可能已經超過了人類。以上兩點,也正是我在德國heise那樣留言的理由。

機器學習算法訓練出來的結果,即不同盤面下的策略選擇和價值判斷,是分別儲存在AlphaGo的策略網絡和價值網絡中,代表AlphaGo的“棋感”。這種類神經網絡的數據結構有一個特點,就是讀取效率非常高。它們用來給AlphaGo提供基於經驗知識的“直覺判斷”,也就是為下一步提出幾個最有價值的選點。這裡的“價值”以獲勝概率表示。

但是,那個獲勝概率也只是一個估計值。跟水平一般的棋手下,那兩個網絡就足夠。相當於,高手對庸手,高手憑感覺下棋就可以了。但是遇到高手時,那些“感覺”就要到上面所說的那個搜索樹中老老實實層層展開去驗算一下。但是這時,因為選點極少,搜索樹的寬度已經大大減小,隨機抽取一些分支搜到底,算出來的結果準確率也相應提高了。

很好理解的是,棋子越下到後面,搜索樹的深度越小,在給定的時間下,可以抽取驗算的分支就更多,各個選點上的勝負率就算得越準確。而在前半局時,搜索樹的分支還太多,也太深,AlphaGo也算不准確。對手足夠精明老練且運氣好的話,可能可以占到很大的優勢。越往後AlphaGo算得越準確,所以,人在佔優的情況下還絕對不能出錯。這對人來說太難了。而如果前半局就處於不利,後半局基本沒有機會翻盤,就抱著學習的心態下到底吧。

基本上,看那個算法框架就知道,圍棋已經被人工智能crack了。這次的人機對弈,其實是對這套算法的一次檢驗。就算現在輸掉,假以時日,AlphaGo勝過人類棋手是必然的事。完全不必悲觀或者害怕。它不過是人類製造出來的工具,知道它的運作機理就可以駕馭它。網上流傳很廣一個說法我覺得很好:汽車也是人發明的,人也不必跟汽車去比誰跑得快呀!所以我一直一直鼓勵大家多少去了解一點機器學習的算法。了解了就知,機器算得比我們準比我們快是理所當然的事,輸掉也根本不是什麼恥辱。沒有我們發明那些算法,告訴機器怎樣去瘋狂地算瘋狂地歸納,它們什麼也不懂呀!

AlphaGo的這套算法,雖然都不是特別新,但是正如知乎網上的一位科學家所說的,它的價值在於它的工程實現。這個富有邏輯和創意的算法組合給其他類似的“困難”問題提供了一個光輝樣本。當中許多問題細節在算法工程上的處理方法,會給其他問題的算法帶來啟迪。

最後,我要說的是,人工智能再發展,人仍然有作為人的獨特價值。人的邏輯思維,機器可以模仿歸納。但是,人對某物某人某件事一瞬間的情生意動,或者天長地久的一往情深,機器無法模擬得到。讓我們在有生之年好好感受。


謝謝閱讀,下次再見。

作者博客

發表意見