一、西洋跳棋
西洋跳棋是一種兩人棋盤游戲。玩家的棋子都是沿斜角走的。棋子可跳過敵方的棋子並吃掉它。
相關規則參考:Wiki
二、機器學習
通過讓程序分析人們購物清單,來分析人們對商品的品牌、價格的偏好。
通過跟蹤個人的新聞瀏覽,分析其興趣愛好、並為其推薦感覺興趣的新聞或產品。
通過對已知的手寫字符的分析,能夠讓計算機程序自動的認出手寫字符。
…
以上這些都是機器學習的例子,在今天,機器學習已經不知不覺的進入到人們的生活,也許你為奇怪為什么網頁上的廣告都是顯示你最在在淘寶或京東上最近購買的商品。最終你會發現,你使用的軟件,你操作的系統,變得越來越智能。
機器學習:任何計算機程序通過經驗來提高某任務處理性能的行為,都稱為機器學習。
定義:
對於某類任務T和性能度量P,如果一個計算機程序在T上以P衡量的性能隨着經驗E而自我完善,那么我們稱這個計算機程序在經驗E中學習。
既然學習的定義如上面描述,那么我們用機器學習來定義下西洋跳棋。
任務T:下西洋棋
性能標准P:比賽中擊攻對手的百分比
訓練經驗E:和自己或與選手對弈。
三、如何設計一個機器學習系統
上面我們已經把下西洋棋用機器學習的方法表示出來,接下來,我們需要一步一步考慮如何完成這個學習系統的設計。
面臨的第一個問題就是訓練經驗,因為它是整個系統的輸入:
首先,這個經驗一定要可以為我們下西洋棋每一步的決策提供直接或間接的反饋。直接的經驗比如:和種棋盤狀態和相應的正確走子;間接的經驗比如:根據最終局的勝負或走子序列反饋每步走子的貢獻度。
其次,學習器可以在多大程度上控制訓練樣例序列。可以用一些固定的走子步驟和棋局,可以允許學習器主動地去微調一些走子方式和嘗試一些它還未考慮過的全新棋局。
最后,訓練樣例的分布能多好地表示實例分布,就是說你不能一直讓學習系統一直與菜鳥對弈,這樣遇到大師級的就不能有很好的表現,因為它會遇到平時訓練時沒有遇到過的走子或棋位布局。
那么我們就選擇和100位水平高低各不相同的選手對弈各100局,總共1萬局夠成了我們的訓練經驗。
為了完成這個下棋的學習系統,我們需要選擇:
1) 目標函數
2) 目標知識的表示
3) 一種學習機制
目標函數:我們在西洋棋對弈時,能夠操作的步驟就是走子,合法的走子有很多種,每一種都會產生一個不同的棋局,我們的目標就是選擇出最好的走法,於是定義我們的目標函數是這樣的:
目標函數V,並用$V:B \to R$來表示$V$把任何合法的棋局映射到某一個實數值。
我們讓目標函數$V$給好的棋局賦予較高的評分,如果系統能夠成功地學會這個目標函數$V$,那么它便能使用此函數輕松地找到當前棋局的最佳走法。
於是我們的目標就落在了,怎樣給一個棋局評分,我們需要一套規則來給所有的棋局評分。一個棋局,其最直觀的形式就是棋局上所有點棋子狀態有或沒有,比如傳統的10*10的棋盤,那每個格子里要么有子,要么沒有子,我們可以用1或0表示,這樣一局棋局就可以表示為一個10*10的矩陣,矩陣的元素為1或0。
我們會發現這樣表示一個棋局還是太抽象,不容易找出判斷棋局好壞的規則,我們希望選擇一些具有表征能力的描述,以最大可能的代替一個棋局的信息。如果可以選擇棋盤上黑子的數量和紅子的數量,這時候,較為一般的數量占優的棋局會有較高的評分。下面是我們選擇的幾個棋盤狀態特征:
feature1:棋盤上黑子的數量
feature2:棋盤上紅子的數量
feature3:棋盤上紅王的數量
feature4:棋盤上黑五的數量
feature5:被紅子威脅的黑子的數量
featurn6:被黑子威脅的紅子的數量
但是上面6個特征它們說明棋局好壞的能力也不同,有的代表性強,有的代表性弱,所以我們要給它們賦予一定的權重:
$$v(b)=w_0+w_1 x_1+w_2 x_2+w_3 x_3+w_4 x_4+w_5 x_5+w_6 x_6$$
那么V(b)就是一個目標函數,對於每一種走子b,目標函數都可以計算出一個實數值來說明棋局的好壞。
比如黑子贏了的棋局,我們將它的函數值定位為V(bi)=+100,這種情況下,已經沒有紅子,那么這個棋局就可以表示為:
$$<<x_1=3,x_2=0,x_3=1,x_4=0,x_5=0,x_6=0>,+100>$$
有了上面這些表示,我們就可以運用一些對局的局來訓練我們的系統,那么就想通過這些樣本來選擇一組最合適的權值,讓所有棋局與我們最終的預測結果都盡可能一致。
任何一個樣本棋局都要表示為這樣一個數據對$<b,V(b)>$,其中的$V(b)$我們通過給出來些近似函數$\hat{V}(b)$來手動的標記。
剩下的事情就是為這個學習算法選擇最合適訓練樣例的權。一種常用的方法是把最佳的假設(或權重向量集合)定義為使訓練值和假設預測出的值間的誤差平方和E最小。
$$E=\sum_{<b,V_{train}(b)>}(V_{train}(b)-\hat{V}(b))^2$$
這里我們可以采用最小均方法來求最佳權值,或叫LSM訓練法則。
對於每一個訓練樣本$<b,V_{train}(b)>$
使用當前的權重計算$\hat{V}(b)$
對每一個權重$w_i$進行如下更新:
$$w_i \gets w_i +\eta (V_{train} (b)-\hat{V}(b))x_i$$
這里是一個小的常數,用來調整權值的更新幅度,比如果誤差為0時,權值就不會更新。
四、最終的設計
執行系統:這個模塊用學會的目標函數(決策器)來下棋。它把一局新的棋局作為輸入,然后會產生一組解答路線。
鑒定器:它將一組解答路線生成為一組訓練數據。
泛化器:它以訓練樣本作為輸入,產生一個輸出假設,作為它對目標函數的估計。
實驗生成器:它以泛化器中生成的假設來生成一個決策器,決定每種棋局下應該執行的走子。
五、可靠嗎
如此設計的程序能擊敗人類的西洋跳棋冠軍嗎?或許不能,部分原因在於我們對目標函數的表示過於簡單了,我們可以設計更復雜更具有表征性的特征。學習的方式也是多種多樣:
我們可以簡單的只儲存訓練樣例,然后去尋找保存的“最接近”的情形來匹配新的情況——最近鄰法。
可以產生大量的跳棋程序,讓它們相互比賽,保留最成功的程序並進一步用模擬進化的方式來培育或變異它們——遺傳算法。
而人們有着不一樣的學習機制,我們可以分析或向自己解釋比賽中碰到的成敗的原因——基於解釋的學習。這當然也是機器學習最高級的形式。