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

Возможно, пришло время взглянуть на более сложные топологии сети. Давайте посмотрим, что делают эксперты, чтобы получить рекомендации: для меня это означает прекрасную запись в блоге Артура Джулиани: Простое обучение с подкреплением с помощью Tensorflow, часть 4: Глубокие Q-сети и не только.

Я рекомендую вам прочитать статью самостоятельно, но вот краткое изложение того, что он там делает, чего мы в настоящее время не делаем:

  • Сверточные слои
  • Опыт Replay
  • Предтренировочные игры
  • Отдельная целевая сеть (сеть Double Q)
  • Дуэль Q Network

Сверточные слои

Сверточные сетевые слои очень эффективны для обработки и анализа визуальных изображений, поскольку они обрабатывают и идентифицируют шаблоны в стеках массивов входных 2D-данных - обычно это разные цветовые полосы 2D-растровых изображений.

Учитывая неотъемлемую 2D-природу доски для крестиков-ноликов, это может очень помочь.

Опыт Replay

Сохраняя предыдущие игры в буфере опыта и повторно используя этот прошлый опыт при обучении сети, мы можем повысить стабильность обучения. Мы избегаем застревания сети в схемах, когда она повторяет одни и те же плохие ходы снова и снова с небольшими изменениями в результатах или обучении. В частности, я надеюсь, что это поможет нам в тех случаях, когда положительный опыт очень редок, например играя вторым против Min Max Player.

Предтренировочные игры

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

Отдельная целевая сеть

По мнению экспертов, использование одной и той же Q-сети для обучения, а также целевой функции Q для вычисления потерь может стать нестабильным и выйти из-под контроля. Разделив цель на независимую вторую сеть, обучение должно стать более стабильным.

Наша текущая топология выглядит так: текущее состояние - s, состояние после перемещения - s ′, вознаграждение за текущий ход - r, а значение скидки для будущих ожидаемых вознаграждений - γ:

После добавления целевой сети это будет выглядеть так:

Время от времени мы обновляем целевую сеть, копируя в нее веса из основной сети.

Дуэль Q Network

В настоящее время сеть будет выдавать абсолютное значение качества для каждого шага. Потенциальное улучшение по сравнению с этим подходом состоит в том, чтобы сопоставить ценность хода со значением текущего состояния доски. Т.е. вместо того, чтобы смотреть на абсолютное значение Q хода, мы спрашиваем, насколько этот ход улучшает или уменьшает значение текущего состояния доски. Или другими словами: насколько лучше или хуже ход по сравнению с другими возможными ходами в этом состоянии. Мы называем это преимуществом шага. Т.е.

Q(s,a)=V(s)+A(a)

где Q (s, a) - значение Q перемещения a в состоянии s, V (s) - значение Q состояния s, а A (a) - преимущество перемещения a.

Сеть Dueling Q будет выглядеть так:

Собираем все вместе

Если мы хотим быть методичными в этом вопросе, мы должны попробовать каждое из этих потенциальных улучшений независимо и посмотреть, действительно ли они улучшают ситуацию и насколько сильно. Потом все комбинации. Ни у кого нет на это времени, поэтому мы добавляем Experience Replay, Pre-training games, отдельную целевую сеть и топологию Dueling Q Network одновременно. Однако мы еще не совсем сверточные слои. Код для этого находится в ExpDoubleDuelQPlayer.

Давайте попробуем это сделать, начнем с простого случая - сначала идем против RandomPlayer, а затем пытаемся удачи против других подозреваемых:

Лучше, чем раньше, но все еще не идеально. Кажется, в итоге я получаю около 80 +/- 15% дро. Не те 100%, которые мы искали.

Обобщить:

Player      |   NN Player 1st       | NN Player 2nd 
==============================================================
Random      | Improved, not perfect | Improved, not perfect
Min Max     | Seems to work         | Seems to work
Rnd Min Max | Seems to work         | Better, but not perfect

В следующей части мы добавим слои сверточной сети и посмотрим, поможет ли это получить последние несколько недостающих процентов.

Остальные части этой серии можно найти здесь:

Исходный код и записные книжки Jupyter для всех частей этой серии доступны на GitHub.