1

好吧,所以我創建了一個神經網絡Q-learner,使用與DeepMind的Atari算法相同的想法(除了我給出的原始數據不是圖片(然而))。爲什麼我的神經網絡Q-learning不學習井字遊戲

神經網絡的構建:

  • 9個輸入(0代表空白點,1表示 「X」,-1 「O」)

  • 1隱藏層與9-50神經元(試圖用不同的尺寸,激活函數乙狀結腸)

  • 9輸出(1每一個動作,輸出Q值,激活函數乙狀結腸)

  • MSE損失函數
  • 亞當backprop

我100%相信網絡是正確建立,因爲坡度的檢查和大量的測試。

Q-參數:

  • -1獎勵敗局
  • -1的獎勵,如果此舉是試圖已佔點(例如,X已經在球員Ø試圖把現場他的「O」)
  • 0獎勵吸引
  • 0獎勵移動,這不會導致終端狀態
  • +1的獎勵贏得比賽
  • 下一個狀態(在s,a,r,s'中)是你自己和對手的移動之後的狀態。例如。空板和選手X先轉身並將「X」放在左上角。然後玩家O將「O」放在右上角。那麼s,a,r,s'就是s = [0,0,0,0,0,0,0,0,0],a = 0,r = 0,s'= [1,0, - 1,0,0,0,0,0,0]

問題

我所有的Q值變爲零,如果我給-1獎勵時,由移動已經佔據的位置。如果我不這樣做,網絡不知道它不應該移動到已經佔用的地方,似乎學習任意的Q值。另外我的錯誤似乎並沒有縮小。

解決方案沒有奏效

  • 我曾試圖改變獎勵(0,0.5,1)和(0,1),但它仍然沒有學會。

  • 我試圖將空狀態表示爲0,對於O表示0.5,對於X表示1,但沒有工作。

  • 我已經試圖在移動完成後給出下一個狀態,但它沒有幫助。

  • 我已經嘗試過與亞當和香草回道具,但仍然是相同的結果。

  • 我試過從重播內存和隨機梯度下降的批次,但仍然相同
  • 將sigmoid更改爲ReLU,但沒有幫助。
  • 各種各樣的事情我不記得在GitHub上現在

項目:https://github.com/Dopet/tic-tac-toe(對不起, 醜陋的代碼主要是由於所有的這些代碼的重構,這也應該是簡單的測試看是否算法工作)

要點:

  • TicTac類有遊戲本身(由û從歌唱比賽抽象類模板方法模式)
  • NeuralNetwork類記錄一些數據文件被稱爲MyLogFile.log在當前目錄
  • Block和組合類只是用來創造獲獎情況
  • jblas-1.2.4。 jar包含DoubleMatrix庫
+1

這個帖子是非常好的,只要它去。問題是(a)我的方法沒有看到任何錯誤; (b)您沒有提供代碼來重現錯誤。 – Prune

+0

我將項目添加到GitHub。請問你有什麼不清楚的地方! https://github.com/Dopet/tic-tac-toe – Dope

+0

[最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。 – Prune

回答

1

這是一個獎勵/從輸出層中刪除激活功能的問題。大多數時候我有[-1,1]的獎勵,我的輸出層激活函數是sigmoid,它是從[0,1]開始的。這導致網絡在用-1回報時總會有錯誤,因爲輸出永遠不會小於零。這導致值爲零,因爲它試圖修復錯誤,但它不能

0

我認爲你的表述是錯誤的。您正在使用NN爲下一個狀態提供的最大值更新狀態值。

expectedValue[i] = replay.getReward() + gamma *targetNetwork.forwardPropagate(replay.getNextState()).max();

這適用於單人遊戲的設置。但是由於tic tac toe是雙人遊戲,「下一個狀態」(對手)的較高值對當前狀態的值不利。

您可以將最大值2個狀態向前(使用NN預測2個狀態向前),但是這也不能很好地工作,因爲您假定您做出的第二個移動是最佳的並導致大量錯誤的更新。

我建議您使用policy gradients來進行傳播值不太清晰的設置。在這種方法中,你玩隨機遊戲(兩個玩家隨機移動),並說如果玩家'O'贏得獎勵你所有'O'移動積極(降低折扣因素,即最終行動獲得更多的獎勵,然後獎勵減少一個因素)和獎勵'X'以相同的方式消極地移動。如果遊戲結果爲平局,則可以用較低的積極回報獎勵兩個玩家。

你可能會最終獎勵次優動作,反之亦然,但在大量的遊戲中,事情對你有利。

+0

這應該不是問題,因爲我的下一個狀態是你自己和對手的移動之後的狀態(參見上面的Q參數部分,例如我的意思)。但我確實得到了這個工作。這是從輸出層獎勵/去除激活功能的問題。大多數時候我有[-1,1]的獎勵,我的輸出層激活函數是sigmoid,它是從[0,1]開始的。 由於輸出永遠不會小於零,這導致網絡在以-1回報時始終有錯誤。這導致值爲零,因爲它試圖修復錯誤,但它不能 – Dope