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

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

Терминология

Прежде чем мы углубимся в объяснение обучения с подкреплением, нам нужно определить несколько ключевых терминов.

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

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

Состояние всегда наш агент будет в том, что мы называем состоянием. Состояние просто сообщает нам о статусе агента. Наиболее распространенный пример состояния - расположение агента в среде. Перемещение мест изменило бы состояние агентов.

Действие: любое взаимодействие между агентом и средой будет считаться действием. Например, движение влево или прыжок будет действием. Действие может изменить или не изменить текущее состояние агента. Фактически, бездействие - это тоже действие! Действие, скажем, не нажатие клавиши, если мы используем наш пример Марио.

Вознаграждайте. Каждое действие, предпринимаемое нашим агентом, приведет к вознаграждению некоторой величины (положительному или отрицательному). Целью нашего агента будет максимальное вознаграждение в среде. Иногда награда будет ясной, например, если агент выполняет действие, увеличивающее его счет в окружающей среде, мы можем сказать, что он получил положительное вознаграждение. Если агент совершит действие, в результате которого он потеряет счет или, возможно, погибнет в окружающей среде, он получит отрицательное вознаграждение.

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

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, чтобы поиграть с кодом

Источники