Например, если бы у меня была нейронная сеть, которая играла в шашки / шашки и пыталась сделать неверный ход, есть ли способ специально оптимизировать этот конкретный результат?
---------------------------------------
8 | | bM | | bM | | bM | | bM |
---------------------------------------
7 | bM | | bM | | bM | | bM | |
---------------------------------------
6 | | bM | | bM | | bM | | bM |
---------------------------------------
5 | | | | | | | | |
---------------------------------------
4 | | | | | | | | |
---------------------------------------
3 | wM | | wM | | wM | | wM | |
---------------------------------------
2 | | wM | | wM | | wM | | wM |
---------------------------------------
1 | wM | | wM | | wM | | wM | |
---------------------------------------
A B C D E F G H
Если бы доска выглядела вот так, и был бы выходной нейрон для каждого возможного движения в области черновой фигуры (вплоть до движения 2 в любом направлении), поэтому выходных нейронов 64 * 8, если бы выход с наибольшей вероятностью был нейрон 8 (или любой другой недопустимый вывод), который будет чем-то вроде B1C2 (B1 - начальная позиция, а C2 - конечная позиция).
Есть ли способ, если выход нейронной сети уже является распределением вероятностей, обновить сеть так, чтобы этот конкретный выход был равен 0, а все остальные выходы были обновлены и нормализованы?
Я пробовал смотреть на примеры нейронных сетей, которые обучаются на наборе данных mnist и adamoptimizer, но не смог найти ничего, что изменяет только один конкретный вывод, а не меняет весь выходной слой.
Спасибо за любую помощь!
В этом конкретном примере вам лучше реструктурировать свою сеть, чтобы включить в нее только те ходы, которые потенциально могут быть действительными. B1C2 никогда не будет правильным ходом, поэтому не позволяйте ему быть частью вашей сети.
Для ходов, которые потенциально могут быть действительными, но на самом деле недействительными, например B2C3 (недействительны для первого хода, но действительны после перемещения фигуры, находящейся в настоящее время на C3), вы можете написать собственную функцию активации, но, вероятно, будет проще просто отрегулируйте вывод.
Вы можете написать функцию для установки каждого недопустимого хода в ноль, а затем вы разделите все остальные ответы на (1 - сумма неверных прогнозов хода). Обратите внимание: это предполагает, что вы уже используете softmax в качестве последней функции активации.
Отредактируйте на основе следующего вопроса ниже:
Вы можете написать одну функцию, которая принимает состояние доски и прогнозы в качестве входных данных и возвращает прогнозы с недопустимыми ходами, установленными на ноль, а остальные прогнозы нормализованы.
Если вместо изменения конечного результата вы предпочитаете, чтобы сеть узнала, какие ходы недопустимы, это может быть обработано вашей функцией потерь. Например, если вы занимаетесь глубоким Q-обучением, вы добавляете к счету большой штраф за неверные ходы.
Разве тогда мне не пришлось бы писать другую функцию, полностью зависящую от состояния платы, чтобы начать с нее? Есть ли способ обратного распространения для конкретного выбранного выхода, поскольку это будет означать, что в других аналогичных ситуациях менее вероятно, что выберет тот же недопустимый ход. (Следовательно, узнав, что недопустимые ходы недействительны)