(六)從零開始學人工智能-搜索:對抗搜索

對抗搜索html

文章目錄java

對抗搜索算法

1 爲何要學習對抗搜索?編程

2 什麼是對抗搜索?網絡

3 對抗搜索算法數據結構

3.1 極小極大值算法架構

3.1.1 分硬幣遊戲dom

3.1.2 最優路徑示例機器學習

3.2 α-β剪枝ide

3.3 蒙特卡羅樹搜索算法

3.3.1 蒙特卡羅方法

3.3.2 蒙特卡羅方法的基本思想

3.3.3 UCB算法基礎

3.3.4 Monte-Carlo Planning

4 Alphago原理

4.1 架構

4.2 基礎策略網絡和加強策略網絡

4.3 評價網絡

4.4 蒙特卡羅樹搜索

5 對抗搜索總結

聲明

參考文獻

1 爲何要學習對抗搜索?

上文開篇咱們說了爲何要學習一點算法:不求能上天飛黃騰達,但至少得知道未來幹掉本身的是誰,不能走的不明不白,是不?

李開復曾經把基礎課程比擬爲「內功」,把新的語言、技術、標準比擬爲「外功」。 成天趕時髦的人最後只懂得招式,沒有功力,是不可能成爲高手的。真正學懂計算機的人(不僅是「編程匠」)都對數學有至關的造詣,既能用科學家的嚴謹思惟來求證,也能用工程師的務實手段來解決問題——而這種思惟和手段的最佳演繹就是「算法」。

對抗搜索是一類算法的算法的總稱,也是機器學習的一個分支。那咱們爲何要學習對抗搜索呢?實在點,學它對咱們有什麼用?能增收或撩妹不?你總得給我個理由是不!

爲了回答這個問題,咱們先看一下這張圖,也是AI的發展簡史:

從圖中能夠看到,1997年Deep Blue世紀大戰和2016年AlphaGo擊敗李世石,其中的關鍵技術便是對抗搜索技術。在棋類遊戲裏AI已經超過了人類,另外,在咱們數學部分第一講的概述中也提到了一樣的問題,AI在計算機視覺領域(如ImageNet的識別)等也是遠遠優於人類的。**刺激不?危機不?**那怎麼辦呢?

成年人別問那麼多,直接幹學就完了!

再舉一個棋類例子:設想你在玩井字棋:

井字棋是一種在3 * 3格子上進行的連珠遊戲,和五子棋相似,分別表明O和X的兩個遊戲者輪流在格子裏留下標記(通常來講先手者爲X),任意三個標記造成一條直線,則爲獲勝。

正常狀況下,你的目標是贏,除非...對方是個妹紙,如何輕鬆贏得棋局,學完這部份內容,你將贏棋把妹兩不誤!不說廢話了,開搞吧

2 什麼是對抗搜索?

老規矩,爲了方便描述,咱們先介紹幾個概念,有個先驗印象,對抗搜索涉及幾個常見概念:智能體、對抗搜索和博弈樹。

智能體

智能體(agents):在信息技術尤爲是人工智能和計算機領域,能夠看做是可以經過傳感器感知其環境,並藉助於執行器做用於該環境的任何事物。以人類爲例,咱們是經過人類自身的五個感官(傳感器)來感知環境的,而後咱們對其進行思考,繼而使用咱們的身體部位(執行器)去執行操做。相似地,機器智能體經過咱們向其提供的傳感器來感知環境(能夠是相機、麥克風、紅外探測器),而後進行一些計算(思考),繼而使用各類各樣的電機/執行器來執行操做。如今,你應該清楚在你周圍的世界充滿了各類智能體,如你的手機、真空清潔器、智能冰箱、恆溫器、相機,甚至你本身。

對抗搜索

對抗搜索也稱爲博弈搜索,在人工智能領域能夠定義爲:有完整信息的、肯定性的、輪流行動的、兩個遊戲者的零和遊戲(如象棋)。

遊戲:意味着處理互動狀況,互動意味着有玩家會參與進來(一個或多個);

肯定性的:表示在任什麼時候間點上,玩家之間都有有限的互動;

輪流行動的:表示玩家按照必定順序進行遊戲,輪流出招;

零和遊戲:意味着遊戲雙方有着相反的目標,換句話說:在遊戲的任何終結狀態下,全部玩家得到的總和等於零,有時這樣的遊戲也被稱爲嚴格競爭博弈;

