В этой статье речь пойдет о обучении с подкреплением. Этот метод отличается от многих других методов машинного обучения, которые у нас есть, и имеет множество применений в обучающих агентах (ИИ) для взаимодействия с такими средами, как игры. Вместо того, чтобы кормить нашу модель машинного обучения миллионами примеров, мы позволяем нашей модели предлагать собственные примеры, исследуя окружающую среду.
Идея проста. Люди учатся, исследуя ошибки и прошлый опыт и извлекая уроки из них, так что пусть наш компьютер сделает то же самое.
Терминология
Прежде чем мы углубимся в объяснение обучения с подкреплением, нам нужно определить несколько ключевых терминов.
Среда. В задачах обучения с подкреплением мы имеем представление об окружающей среде. Это то, что будет изучать наш агент. В качестве примера среды в случае обучения ИИ игре скажем, что игра в Марио будет уровнем, на котором мы обучаем агента.
Агент агент - это объект, который исследует окружающую среду. Наш агент будет взаимодействовать и предпринимать различные действия в среде. В нашем примере с марио персонажем марио в игре будет наш агент.
Состояние всегда наш агент будет в том, что мы называем состоянием. Состояние просто сообщает нам о статусе агента. Наиболее распространенный пример состояния - расположение агента в среде. Перемещение мест изменило бы состояние агентов.
Действие: любое взаимодействие между агентом и средой будет считаться действием. Например, движение влево или прыжок будет действием. Действие может изменить или не изменить текущее состояние агента. Фактически, бездействие - это тоже действие! Действие, скажем, не нажатие клавиши, если мы используем наш пример Марио.
Вознаграждайте. Каждое действие, предпринимаемое нашим агентом, приведет к вознаграждению некоторой величины (положительному или отрицательному). Целью нашего агента будет максимальное вознаграждение в среде. Иногда награда будет ясной, например, если агент выполняет действие, увеличивающее его счет в окружающей среде, мы можем сказать, что он получил положительное вознаграждение. Если агент совершит действие, в результате которого он потеряет счет или, возможно, погибнет в окружающей среде, он получит отрицательное вознаграждение.
Самая важная часть обучения с подкреплением - это определение того, как вознаградить агента. В конце концов, цель агента - получить максимальное вознаграждение. Это означает, что мы должны вознаградить агента соответствующим образом, чтобы он достиг желаемой цели.
Q-Learning
Теперь, когда у нас есть смутное представление о том, как работает обучение с подкреплением, пора поговорить об особом методе обучения с подкреплением, который называется Q-Learning.
Q-Learning - это простой, но довольно мощный метод машинного обучения, который включает изучение матрицы значений «действие-вознаграждение». Эту матрицу часто называют Q-таблицей или Q-матрицей. Матрица имеет форму (количество возможных состояний, количество возможных действий), где каждое значение в матрице [n, m] представляет ожидаемое вознаграждение агентов, учитывая, что они находятся в состоянии n и предпринимают действие m. Алгоритм Q-обучения определяет способ обновления значений в матрице и решает, какое действие предпринимать в каждом состоянии. Идея состоит в том, что после успешного обучения / изучения этой Q-таблицы / матрицы мы можем определить действие, которое агент должен предпринять в любом состоянии, посмотрев на эту строку состояний в матрице и взяв максимальное значение. столбец как действие.
Рассмотрим этот пример.
Скажем, A1-A4 - возможные действия, и у нас есть 3 состояния, представленные каждой строкой (состояние 1 - состояние 3).
A1 A2 A3 A4 0 0 10 5 5 10 0 0 10 5 0 0
Если бы это была наша Q-таблица / матрица, то следующие действия были бы предпочтительными в каждом состоянии.
Состояние 1: A3
Состояние 2: A2
Состояние 3: A1
Мы видим, что это связано с тем, что значения в каждом из этих столбцов являются самыми высокими для этих состояний!
Изучение Q-таблицы
Так это просто, правда? Теперь, как нам создать эту таблицу и найти эти значения. Здесь мы обсудим, как алгоритм Q-Learning обновляет значения в нашей Q-таблице.
Начну с того, что наша Q-таблица начинается со всех 0 значений. Это потому, что агент еще ничего не узнал об окружающей среде.
Наш агент учится, исследуя окружающую среду и наблюдая за результатом / наградой за каждое действие, которое он предпринимает в каждом состоянии. Но как узнать, какие действия нужно предпринять в каждом состоянии? Наш агент может решить, какое действие предпринять двумя способами.
- Случайный выбор допустимого действия
- Использование текущей Q-таблицы для поиска наилучшего действия.
Ближе к началу обучения наши агенты будут совершать случайные действия, чтобы исследовать окружающую среду и входить во множество различных состояний. По мере того, как он начинает больше изучать окружающую среду, он начинает постепенно больше полагаться на усвоенные ценности (Q-таблица) для принятия мер. Это означает, что по мере того, как наш агент все больше исследует окружающую среду, он будет лучше понимать и чаще предпринимать «правильные» или более эффективные действия. Важно, чтобы агент имел хороший баланс между выполнением случайных действий и использованием изученных значений, чтобы гарантировать, что он действительно попадает в локальный максимум.
После каждого нового действия наш агент будет записывать новое состояние (если есть), в которое он вошел, и награду, которую он получил за выполнение этого действия. Эти значения будут использоваться для обновления Q-таблицы. Агент перестанет предпринимать новые действия только после того, как будет достигнут определенный временной лимит, или он достигнет цели, или достигнет конца среды.
Обновление Q-значений
Формула обновления Q-таблицы после каждого действия следующая:
- α означает скорость обучения
- γ означает коэффициент скидки.
Скорость обучения α
Скорость обучения α - это числовая константа, которая определяет, сколько изменений разрешено при каждом обновлении QTable. Высокая скорость обучения означает, что каждое обновление будет вносить большие изменения в текущее значение состояния-действия. Небольшая скорость обучения означает, что в каждом обновлении есть более тонкие изменения. Изменение скорости обучения изменит то, как агент исследует среду и насколько быстро он определяет окончательные значения в QTable.
Коэффициент дисконтирования γ
Коэффициент дисконтирования, также известный как гамма (γ), используется для балансировки того, сколько внимания уделяется текущему и будущему вознаграждению. Высокий коэффициент дисконтирования означает, что будущие вознаграждения будут рассматриваться более серьезно.
Чтобы выполнить обновления в этой таблице, мы позволим агенту исследовать среду в течение определенного периода времени и использовать каждое из своих действий для выполнения обновления. Постепенно мы должны начать замечать, что агент учится и выбирает лучшие действия.
Пример Q-Learning
В этом примере мы будем использовать алгоритм Q-Learning для обучения агента навигации в популярной среде из Open AI Gym. Open AI Gym был разработан, чтобы программисты могли практиковать машинное обучение в уникальных средах. Интересный факт, Илон Маск - один из основателей OpenAI!
Давайте начнем с того, что такое Open AI Gym.
import gym # all you have to do to import and use open ai gym!
После импорта тренажерного зала вы можете загрузить среду, используя строку
gym.make("
environment")
. env = gym.make(‘FrozenLake-v0’) # we are going to use the FrozenLake enviornment
Есть еще несколько команд, которые можно использовать для взаимодействия и получения информации о среде.
print(env.observation_space.n) # get number of states print(env.action_space.n) # get number of actions env.reset() # reset enviornment to default state action = env.action_space.sample() # get a random action new_state, reward, done, info = env.step(action) # take action, notice it returns information about the action env.render() # render the GUI for the environment
Окружающая среда замороженного озера
Теперь, когда у нас есть базовое представление о том, как работает тренажерный зал, пора обсудить конкретную проблему, которую мы будем решать.
Среда, которую мы загрузили выше FrozenLake-v0
, является одной из самых простых сред в Open AI Gym. Цель агента - пройти по замерзшему озеру и найти цель, не проваливаясь сквозь лед (визуализируйте окружающую среду выше, чтобы увидеть пример).
Есть:
- 16 состояний (по одному на каждый квадрат)
- 4 возможных действия (ВЛЕВО, ВПРАВО, ВНИЗ, ВВЕРХ)
- 4 различных типа блоков (F: замороженный, H: лунка, S: начало, G: цель)
Создание Q-таблицы
Первое, что нам нужно сделать, это создать пустую Q-таблицу, которую мы можем использовать для хранения и обновления наших значений.
import gym import numpy as np import time env = gym.make(‘FrozenLake-v0’) STATES = env.observation_space.n ACTIONS = env.action_space.n Q = np.zeros((STATES, ACTIONS)) # create a matrix with all 0 values Q
Константы
Как мы уже обсуждали, нам нужно определить некоторые константы, которые будут использоваться для обновления нашей Q-таблицы и сообщить нашему агенту, когда следует прекратить обучение.
EPISODES = 2000 # how many times to run the environment from the beginning MAX_STEPS = 100 # max number of steps allowed for each run of enviornment LEARNING_RATE = 0.81 # learning rate GAMMA = 0.96
Выбор действия
Помните, что мы можем выбрать действие одним из двух способов:
- Случайный выбор допустимого действия
- Использование текущей Q-таблицы для поиска наилучшего действия.
Здесь мы определим новое значение ϵ, которое скажет нам вероятность выбора случайного действия. Это значение будет вначале очень высоким и постепенно уменьшаться по мере того, как агент узнает больше об окружающей среде.
epsilon = 0.9 # start with a 90% chance of picking a random action
код для выбора действия
if np.random.uniform(0, 1) < epsilon: # we will check if a randomly selected value is less than epsilon. action = env.action_space.sample() # take random action else: action = np.argmax(Q[state, :]) # use Q table to pick best action based on current values
Обновление значений Q
Приведенный ниже код реализует формулу, описанную выше.
Q[state, action] = Q[state, action] + LEARNING_RATE * (reward + GAMMA * np.max(Q[new_state, :]) — Q[state, action])
Собираем все вместе
Теперь, когда мы знаем, как делать некоторые базовые вещи, мы можем объединить их вместе, чтобы создать наш алгоритм Q-Learning,
import gym import numpy as np import time env = gym.make(‘FrozenLake-v0’) STATES = env.observation_space.n ACTIONS = env.action_space.n Q = np.zeros((STATES, ACTIONS)) EPISODES = 1500 # how many times to run the enviornment from the beginning MAX_STEPS = 100 # max number of steps allowed for each run of enviornment LEARNING_RATE = 0.81 # learning rate GAMMA = 0.96 RENDER = False # if you want to see training set to true epsilon = 0.9 [ ] rewards = [] for episode in range(EPISODES): state = env.reset() for _ in range(MAX_STEPS): if RENDER: env.render() if np.random.uniform(0, 1) < epsilon: action = env.action_space.sample() else: action = np.argmax(Q[state, :]) next_state, reward, done, _ = env.step(action) Q[state, action] = Q[state, action] + LEARNING_RATE * (reward + GAMMA * np.max(Q[next_state, :]) — Q[state, action]) state = next_state if done: rewards.append(reward) epsilon -= 0.001 break # reached goal print(Q) print(f”Average reward: {sum(rewards)/len(rewards)}:”) # and now we can see our Q values! [ ] # we can plot the training progress and see how the agent improved import matplotlib.pyplot as plt def get_average(values): return sum(values)/len(values) avg_rewards = [] for i in range(0, len(rewards), 100): avg_rewards.append(get_average(rewards[i:i+100])) plt.plot(avg_rewards) plt.ylabel(‘average reward’) plt.xlabel(‘episodes (100\’s)’) plt.show()
ну, мы можем сделать больше, чем это, например, реализовать Ai в некоторых классических играх, таких как flappy bird, mario и других, но это слишком много для блога, но если вам интересно, вы можете проверить репозиторий github, чтобы поиграть с кодом
Источники
- Openai. Openai / Gym. GitHub, https://github.com/openai/gym/wiki/FrozenLake-v0.