Агент Q-table - это простой агент для обучения с подкреплением. Он использует таблицу значений, которая представляет вероятность получения награды в результате выполнения определенного действия в определенном состоянии игры. Агент обновляет таблицу во время игры - учится делать более эффективные ходы - и использует стол для принятия решения о своем следующем ходе.

Давайте рассмотрим пример использования Letter Noose (также известного как Hangman *). Эта игра дает вам 6 шансов угадать буквы в трехбуквенном слове, которое (предупреждение о спойлере) оказывается котом.

Игровое поле Letter Noose состоит из пустых мест и заполнено буквами, если игрок правильно догадывается. Изначально наше игровое поле выглядит так:

и в итоге выигрышная игровая доска будет выглядеть так:

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

Используя Q-таблицу, мой агент довольно быстро учится писать cat. В этом обучающем наборе он выучил всего 6 эпизодов (эпизод - это полный цикл игры от первого хода до игра окончена) и использует свои знания для последовательного написания кота Правильно в будущих играх.

Как Q-таблица выбирает свой ход

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

В этой игре я решил инициализировать таблицу нулями и использовать такой шумный селектор букв:

np.argmax(QTable[current_state, :] + np.random.randn(1, action_space_n))

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

np.argmax(QTable[current_state, :] + np.random.randn(1, action_space_n) * (1.0 / episode_number))

Кроме того: эта концепция затухания шума похожа на концепцию затухания скорости обучения, в которую вы можете погрузиться здесь.

Как Q-таблица обновляется, чтобы улучшить свой выбор

Алгоритм обновления Q-таблицы немного сложен, учитывая различные параметры, поддерживаемые агентом и игровой средой. Я разбил это здесь:

current_state = c _ _
action = t
state_after_action = c _ t
learning_rate = .8
discount = .95
reward = 1
discounted_next_state_value = discount * np.max(QTable[state_after_action, :])
current_state_value = QTable[current_state, action]
QTable[current_state, action] = current_state_value + learning_rate * (reward + discounted_next_state_value - current_state_value)

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

Я вытащил несколько соответствующих строк Q-таблицы для игрового поля cat, чтобы проиллюстрировать, как таблица обновляется по эпизодам:

К эпизоду 126 таблица уже давно назрела, и агент постоянно произносит слово кот, чтобы каждый раз выигрывать .

Обратите внимание, что при состоянии _ _ _ таблица узнала, что буква q была плохим выбором, и присвоила ей отрицательное значение -0,8. Вместо этого он научился отдавать предпочтение букве a, обновив ее до строгого значения 3,755.

Когда состояние равно _ a _, действие буквы t очень благоприятно с оценкой 2,9. И, наконец, когда состояние равно _ a t, буква c является очевидным выбором со значением 2.0.

Применение Q-таблиц в игровой среде

В OpenAI’s Gym метод step вашей игровой среды должен возвращать наблюдение, награду, выполненное и информацию. Наблюдение, которое мы возвращаем в Letter Noose, - это обновленная доска после того, как пользователь угадывает букву, например: _ a _ .

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

Мой агент Q-table и игровая среда Letter Noose доступны на моем github вместе со вспомогательным классом, который позволяет запускать игру для нескольких эпизодов: https://github.com/sarahedkins/gym-agent-runner.

Если вы запустите python run.py, вы сможете увидеть развитие Q-таблицы более 300 эпизодов (не стесняйтесь экспериментировать с этим числом и другими параметрами в файле агента). Вы даже можете расширить игру, включив в нее больше слов решения, чтобы агент увеличил свой словарный запас. Удачи!

Привет. Я выражаю свою признательность индексу Джо Тота за то, что он познакомил меня с концепциями Q-table, описанными здесь, и тренажерному залу OpenAI через его крестики-нолики. игровая среда. ❤️