訓練卷積神經網路下五子棋
本人是計算機專業大四學生,最後一個學期正在寫畢業論文,題目就是用卷積神經網路學習五子棋。在研究了AlphaGo的兩篇paper之後,放棄了Reinforcement Learning的想法(太費時費資源了),決定用大量的數據訓練一個Policy Network。
數據是從這個網站獲得的 http://www.renju.net, 一共50000多局棋局。
方法如下:
- 第一步,預處理數據:
原始數據是類似這樣的每一步位置的記錄
我將每一局遊戲重現了一遍,以二維數組的形式記錄下每一步之前的棋盤狀態(sample,size: 15x15), 和下一步的位置(one-hot label, size: 15x15 = 225)。
- 第二步,神經網路構建(Tensorflow):
這是最開始用的神經網路結構,之後又加了一個卷基層,每個卷基層128個filters, 又加了一個全聯接層,兩個全連階層各512個神經元。
- 第三步,訓練
訓練了一晚上,用的顯卡訓練,testing loss很快降到4.7左右就再也不減小了,但我還是堅持讓它訓練了一晚(可能overfit了也說不準。。)
- 測試
不出所料,神經網路很弱很弱(WEAK!!)於是乎,想辦法分析下神經網路究竟學了個什麼??(What the XXXX)
我把神經網路每一次的預測可視化:
我的天哪,不出所料,神經網路認為越往中心走越好,完全就是無腦了。
怕是overfit的原因,我又快速訓練了一遍神經網路,效果依舊不好。
雖然做成這個樣子論文已經可以了,但是不甘心,又由於沒有系統的學過機器學習和神經網路,是在想不到解決辦法,於是乎發此貼,請大師們指點迷津 :)
更新!:問題找到了,見下圖
圖片是訓練用的Label,我把他們全部加起來又reshape成了15X15的樣子。可以看得出訓練label確實集中在中心區域。
同樣可以從這個頻率直方圖裡看出問題(橫坐標是label 從0標到224, 一共225 個):
再次更新 (三月3號,2018):
增加了100多行代碼的評估函數來輔助神經網路使用,因為神經網路輸出已經給出了一個概率梯度,因此沒有用樹搜索,只是簡單的取神經網路輸出的前20個可能走法進行評估,然後取得分最高的走法去下。發現效果還不錯,因為沒有樹搜索,節省了時間。附上一局人機對戰:
推薦閱讀:
※再戰絕藝,半目惜敗
※如何看待柯潔在人機大戰後持續連勝?
※AlphaZero實踐——中國象棋(附論文翻譯)
※不只是圍棋!AlphaGo Zero之後DeepMind推出泛化強化學習演算法AlphaZero
※李世石在與AlphaGo對弈的第四局下出的「78挖」這一手是否算得上「神之一手」?