在國際象棋數據上訓練神經網絡
我一直在和朋友一起寫一個國際象棋引擎,引擎本身已經非常好(2700+ CCRL)。我們的想法是使用神經網絡來更好地評估位置。
輸入到網絡
因為網絡的輸出很大程度上取決於哪一方必須移動,所以我們使用輸入的前半部分來解析誰必須移動的位置,而後半部分則用於分析對手的位置。事實上,我們為每個部分和每個正方形都有一個輸入,這將導致 12x64 輸入。我們的想法也包括對手國王的位置。所以每一方都有 6x64 輸入,對於每個方格,對手國王可以是 -> 6x64x64。總的來說,這會產生 12x64x64 二進制輸入值,其中最多設置 32 個。
圖層
下一層由 64 個神經元組成,其中前 32 個神經元只接受前半部分輸入特徵的輸入,後 32 個只接受後半部分輸入特徵的輸入。
它遵循一個具有 32 個完全連接的神經元的層,輸出層只有一個輸出。
激活功能
我們在隱藏層使用 LeakyReLU,在輸出使用線性激活函數。
訓練
最初,我想在大約 100 萬個位置上訓練網絡,但這需要很長時間。位置本身的目標值在 -20 到 20 的範圍內。我使用 ADAM 的隨機梯度下降,學習率為 0.0001,MSE 作為損失函數。
我遇到的問題是,即使訓練這 100 萬個職位也需要很長時間。目標是稍後在 3 億個位置上進行訓練。
我不確定在哪裡可以改善培訓進度。
下面是顯示超過 1000 次迭代的訓練進度的圖表
每次迭代的更改如下所示:
我希望有人能給我一兩個提示,告訴我我可以改進什麼,以便更快地訓練網絡。我很高興有任何建議!
問候,芬恩
編輯 1
正如建議的那樣,我應該將我的網絡轉換為 keras。我在讓稀疏輸入運行時遇到問題。
import keras from keras.layers import Input, Concatenate, Dense, LeakyReLU from keras.models import Model from keras import backend as K import numpy as np # trainX1 = tf.SparseTensor(indices=[[0,0], [0,1]], values=[1, 2], dense_shape=[1,24576]) # trainX2 = tf.SparseTensor(indices=[[0,0], [0,1]], values=[1, 2], dense_shape=[1,24576]) # # trainY = np.random.rand(1) trainX1 = np.random.random((10000,24576)) trainX2 = np.random.random((10000,24576)) trainY = np.zeros((10000,1)) #input for player to move activeInput = Input((64*64*6,)) inactiveInput = Input((64*64*6,)) denseActive = Dense(64)(activeInput) denseInactive = Dense(64)(inactiveInput) act1 = LeakyReLU(alpha=0.1)(denseActive) act2 = LeakyReLU(alpha=0.1)(denseInactive) concat_layer= Concatenate()([act1, act2]) dense1 = Dense(32)(concat_layer) act3 = LeakyReLU(alpha=0.1)(dense1) output = Dense(1, activation="linear")(act3) model = Model(inputs=[activeInput, inactiveInput], outputs=output) model.compile(loss='mse', optimizer='adam', metrics=['accuracy']) # print(model.summary()) print(model.fit([trainX1,trainX2], trainY, epochs=1))
如果我
sparse=True
用於 Dense 層,它會拋出一些異常。如果有人可以幫助我創建稀疏輸入向量,我會很高興。
我認為您需要考慮在 GPU 上運行它。谷歌 Colab 是免費的,亞馬遜 AWS 非常便宜。您似乎知道自己在做什麼,因此您可能可以很快啟動並運行 PyTorch。一旦您比較了在 GPU 上實現的相同網絡與您的單處理器設置的性能,您將能夠更好地了解下一步該去哪裡。