Есть ли способ специально оптимизировать отдельный вывод нейронной сети в тензорном потоке?

Например, если бы у меня была нейронная сеть, которая играла в шашки / шашки и пыталась сделать неверный ход, есть ли способ специально оптимизировать этот конкретный результат?

  ---------------------------------------
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, но не смог найти ничего, что изменяет только один конкретный вывод, а не меняет весь выходной слой.

Спасибо за любую помощь!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
55
1

Ответы 1

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

Для ходов, которые потенциально могут быть действительными, но на самом деле недействительными, например B2C3 (недействительны для первого хода, но действительны после перемещения фигуры, находящейся в настоящее время на C3), вы можете написать собственную функцию активации, но, вероятно, будет проще просто отрегулируйте вывод.

Вы можете написать функцию для установки каждого недопустимого хода в ноль, а затем вы разделите все остальные ответы на (1 - сумма неверных прогнозов хода). Обратите внимание: это предполагает, что вы уже используете softmax в качестве последней функции активации.

Отредактируйте на основе следующего вопроса ниже:

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

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

Разве тогда мне не пришлось бы писать другую функцию, полностью зависящую от состояния платы, чтобы начать с нее? Есть ли способ обратного распространения для конкретного выбранного выхода, поскольку это будет означать, что в других аналогичных ситуациях менее вероятно, что выберет тот же недопустимый ход. (Следовательно, узнав, что недопустимые ходы недействительны)

Kian Kordtomeikel 18.12.2018 21:44

Другие вопросы по теме