#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()
?