關於零和,也能夠這樣來理解:本身的幸福是創建在他人的痛苦之上的,兩者的大小徹底相等,於是雙方都想盡一切辦法以實現「損人利己」。零和博弈的結果是一方吃掉另外一方,一方的所得正是另外一方的所失,整個社會的利益並不會所以而增長一分。

例以下井字棋,一個遊戲者贏了+1,則另外一個必定輸了-1,總和等於零。

博弈樹

考慮兩個遊戲者:MIN和MAX,MAX先行,而後兩人輪流出招,直到遊戲結束。在遊戲最後,給優勝者積分,給失敗者罰分。

遊戲能夠形式地定義成含有下列組成部分的一類搜索問題:

初始狀態,包含棋盤局面和肯定該哪一個遊戲者出招。

後繼狀態,返回(move,state)對(兩項分別爲招數、狀態)的一個列表,其中每一對錶示一個合法的招數和其結果狀態。

終止測試,測試判斷遊戲是否結束,遊戲結束的狀態稱爲終止狀態。

效用(收益)函數,效用函數(又稱爲目標函數或者收益函數),對終止狀態給出一個數值。在井字棋中,結果是贏、輸或平,分別賦予數值+一、-1或0。有些遊戲有更多的可能結果,例如雙陸棋的收益範圍從-192到+192。

每方的初始狀態和合法招數定義了遊戲的博弈樹。上圖給出了井字棋的部分博弈樹。在初始狀態,MIN有9個可能的走法。遊戲交替執行,MAX下X,MIN下O,直到咱們到達了樹的葉節點對應的終止狀態,也就是說一方的三個棋子連成一條直線或者全部棋位都填滿了。葉節點上的數字指示了這個終止狀態對於MAX來講的效用值;值越高被認爲對MAX越有利,而對MIN則越不利。因此MAX的任務是利用搜索樹(特別是終止狀態的效用值)來肯定最佳的招數,即求解終止狀態爲+1的招數。

3 對抗搜索算法

上節提到的#字棋遊戲,咱們能夠大概畫出它的博弈樹:

至於爲何須要這棵樹我相信你很容易想到,計算機最擅長什麼?沒錯,就是機械式窮舉,試想一下,當你走了一步後,計算機準備執行下一步,它就會考慮全部能走的狀況,而後他會再窮舉你接下來的步驟而後再繼續加深...不過回過頭來想一下你就會發現這種方法更適用於一些棋盤比較小得如上面的#字棋,這樣計算機只須要不多的搜索深度,就能選擇最佳方案,所以一個設計優秀的#字棋AI基本上你是贏不了的,除非你也有同他那樣的窮舉能力,那麼輸贏就要取決於誰先走了。

有了這樣一棵博弈樹以後,有沒什麼方法找到最優解呢?咱們介紹三種常見算法: 極小極大值算法、α-β剪枝、 蒙特卡羅樹搜索算法。

3.1 極小極大值算法

本節咱們以例子形式展開介紹極小極大算法。

3.1.1 分硬幣遊戲

雖然就算是井字棋這樣的簡單遊戲,可是想要畫出它的整個博弈樹對咱們而言也太複雜了,因此咱們將轉而討論一個更簡單的遊戲:分硬幣遊戲。

假設咱們已經有一個評價每種決策的收益的估值函數。對於極大層節點,若是咱們知道了它的每一步決策的收益值,那麼它老是會選擇收益最大的那個決策,做爲它的節點的收益值;反過來,對於極小層節點,它老是會選擇收益最小的(對我方收益最小,就是對方收益最大)那個決策。

遊戲規則是:一堆硬幣,雙方輪流將它分紅大小不能相等的兩堆,而後下一我的挑選任意一堆繼續分下去,雙方交替遊戲,直到其中一我的沒法繼續分下去,則對方得到勝利。

假設咱們剛開始有一堆7枚硬幣,輪到我方先分。我須要找到我當前應該怎麼樣分這堆硬幣。或者說,須要找到當前可以得到最優收益的決策,咱們經過構造出一棵極大極小樹來作到。

首先,咱們窮舉全部的可能的狀態。用矩形表明輪到我方作決策的極大層節點,用圓形表明輪到對方作決策的極小層節點,列舉出全部的狀態:

