Я пытаюсь перемещаться по агенту в домене n * n gridworld, используя Q-Learning + нейронную сеть с прямой связью в качестве аппроксиматора q-функции. По сути, агент должен найти лучший/кратчайший путь для достижения определенной конечной цели (награда +10). Каждый шаг, который делает агент, получает -1 награду. В gridworld также есть некоторые позиции, которых агенту следует избегать (награда -10, терминальные состояния тоже).
До сих пор я реализовал алгоритм Q-обучения, который сохраняет все значения Q в Q-таблице, и агент работает хорошо. На следующем шаге я хочу заменить Q-таблицу нейронной сетью, обучаемой онлайн после каждого шага агента. Я попробовал NN с прямой связью с одним скрытым слоем и четырьмя выходами, представляющими значения Q для возможных действий в мире сетки (север, юг, восток, запад). В качестве входных данных я использовал нулевую матрицу nxn, которая имеет «1» в текущих позициях агента.
Чтобы достичь своей цели, я попытался решить проблему с нуля:
Исследуйте грид-мир со стандартным Q-Learning и используйте Q-карту в качестве обучающих данных для сети после завершения Q-Learning --> работает нормально
Используйте Q-Learning и предоставьте обновления Q-карты в качестве обучающих данных для NN (batchSize = 1) --> сработало хорошо
Полностью заменить Q-Map на NN. (Это тот момент, когда становится интересно!)
-> ПЕРВАЯ КАРТА: 4 x 4 Как описано выше, у меня есть 16 «дискретных» входов, 4 выхода, и он отлично работает с 8 нейронами (relu) в скрытом слое (скорость обучения: 0,05). Я использовал жадную политику с эпсилоном, которая уменьшает от 1 до 0,1 в течение 60 эпизодов. Здесь показан тестовый сценарий. Производительность сравнивается между стандартным qlearning с q-map и " нейронное обучение (в данном случае я использовал 8 нейронов и разную скорость отсева).
Подводя итог: нейронное Q-обучение хорошо работает для небольших сетей, а также производительность в порядке и надежна.
-> Большая карта: 10 x 10
Теперь я попробовал использовать нейронную сеть для больших карт. Сначала я попробовал этот простой случай.
В моем случае нейронная сеть выглядит следующим образом: 100 input; 4 выхода; около 30 нейронов(релу) в одном скрытом слое; снова я использовал уменьшающийся коэффициент исследования для жадной политики; более 200 эпизодов скорость обучения снижается с 0,1 до 0,015 для повышения стабильности.
Сначала у меня были проблемы со сходимостью и интерполяцией между отдельными позициями, вызванные дискретным входным вектором. Чтобы решить эту проблему, я добавил к вектору несколько соседних позиций со значениями, зависящими от их расстояния до текущей позиции. Это значительно улучшило обучение, и политика стала лучше. Производительность с 24 нейронами показана на картинке выше.
Резюме: простой случай решается сетью, но только с большим количеством настроек параметров (количество нейронов, коэффициент исследования, скорость обучения) и специальным преобразованием входных данных.
Теперь вот мои вопросы/проблемы, которые я до сих пор не решил:
(1) Моя сеть способна решать действительно простые случаи и примеры на карте 10 x 10, но она терпит неудачу, поскольку проблема становится немного сложнее. В тех случаях, когда сбой весьма вероятен, в сети нет никаких изменений, чтобы найти правильную политику. Я открыт для любой идеи, которая может улучшить производительность в этом случае.
(2) Есть ли более разумный способ преобразования входного вектора для сети? Я уверен, что добавление соседних позиций к входному вектору, с одной стороны, улучшает интерполяцию q-значений по карте, но, с другой стороны, затрудняет обучение специальных/важных позиций в сети. Я уже пробовал стандартный декартовский двумерный ввод (x/y) на ранней стадии, но потерпел неудачу.
(3) Существует ли другой тип сети, кроме сети прямого распространения с обратным распространением, который обычно дает лучшие результаты с аппроксимацией q-функции? Вы видели проекты, в которых FF-nn хорошо работает на больших картах?