強化學習主要包括狀態空間、價值函數、狀態轉移三個部分,經過狀態之間的轉移來獲得每一個狀態的價值,強化學習的目標是使得總價值達到最大。注意,與監督學習不一樣的是,監督學習一般須要大量的樣原本得到有價值的信息,而強化學習卻不須要,強化學習能夠不須要預先給定任何知識,只須要指定必定的策略和回報,它能夠經過不斷地嘗試和探索,從而能夠進行最優的決策,並且隨着嘗試的次數增多,決策也會愈來愈最優。(原文在我的微信公衆號:deeplearningdigest)算法
今天經過一個實例來具體講解狀態空間、價值函數等概念,例子是編寫一個能夠人機對弈的五子棋程序。因爲完整的棋盤致使狀態空間太大,我的PC一時難以訓練,所以這裏咱們使用的是5*5大小的棋盤。加入兩個玩家的棋子爲X和O,那麼贏的狀況就是:微信
同一行或者同一列的棋子相同;機器學習
正對角線或反對角線的棋子相同。函數
那麼如何定義價值函數呢?首先,咱們把棋盤上每一種佈局看作一種狀態空間,而後每一種狀態空間又對應一個價值,咱們把全部價值組合起來稱爲價值空間,價值空間中的每一個狀態的價值都是要經過價值函數獲得。不一樣狀態之間的價值相對大小決定着該狀態贏得棋局的機率大小,例如若是狀態A的價值大於狀態B的價值,那麼咱們能夠認爲狀態A能贏的機率大於狀態B能贏的機率。佈局
關於全部狀態的價值初始化方法以下:假如咱們棋子X爲例,那麼只要有三個X棋子在一條線上,說明此時棋盤狀態表示X已經贏了,那麼這個狀態的價值就設置爲1,也就是說能贏的狀態的價值都設置爲1;反之,若是有三個O棋子在一條直線上,也就表明X輸了,因而此時棋盤狀態的價值就設置爲0。還有一些狀態就是打平手了,咱們把全部平局的狀態的價值都設置爲0;而後還有一些狀態是表示棋還沒下完,沒法判斷輸贏或平局,這種狀況價值設置爲0.5,由於咱們以爲雙方都有可能會贏。學習
那麼如何進行狀態轉移呢?首先狀態轉移只能是轉移到棋盤上的空位置處,這裏假設棋盤上的狀態只有三種狀況,分別是X、O、Empty,狀態轉移只能是轉移到Empty的點。spa
具體玩家指定下一步是到哪個Empty點的策略是:爲了保證能在機器學習的exploration和exploitation兩者之間作出一個折中,一般有兩種算法,一種是貪婪算法,另一種是隨機算法。貪婪算法的目的是選擇出此刻最優的Empty點,而隨機算法是去探索更多可能性。就比如日常咱們在叫外賣時,你能夠去點一個以前本身最喜歡的外賣,也能夠去嘗試一種新的口味,那麼第一種狀況對應的就是貪婪算法,也就是機器學習中的exploitation;第二種狀況對應的就是隨機算法,也就是機器學習中的exploration。設計
有了貪婪算法和隨機算法事後,就要考慮什麼時候使用貪婪算法和隨機算法了,毫無疑問,貪婪算法使用的狀況應該要佔大多數,所以咱們這裏設置一個機率閾值0.1,在每一次狀態轉移以前,經過隨機抽樣0~1之間的數來採起不一樣的算法。若是它小於0.1,咱們採起隨機算法;若是它大於0.1,咱們就採起貪婪算法。開發
隨機算法的執行很簡單,隨機在Empty的位置集合裏去挑選一個位置便可做爲下一步的位置;而貪婪算法的執行過程是遍歷全部的Empty位置獲得全部的狀態,而且計算每一個狀態的價值,找出其中最大價值的那個狀態。與隨機算法所不一樣的是,貪婪算法每一步都會更新價值空間,也就是說對上一個狀態空間的價值進行更新,具體的更新公式以下:it
V(s)=V(s)+alpha*[V(s')-V(s)]
其中V表示價值空間,s表示上一個狀態,s'表示下一個狀態,alpha表示一個相似學習率同樣的參數,本文中設置爲0.99,這裏能夠類比梯度降低算法,只不過這裏使用的是時間上的差分。
按照以上的描述,咱們就能夠設計一個會下五子棋的Agent了,這個Agent先讓它本身與本身對弈必定次數,次數越多,技術越強。它具有了基本的技術之後,就能夠進行人機對弈了,而且,隨着人機對弈次數愈來愈多,它也會變得愈來愈強大了。
因爲五子棋狀態空間較多,計算量較大,而若是設置機器人自身對弈次數較小的話,演示效果不佳;所以這裏給出9宮格的演示結果(三個連成一條線就表明贏了),首先讓Agent本身與本身下了30000局,而後我來和它下,結果以下圖所示,X表明我,O表明Agent:
第一步,我走(0,0):
而後機器走出(1,1):
第二步,我走(1,0),而後機器走出(2,0):
第三步,我走出(0,2),而後機器走出(0,1):
第四步,我走出(2,1),而後機器走出(2,2),最後只剩一個地方我走了(1,2),所以最終達成平局。
從上能夠看出,機器以及具有了基本的下棋技能。對於五子棋,演示方式也是和上面的同樣。下面給出開發人機對弈的五子棋程序Python代碼: