Нейронная сеть и обучение разнице во времени
У меня есть несколько статей и лекций по изучению временных разностей (некоторые из них относятся к нейронным сетям, таким как учебник Саттона по TD-Gammon), но мне трудно понять уравнения, что приводит меня к моим вопросам.
-Откуда берется прогнозное значение V_t? И впоследствии, как мы получаем V_ (t + 1)?
-Что именно распространяется обратно, когда TD используется с нейронной сетью? То есть откуда берется ошибка, которая распространяется обратно при использовании TD?
1 ответ
Взгляды назад и вперед могут сбивать с толку, но когда вы имеете дело с чем-то простым, например, игровой программой, на практике все довольно просто. Я не смотрю на ссылку, которую вы используете, поэтому позвольте мне дать общий обзор.
Предположим, у меня есть аппроксиматор функции, такой как нейронная сеть, и что он имеет две функции, train
а также predict
для обучения на конкретном выходе и прогнозирования результатов состояния. (Или результат действия в данном состоянии.)
Предположим, у меня есть след игры от игры, где я использовал predict
метод, чтобы сказать мне, что делать в каждой точке и предположить, что я проигрываю в конце игры (V=0). Предположим, мои состояния: s_1, s_2, s_3...s_n.
Подход Монте-Карло говорит, что я тренирую свой аппроксиматор функций (например, мою нейронную сеть) в каждом из состояний в трассе, используя трассировку и итоговую оценку. Итак, учитывая этот след, вы бы сделали что-то вроде вызова:
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)
,
Это учится намного быстрее, чем методы Монте-Карло и динамического программирования, потому что вы не просите алгоритм изучить такие экстремальные значения. (Игнорирование текущего прогноза или игнорирование окончательного результата.)