TD (λ) в Delphi / Pascal (обучение с разницей во времени) - PullRequest
4 голосов
/ 30 января 2011

У меня есть искусственная нейронная сеть, которая играет Tic-Tac-Toe - но она еще не завершена.


Что у меня еще есть:

  • массив вознаграждений «R [t]» с целочисленными значениями для каждого временного шага или ходом «t» (1 = игрок A выигрывает, 0 = ничья, -1 = игрок B выигрывает)
  • Входные значенияправильно распространяются по сети.
  • формула для настройки весов:

enter image description here


Чего не хватает:

  • обучение TD: мне все еще нужна процедура, которая "распространяет" ошибки сети, используя алгоритм TD (λ).

Но я не совсем понимаюэтот алгоритм.


Мой подход до сих пор ...

Параметр затухания следа λ должен быть «0,1», так как дистальные состояния не должны получать так многонаграда.

Скорость обучения составляет «0,5» в обоих слоях (входной и скрытый).

Это случай задержки вознаграждения: награда остается «0» до тех пор, покамне заканчивается.Тогда вознаграждение становится «1» за победу первого игрока, «-1» за победу второго игрока или «0» в случае ничьей.


Мои вопросы:

  • Как и когда вы вычисляете ошибку сети (ошибка TD)?
  • Как реализовать "обратное распространение" ошибки?
  • Каквеса корректируются с использованием TD (λ)?

Заранее большое спасибо:)

Ответы [ 3 ]

2 голосов
/ 31 января 2011

Если вы серьезно относитесь к созданию этой работы, то понимание TD-лямбды было бы очень полезно. Книга Саттона и Барто "Обучение усилению" доступна бесплатно в формате HTML и подробно описывает этот алгоритм. По сути, TD-лямбда создает отображение между состоянием игры и ожидаемой наградой в конце игры. По ходу игры государства, которые с большей вероятностью приводят к выигрышным состояниям, как правило, получают более высокие ожидаемые значения вознаграждения.

Для такой простой игры, как крестики-нолики, лучше начинать с табличного отображения (просто отслеживать ожидаемое значение вознаграждения для каждого возможного игрового состояния). Затем, когда у вас все получится, вы можете вместо этого попробовать использовать NN для отображения. Но я бы предложил сначала попробовать отдельный, более простой проект NN ...

0 голосов
/ 09 февраля 2011

Насколько я помню, вы проводите обучение с известным набором результатов - поэтому вы вычисляете выходной сигнал для известного входного значения и вычитаете из этого известное выходное значение - это ошибка.

Затем вы используете ошибку, чтобы исправить сеть - для одного слоя NN, настроенного с помощью правила дельты, я знаю, что эпсилон 0,5 слишком высок - что-то вроде 0,1 лучше - медленнее, но лучше.С обратным распространением это немного более продвинуто - но, насколько я помню, описание математического уравнения для NN сложное и трудное для понимания - это не так сложно.

взгляните на http://www.codeproject.com/KB/recipes/BP.aspx

или Google для "обратного распространения c" - это, вероятно, легче понять в коде.

0 голосов
/ 31 января 2011

Меня это тоже смущало, но я считаю, что так оно и работает:

Начиная с конечного узла, вы проверяете R, (вывод получен) и E, (ожидаем выход).Если E = R, это нормально, и у вас нет никаких изменений.

Если E! = R, вы видите, как далеко он был, на основе порогов и тому подобного, а затем сдвигаете вес или порог вверхили немного вниз.Затем, основываясь на новых весах, вы возвращаетесь назад и угадываете, было ли оно слишком высоким или слишком низким, и повторяете, с более слабым эффектом.

Я никогда не пробовал этот алгоритм,но это в основном версия идеи, насколько я понимаю.

...