今天潜叛,引人注目的人機大戰(zhàn)終于以4:1的懸殊比分遭笋,宣告了AlphaGo贏得了比賽坝冕,看起來計算機相當?shù)膹姶螅蛧暹@個領(lǐng)域來講瓦呼,已經(jīng)完全戰(zhàn)勝了人類喂窟,那么我們不禁要問,計算機戰(zhàn)勝人類的原理是什么?他們真的具備跟人類匹敵的智商嗎磨澡?
大概在10多年前碗啄,我曾經(jīng)寫過一個中國象棋的AI項目,當時并沒有利用分布式計算(那時也不懂)稳摄,只是一個單機程序稚字,大概能有6-7步的預(yù)測能力,經(jīng)過不客觀測試厦酬,能戰(zhàn)勝我能接觸到的所有象棋愛好者胆描。當時人機博弈理論的基礎(chǔ)就是Alpha-Beta搜索:
Alpha-Beta搜索實際上是從最簡單的BFS搜索和之后的A*搜索發(fā)展來的,BFS其實就是最簡單的窮舉仗阅,每層都把所有的可能列出來昌讲,最后給一個結(jié)論,而A*搜索在這個基礎(chǔ)上减噪,多了一個選擇函數(shù)剧蚣,即在每層遍歷時,給一個優(yōu)先級旋廷,優(yōu)先從看起來局部最優(yōu)的方向入手遍歷鸠按,比如我們在地圖上設(shè)計尋路的機器人,可以設(shè)定NPC周圍所有8個節(jié)點方向上饶碘,最指向最終目的地的方向的節(jié)點是看起來最優(yōu)的目尖,然后從這個節(jié)點優(yōu)先遍歷。
Alpha-Beta搜索扎运,實際也借鑒了A*的思想瑟曲,即每次都從局部看起來最優(yōu)的結(jié)果給出下一步的判斷。首先豪治,我來解釋一下什么是局部最優(yōu):
因為以目前計算機(尤其指單機)的計算能力洞拨,是無法遍歷棋盤所有可能的,以圍棋為例负拟,19*19的棋盤上烦衣,一共有361個點,也就是執(zhí)黑先行者有361個選擇掩浙,之后執(zhí)白有360個選擇花吟,于是361*360*359....,這是一個比天文數(shù)字還大的數(shù)字厨姚,所以我們根本不可能通過計算得到全局最優(yōu)衅澈。
判斷棋局的優(yōu)劣
那么,我們怎么評價某一種走法看起來最優(yōu)呢谬墙?這就需要根據(jù)不同的棋今布,設(shè)定規(guī)則了经备,以中國象棋為例:
規(guī)則1,我們規(guī)定部默,自己一方所有子能走的區(qū)域越大則越優(yōu)弄喘,說俗點,別把自己給“悶死”了甩牺,比如 ? ? ? ? ? ? ? ? ?馬走到邊上蘑志。于是給定一個棋盤,我們可以計算:
V1= 馬可走的區(qū)域+車可走的區(qū)域+兵可走的區(qū)域+帥可走的區(qū)域+....
V越大贬派,則越優(yōu)秀
但是急但,下過象棋的人都會覺得,規(guī)則1也太簡單了吧搞乏,完全沒考慮到車和兵在棋盤上的重要度完全不一樣波桩,不能按照一個權(quán)值系數(shù)算,另外请敦,規(guī)則1完全沒考慮到對對手的威脅性镐躲,于是,我們進行改進:
V2=系數(shù)A * (系數(shù)1*馬可走的區(qū)域+系數(shù)2*車可走的區(qū)域+系數(shù)3*兵可走的區(qū)域...) + 系數(shù)B * (自己的馬有可能吃掉對方的子的重要度+自己的車有可能吃掉對方的子的重要度+自己的兵可以吃掉對方的子的重要度...)
大家能明顯的看到侍筛,V2比V1合理多了萤皂,不僅僅考慮到了自己的字別被“悶死”,還考慮到了對對方的威脅匣椰,那么這個公式還能不能改進呢裆熙?還能!我們知道禽笑,對對方的威脅入录,對帥的威脅是最高的,對車的威脅完全高于對兵的威脅佳镜,說俗一點僚稿,就是能吃掉對方的帥,絕不吃掉對方的車蟀伸,能吃掉對方的車蚀同,絕不吃掉對方的兵。
于是望蜡,這個公式就V3就更復(fù)雜了唤崭,系數(shù)也越來越多拷恨,這里我們得出一個結(jié)論:
我們一定一個得到一個公式脖律,它較公平的判斷一個棋局,對某一方的優(yōu)劣是什么腕侄,且這個優(yōu)劣還是可以量化的小泉!當然芦疏,對于圍棋而言,這個公式更麻煩一些微姊。
但這里我們忽略了一個問題:即最終的公式有N多的系數(shù)酸茴,我們需要一種辦法來確定最優(yōu)的系數(shù)組合。
Alpha-Beta搜索
當雙方博弈時兢交,當下一步該自己走時薪捍,只需要遍歷所有的下一步可能,然后選擇一個棋局對自己最優(yōu)的方案即可配喳,這個非常簡單酪穿,但是,這僅僅代表計算機有預(yù)測一步的能力晴裹,按照這個邏輯設(shè)計出來的程序可能連小孩都打不過被济,要想戰(zhàn)勝人,需要有提前預(yù)判N步的能力涧团。那么怎么預(yù)測兩步呢只磷?
我們可以遍歷所有的下一步的下一步的可能,因為下一步的下一步是對手下泌绣,所以我們只需要從所有可能中選擇讓對手最難受的一種可能即可钮追。于是,按照這個思路阿迈,我們就產(chǎn)生了兩個約束條件:
A:對自己最有利
B:讓對手最難受
如果我們在搜索過程中畏陕,不斷的以這兩個約束條件去進行搜索,這就是Alpha-Beta搜索仿滔。兩個約束條件更符合博弈的本質(zhì)惠毁,即對自己最有利且不斷限制對方。Alpha-Beta算法本身也很簡單崎页,可自行Google鞠绰。
看起來AI下棋的原理不難,但其實真正的奧秘就是如何減少搜索的計算量飒焦。
核心:減少計算量
從之前的描述蜈膨,我們可以看出,計算機算的越快牺荠,贏的概率越大翁巍,那么怎么算的更快呢?更好的硬件+分布式并行是一種思路休雌,當然從算法上能減少計算量則更好灶壶!減少計算量的辦法至少有這么幾種:
1,其實每步下棋時杈曲,沒有必要棋盤上所有點都考慮驰凛,而是可以優(yōu)先考慮某些點胸懈,比如離目前棋子比較近的點,這樣就能減少相當一部分工作量恰响。
2趣钱,錄入相當多的棋譜,這樣可以避免搜索一直到葉子節(jié)點胚宦,如果匹配到棋譜的話首有,可以從之前很多步就提前返回。
3枢劝,賦予計算機一種神奇的能力绞灼,讓他能夠有預(yù)感,預(yù)感到某一步可能“有戲”呈野,這樣把這一步放到Alpha-Beta搜索隊列的前面低矮,優(yōu)先搜索,這樣避免把計算資源浪費在其他“沒戲”的下一步上被冒。
而3军掂,也是根據(jù)AlphaGo公開出的資料中,最高深的一點昨悼,即所謂的CNN蝗锥,應(yīng)用在蒙特卡羅搜索MCTS中,從而把有限的計算能力計算值得計算的子節(jié)點率触。這一點在圍棋中尤為重要(更尤其在初盤中盤终议,因為末盤的搜索量會急劇減少),能做好這一點才是讓圍棋AI能夠戰(zhàn)勝人類高手的關(guān)鍵葱蝗。
那么按照公開資料穴张,AlphaGo是根據(jù)CNN卷積神經(jīng)網(wǎng)絡(luò)來訓練AI的,輸入就是19*19的棋盤信息两曼,輸出就是一個value皂甘,量化的代表對誰有利,通過輸入成千上萬的高手棋譜悼凑,經(jīng)過反復(fù)的自學習偿枕,確定神經(jīng)網(wǎng)絡(luò)的參數(shù),最終可以實現(xiàn)給定任何一個棋局户辫,判斷其是否對自己有利渐夸,這樣就可以在每次Alpha-Beta搜索計算前,把待搜索的布局排序渔欢,優(yōu)先搜索那些對自己有利的布局墓塌,從而大大縮小計算量。
神經(jīng)元網(wǎng)絡(luò)大多都依賴梯度下降,即誤差反傳BP桃纯,舉個通俗的例子酷誓,一個盲人登山披坏,要尋找山的最高點态坦,他所能做的,就是不斷的往前或者往后邁棒拂,不斷收集前后兩步的高度差值伞梯,如果高度差很大,就反饋給大腦加大步伐帚屉,如果高度差越來越小谜诫,就反饋給大腦減小步伐,最終直到前后兩步的高度差一樣了攻旦,也就找到最高點了(其實是局部最高點)喻旷。這個比較好理解,但是為什么卷積的神經(jīng)網(wǎng)絡(luò)適合圍棋這個場景牢屋,這里面是數(shù)學理論的推導依據(jù)還是先有模型不斷經(jīng)驗測試的結(jié)果且预,只能靠進一步研讀Google的資料來尋找答案了。
機器戰(zhàn)勝人類了嗎烙无?
從上面的淺顯分析可以看出锋谐,即使AlphaGo將來可以戰(zhàn)勝柯潔大棋渣,其整個運算過程其實跟圍棋藝術(shù)本身沒任何關(guān)系截酷,包括是最神秘的那個CNN里面的層級涮拗、參數(shù)關(guān)系,也很難說明他們跟人類的思考模式有相似的關(guān)系迂苛。我總感覺三热,這種AI只不過是用計算機的邏輯在某一個“固定的、可言傳的”規(guī)則上計算能力超過了人類三幻。
但我們現(xiàn)實生活中康铭,“不固定的、不可言傳”的事務(wù)比比皆是赌髓,怎么談生意从藤、怎么忽悠投資人、怎么跟領(lǐng)導匯報锁蠕、怎么泡妞夷野。。荣倾。這些都無法用固定規(guī)則來描述悯搔,換句話說,即使給出再大的計算能力舌仍,也很難給出上面這些事的“棋局優(yōu)劣函數(shù)”妒貌,同時也無法找出一個CNN網(wǎng)絡(luò)來評估訓練這些事通危,因為他們的輸出根本就是不是離散的。
所以灌曙,我覺得目前的AlphaGo距離真正的人類智商還相差太遠菊碟,等什么時候,計算機能夠做到察言觀色在刺、洞察秋毫逆害,能夠像電影“機器姬”迷惑人類時,才能算是真正的人工智能蚣驼!