Создаю нейронную сеть. Обучение с подкреплением. Reinforcement learning.
![630d562e129d2377241941.png](https://habrastorage.org/webt/63/0d/56/630d562e129d2377241941.png)
Агент двигается по полю 10х10. Его задача - собрать как можно больше куриных ножек.
Изначально пробовал генетический алгоритм, он показал максимальный результат = 10 шт (на доске всего 20).
Сейчас решил попробовать метод наград и штрафов. Но возникла проблема с кодом.
Награды: за попадание на клетку с куриной ножкой, за каждый ход (чтобы дольше оставался в игре)
Штрафы: выход за границы, шаги туда-сюда, превышение максимального кол-ва ходов
Модель системы - 63 входа (состояние среды) - 23 нейрона в скрытом слое - 4 нейрона на выходе ( [0,0,0,1] - где содержатся вероятности хода наверх, вниз, вправо, влево )
Заполнил сеть рандомными весами. Нейросеть предсказывает каждый ход боту.
![2egebqgdxjutx0tzxvwawunwffq.png](https://habrastorage.org/r/w1560/webt/2e/ge/bq/2egebqgdxjutx0tzxvwawunwffq.png)
Использую tensorflow js. Хочу чтобы на каждом новом шагу веса корректировались в зависимости от наград и штрафов. Чтобы за границы не выходил, а понимал, что нужно исследовать окружение.
Если бот сходил вправо и вышел за границы игрового поля - начисляю ему штраф, это должно быть плохим примером для нейронной сети. Далее беру выходной нейрон, который показывал наибольшую вероятность (ход вправо) и каким-то образом делаю обратное распространение...уменьшаю веса градиентом по всей цепочке от
этого одного выходного нейрона до входных данных.
Кто-нибудь знает как это выглядит в коде tensorflow?
В итоге хочется получить что-то по типу
tf.model.namefunction( нейрон выходного слоя, x )
где x - значение на которое сделать обратное распространение. За штраф скажем -0.01, за награду 0.004