白話DQN(DeepQ-Learning)強化學習算法(五子棋九宮格對弈實例)

介紹

    本文公開一個基於dqn的九宮格遊戲和五子棋遊戲自動下棋算法源碼,並對思路進行講解。

源碼地址:https://gitee.com/lizhigong/DQN-9pointgame

最近學習DQN算法繞了很多彎子,踩了很多坑,這裏梳理一下,一來給自己學習過程留個記錄,二來趁着坑比較熱乎,寫出來給大家分享分享。

代碼中有居於ANN的九宮格遊戲  已經訓練好的

還有一個基於CNN的8*8的五子棋遊戲 自己可以嘗試着訓練一下 自己試了試效果還不錯

1、Q-Learning介紹

Q-Learning的思想並不是很複雜,很多文章都有詳細的介紹,這裏只是簡單舉個例子,不做詳細講解。

比如選擇一條最近的路回家,而智能體可能出現在下面的方框中的任何一個位置,路線如下圖所示。

那麼怎麼用Q-Learning解決路線選擇的問題呢?

1、給所有的方框編上數字(價值數字)

2、選擇下一個路線時,按照鄰近的價值最高的方框選擇,就能按照最近的路線回家。

價值數字如下:

那麼問題來了:這上面的數字是我自己填的,那麼機器學習的話這個數字怎麼定?

1、初始化(全部的方框爲0)

2、設定獎勵值(到家得100分)

3、任意選擇一個方框,開始走,每走一步,看看所在的方框鄰近的連線裏面,分值最高的數字是幾,然後把這個數字乘以一個係數(圖例中方框較少,所以固定減10,不至於出現0,如果方框較多的情況下,用減係數的方法會出現很多0的方框,這些0的方框就不好選擇路線了,所以要用乘以一個係數),填到這個方框裏面。然後反覆的遍歷,反覆的走,直到最後,數字都固定下來了。

那麼Q-leaning的公式自然就出來了

這裏面每個方框表示一個狀態,的Q(S,A)指的是目標方框的狀態價值 ,也叫到目標位置的動作轉移價值,這個比較繞,初學者可以直接理解爲方框的價值(獲取獎勵的期望值、獲取獎勵的概率值等等,叫法很多,萬變不離其宗,主要是理解裏面的意思)。R指的是獎勵值(到家得100分)那個阿拉伯R就是上面說的係數,如果沒有這個係數,最後所有的方框都會變成100,還是沒辦法選路。max(Q)就是目標位置下一步所能達到的最大價值,也可以描述成目標位置下一步最大轉移價值,我不知道我描述是否容易理解。

這個狀態和狀態之間的轉移可以做成一個價值轉移表。通過迭代完善表中的價值信息,這個過程就叫Q-leaning。

2、DQN介紹

DQN也叫deepQ-Learning,在Q-Learning前面加一個Deep。Q-Learning有一個缺點,如果狀態特別多,比如五子棋的棋盤,每個位置都有(空白、黑子、白子)三個狀態,那麼假如一個10*10的棋盤 就有3^100個狀態,那麼這個Q表是沒辦法做出來的。那麼我們就沒辦法構建這個Q表來獲取狀態價值狀態轉移價值了。

DQN就是搭建一個人工神經網絡,輸入是當前狀態,輸出是狀態轉移價值。或者輸入是當前狀態,輸出是當前狀態的Q值。通過多次迭代訓練,使得神經網絡輸出逼近真實的Q值(逼近而不是等於,因爲畢竟是神經網絡,參數數量,存儲佔用量遠小於Q表,如果能做到完全等於的話,還要存儲幹啥)

那麼神經網絡的訓練的損失就是 預測Q值和(max(下一步的真實Q值)乘係數 +獎勵值)的差的平方。  預測Q值就是神經網絡一次前向傳播輸出的Q值,真實Q值就是神經網絡曾經預測的Q值。爲什麼真實Q值是神經網絡曾經預測過的Q值呢?因爲神經網絡每次訓練都會對輸出值產生影響,如果這個真實Q值一直變化的話,那麼神經網絡是沒辦法收斂的。所以需要搭建另一個參數一模一樣的神經網絡來生成真實Q值。這個生成真實Q值的網絡不需要訓練,只需要迭代一定次數以後,複製一份預測網絡的參數即可。就好比一個笨老師教一個學生,學生學會了以後當了老師,教新的學生,然後青出於藍而勝於藍,這個學生越來越強。

本文中代碼用的方法是,保存歷史預測的Q值,等一個棋局結束後,再用這些Q值來訓練每一步的預測Q值,這樣做到一個神經網絡就可以了。相當於一個聰明的學生,不停的複習,歸納,總結,然後逐漸變強。

3、對抗算法介紹

根據上面介紹的Q-Learning算法,解決的是一個單智能體的問題,這個智能體如何能夠用最小的代價獲得最大的回報。但是對弈的學習過程不一樣,博弈中存在兩個智能體,當前狀態和當前動作對應的下一個狀態會有很多,因爲對手怎麼下子我們不知道。那麼當前狀態和當前動作對應的什麼狀態是固定的呢?對手的狀態。那麼我能不能預測一下對手下一步能達到的最大的Q值呢?對手的Q值和我的Q值又有什麼關係呢?對於零和博弈,對手的優勢就是我得劣勢,對手的劣勢就是我的優勢,那麼我就可以用對手的Q值乘一個負的係數來訓練當前的Q值。這樣就解決了。

訓練的過程就是,先自己和自己下一局棋,並記錄每一步和每一步預測的最大Q值。等棋局結束後,再把整個棋局用神經網絡"回顧"一遍,用記錄的步子,Q值訓練。

4、訓練過程中注意的地方

下子的時候按照常理,咱們都是選擇Q值最大的動作來下子,這樣下子是沒問題的,但是我們是來訓練網絡的,如果每次選擇最大的步子下子的話容易陷入一個僵局。獲勝方一直用同樣或相似的套路打敗敗方,神經網絡很快損失下降很快,但是還是不會正確的落子,或者說它只對某一種棋局局面的風格掌握得很好,對不按照套路出牌的人就沒辦法應對。那麼我們就要加一個隨即事件,一部分步子是按照最大值去走的,一部分步子是隨機走的,但是最大Q值是每次都要計算出來保存用於回顧訓練用的。這樣很快就訓練出一個會正確走子的九宮格遊戲了。

不同的棋子最好放在不同的channel裏面,我發現如果用0背景1白棋2黑棋這樣標註放到一個棋盤裏面神經網絡無法收斂

感興趣的各位大佬可以下載研究討論一下。

QQ:306218847,歡迎聯繫討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章