DQN - Q-Loss не сходится

Я использую алгоритм DQN для обучения агента в своей среде, который выглядит следующим образом:

  • Агент управляет автомобилем, выбирая дискретные действия (влево, вправо, вверх, вниз).
  • Цель - проехать с желаемой скоростью, не врезаясь в другие машины.
  • Состояние содержит скорость и положение машины агента и окружающих машин.
  • Награды: -100 за столкновение с другими автомобилями, положительная награда в зависимости от абсолютной разницы с желаемой скоростью (+50 при движении с желаемой скоростью).

Я уже настроил некоторые гиперпараметры (сетевая архитектура, исследование, скорость обучения), которые дали мне некоторые результаты спуска, но все еще не так хороши, как должны / могли бы быть. Награды за эпизод увеличиваются во время тренировки. Q-значения также сходятся (см. Рисунок 1). Однако для всех различных настроек гиперпараметра Q-потери не сходятся (см. Рисунок 2 ). Я предполагаю, что отсутствие сходимости Q-потерь может быть ограничивающим фактором для лучших результатов.

Q-значение одного дискретного действия для тренировки

Q-потеря во время тренировки

Я использую целевую сеть, которая обновляется каждые 20 тысяч временных шагов. Q-потери рассчитываются как MSE.

У вас есть идеи, почему Q-потеря не сходится? Должна ли Q-Loss сходиться для алгоритма DQN? Мне интересно, почему Q-потеря не обсуждается в большинстве статей.


person user8861893    schedule 31.10.2017    source источник


Ответы (2)


Да, убыток должен покрывать, потому что значение убытка означает разницу между ожидаемым значением Q и текущим значением Q. Только когда значение потерь сходится, ток приближается к оптимальному значению Q. Если он расходится, это означает, что ваше приближенное значение становится все менее и менее точным.

Возможно, вы можете попробовать настроить частоту обновления целевой сети или проверить градиент каждого обновления (добавить отсечение градиента). Добавление целевой сети увеличивает стабильность Q-обучения.

В статье Deepmind Nature 2015 года говорится, что:

Вторая модификация онлайн-Q-обучения, направленная на дальнейшее повышение стабильности нашего метода с нейронными сетями, заключается в использовании отдельной сети для генерации трагеты yj в обновлении Q-обучения. Точнее, при каждом обновлении C мы клонируем сеть Q для получения целевой сети Q 'и используем Q' для генерации целей Q-обучения y j для следующих обновлений C для Q. Эта модификация делает алгоритм более стабилен по сравнению со стандартным интерактивным Q-обучением, где обновление, которое увеличивает Q (s t, a t), часто также увеличивает Q (s t + 1 , a) для всех a и, следовательно, также увеличивает целевой y j, что может привести к колебаниям или расхождению в политике. Генерация целей с использованием старого набора параметров добавляет задержку между моментом обновления Q и моментом, когда обновление влияет на цели y j, делая расхождение или колебания гораздо более маловероятными.

Контроль на уровне человека посредством глубокого обучения с подкреплением, Mnih et al., 2015

Я провел эксперимент для другого человека, который задавал аналогичные вопросы в среде Cartpole, и частота обновления 100 решает проблему (достигается максимум 200 шагов).

Когда C (частота обновления) = 2, график средней потери:  C = 2

C = 10

C = 10

C = 100

введите описание изображения здесь

C = 1000

введите описание изображения здесь

C = 10000

введите описание изображения здесь

Если расхождение значений потерь вызвано разнесением градиента, вы можете обрезать градиент. В DQN Deepmind 2015 автор обрезал градиент, ограничив значение в пределах [-1, 1]. В другом случае автор Prioritized Experience Replay обрезает градиент, ограничивая норму в пределах 10. Здесь вот примеры:

Отсечение градиента DQN:

    optimizer.zero_grad()
    loss.backward()
    for param in model.parameters():
        param.grad.data.clamp_(-1, 1)
    optimizer.step()

PER градиентное отсечение:

    optimizer.zero_grad()
    loss.backward()
    if self.grad_norm_clipping:
       torch.nn.utils.clip_grad.clip_grad_norm_(self.model.parameters(), 10)
   optimizer.step()
person Alexander    schedule 07.11.2019
comment
Каковы оси x и y на этих графиках? Это эпизоды или средняя потеря всего опыта в памяти / буфере воспроизведения? - person user76284; 28.01.2020
comment
Да, как ты сказал. X - это эпизоды, а y - средний убыток для модели. - person Alexander; 01.04.2020

Я думаю, это нормально, что Q-потери не сходятся, поскольку ваши данные постоянно меняются при обновлении политики. Это не то же самое, что обучение с учителем, когда ваши данные никогда не меняются, и вы можете выполнить несколько проходов по своим данным, чтобы убедиться, что ваши веса хорошо соответствуют этим данным.

Другое дело, что я обнаружил, что небольшое обновление целевой сети на каждом временном шаге (мягкое обновление) сработало для меня лучше, чем обновление его на каждом временном шаге X (жесткое обновление).

person Raphael Royer-Rivard    schedule 05.09.2018
comment
Когда DQN исследует случайный выбор переходов из памяти воспроизведения, и по мере того, как он «исследует» пространство действий, и с уменьшением эпсилона, не должно быть фаз увеличения потерь по мере того, как DQN перемещается в «неизученную» часть пространства действий, и фазы потери уменьшаются по мере того, как он узнает больше, исследует больше пространства действий и эпсилон- ›0. В конечном итоге, когда пространство действий полностью изучено, все потери должны уменьшиться до 0. - person MarkD; 26.12.2020