Q-Learning на Python
Предварительные требования: обучение с подкреплением
Вкратце обучение с подкреплением - это парадигма процесса обучения, в которой обучающийся агент со временем учится оптимально вести себя в определенной среде, постоянно взаимодействуя с ней. В процессе обучения агент испытывает различные ситуации в среде, в которой он находится. Они называются состояниями . Агент, находясь в этом состоянии, может выбирать из набора допустимых действий, которые могут принести различные награды (или штрафы). Обучающий агент со временем учится максимизировать эти награды, чтобы вести себя оптимально в любом заданном состоянии.
Q-Learning - это базовая форма обучения с подкреплением, которая использует Q-значения (также называемые значениями действия) для итеративного улучшения поведения обучающего агента.
- Q-значения или Action-Values: Q-значения определены для состояний и действий. оценка того, насколько хорошо предпринимать действия в государстве . Эта оценка будет итеративно вычисляться с использованием правила TD-Update, которое мы увидим в следующих разделах.
- Награды и эпизоды: агент в течение своей жизни начинает с начального состояния, совершает ряд переходов из текущего состояния в следующее состояние в зависимости от своего выбора действия, а также среды, в которой агент взаимодействует. На каждом этапе перехода, агент из состояния выполняет действие, наблюдает за наградой из окружающей среды, а затем переходит в другое состояние. Если в какой-то момент агент попадает в одно из конечных состояний, это означает, что дальнейший переход невозможен. Говорят, что это завершение эпизода.
- Временная разница или TD-обновление:
Правило Temporal Difference или TD-Update может быть представлено следующим образом:
Это правило обновления для оценки значения Q применяется на каждом временном шаге взаимодействия агентов с окружающей средой. Используемые термины поясняются ниже. :
- : Текущее состояние агента.
- : Текущее действие Выбрано в соответствии с некоторой политикой.
- : Следующее состояние, в котором заканчивается агент.
- : Следующее лучшее действие, которое нужно выбрать с использованием текущей оценки Q-значения, т.е. выбрать действие с максимальным Q-значением в следующем состоянии.
- : Текущая награда, наблюдаемая из окружающей среды в ответ на текущее действие.
- (> 0 и <= 1): коэффициент дисконтирования для будущих вознаграждений. Будущие награды менее ценны, чем текущие, поэтому их нужно сбрасывать со счетов. Поскольку Q-значение является оценкой ожидаемого вознаграждения от государства, здесь также применяется правило дисконтирования.
- : Длина шага, используемая для обновления оценки Q (S, A).
- Выбор действия с помощью -жадная политика:
-greedy policy - очень простая политика выбора действий с использованием текущих оценок Q-значения. Это выглядит следующим образом:
- С вероятностью выберите действие, которое имеет наивысшее значение Q.
- С вероятностью выбрать любое действие наугад.
Теперь, когда мы располагаем всей необходимой теорией, давайте рассмотрим пример. Мы будем использовать тренажерный зал OpenAI для обучения нашей модели Q-Learning.
Команда установить
gym
-pip install тренажерный зал
Перед тем, как начать с примера, вам понадобится вспомогательный код, чтобы визуализировать работу алгоритмов. Будет два вспомогательных файла, которые необходимо загрузить в рабочий каталог. Здесь можно найти файлы.
Шаг №1: Импортируйте необходимые библиотеки.
import
gym
import
itertools
import
matplotlib
import
matplotlib.style
import
numpy as np
import
pandas as pd
import
sys
from
collections
import
defaultdict
from
windy_gridworld
import
WindyGridworldEnv
import
plotting
matplotlib.style.use(
'ggplot'
)
Шаг № 2: Создайте среду в спортзале.env
=
WindyGridworldEnv()
Шаг № 3: Сделайте -жирная политика.def
createEpsilonGreedyPolicy(Q, epsilon, num_actions):
"""
Creates an epsilon-greedy policy based
on a given Q-function and epsilon.
Returns a function that takes the state
as an input and returns the probabilities
for each action in the form of a numpy array
of length of the action space(set of possible actions).
"""
def
policyFunction(state):
Action_probabilities
=
np.ones(num_actions,
dtype
=
float
)
*
epsilon
/
num_actions
best_action
=
np.argmax(Q[state])
Action_probabilities[best_action]
+
=
(
1.0
-
epsilon)
return
Action_probabilities
policyFunction
return
Шаг №4: Постройте модель Q-Learning.def
qLearning(env, num_episodes, discount_factor
=
1.0
,
alpha
=
0.6
, epsilon
=
0.1
):
"""
Q-Learning algorithm: Off-policy TD control.
Finds the optimal greedy policy while improving
following an epsilon-greedy policy"""
# Action value function
# A nested dictionary that maps
# state -> (action -> action-value).
Q
=
defaultdict(
lambda
: np.zeros(env.action_space.n))
# Keeps track of useful statistics
stats
=
plotting.EpisodeStats(
episode_lengths
=
np.zeros(num_episodes),
episode_rewards
=
np.zeros(num_episodes))
# Create an epsilon greedy policy function
# appropriately for environment action space
policy
=
createEpsilonGreedyPolicy(Q, epsilon, env.action_space.n)
# For every episode
for
ith_episode
in
range
(num_episodes):
# Reset the environment and pick the first action
state
=
env.reset()
for
t
in
itertools.count():
# get probabilities of all actions from current state
action_probabilities
=
policy(state)
# choose action according to
# the probability distribution
action
=
np.random.choice(np.arange(
len
(action_probabilities)),
p
=
action_probabilities)
# take action and get reward, transit to next state
next_state, reward, done, _
=
env.step(action)
# Update statistics
stats.episode_rewards[ith_episode]
+
=
reward
stats.episode_lengths[ith_episode]
=
t
# TD Update
best_next_action
=
np.argmax(Q[next_state])
td_target
=
reward
+
discount_factor
*
Q[next_state][best_next_action]
td_delta
=
td_target
-
Q[state][action]
Q[state][action]
+
=
alpha
*
td_delta
# done is True if episode terminated
if
done:
break
state
=
next_state
return
Q, stats
Шаг № 5: Обучите модель.Q, stats
=
qLearning(env,
1000
)
Шаг № 6: Постройте важную статистику.plotting.plot_episode_stats(stats)
Заключение:
Мы видим, что на графике «Награда за эпизод с течением времени», что награды за эпизод постепенно увеличиваются со временем и, в конечном итоге, выравниваются до высокого значения награды за эпизод, что указывает на то, что агент научился максимизировать свою общую награду, полученную в эпизоде, ведя себя оптимальным образом в каждом эпизоде. государственный.Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.