[心得] 用強化學習設計21點AI機器人
嗨各位,最近花了一些時間學習機器學習相關主題,想說來用python設計一個會玩21點的
機器人好了,以下會簡單介紹我使用的遊戲環境,深度神經網路,和相關成果。
一、遊戲環境:openAI的gym,簡單程式碼如下
https://imgur.com/wCFHI5t
可以看到要在python搭建Blackjack環境其實非常簡單,import完gym之後用gym.make就能
搭建各種遊戲環境。
二、規則:
而我們這個遊戲是我們要擔任player的角色和莊家(dealer)對賭,我們起始會有兩張
手牌,莊家則會有一張。點數方面2~10都以牌面作為點數,J,Q,K都算10點,ace可算1或1
1。
我們只有兩種動作可以選擇:拿牌(hit)或不拿(stand)。
目標是讓手牌點數和最靠近21點,若超過21點(爆牌)則直接判定輸了。
在我們決定不拿牌後,換莊家開始拿牌,莊家若手牌和低於17點,必須繼續要牌。
最後比誰的牌點數和最靠近21誰就贏了。
後續我還有改寫gym的環境讓我們可以做雙倍加注(double),讓玩家可以採取
更多策略,更符合實際情況。
總之這張圖的重點在env.step(action)那行,簡單說就是
我們隨機採取了一個action(0代表stand, 1代表hit)然後observation就是遊戲當前狀態
,會回傳一組數字:(我方當前手牌和, 莊家手牌, 我方是否有ace),那reward就是強化
學習當中很重要的機制,可以讓我們透過這種獎懲機制去訓練模型,-1代表輸了;0代表
我們還沒爆牌或是平手;1代表我們贏了。done回傳True或False表示當局結束與否。
在完全採取隨機action的情況下玩10萬場的勝率約27%。
三、訓練方法:Deep Q Learning
我是用keras搭建神經網路的,因為比tensorflow簡潔直觀。附上我使用的超參。
https://imgur.com/Fbv8Nwp
我搭建了三層fully connected layer,activation function都用relu沒問題,
但output layer的activation function就不能用relu了,因為在DQN中我們的input
是遊戲的state也就是我們上面提到的observation,我們的output則是在碰到這樣的
state,我們“採取各個動作預期的reward們”
打個比方:我們可能input [11, 6, 0],表示我們手牌和是11,莊家拿6,我們沒ace。
這個神經網路的output應該要像這樣 [-0.4 0.2],其中-0.4表示採取stand預期的
reward,0.2表示採取hit預期的reward,那我們當然希望reward越大越好所以就採取
hit這個動作。
因此這個output通常是有正有負的,不能用relu,那就用linear吧。
再簡單提一下memory,是我們儲存各個observation跟action的地方,在訓練的時候
會從中隨機抽樣用TD的方法去不斷更新我們的神經網路。
四、基本版訓練成果:
https://imgur.com/9l0Akrl
靠左的數字是我們的手牌,上面的數字是莊家的手牌,H(hit拿牌)或S(stand不拿)
則是這個神經網路打算採取的策略,會有兩段是因為上面那段是手上沒有ace的情況
,下面是有ace的。
可以看到這個神經網路已經可以做出和人類非常相近的決策:在大牌選擇stand,
小牌選擇hit,並在手上有ace的時候更積極hit。而在這樣策略下勝率提升到42%,
敗率49%。
也就是說平均每下注一百元會輸掉七元,雖然相較完全隨機玩有顯著的進步,但還有
進步空間,因此我決定加入其他戰略(double)讓玩家可以選擇雙倍下注,看能不能
讓機器人有更聰明的表現。
五、加入double戰略
由於openAI的原始程式碼並沒有double的功能因此我自己改寫了一下他們的程式碼,
簡單來說現在玩家可以選擇在第一手要不要double,要是double的話,玩家只能再拿
一張牌,然後莊家開始要牌。
神經網路方面我一樣用DQN下去train,只是在output的時候變成輸出三種動作的
期望reward。除此之外我參考了周莫煩的code和prioritised replay的paper實作了
優先回放,其中有用到sumtree的資料結構。也加入了doubleDQN的訓練方法。
六、double版訓練成果
在看這個神經網路的決策之前我們先看一下我們人類推算出的最佳21點戰略表。
https://imgur.com/15vKVBF
然後這是我們的神經網路在面對各種情況所下的決策表。
https://imgur.com/eKQzWDW
可以看到明顯它學習到在我們握有9, 10, 11且莊家是weak hand的時候可以進行
double,還有在手上有ace的時候該如何double等等。雖然不盡完美,但在我用這個
神經網路下去玩一百萬場的結果平均每一百元大約輸2.X元左右,如果真的要贏錢,
可能還要加上split的戰略和算牌了。
七、結語
其實發文也同時是記錄自己的學習筆記和找到同樣對RL也有興趣的朋友、前輩一起
討論啦,感謝大家耐心看完。要是對我的程式碼有興趣歡迎到我的github按個星https://
github.com/blue0107/DQN-blackjack-pokerbot,歡迎大家討論
指教啦!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 27.246.75.8
※ 文章網址: https://www.ptt.cc/bbs/DataScience/M.1535696714.A.DA8.html
推
08/31 14:35,
6年前
, 1F
08/31 14:35, 1F
※ 編輯: b05703 (27.246.75.8), 08/31/2018 14:47:56
推
08/31 15:43,
6年前
, 2F
08/31 15:43, 2F
推
08/31 18:11,
6年前
, 3F
08/31 18:11, 3F
推
08/31 19:55,
6年前
, 4F
08/31 19:55, 4F
→
08/31 21:17,
6年前
, 5F
08/31 21:17, 5F
推
08/31 21:17,
6年前
, 6F
08/31 21:17, 6F
→
08/31 21:17,
6年前
, 7F
08/31 21:17, 7F
※ 編輯: b05703 (27.246.75.8), 08/31/2018 21:23:05
→
08/31 22:52,
6年前
, 8F
08/31 22:52, 8F
→
08/31 23:33,
6年前
, 9F
08/31 23:33, 9F
推
09/01 01:14,
6年前
, 10F
09/01 01:14, 10F
推
09/01 05:40,
6年前
, 11F
09/01 05:40, 11F
推
09/01 11:16,
6年前
, 12F
09/01 11:16, 12F
推
09/01 13:24,
6年前
, 13F
09/01 13:24, 13F
推
09/01 15:18,
6年前
, 14F
09/01 15:18, 14F
→
09/01 15:40,
6年前
, 15F
09/01 15:40, 15F
→
09/01 15:40,
6年前
, 16F
09/01 15:40, 16F
→
09/01 15:40,
6年前
, 17F
09/01 15:40, 17F
推
09/01 19:19,
6年前
, 18F
09/01 19:19, 18F
推
09/03 00:34,
6年前
, 19F
09/03 00:34, 19F
推
09/03 10:42,
6年前
, 20F
09/03 10:42, 20F
推
09/04 21:40,
6年前
, 21F
09/04 21:40, 21F
推
09/13 17:55,
6年前
, 22F
09/13 17:55, 22F
推
10/07 20:05,
6年前
, 23F
10/07 20:05, 23F
推
01/06 20:41,
6年前
, 24F
01/06 20:41, 24F
DataScience 近期熱門文章
PTT數位生活區 即時熱門文章
0
18