Представления назад и вперед могут сбивать с толку, но когда вы имеете дело с чем-то простым, например с игровой программой, на практике все оказывается довольно просто. Я не смотрю на ссылку, которую вы используете, поэтому позвольте мне просто дать общий обзор.
Предположим, у меня есть аппроксиматор функций, такой как нейронная сеть, и что у него есть две функции, train
и predict
, для обучения на конкретном выходе и прогнозирования результата состояния. (Или результат выполнения действия в данном состоянии.)
Предположим, у меня есть след игры от игры, в которой я использовал метод predict
, чтобы сказать мне, какой ход делать в каждой точке, и предположим, что я проигрываю в конце игры (V=0). Предположим, мои состояния s_1, s_2, s_3...s_n.
Подход Монте-Карло говорит, что я обучаю свой аппроксиматор функции (например, мою нейронную сеть) каждому из состояний в трассе, используя трассу и окончательную оценку. Итак, учитывая эту трассировку, вы должны сделать что-то вроде call:
train(s_n, 0)
train(s_n-1, 0)
...
train(s_1, 0)
.
То есть я прошу каждое государство предсказать окончательный результат трассировки.
Подход динамического программирования говорит, что я тренируюсь на основе результата следующего состояния. Таким образом, мое обучение будет чем-то вроде
train(s_n, 0)
train(s_n-1, test(s_n))
...
train(s_1, test(s_2))
.
То есть я прошу аппроксиматор функции предсказать, что предсказывает следующее состояние, тогда как последнее состояние предсказывает окончательный результат трассировки.
Обучение TD смешивается между двумя из них, где λ=1
соответствует первому случаю (Монте-Карло), а λ=0
соответствует второму случаю (динамическое программирование). Предположим, что мы используем λ=0.5
. Тогда наша тренировка будет такой:
train(s_n, 0)
train(s_n-1, 0.5*0 + 0.5*test(s_n))
train(s_n-2, 0.25*0 + 0.25*test(s_n) + 0.5*test(s_n-1)+)
...
Теперь то, что я написал здесь, не совсем правильно, потому что вы на самом деле не проверяете аппроксиматор повторно на каждом шаге. Вместо этого вы просто начинаете со значения прогноза (V = 0
в нашем примере), а затем обновляете его для обучения следующего шага со следующим прогнозируемым значением. V = λ·V + (1-λ)·test(s_i)
.
Это учится намного быстрее, чем методы Монте-Карло и динамического программирования, потому что вы не просите алгоритм изучить такие экстремальные значения. (Игнорирование текущего прогноза или игнорирование конечного результата.)
person
Nathan S.
schedule
23.04.2014