Понимание Q-Learning в действии и на примере
Добро пожаловать в мою серию статей об обучении с подкреплением! Теперь, когда мы рассмотрели строительные блоки, пришло время обсудить TD (λ) и Q-обучение.
В этом посте я воспользуюсь простым примером, который поможет вам понять Q-обучение и ответит на следующие вопросы:
- Что такое TD (λ) и как он используется?
- Как работает классический внеполитический метод Q-Learning?
- Как выглядит реализация Q-обучения в Python?
Если вы новичок в этой серии, обязательно сначала ознакомьтесь со следующими публикациями:
Часть 1: Краткое введение в RL
Часть 2: Знакомство с марковским процессом
Часть 3: Марковский процесс принятия решений (MDP)
Часть 4: Поиск оптимальной политики с MDP
Часть 5: Монте-Карло и изучение временной разницы
Приступим к Q-обучению!
Обучение временной разнице: TD (λ)
В моем последнем посте мы упоминали, что если мы заменим Gt в формуле, обновленной MC, предполагаемой доходностью Rt + 1 + V (St + 1 ), мы можем получить TD (0):
Где:
- Rt + 1 + V (St + 1) называется целевым значением TD.
- Rt + 1 + V (St + 1) - V (St) называется ошибкой TD.
Теперь мы заменяем целевое значение TD на Gt (), мы можем получить TD (λ). Gt () создается следующим образом:
Итак, формула TD (λ):
В котором:
Как уже говорилось, Q-обучение представляет собой комбинацию обучения по методу Монте-Карло (MC) и временной разнице (TD). Теперь, когда у нас за плечами MC и TD (0), описанные в Части 5 и TD (λ), мы, наконец, готовы вытащить большие пушки!
Q-Learning
Формула Q-Value:
Из вышесказанного мы видим, что Q-обучение напрямую происходит от TD (0). Для каждого обновленного шага Q-Learning использует жадный метод: maxaQ (St + 1, a).
В этом основное отличие Q-обучения от другого метода, основанного на TD, под названием Sarsa, который я не буду объяснять в этой серии. Но как изучающий RL вы должны знать, что Q-обучение - не единственный метод, основанный на TD.
Пример того, как работает Q-Learning
Попробуем лучше понять это на примере:
Вы ужинаете с друзьями в итальянском ресторане, и, поскольку вы бывали здесь один или два раза раньше, они хотят, чтобы вы сделали заказ. По опыту вы знаете, что пицца Маргарита и паста Болоньезе восхитительны. Итак, если вам нужно заказать десять блюд, опыт может подсказать вам, что нужно заказывать по пять из каждого. Но как насчет всего остального в меню?
В этом сценарии вы похожи на нашего «агента», которому поручено найти лучшую комбинацию из десяти блюд. Представьте, что это становится еженедельным ужином; вы, вероятно, начнете приносить с собой блокнот, чтобы записывать информацию о каждом блюде. В Q-обучении агент собирает Q-значения в Q-таблицу. Для меню ресторана эти значения можно рассматривать как оценку для каждого блюда.
А теперь допустим, что ваша вечеринка возвращается в ресторан в третий раз. Теперь у вас в записной книжке немного информации, но вы, конечно же, еще не изучили все меню. Как вы решаете, сколько блюд заказать из своих заметок - какие, как вы знаете, хороши, и сколько новых попробовать?
Здесь в игру вступает ε-жадность.
Политика ε-жадных исследований
В приведенном выше примере то, что произошло в ресторане, похоже на наш MDP (Марковский процесс принятия решений), и вы, как наш агент, сможете найти лучшую комбинацию блюд для своей вечеринки, только если вы изучите ее достаточно тщательно.
Так и с Q-Learning: он может работать, только если агент достаточно тщательно исследует MDP. Конечно, это займет очень много времени. Представляете, сколько раз вам придется возвращаться в ресторан, чтобы попробовать каждое блюдо из меню в каждой комбинации?
Вот почему Q-Learning использует ε-жадную политику, которая является «жадной» по ε степени для самых высоких значений Q и 1 - ε степенью «жадной» для случайного исследования. .
На начальных этапах обучения агента случайная среда исследования (т. Е. Пробование новых вещей в меню) часто лучше, чем режим фиксированного поведения (т. Е. Упорядочивание того, что вы уже знаете, это хорошо), потому что это когда агент накапливает опыт и заполняет вверх по Q-таблице.
Таким образом, обычно начинают с большого значения ε, например 1,0. Это означает, что агент будет тратить 100% своего времени на изучение (например, с использованием случайной политики) вместо обращения к Q-таблице.
Отсюда значение ε можно постепенно уменьшать, делая агента более жадным для значений Q. Например, если мы снизим ε до 0,9, это означает, что агент будет тратить 90% своего времени на выбор лучшей стратегии на основе Q-таблицы и 10% своего времени на изучение неизвестного.
Преимущество ε -жадной политики по сравнению с полностью жадной в том, что она всегда проверяет неизвестные области MDP. Даже когда целевая политика кажется оптимальной, алгоритм никогда не перестает исследовать: он просто становится все лучше и лучше.
Существуют различные функции для исследования, и многие определенные политики исследования можно найти в Интернете. Обратите внимание, что не все политики исследования должны работать как для дискретных, так и для непрерывных пространств действий.
Реализация Q-Learning на Python
Вот как можно реализовать Q-обучение:
import numpy as np # Q q = np.matrix(np.zeros([6, 6])) # Reward r = np.matrix([[-1, -1, -1, -1, 0, -1], [-1, -1, -1, 0, -1, 100], [-1, -1, -1, 0, -1, -1], [-1, 0, 0, -1, 0, -1], [ 0, -1, -1, 0, -1, 100], [-1, 0, -1, -1, 0, 100]]) gamma = 0.8 epsilon = 0.4 # the main training loop for episode in range(101): # random initial state state = np.random.randint(0, 6) # if not final state while (state != 5): # choose a possible action # Even in random case, we cannot choose actions whose r[state, action] = -1. possible_actions = [] possible_q = [] for action in range(6): if r[state, action] >= 0: possible_actions.append(action) possible_q.append(q[state, action]) # Step next state, here we use epsilon-greedy algorithm. action = -1 if np.random.random() < epsilon: # choose random action action = possible_actions[np.random.randint(0, len(possible_actions))] else: # greedy action = possible_actions[np.argmax(possible_q)] # Update Q value q[state, action] = r[state, action] + gamma * q[action].max() # Go to the next state state = action # Display training progress if episode % 10 == 0: print("------------------------------------------------") print("Training episode: %d" % episode) print(q)
При достаточном количестве итераций этот алгоритм сходится к оптимальным значениям Q. Это называется внеполитическим алгоритмом, поскольку обучаемая политика не является той, которая выполняется.
Примечание. Приведенный выше код взят из https://blog.csdn.net/zjm750617105/article/details/80295267
В итоге
Q-Learning - это алгоритм вне политики, основанный на методе TD. Со временем он создает Q-таблицу, которая используется для выработки оптимальной политики. Чтобы изучить эту политику, агент должен изучить. Обычный способ сделать это - заставить агента следовать другой случайной политике, которая изначально игнорирует Q-таблицу при выборе действий.
На сегодня все. Ты сделал это! Этой статьей мы завершили обсуждение TD, и я надеюсь, что вы получили базовые знания о:
- Обучение временной разнице: целевое значение TD, ошибка TD и TD (y)
- Реализация Q-обучения на Python
- Политика исследования Q-Learning с помощью ε-greedy
TD и Q-обучение очень важны в RL, потому что на их основе происходит множество оптимизированных методов. Есть Double Q-Learning, Deep Q-Learning и так далее.
Кроме того, есть и другие методы, совершенно отличные от TD и Q-обучения, которые мы еще не затрагивали в этой серии, например Policy Gradient (PG).
Я расскажу о многих из этих методов в следующих статьях. Если есть что-то, чему вы особенно хотите научиться, не стесняйтесь оставлять мне сообщение в комментариях. Я определю порядок приоритета в соответствии с вашими потребностями.
Спасибо за внимание! Если вам понравилась эта статья, пожалуйста, нажмите кнопку хлопка столько раз, сколько сможете. Это будет много значить и побудит меня продолжать делиться своими знаниями.
Вопросы или мысли добавить? Буду рад услышать от вас в комментариях!
Подпишитесь на меня, чтобы увидеть мою следующую запись.