注意,到這裏咱們尚未進行估值 ,所以這還不算是極大極小樹。下面咱們來設計這個遊戲的估值函數,很簡單,若是當前局面,咱們已經贏了,那麼收益爲+1,若是咱們輸掉了,那麼收益爲-1,這個遊戲沒有平局,因此只可能有這兩種收益值。

剛開始估值的時候,咱們還位於根節點,咱們對於整棵樹是一無所知的,就像下面這樣:

咱們想要得到根節點的估值,須要對根節點的子節點進行遍歷,首先對第一個子節點進行遍歷,發現仍是不能判斷它的值,繼續遍歷(上節課提到的深度優先)它的子節點,直到到達葉子節點:到了葉子節點,咱們能夠對它進行估值了,由於此時是極小層,須要對手進行決策,可是對手已經沒法再繼續分下去了。因此,它的收益值爲+1:這樣得到了第一個葉子節點的估值,因爲它的父節點只有惟一一個子節點,所以父節點的收益值也只能是+1,而後能夠一直回溯上去,直到到達紅色的節點:此時,咱們不能直接給紅色節點賦值了,由於它還有別的子節點,咱們繼續遍歷它的子節點:遍歷到又一個葉子節點,發現它的收益是-1(我方失敗),再回溯回去:如今咱們又回到了紅色節點,如今它的全部子節點的收益值都已經得到了。注意,這個節點是一個**極大層節點**。咱們說過,極大層節點老是會選擇收益最大的子節點,它的子節點一個是+1一個是-1,所以,它的值應該是最大的那個+1。咱們繼續按照深度優先的順序遍歷:到這裏,當前紅色的節點是一個**極小層節點**,它老是選擇收益最小的決策,所以它的收益值是-1。 接下來,咱們繼續按照這個思路進行遍歷,中間的過程我就省略了,最後的結果以下所示:

到這裏,咱們的極大極小樹已經構建完成了。

咱們發現,當前的根節點的收益值竟然是-1,也就是說,只要對方夠聰明,咱們不管如何都沒法取勝。

這就很絕望了,可是仔細想一想,咱們假設的前提是,對方是聰明絕頂,不犯錯誤的高手。

咱們知道不管如何都會失敗,那可不能夠賭對方會犯錯呢。

這樣一想,其實3種必敗的決策仍是有必定的優劣性的。好比,最右邊那個子節點,它的全部子樹跟子樹的子樹收益都是-1,也就是說,對方就算亂下,咱們都必輸;而中間跟左邊那個子節點,若是對手下錯了,還有一必定概率可以通往+1的葉子節點的。所以,左邊兩個決策要比最右邊的決策要相對好那麼一點兒。所以,在發現咱們已經必敗的時候,依然可以在決策中作一個取捨,選擇敗得不明顯的那種決策。

3.1.2 最優路徑示例

設想有兩個選手,橙色節點是MAX,藍色節點是MIN,每人輪流移動一步,MAX先開始:

第一步:MAX選手根據DFS深度優先,生成整個博弈樹,根據效用函數UTILITY獲得全部葉子節點值,以下圖,A是初始節點。

第二步:從葉子節點向上回溯,D節點是MAX節點,選擇最大值4,同理獲得同一層節點的值。第三步:遞歸上一層,該層爲MIN節點,選擇孩子節點的最小值,B節點爲4,C節點爲-3。第四步:再遞歸到上一層,是根節點A,選擇孩子節點最大值4。**所以對於MAX選手而言,最優路徑爲綠色路徑,取得最大值爲4。**

擴展:複雜度分析

博弈樹中,分支因子(branching factor)是每一個結點下的子結點數。若是各個結點分支因子不一樣,則能夠計算平均分支因子。例如,在國際象棋中,如把一步合法走法算做一個「結點」,那麼平均分支因子據信約爲35。這表示棋手每一步走棋平均有大約35種合法走法,一盤棋通常每一個遊戲者走50步,那麼搜索樹大約有35^100個節點。

如圖,b是分支因子數,d是遊戲者走的步數之和。

3.2 α-β剪枝

上一小節咱們介紹了極大極小樹,對於分硬幣這樣相對簡單的遊戲,它仍是可以用得上的。可是呢,它必須得窮舉出全部的狀態。再從終結狀態開始,計算每一個節點的估值,最後才能得到當前最優的決策。

