Сверточная нейронная сеть имеет 1,7% объясненной дисперсии после нескольких дней настройки структуры и гиперпараметров. - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь создать сверточную нейронную сеть, которая принимает позицию на шахматной доске и оценивает ее, выплевывая число многоножек. на каждую позицию в игре (1 образец для e4, 1 образец для e4 e5, et c до мата). Единственная особенность - это массив 8x8x6 для каждой доски, 6 - это 1, 0 или -1 в зависимости от того, чья фигура там, с индексами, относящимися к каждому типу фигур ([1,0,0,0,0,0 ] - пешка), а 8x8 соответствует полям доски.

Я знаю, что для шахмат это своего рода небольшой образец позиций - у меня есть больший набор данных с большим количеством игр, но это займет долго обрабатывать, поэтому моей целью было получить работоспособную модель, прежде чем тратить время и вычислительные мощности на ее предварительную обработку.

Моя примерно самая эффективная модель после нескольких дней настройки:

# model configuration
# takes in a board input and outputs a centipawn value
from tensorflow.keras.callbacks import EarlyStopping, TensorBoard
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.optimizers import SGD, Adam, RMSprop
from tensorflow.keras.regularizers import L1, L2
from tensorflow.keras.metrics import MeanAbsoluteError
from tensorflow.keras.initializers import GlorotUniform
log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
early_stop = EarlyStopping(monitor='val_loss', mode='min', verbose = 1, patience = 50)
adamOpti = Adam(learning_rate=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, amsgrad=False,
    name='Adam')
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)
initializer = GlorotUniform()
regularizerl2 = L2(l2 = 0.1)
EPOCHS = 5000

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Dropout, Flatten, MaxPooling2D, BatchNormalization
model = Sequential()
model.add(Conv2D(36, (3, 3), activation='relu', input_shape=(8,8,6), padding='same', kernel_regularizer=regularizerl2))
model.add(Conv2D(36, (3, 3), activation='relu', padding='same', data_format="channels_last", kernel_regularizer=regularizerl2))
model.add(BatchNormalization())
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.2))


model.add(Flatten())
model.add(Dense(64, activation = 'relu', kernel_initializer=initializer, kernel_regularizer=regularizerl2))
model.add(Dropout(0.5))
model.add(Dense(1))
# , metrics=[MeanAbsoluteError(name='mean_absolute_error', dtype=None)]
model.compile(loss='mse', optimizer=adamOpti)

# training
model.fit(X_train, y_train, epochs = EPOCHS, validation_data = (X_test, y_test), batch_size=1024, callbacks=[tensorboard_callback, early_stop])

Я пробовал варьировать количество полностью связанных и сверточных слоев, но большее количество обоих, похоже, увеличивает переоснащение. В моей исходной нейронной сети не было регуляризации или пакетной нормализации, которые отчасти помогали, но ничего примечательного. Я изменил скорость обучения и количество нейронов на слой. Независимо от того, что я делаю, похоже, это никогда не окажет особенно существенного влияния на производительность нейронной сети. Ниже приведена среднеквадратичная ошибка моей последней модели, которая также имела среднюю абсолютную ошибку 470,374 сантипешек (в диапазоне от -10000 до 10000, но большинство позиций только в пределах -1500-1500) введите описание изображения здесь

Я не уверен, что мой подход неправильный, мои гиперпараметры / структура отключены, мое представление данных неверно или что-то еще. Я был бы признателен, если бы мне помог кто-то с более глубокими познаниями в шахматном программировании или сверточных нейронных сетях. по акции fi sh, однако позиции передаются в мою нейронную сеть без данных хода.

1 Ответ

0 голосов
/ 15 августа 2020

Прошла неделя или две, и я обучил новый, больший набор данных. Я не уверен, можно ли улучшить структуру сети или формат данных для решения проблем, но та же сверточная нейронная сеть дает фантастические c результаты на новом наборе данных, поэтому проблема и чрезмерное переоснащение кажутся быть результатом недостатка данных - в частности, в шахматах даже 800 000 выборок не могут охватить достаточное количество позиций.

...