1.游戲簡介
符號A為 AI Agent。
符號@為金幣,AI Agent需要盡可能的接取。
符號* 為炸彈,AI Agent需要盡可能的躲避。
游戲下方一組數字含義如下:
Bomb hit: 代表目前AI Agent所接取的炸彈數。
Coin hit: 代表目前AI Agent所接取的金幣數。
Iteration:代表游戲已經進行的幀數,案例正常游玩視頻,250ms一幀。高速狀態下幀頻未知。
Game Play:每幀會隨機產生一個炸彈和一個金幣,或者只產生一個炸彈或金幣。每幀AI agent可以行動一次, 以及所有的炸彈和金幣下降一格。
當金幣和炸彈到最后一格時會自動消失,此時不在參與AI Agent碰撞。
2.游戲展示
左為AI高速學習視頻,右為AI正常游玩視頻
3.實現原理
學習種類: 增強學習又稱強化學習
學習細節: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)) β為調整步長。
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。