極小極大值算法對博弈樹執行了一個完整的深度優先探索,問題是必須檢査的遊戲狀態的數目隨着招數的數量指數級增加,好比即便是最簡單的「井」字棋,它的第一步有9種決策,而後對面有9*8=72種決策,…,最後一層的決策個數達到了 9! = 362880 種。如此簡單的遊戲,在不作特殊處理的時候,都有幾十萬種決策(固然這個量級計算機仍是可以hold住的)。它的棋盤大小僅僅是3 X 3,五子棋是15 X 15,圍棋是19 X 19,想要窮舉出全部決策,幾乎是不可能的。

所以,咱們不可以像上一章那樣,每次都窮舉出全部的結果,再去慢慢找最優決策。隨着樹的深度的增長,咱們的節點個數是指數級上升的。這種狀況下咱們不得不搜索到必定程度,就中止繼續往下搜索。

當咱們停下來之後,這個時候,因爲咱們遊戲尚未結束,咱們如何判斷當前的結果的好壞?

咱們須要設計一個評價函數(Evaluation function)對於當前局面進行評分。這個評價函數如何設計?主要是根據不一樣的遊戲,還有人類的平常經驗來判斷。

我當時設計五子棋AI的時候,就人爲的設計了一個評價當前局面的分數的函數。好比已經有5個子連成一線了,它就是最高分;若是有4個子連成一線,它就是次高分;還有雙3,…。這樣咱們就能根據局面,得到一個得分。固然,當對面調用這個評價函數的時候,得到的分數前面要取一個負號。由於對手的最高分,就是咱們的最低分。

有了評價函數,咱們就能夠隨時終止咱們的搜索了。由於對於任何局面,咱們都可以給出一個收益得分 。咱們能夠限定咱們的搜索的深度,隨時結束搜索。

可是咱們的搜索空間仍然很是龐大。由於最開始的幾層,可作的決策是至關多的。

好比五子棋,第一步就有225種下法。而對手對應就有225_224=50,400種決策;再往下一層,就有225_224*223=11,239,200種。這才第三層,就已經快爆炸了。

通常五子棋的高手都能想到後面五六步,甚至十幾步。想要與之對抗,咱們必須得想辦法減小咱們的搜索數量,增長咱們的搜索深度,這樣咱們的AI才能看得更遠的將來,想得更多,這樣棋力纔會變強。

在這裏,咱們借用剪枝技術消除搜索樹的很大一部分,應用到一棵標準的極小極大值樹上,它剪裁掉那些不可能影響最後決策的分支,仍然能夠返回和極小極大值算法一樣的結果。

咱們先來理解一下,怎麼樣的搜索是沒有必要的,假設咱們限定了搜索深度爲3,咱們從頭開始搜索,以下:

咱們從根節點往下搜,直到第一個葉子節點:

此時,到達了第一個深度爲3的節點,此時咱們調用估值函數,假設咱們得到它的收益爲3,如今咱們回頭來看它的父節點:

因爲,這個父親節點是MIN節點,咱們知道,它老是會選擇子節點中最小值。如今,子節點已經出現了一個值爲3。

如今仔細想一想,若是咱們繼續得到它的子節點的收益,爲一個比3要大的值,假設爲12好了。那麼當前的父節點,必然不會選擇這個12,而會去選擇3。所以,這個父親節點的收益,不管如何,都不會超過3,那麼它的取值範圍,咱們能夠認爲是:(-∞,3]。也就是說,咱們的子節點,其實更新了它的父節點的收益的一個上界值,如圖:

到這裏,咱們其實並無進行剪枝,只是找到了一個父節點的上界值(β值),咱們仍是得繼續搜索它的子節點:假如咱們搜索到了12,咱們依然試圖更新父節點的上界值(β值),可是由於比3要大,更新失敗了,繼續搜索下一個,直到搜索完全部的固然父節點的全部子節點:當它全部的子節點都被搜索完之後,咱們其實能夠知道當前節點的收益就是3了。這個時候咱們能夠修改它的下界爲3,收益爲3。

注意這個時候,其實跟以前的極大極小樹的搜索過程沒有區別,咱們並無進行任何的剪枝。接下來繼續搜索:

咱們肯定了當前節點收益爲3,再去看它的父節點,即根節點。根節點本來的收益值範圍是(-∞,+∞)。如今咱們找到了一個子節點收益是3。

