增強學習訓練AI玩游戲


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 算法的簡明教程)

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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM