Как использовать логическую симметрию входных нейронов для обучения контролируемой нейронной сети? - PullRequest
0 голосов
/ 22 сентября 2019

Введение

Как будет ясно, я не специалист по машинному обучению, но я работаю на руководящей должности в области наук о данных и изучаю ML, чтобы понять потенциал.В основном в качестве упражнения я тренирую нейронную сеть для прогнозирования итоговых очков в игре, подобной Bejewel, с учетом начальной доски (скажем, R рядов, C столбцы, L цвета).После статьи о глубоких шахматах (https://arxiv.org/abs/1711.09667), я не определяю особенности, но позволяю NN найти их. Поэтому в качестве входных данных я использую R * C * L нейроны с двоичным входом, плюс2 R * C дополнительные входные нейроны для 2 «специальных» драгоценных камней (получаются путем уничтожения более 3 драгоценных камней за раз). Для доски 8x8 с классическими 5 цветами это количество составляет 448 входных нейронов.Я использую два скрытых слоя (100, 20) и сигмовидную функцию между слоями. Я тренирую это, используя базу данных, которую я построил с тысячами игр: стартовая доска в качестве входных данных и очки, полученные после 5 ходов в качестве выходных.

Вопрос

В целом приветствуются любые предложения, поскольку у меня нет профессионального опыта в области машинного обучения. Однако мой вопрос носит более теоретический характер.

Мне было интересно , как я могу использоватьсимметрия между пятью цветами . Действительно, я знаю, что смещение цветов (т.е. переключение входных нейронов) ничего не изменит. Вариант, о котором я сейчас думаю, пока яЯ пишу этот вопрос (как обычно!) будет просто умножить набор тренировок, добавив все цветовые перестановки (5!= 120) платы ввода в набор с таким же выходом.Однако более утонченной и более концептуально привлекательной идеей было бы ограничить веса или структуру сети, чтобы как-то отразить эту теоретическую симметрию, чтобы любое обучение автоматически обновляло сеть симметричным образом.Это возможно / рекомендуется?Как это реализовать?

Текущая реализация

Я использую очень стандартную реализацию контролируемого обучения в pybrain .Набор данных DS имеет R * C * (L + 2) двоичных входных нейронов, и выходной слой нормализуется (вычитая среднее значение и деля на стандартное отклонение).Есть два скрытых слоя.Все полностью подключено.

Набор данных DS разделен на 80-20 в TrainDS и TestDS .

nn=FeedForwardNetwork()

inLayer = LinearLayer(R*C*(L+2))
hidden1 = SigmoidLayer(100)
hidden2 = SigmoidLayer(20)
outLayer = SigmoidLayer(1)

nn.addInputModule(inLayer)
nn.addModule(hidden1)
nn.addModule(hidden2)
nn.addOutputModule(outLayer)

in_to_hidden = FullConnection(inLayer, hidden1)
hidden1_to_hidden2 = FullConnection(hidden1, hidden2)
hidden2_to_out = FullConnection(hidden2,outLayer)
nn.addConnection(in_to_hidden)
nn.addConnection(hidden1_to_hidden2)
nn.addConnection(hidden2_to_out)
nn.sortModules()


TrainDS, TestDS = DS.splitWithProportion(0.8)

trainer = BackpropTrainer( nn, dataset=DS, momentum=0.1, verbose=True, weightdecay=0.01)
print sum(np.abs(nn.activateOnDataset(TrainDS) - TrainDS.data['target'][:len(TrainDS)]))/len(TrainDS)
print sum(np.abs(nn.activateOnDataset(TestDS) - TestDS.data['target'][:len(TestDS)]))/len(TestDS)

Я получаю среднюю ошибку в поезде и тестовом наборе соответственно 0,70 и 0,77.

...