根節點是一個MAX節點,跟以前相反,子節點的收益值3,能夠用來更新的是根節點的下界(α值)。至於爲何,能夠類比一下以前的。咱們如今已經有搜索到一個3,若是咱們之後搜索到比3小的值,那麼根節點在取最大值的時候,確定會選擇更大的3,而不是其餘值。所以最優解的下界就是3,不會再更小了。

咱們帶着根節點的取值區間[3, +∞)繼續往下搜索,把這個區間賦給下一個子節點:

往下繼續深度優先遍歷,訪問它的第一個子節點。此時到達設定的深度3,咱們調用評價函數,假設評價函數返回值爲2:敲黑板,重點來了。

咱們知道,當前子節點是一個收益爲2的MAX節點。MAX節點能夠更新父節點的上界。所以,父親節點的上界,被修改爲了2。 這裏就出現了一個矛盾的區間[3,2],以下圖:

觀察當前的節點,它的收益值的取值區間是[3,2]。這明顯是不合理的,收益不可能下界是3,同時上界又是2。咱們能夠作出判斷,這個節點不管如何都不多是最優解。

因爲這個區間已經產生了矛盾,咱們能夠直接給當前節點判死刑,跳過剩下全部的子節點了:

上面的操做叫作α-β剪枝!

能夠這樣理解,收益值的可行區間一旦變成矛盾的,說明當前節點必然不會是得到最優的決策,那麼咱們能夠直接跳過這個節點,無論它還有多少個子節點沒有被搜索。

Tips: 若是你以爲我上面一段頗有道理,能夠忽略這部份內容。

若是你是一個嚴謹的懷疑論者,內心不踏實,請繼續看下去下面的證實過程。

咱們就來仔細分析討論一下,假如咱們接着往下搜索會發生什麼:

剩下的值無非就兩種狀況,咱們全都來討論一遍:

第一種,搜索到比2小的值,好比1:

那麼它的父親節點是個MIN節點,會選擇比2更小的1,假設最後中間的節點收益就是這個1,再看根節點:因爲根節點是MAX節點,所以,即便找到了收益更小的1,根節點並不會選擇它,而是選擇更大的值爲3的左邊那個節點。

第二種狀況,搜索到比2大的值,好比5:

它並不能代替2,因此中間節點的收益仍是2。在根MAX節點作取捨的時候,依然仍是會選擇更大的左邊的那個3的節點。

所以,咱們能夠放心地說,當發現收益值的區間產生矛盾的時候,咱們當前的節點不管再怎麼繼續搜索,也不可能出現最優解了。這下能夠放心跳過了。

證實完!

在這個例子裏面,咱們已經給中間那個點判了死刑,直接跳過它剩下的2個子節點,轉到了右邊那個節點。

老規矩,把父親節點的可行區間傳遞給當前子節點,繼續往下深度優先遍歷:到了葉子節點,調用估值函數,假設這回返回的收益是14:因爲14是MAX層,試圖更新父節點的上界。沒有產生矛盾區間,繼續往下搜。假設下一個搜索到的是1:更新上界,產生矛盾區間,中止繼續搜索。到這裏咱們遍歷了根節點的全部可能子節點,能夠作出最終判斷,根節點的收益最終值爲3,以及獲得最優的路徑:經過維護一個收益的可行區間,在搜索的過程當中進行剪枝操做,就是所謂的α-β剪枝。

因爲α-β剪枝剪掉的點,都是必然不多是最優解的節點,所以咱們永遠不會錯過最優解。同時,因爲及時的剪枝操做,咱們大大地減小了須要搜索的節點數量,節省下來的算力就能進行更多更深層次的搜索。

這就是傳說中的博弈樹跟α-β剪枝的原理了。

α-β剪枝能夠用於樹的任何深度,並且不少狀況下能夠剪裁整個子樹,而不是僅剪裁葉節點。通常原則是:考慮在樹中某處的節點n,遊戲者能夠選擇移動到該節點。若是遊戲者在n的父節點或者更上層的任何選擇點有一個更好的選擇m,那麼在實際的遊戲中就永遠不會到達n。因此一旦咱們發現關於n的足夠信息(經過檢査它的某些後代),可以獲得上述結論,咱們就能夠剪裁它。

