符號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碰撞。編碼
左爲AI高速學習視頻,右爲AI正常遊玩視頻人工智能
學習種類: 加強學習又稱強化學習
學習細節:Q算法 + 值函數線性(參數)逼近,若是您還不知啥麼是q算法,啥麼是值函數,啥麼又是線性參數逼近。那麼我推薦您先看看一下資源。
A Painless Q-learning Tutorial (一個 Q-learning 算法的簡明教程)
而後,我來給你講講什麼是線性參數逼近。咱們由淺入深,先探討一下向量。在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)) β爲調整步長。
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θ, 這裏是向量的點積,乘積的和。
本遊戲採用值函數線性參數化逼近,對動做狀態值函數Q(s, a)進行線性參數話逼近。值函數近似多用於求解連續狀態集或大規模狀態集。由於state或action太多沒法所有保存,因此須要抽象出一個函數,函數的參數爲state和 action ,返回值爲其分數。
最後咱們的Q值函數可表示爲:Q(s, a) = φ(s, a)Tθ,更新權重法則爲:θ ← θ + β φ(s, a)(Q+(s, a) - Q(s, a)),
對於本文給出的小遊戲,簡單的使用隨機梯度降低法能夠對動做狀態值函數進行線性近似。並能夠取得較好的效果。
相關代碼,已上傳
https://github.com/RonTang/QLearningForAiPlayGame/
須要的同窗請自行獲取。
研究機器學習只是筆者的業餘愛好,故本文使用的最基本的強化學習算法,若有錯誤請耐心指正。若是讀者想要進一步深刻學習,不妨瞭解一下Google DeepMind的各類DQN,OpenAL剛剛出新的強化學習算法PPO。這些新的強化學習算法從效率和效果都有很大提升。固然,具體研究起來確定是很複雜的,有興趣的讀者本身去研究吧。
做爲一個遊戲開發者,在適當的地方使用機器學習是很好的選擇。謹記,咱們作遊戲是爲了讓玩家開心,不是爲了讓AI吊打玩家。至於人工智能學者總愛拿遊戲作例子,一是爲了方便向民間傳播研究進度,刷存在感,拉投資。二是某些遊戲的狀態空間確實比較複雜。好比搞搞圍棋,搞搞Dota2,搞搞星際2。