加強學習訓練AI玩遊戲

1.遊戲簡介

符號A爲 AI Agent。git

符號@爲金幣,AI Agent須要儘量的接取。github

符號* 爲炸彈,AI Agent須要儘量的躲避。算法

遊戲下方一組數字含義以下:less

Bomb hit: 表明目前AI Agent所接取的炸彈數。機器學習

Coin hit:   表明目前AI Agent所接取的金幣數。wordpress

Iteration:表明遊戲已經進行的幀數,案例正常遊玩視頻,250ms一幀。高速狀態下幀頻未知。函數

Game Play:每幀會隨機產生一個炸彈和一個金幣,或者只產生一個炸彈或金幣。每幀AI agent能夠行動一次, 以及全部的炸彈和金幣降低一格。學習

當金幣和炸彈到最後一格時會自動消失,此時不在參與AI Agent碰撞。編碼

2.遊戲展現

                                 左爲AI高速學習視頻,右爲AI正常遊玩視頻人工智能

3.實現原理

學習種類: 加強學習又稱強化學習

學習細節:Q算法 +  值函數線性(參數)逼近,若是您還不知啥麼是q算法,啥麼是值函數,啥麼又是線性參數逼近。那麼我推薦您先看看一下資源。

  A Painless Q-learning Tutorial (一個 Q-learning 算法的簡明教程)

Q-learning toturial

而後,我來給你講講什麼是線性參數逼近。咱們由淺入深,先探討一下向量。在2維空間中,咱們能夠用兩個正交的二維基向量i,j來任意二維向量v。寫做v = x*i+y*j; 咱們只需調整x,y,也就是調整基向量的權重參數,就能夠表示不一樣的向量。同理,N維空間,咱們也能夠用N個正交的N維基向量表示任意N維向量。那麼須要調整的權重也會相應的增長到N個。 回到函數的問題,咱們是否能夠用相似的方式,用N個基函數的和來表示一個複合函數,而且經過修改每一個函數的權重參數來表示不一樣的複合函數。很明顯,答案是能夠的。 那麼如今的問題是如何調整這些權重,使它表達的複合函數更接近個人目標函數?

進一步對於強化學習來講,咱們不知道目標函數的具體樣子。咱們經過不斷的實驗得知函數的輸入輸出模式爲 in:a0 out:b0; in:a1 out:b1.......

因此咱們要創建一個函數f,使其的輸入輸出與咱們的目標函數的輸入輸出匹配便可。完美的匹配全部輸入輸出怕是找不到,退而求其次,咱們去尋找平均狀況下最好的匹配,即容許構造函數f與目標函數t某些輸入與輸出存在差別,但整體上差距最小。在這裏咱們使用隨機梯度降低

Q(s, a) φ(s, a)Tθ (θ是有多個權重構成的向量,咱們要不斷調整θ, φ(s, a)T則爲基函數,返回值爲向量

C = 1/2(Q+(s, a) - Q(s, a))2 =1/2 (Q+(s, a) - φ(s, a)Tθ)2
∂C/∂θ = -φ(s, a)(Q+(s, a) - φ(s, a)Tθ).

θ θ + β φ(s, a)(Q+(s, a) - Q(s, a))  β爲調整步長。

4.遊戲內狀態編碼

Game State:

本文 AI Agent 採起對其上方4*3區域進行二進制編碼。0表明空位置,1表明空間被bomb或coin佔據。那麼4*3區域須要24bit的數據來表示coin 和 bomb,以本文爲例,前12位表明bomb後12位代碼coin。相同位置的bomb和coin能夠同時爲0,表明既沒有bomb也麼有coin,但不能同時爲1,即兩者不可重疊。

對其進行二進制編碼的好處爲能夠把state抽象成爲一個int數值,大大了減小了描述state所需的空間。固然監測區域越大狀態空間就越大,那麼Agent就越智能。

Game Action:

左移,右移,不動。

Feature base φ(s, a):

用於描述當前狀態特徵的基函數,在程序中它不返回一個12維向量,而是增長參數i,表明獲取第幾個特徵,函數輸入爲狀態s和指令a,特徵函數φ(s, a,i)的返回值取值範圍爲 -1,0,1。

φ(s, a)的計算須要使用當前的狀態s 和 當下要執行的action。

Feature base  Weight θ

θ也是12維向量,用以表示feature base中不一樣元素的權重。

Q value:

   Q(s, a) = φ(s, a)Tθ, 這裏是向量的點積,乘積的和。

5.具體實現方法

本遊戲採用值函數線性參數化逼近,對動做狀態值函數Q(s, a)進行線性參數話逼近。值函數近似多用於求解連續狀態集或大規模狀態集。由於state或action太多沒法所有保存,因此須要抽象出一個函數,函數的參數爲state和 action ,返回值爲其分數。

最後咱們的Q值函數可表示爲:Q(s, a) = φ(s, a)Tθ,更新權重法則爲:θ θ + β φ(s, a)(Q+(s, a) - Q(s, a)),

對於本文給出的小遊戲,簡單的使用隨機梯度降低法能夠對動做狀態值函數進行線性近似。並能夠取得較好的效果。

6.代碼分享

  相關代碼,已上傳

  https://github.com/RonTang/QLearningForAiPlayGame/

  須要的同窗請自行獲取。

7.將來展望&心語

研究機器學習只是筆者的業餘愛好,故本文使用的最基本的強化學習算法,若有錯誤請耐心指正。若是讀者想要進一步深刻學習,不妨瞭解一下Google DeepMind的各類DQN,OpenAL剛剛出新的強化學習算法PPO。這些新的強化學習算法從效率和效果都有很大提升。固然,具體研究起來確定是很複雜的,有興趣的讀者本身去研究吧。

做爲一個遊戲開發者,在適當的地方使用機器學習是很好的選擇。謹記,咱們作遊戲是爲了讓玩家開心,不是爲了讓AI吊打玩家。至於人工智能學者總愛拿遊戲作例子,一是爲了方便向民間傳播研究進度,刷存在感,拉投資。二是某些遊戲的狀態空間確實比較複雜。好比搞搞圍棋,搞搞Dota2,搞搞星際2。

相關文章
相關標籤/搜索