記住極小極大搜索是深度優先的,因此任什麼時候候咱們不得不考慮樹中一條單一路徑上的節點。α-β剪枝的名稱就是從下面兩個描述這條路徑上任何地方的回傳值界限的參數得來的: α = 到目前爲止咱們在路徑上的任意選擇點發現的MAX的最佳(即極大值)選擇 β = 到目前爲止咱們在路徑上的任意選擇點發現的M1N的最佳(即極小值)選擇 α-β搜索不斷更新a和β的值,而且當某個節點的值分別比目前的MAX的α或者MIN的β值更差的時候剪裁這個節點剩下的分支(即終止遞歸調用)。

擴展:

完整算法

複雜度分析

3.3 蒙特卡羅樹搜索算法

下棋其實就是一個馬爾科夫決策過程(MDP),即根據當前的棋面狀態,肯定下一步的該怎麼走。

那麼,該下哪一步才能確保後續贏棋的機率比較大呢?最容易想到的就是前述的一些方法:枚舉後續的每一種走法,而後計算每一步贏棋的機率,選擇機率最高的走,以下圖所示:

可是,對於圍棋而言,狀態空間實在是太大了,沒辦法枚舉:這種時候就是靠蒙特卡洛樹搜索了。它的方法也很是簡單,那就是「沒病走兩步」:* 在當前狀態的基礎上,選擇一個備選動做/狀態; * 從備選動做/狀態開始,「走兩步」,不須要枚舉後續全部狀態,只須要以必定的策略一直模擬到遊戲結束爲止; * 計算此次採樣的回報; * 重複幾回,將幾回回報平均,得到該備選動做/狀態的價值。換個通俗點的說法,就是用**頻率估計機率**。只要採樣的樣本數越多,頻率越接近機率。

3.3.1 蒙特卡羅方法

蒙特卡羅方法(Monte Carlo method)也稱統計模擬方法,是1940年代中期因爲科學技術的發展和電子計算機的發明,而提出的一種以機率統計理論爲指導的數值計算方法。是指使用隨機數(或更常見的僞隨機數)來解決不少計算問題的方法。

蒙特卡羅方法於20世紀40年代美國在第二次世界大戰中研製原子彈的「曼哈頓計劃」計劃的成員S.M.烏拉姆和J.馮·諾伊曼首先提出。數學家馮·諾伊曼用馳名世界的賭城–摩納哥的Monte Carlo來命名這種方法,爲它蒙上了一層神祕色彩。在這以前,蒙特卡羅方法就已經存在。1777年,法國數學家布豐(Georges Louis Leclere de Buffon,1707—1788)提出用投針實驗的方法求圓周率π,這被認爲是蒙特卡羅方法的起源。

3.3.2 蒙特卡羅方法的基本思想

當所求解問題是某種隨機事件出現的機率,或者是某個隨機變量的指望值時,經過某種「實驗」的方法,以這種事件出現的頻率估計這一隨機事件的機率,或者獲得這個隨機變量的某些數字特徵,並將其做爲問題的解。

計算Pi

能夠認爲投針實驗,在正方形內,投入必定數量的針,計算落入圓內針的數量與總共數量比值,從而計算Pi。

蒙特卡羅求定積分

蒙特卡洛方法的一個重要應用就是求定積分。來看下面的一個例子

當咱們在[a,b]之間隨機取一點x時,它對應的函數值就是f(x)。接下來咱們就能夠用f(x) * (b - a)來粗略估計曲線下方的面積,也就是咱們須要求的積分值,固然這種估計(或近似)是很是粗略的。

3.3.3 UCB算法基礎

若是博弈樹很是龐大,按照極小極大值算法和α-β剪枝,那麼對抗搜索的時間效率是十分低下的。蒙特卡羅樹搜索算法就是優化博弈樹搜索的算法。

下面先介紹UCB算法,這是MCTS的經典實現UCT(Upper Confidence bounds for Trees)裏面用到的算法。公式以下:

其中v'表示當前樹節點,v表示父節點,Q表示這個樹節點的累計quality值,N表示這個樹節點的visit次數,C是一個常量參數(能夠控制exploitation和exploration權重)。 這個公式的意思是,對每個節點求一個值用於後面的選擇,這個值有兩部分組成,左邊是這個節點的平均收益值(越高表示這個節點指望收益好,越值得選擇,用於exploitation),右邊的變量是這個父節點的總訪問次數除以子節點的訪問次數(若是子節點訪問次數越少則值越大,越值得選擇,用戶exploration),所以使用這個公式是能夠兼顧探索和利用的。

