Алгоритм SARSA для обучения с подкреплением уменьшает значения с течением времени

#julia #reinforcement-learning

#джулия #подкрепление-обучение

Вопрос:

В настоящее время я пытаюсь реализовать алгоритм SARSA, как описано в Саттон, Барто «Обучение с подкреплением, введение» в сеточном мире с ветреным восходящим потоком. (Я использую ту же среду, что и Саттон, Барто — стр.130.) В принципе, есть 70 полей, и можно перемещаться в четырех направлениях: вверх, вниз, влево или вправо. В некоторых состояниях ветер приведет к смещению движения на один шаг вверх. Награда равна -1 за каждый временной шаг, когда цель не достигнута.

Я внедрил среду, и, похоже, все работает нормально. Однако алгоритм обучения, похоже, не работает. Авторы книги утверждают, что при использовании определенных параметров алгоритм сходится к почти оптимальному решению примерно после 150 изученных эпизодов. Это не относится к моему коду (написанному на Julia v1.1.0)

 g = GridWorld()
α = 0.5
γ = 1
ϵ = 0.1
Q = zeros(70,4)

for episode in 1:100000

isDone = false
S = g.start
A = eps_greedy(Q,ϵ,S)


while !isDone

    (R,isDone) = action(g,A)
    S´ = g.position

    A´ = eps_greedy(Q,ϵ,S´)

    Q[S,A]  = α*(R   γ* Q[S´,A´] - Q[S,A])

    S = S´
    A = A´
end



end
 

Объект g хранит текущее состояние, которое изменяется в соответствии с действием A при вызове действия (g, A). Функция eps_greedy(Q, epsilon, S) просто принимает текущее состояние и выбирает эпсилон-жадное действие из функции значения действия Q.

Проблема в том,: Чем дольше я тренируюсь, тем ниже будут значения действий, сохраненные в Q. Например, при обучении примерно для 2000 эпизодов все значения действия начального состояния одинаковы и составляют примерно -950. Обучение на 20000 даст значения действия около -10000. Я не думаю, что это должно произойти, но я не совсем уверен, что вызывает проблему. Любая помощь будет принята с благодарностью!

Комментарии:

1. Не γ слишком ли вы высоки, вызывая расхождение в Q-значениях? Найдите коэффициент скидки в статье Википедии для SARSA . Алгоритм кажется правильно реализованным, если ваш eps_greedy тоже правильный.

2. @hckr, похоже, это действительно сработало! Я думал, что раньше пробовал более низкие значения, но, по крайней мере, теперь это работает. Возможно, авторы книги, на которую я ссылался, на самом деле тоже использовали другие параметры, хотя они утверждали, что используют gamma = 1 . В любом случае, спасибо!

3. Если они говорят, что недисконтировано, значит, они использовались γ=1 . Вероятно, в вашем коде есть какая-то другая проблема, может быть, в GridWorld() ?