Базовый градиентный поток актор-критик TD0 противоречит логике
Краткое содержание
Изучаю методы градиента политики и решил закодировать простейший алгоритм управления задачей CartPole. Это классический одношаговый метод Actor-Critic c обновлением TD(0), без базового уровня (baseline) и полностью использующий бутстрэпинг. Алгоритм описан в книге Саттон и Барто на странице 332. Использую две отдельные сети: одну — для актёра, вторую — для критика, чтобы разобраться, как контролировать потоки градиентов через функции `torch.no_grad()` и `.detach()`. Такая конфигурация требует вызова сети-критика дважды: один раз для получения значений текущего состояния (`values`), второй раз — для следующего состояния (`states_next`) с целью выполнения бутстрэпа. Логика, исследования и советы от ChatGPT подсказывают, что вычисление значения `values_next` должно быть отключено от графа градиентов, чтобы при обратном распространении ошибки поток градиента шёл обратно только через `values`, минуя `values_and_values_next`. Проблема заключается в следующем: если я отсоединяю `values_next` от графа градиента, алгоритм вообще ничего не учится, однако если оставить его подключённым, обучение происходит! Сравнил этот подход с кодом, найденным в интернете...
Полный текст статьи пока не загружен.