3.3.4 Monte-Carlo Planning

蒙特卡羅樹搜索(Monte Carlo Tree Search)是一種基於樹數據結構、能權衡探索與利用、在搜索空間巨大仍然比較有效的的搜索算法。主要包括Selection、Expansion、Simulation和Backpropagation四個階段。

1) Selection

在樹中找到一個最好的值得探索的節點,通常策略是先選擇未被探索的子節點,若是都探索過就選擇UCB值最大的子節點。

2) Expansion

在前面選中的子節點中走一步建立一個新的子節點,通常策略是隨機自行一個操做而且這個操做不能與前面的子節點重複。

3) Simulation

在前面新Expansion出來的節點開始模擬遊戲,直到到達遊戲結束狀態,這樣能夠收到到這個expansion出來的節點的得分是多少。

4) Backpropagation

把前面expansion出來的節點得分反饋到前面全部父節點中,更新這些節點的quality value和visit times,方便後面計算UCB值。

經過不斷地模擬獲得大部分節點的UCB值,而後下次模擬的時候根據UCB值有策略得選擇值得exploitation和exploration的節點繼續模擬,在搜索空間巨大而且計算能力有限的狀況下,這種啓發式搜索能更集中地、更大機率找到一些更好的節點。

下面是論文的僞代碼實現:

其中TREE_POLICY就是實現了Selection和和Expansion兩個階段,DEFAULT_POLICY實現了Simulation階段,BACKUP實現了Backpropagation階段,基本思路和前面介紹的同樣。

簡單理解,蒙特卡羅樹搜索算法是一種模擬啓發算法,根據UCB算法選擇一個節點擴展,而後應用蒙特卡羅模擬方法計算葉子節點得分,向上傳播,循環往復。

4 Alphago原理

4.1 架構

在架構上,AlphaGo能夠說是擁有兩個大腦,兩個神經網絡結構幾乎相同的兩個獨立網絡:策略網絡與評價網絡,這兩個網絡基本上是個13層的卷積神經網絡所構成,卷積核大小爲5 * 5,因此基本上與存取固定長寬像素的圖像識別神經網絡同樣,只不過咱們將矩陣的輸入值換成了棋盤上各個座標點的落子情況。

4.2 基礎策略網絡和加強策略網絡

第一個大腦是策略網絡,基本上就是一個單純的監督式學習,用來判斷對手最可能的落子位置。他的作法是大量的輸入這個世界上職業棋手的棋譜,用來預測對手最有可能的落子位置。在這個網絡中,徹底不用去思考贏這件事,只須要可以預測對手的落子便可。目前AlphaGo預測對手落子位置的正確率是57%(這是刊登在Nature文章時的數據,如今想必更高了)。那各位可能認爲AlphaGo的弱點是否應該就在策略網絡,一方面是預測準確率不高,再者是若是下了以前他沒看過的棋局是否是就有機會能夠贏過他。惋惜並非,由於AlphaGo的策略網絡有作了兩個層面加強。

第一個層面是利用了名爲加強策略網絡(reinforced-learning (RL) policynetwork)的技術,他先使用部分樣本訓練出一個基礎版本的策略網絡,以及使用完整樣本創建出來的進階版策略網絡,而後讓兩個網絡對弈,後者進階版策略網絡等因而站在基礎版前的高手,所以可讓基礎網絡能夠快速的熟悉到高手可能落子的位置數據,進而又產生一個加強版,這個加強版又變成原有進階版的高手,以此循環修正,就能夠不斷的提高對於對手(高手)落子的預測,RL網絡80%贏了基礎版本的策略網絡。

第二個層面則是如今的策略網絡再也不須要在19 * 19的方格中找出最可能落子位置,改良過的策略網絡能夠先經過卷積核排除掉一些區域不去進行計算,而後再根據剩餘區域找出最可能位置,雖然這可能下降AlphaGo策略網絡的威力,可是這種機制卻能讓AlphaGo計算速度提高1000倍以上。也正由於AlphaGo一直是根據總體局勢來猜想對手的可能落子選擇,也所以人類耍的當心機像是刻意下幾步但願擾亂計算機的落子位置,其實都是沒有意義的。

4.3 評價網絡

