DQN的第一次嘗試
在本篇博客中將為大家形象地介紹一下我對DQN的理解,以及我和我的隊友如何利用DQN進行黃金點游戲。最后我會總結一下基於我在游戲中看到的結果,得到的dqn使用的注意事項和這次游戲中我們應該改正的錯誤和改進的不足之處(可能只對黃金點有用,如果理解有誤的話,可以指出,我立馬改正)
問題定義
我的描述可能不太准確,這里直接使用參賽網站上對黃金點比賽的規則定義問題:
規則:N個玩家,每人寫一個或兩個0~100之間的有理數 (不包括0或100),提交給服務器,服務器在當前回合結束時算出所有數字的平均值,然后乘以0.618(所謂黃金分割常數),得到G值。提交的數字最靠近G(取絕對值)的玩家得到N分,離G最遠的玩家得到-2分,其他玩家得0分。只有一個玩家參與時不得分。
我們本次比賽允許沒人提交兩個數,這就給了玩家很大的操作空間(提交一個大數或者小數進行擾動)
問題的難點,我認為主要在於選定合適的action和state,既能保證模型的更新速度,又能保證預測的action能起到得分的作用
方法建模
本次游戲中,每個玩家可拿到的信息有:之前的黃金點、每個玩家給出的數、每個玩家的得分。通過這些信息建模之后給出自己本輪認為可以得分的number1和number2。考慮到rl在游戲上的優異表現,我們本次采用的方法是DQN。下面介紹一下具體的建模方法。
Q Learning
這篇教程說得很好 --> 莫凡教程。 想要詳細了解的小伙伴可以點開鏈接看一下。
提到dqn,必須要先介紹一下它的“前身” -- Q learning。dqn本質上是為了解決q learning的action-value表過大,有的狀態更新不到的問題的。那什么是Q learning呢?我們在這里用石頭剪刀布來舉一下例子。
概念介紹
action
q learnig中的第一個核心是action。action指你未來可以進行的操作。在石頭剪刀布中,action的定義就是我出石頭、出剪刀或者是出布了。
value and reward
value則是q learning中的第二個核心。定義為你執行某一個action之后,在未來可以獲得的收益值。
假設$value_t$為t時刻的value值。而你在t時刻選擇了$action_i$,然后獲得了$reward_t$(在石頭剪刀布中,就是你每輪贏輸或者平局)。那么你t時刻到未來可獲得的收益值即為:你本輪獲得收益加上你你未來獲得收益。
$value_t = reward_t + value_{t+1}$
state
state則是q learning中的第三個核心。定義為你在當前的游戲狀態,可以影響你下一步決策的游戲環境。在石頭剪刀布中,state可以定義為你和你對手在之前的決策等。我們這里將state簡化為上一輪你和對手的決策
流程
q learning維護了一張state-action的value表,這是什么意思呢?我們在這里虛構一張剪刀石頭布中的q表:
剪刀 | 石頭 | 布 | |
---|---|---|---|
對手:布 你:石頭 | 5 | 1 | 2 |
對手:布 你: 剪刀 | 4 | 2 | -1 |
對手:布 你:布 | 2 | -1 | 1 |
對手:石頭 你:剪刀 | 3 | 0 | 4 |
。。。。 |
加設上一輪處於“對手:布 你: 剪刀”的狀態。那么此時value值最大的action就是出剪刀(第三行),將這個值作為$value_{action}$。然后你下一輪出了剪刀之后,發現輸了,因為對手出了石頭。此時你需要更新自己的q表。
你拿到第二步的狀態(對手:石頭 你:剪刀),將這一狀態下的max_value * gamma作為你未來的收益 ,再加上 你這一輪的收益(-1)。將這個值設為$value_{real}$, 更新$value_{action}$:
$value_{action_new} = value_{action} - lr * (value_{action} - value_{real})$
在上式中lr和gamma是人為設定的參數。
DQN
在上面石頭剪刀布中,action相對較少,state我們也是用了一種簡化的方式來模擬。在黃金點游戲中,action數比較多,state也很多。這種情況下是用一個神經網絡代替q表,並周期的更新參數可以有效解決這個問題。
同時我們使用了Experience replay 和 Fixed Q-targets策略。
Experience replay:使用過去的狀態acition對同時更新網絡
Fixed Q-targte:使用兩個net,一個(eval net)用於計算當前state下的value值,一個用於(target ney)計算使用action后未來的value。其中經常更新eval net。而target net 固定steps進行更新(與eval net 交換參數)。
由於我們第一輪的模型存在比較多的問題,現在就只給大家介紹一下第二輪的模型設置和流程
state
為了減小模型規模,我們只使用前10輪的黃金點作為狀態。
action
有7個action:
- 使用上一輪的黃金點
- 使用上兩輪黃金點的平均
- 使用前三輪黃金點的平均
- 使用周期為2的黃金點的平均
- 使用周期為3的黃金點的平均
- 使用最大的三個黃金點的平均
- 使用最小的三個黃金點的平均
model
我們的model為了減小參數和規模,只使用了全連接層。模型概念圖如下
其他參數
memory size:最大記錄前100輪的state1 action state2 reward
lr:0.1;在第50和500個step乘以0.1
batch size:8 ,在 50、100、 500、 1000個step成2
gamma:0.9
e_geedy:0.9
每20個step更新一次target net。
模型從15個step開始學習,從第50個step開始上線。
流程圖
結果分析
我們第一輪的時候選擇使用gru來選擇action,同時state考慮了前20輪的user number、黃金點以及得分。action定義為選擇的分數所在的區間。這導致了模型很難收斂,以及參數區間只要一預測錯就會被扣分。最后的結果當然是分數慘淡,獲得倒數第三名...
第二輪我們改進了策略,主要是改變了action,使每個action都是當前輪次中可能得分的action。簡化模型,是的模型收斂速度加快。改變啟動策略。
最后模型的效果如下,可以看到有的action還是很少使用的,而且我們目前階段其實策略比較保守,沒有像Bot8一樣采用 擾動策略(來不及了)
分數趨勢:
action1選擇:
action2選擇:
回答一下問題
- 我們其實沒什么預期。。。第一輪有些失望,第二輪其實是超出了我們的預期的
- 比賽前,我們與其他選手進行了比賽,以及房間的ai進行了比賽,由此衡量模型的好壞
- 人數的多少並不影響我們方法的使用,但是效果是否會變好或者變差應該需要試驗評估
- 我的隊友真的是一個非常負責的隊友,我本人其實在任務期間有mentor布置的工作要做,就很忙。很多時候事件的協調,debug等都是由我的隊友負責的,非常感謝,而且最后隊友提出的建議也在很大程度上改善了模型的效果!如果非要說什么不足的話,函數可以寫短一點hhh, 主要是函數太長了hhh,debug比較麻煩。但是總體來說是非常好的,合作非常愉快~