第二個大腦是評價網絡。在評價網絡中則是關注在目前局勢的情況下,每一個落子位置的最後勝率(這也是我所謂的總體棋局),而非是短時間的攻城略地。也就是說策略網絡是分類問題(對方會下在哪),評價網絡是評估問題(我下在這的勝率是多少)。評價網絡並非一個精確解的評價機制,由於若是要算出精確解可能會耗費極大量的計算能力,所以它只是一個近似解的網絡,並且經過卷積神經網絡的方式來計算出卷積核範圍的平均勝率(這個作法的目的主要是要將評價函數平滑化,同時避免過分學習的問題),最終答案他會留到最後的蒙利卡羅搜索樹中解決。

固然,這裏提到的勝率會跟向下預測的步數會有關,向下預測的步數越多,計算就越龐大,AlphaGo目前有能力本身判斷須要展開的預測步數。可是如何能確保過去的樣本可以正確反映勝率,並且不受到對弈雙方實力的事前判斷(可能下在某處會贏不是由於下在這該贏,而是這我的比較厲害)。

所以,這個部分它們是經過兩臺AlphaGo對弈的方式來解決,由於兩臺AlphaGo的實力能夠看成是相同的,那麼最後的輸贏必定跟原來的兩人實力無關,而是跟下的位置有關。也所以評價網絡並非經過這世界上已知的棋譜做爲訓練,由於人類對奕會受到雙方實力的影響,經過兩臺對弈的方式,他在與歐洲棋王對弈時,所使用的訓練組樣本只有3000萬個棋譜,可是在與李世石比賽時卻已經增長到1億。因爲人類對奕動則數小時,可是AlphaGo間對弈可能就一秒完成數局,這種方式能夠快速地累積出正確的評價樣本。因此先前提到機器下圍棋最大困難點評價機制的部分就是這樣經過卷積神經網絡來解決掉。

4.4 蒙特卡羅樹搜索

選取:首先根據目前的狀態,選擇幾種可能的對手落子模式。

展開:根據對手的落子,展開至咱們勝率最大的落子模式(咱們稱之爲一階蒙地卡羅樹)。因此在AlphaGo的搜索樹中並不會真的展開全部組合。

評估:如何評估最佳行動(AlphaGo該下在哪?),一種方式是將行動後的棋局丟到評價網絡來評估勝率,第二種方式則是作更深度的蒙地卡羅樹(多預測幾階可能的結果)。這兩種方法所評估的結果可能大相徑庭,AlphaGo使用了混合係數(mixing coefficient)來將兩種評估結果整合,目前在Nature刊出的混合係數是50%-50%。

倒傳導:在決定咱們最佳行動位置後,很快地根據這個位置向下經過策略網絡評估對手可能的下一步,以及對應的搜索評估。因此AlphaGo其實最恐怖的是,李世石在思考本身該下哪裏的時候,不但AlphaGo可能早就猜出了他可能下的位置,並且正利用他在思考的時間繼續向下計算後面的棋路。

5 對抗搜索總結

對抗搜索的適用範圍

有完整信息的、肯定性的、輪流行動的、兩個遊戲者的零和遊戲,這時咱們就能夠用上對抗搜索算法。

對抗搜索的主要思想

對抗搜索的核心思想就是dfs遍歷一遍博弈樹。不難想到,若是博弈樹很是龐大,在不加優化的狀況下,對抗搜索的時間效率是十分低下的。所以,咱們就須要對對抗搜索進行必定的優化。

對抗搜索算法

極小極大值算法

α-β剪枝

蒙特卡羅樹搜索算法

聲明

本博客全部內容僅供學習,不爲商用,若有侵權,請聯繫博主謝謝。

參考文獻

[1] 斯圖爾特·羅素,人工智能:一種現代的方法(第3版)[M],人民郵電出版社,2010

[2] Wu Fei,Adversarial Search–What To Do When Your 「Solution」 is Somebody Else’s Failure

[3] Wu Fei,Adversarial Search- Monte Carlo Tree Search selectively random sampling with simulations

[4] https://www.javatpoint.com/mi...

[5] https://www.jiqizhixin.com/ar...

[6] http://jeffbradberry.com/post...

[7] https://blog.csdn.net/chenxia...

[8] https://blog.csdn.net/bitcarm...

[9] https://www.cnblogs.com/yifdu...

[10] https://www.cnblogs.com/never...

相關文章
相關標籤/搜索