Обучение с подкреплением (RL) — это подобласть искусственного интеллекта, которая фокусируется на обучении агента принимать последовательность решений в окружающей среде для максимизации совокупного вознаграждения. Он привлек значительное внимание благодаря своей способности решать сложные задачи, обучаясь на основе взаимодействия с окружающей средой.

В этом блоге мы углубимся в основы RL и продемонстрируем его реализацию с использованием кода Python и библиотеки OpenAI Gym.

Для начала давайте разберемся с основными компонентами RL. Ключевыми элементами являются агент, среда, действия, состояния и вознаграждения. Агент — это сущность, которая взаимодействует с окружающей средой, предпринимая действия в зависимости от текущего состояния.

Позвольте мне объяснить это с помощью пятиэтапной схемы:

Вот схема из 5 пунктов для обучения с подкреплением:

  1. Агент. Агент – это объект, который обучается и выполняет действия в окружающей среде. Это может быть робот, программа или любой другой объект, взаимодействующий с окружающей средой.
  2. Окружающая среда.Окружающая среда — это среда, в которой работает агент. Это может быть физическая среда, моделируемая среда или комбинация того и другого. Среда предоставляет агенту обратную связь в виде вознаграждений или наказаний в зависимости от действий агента.
  3. Состояние.Состояние представляет текущую ситуацию агента в среде. Он может включать соответствующую информацию, такую ​​как местоположение агента, наличие препятствий или любые другие факторы, которые могут повлиять на процесс принятия решений агентом.
  4. Действие.Решения, принимаемые агентом на основе текущего состояния, называются действиями. Агент выбирает действие из набора возможных действий, которое затем влияет на состояние среды и потенциально приводит к вознаграждению или наказанию.
  5. Награда.Награды – это положительная или отрицательная обратная связь, которую агент получает от окружающей среды в зависимости от своих действий. Цель обучения с подкреплением — максимизировать совокупное вознаграждение с течением времени, т. е. найти оптимальную политику, которая приведет к максимально возможному долгосрочному вознаграждению.

Модели RL: глубокое погружение

Марковский процесс принятия решений (MDP)

  • MDP — это математическая основа для моделирования принятия решений в стохастических средах.
  • Он состоит из набора состояний, действий, вероятностей перехода, немедленных вознаграждений и коэффициента дисконтирования.
  • Агент взаимодействует со средой, выбирая действия, и среда переходит в новое состояние на основе вероятностей.
  • В MDP сохраняется марковское свойство, означающее, что будущее состояние зависит только от текущего состояния и действия, а не от истории.
  • Цель состоит в том, чтобы найти оптимальную политику π, которая максимизирует ожидаемое совокупное вознаграждение.
  • Уравнение Беллмана для функции значения состояния V(s) в MDP: V(s) = max_a {sum_s' [P(s' | s, a) * (R(s, a, s') + γ * V(s'))]
  • V(s) — значение состояния s.
  • P(s’ | s, a) — вероятность перехода в состояние s при заданном состоянии s и действии a.
  • R(s, a, s’) — немедленное вознаграждение, получаемое при переходе из состояния s в состояние s’ посредством выполнения действия a.
  • γ — коэффициент дисконтирования, уравновешивающий немедленные и будущие вознаграждения.

Q-обучение

  • Q-обучение — это безмодельный алгоритм обучения с подкреплением, который изучает оптимальную функцию действия-ценности, называемую Q-функцией.
  • Q-функция обозначает ожидаемое совокупное вознаграждение за выполнение определенного действия в данном состоянии.
  • Алгоритм итеративно обновляет значения Q на основе уравнения Беллмана.
  • Уравнение Беллмана: Q(s, a) = Q(s, a) + α * [r + γ * max(Q(s’, a’)) — Q(s, a)]
  • Q(s, a) — значение Q для состояния s и действия a.
  • α — скорость обучения, определяющая вес, придаваемый новой информации.
  • r — немедленная награда, полученная после совершения действия в состоянии s.
  • γ — коэффициент дисконтирования, уравновешивающий важность немедленных и будущих вознаграждений.
  • max(Q(s’, a’)) — максимальное значение Q среди всех действий в следующем состоянии s’.

DQN (глубокая Q-сеть)

  • DQN — это расширение Q-обучения, которое использует глубокие нейронные сети для аппроксимации функции Q.
  • Вместо таблицы поиска значений Q нейронная сеть обучена прогнозировать значения Q на основе текущего состояния.
  • Сеть обучается с использованием комбинации воспроизведения опыта и целевой сети.
  • Воспроизведение опыта сохраняет прошлый опыт в буфере воспроизведения, случайным образом выбирая его для обучения, чтобы разрушить корреляции в данных.
  • Целевая сеть — это отдельная сеть с отложенными обновлениями, обеспечивающая стабильные целевые значения Q во время обучения.

Круто! Теперь давайте воспользуемся помощью Python, используя библиотеку OpenAI Gym, и творим чудеса

Чтобы проиллюстрировать RL в действии, мы будем использовать библиотеку OpenAI Gym, которая предоставляет широкий спектр предопределенных сред для задач RL. Начнем с простого примера с использованием среды CartPole. Цель этого задания — сбалансировать шест на тележке, применяя силы для перемещения тележки влево или вправо.

!pip установить тренажерный зал

импортный тренажерный зал

env = Gym.make('CartPole-v1')

импортировать numpy как np

num_states = env.observation_space.shape[0]

num_actions = env.action_space.n

q_table = np.zeros((num_states, num_actions))

Далее нам нужно определить гиперпараметры для нашего алгоритма RL, такие как скорость обучения, коэффициент дисконтирования, скорость исследования и количество эпизодов.

learning_rate = 0.1
discount_factor = 0.99
exploration_rate = 1.0
max_exploration_rate = 1.0
min_exploration_rate = 0.01
exploration_decay_rate = 0.01
num_episodes = 1000

Теперь мы можем реализовать алгоритм Q-обучения:

for episodes in range (num_episodes):
    state = env.reset()
    done = False
    
    while not done:
        exploration_rate_threshold = np.random.uniform(0, 1)
        
if exploration_rate_threshold > exploration_rate:
            action = np.argmax(q_table[state, :])
        else:
            action = env.action_space.sample()
        
        new_state, reward, done, _ = env.step(action)
        
        q_table[state, action] = q_table[state, action] + learning_rate * (reward + 
                            discount_factor * np.max(q_table[new_state, :]) - 
                            q_table[state, action])
        
        state = new_state
    
    exploration_rate = min_exploration_rate + (max_exploration_rate)
                        min_exploration_rate) * np.exp(-exploration_decay_rate * episode)

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

После завершения обучения мы можем протестировать производительность нашего агента RL, запустив его в следующей среде:

total_rewards = []
for episodes in range (num_episodes):
    state = env.reset()
    done = False
    episode_reward = 0
    
    while not done:
        action = np.argmax(q_table[state, :])
        new_state, reward, done, _ = env.step(action)
        
        state = new_state
        episode_reward += reward
    
    total_rewards.append(episode_reward)

Наконец, мы можем визуализировать работу нашего RL-агента, отобразив вознаграждения по эпизодам:

import matplotlib.pyplot as plt
plt.plot(total_rewards)
plt.xlabel('Episode')
plt.ylabel('Total Reward')
plt.title('RL Agent Performance')
plt.show()

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

Обучение с подкреплением предлагает мощный подход к решению сложных проблем принятия решений. С помощью Python и библиотеки OpenAI Gym мы можем легко реализовывать алгоритмы RL и экспериментировать с ними.

Практический пример: проблема замерзшего озера, состояние и последствия

Давайте окунемся в морозный мир Замерзшего озера, классической задачи в обучении с подкреплением. Представьте себя в опасном путешествии по замерзшему озеру.

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

Определение состояний, действий и вознаграждений

В среде Frozen Lake каждый квадрат представляет состояние, а каждое движение представляет действие. Некоторые квадраты скрывают дыры, ведущие к неудаче, а другие ведут к высшей награде: достижению цели. Задача заключается в том, чтобы понять, как ориентироваться в этом сложном ландшафте, максимизируя при этом выгоды и сводя к минимуму подводные камни.

Реализация и стратегии Python

Код Python с использованием OpenAI Gym для среды Frozen Lake, а также пошаговые объяснения:

import gym
# Create the FrozenLake environment
env = gym.make('FrozenLake-v0')
# Reset the environment to start a new episode
state = env.reset()
# Define the number of episodes to train
num_episodes = 10000
# Define the maximum number of steps per episode
max_steps = 100
# Define the learning rate and discount factor
learning_rate = 0.1
discount_factor = 0.99
# Initialize the Q-table with zeros
Q = [[0] * env.action_space.n for _ in range(env.observation_space.n)]
# Start the training loop
for episode in range(num_episodes):
    # Reset the environment for a new episode
    state = env.reset()
    done = False
    
    # Loop through the steps within the episode
    for step in range(max_steps):
        # Choose an action using the epsilon-greedy policy
        epsilon = 0.1  # Exploration rate
        if (np.random.uniform(0, 1) < epsilon) or (all(q == 0 for q in Q[state])):
            action = env.action_space.sample()  # Random action
        else:
            action = np.argmax(Q[state])  # Greedy action
        # Perform the chosen action and observe the next state and reward
        next_state, reward, done, _ = env.step(action)
        # Update the Q-table using the Q-learning equation
        Q[state][action] = (1 - learning_rate) * Q[state][action] + learning_rate * (reward + discount_factor * np.max(Q[next_state]))
        # Transition to the next state
        state = next_state
        # Break if the episode is finished
        if done:
            break
# Evaluate the agent's performance after training
total_rewards = 0
num_episodes = 100
for episode in range(num_episodes):
    state = env.reset()
    done = False
    
    # Loop through the steps within the episode
    for step in range(max_steps):
        # Choose the best action based on the learned Q-values
        action = np.argmax(Q[state])
        # Perform the chosen action
        next_state, reward, done, _ = env.step(action)
        
        # Accumulate the total rewards
        total_rewards += reward
        # Transition to the next state
        state = next_state
        # Break if the episode is finished
        if done:
            break
# Print the average rewards per episode
average_rewards = total_rewards / num_episodes
print("Average rewards per episode:", average_rewards)

Объяснение каждого шага:

  1. Импортируйте необходимые библиотеки и модули, включая OpenAI Gym.
  2. Создайте среду FrozenLake, используя gym.make('FrozenLake-v0').
  3. Сбросьте среду, чтобы начать новый эпизод, используя env.reset().
  4. Определите количество эпизодов для обучения (num_episodes) и максимальное количество шагов на эпизод (max_steps).
  5. Определите скорость обучения (learning_rate) и коэффициент дисконтирования (discount_factor) для алгоритма Q-обучения.
  6. Инициализируйте Q-таблицу нулями, где каждая строка представляет состояние, а каждый столбец представляет действие. (Q = [[0] * env.action_space.n for _ in range(env.observation_space.n)])
  7. Запустите цикл обучения, перебирая эпизоды.
  8. Сбросьте окружение в начале каждого эпизода, используя env.reset().
  9. Пройдите этапы эпизода, используя for step in range(max_steps).
  10. Выберите действие, используя эпсилон-жадную политику. С вероятностью выберите случайное действие для исследования. В противном случае выберите для эксплуатации действие с наибольшим значением Q.
  11. Выполните выбранное действие, используя env.step(action), и наблюдайте за следующим состоянием, наградой и статусом завершения эпизода (done).
  12. Обновите Q-таблицу, используя уравнение Q-обучения, обеспечив баланс между разведкой и эксплуатацией.
  13. Переход в следующее состояние путем обновления state = next_state.
  14. Разорвите цикл, если эпизод завершен (done имеет значение True).
  15. После обучения оцените работу агента, запустив эпизоды без исследования.
  16. Накопите общую сумму наград, полученных в каждом эпизоде.
  17. Выведите средние вознаграждения за эпизод, чтобы оценить производительность агента.

Этот код обучает агента Q-learning ориентироваться в среде Frozen Lake и выводит среднее вознаграждение за эпизод как меру производительности агента.

Что такое обучение с подкреплением?

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

Как работает обучение с подкреплением?

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

Каковы ключевые компоненты обучения с подкреплением?

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

Каковы некоторые применения обучения с подкреплением?

Обучение с подкреплением имеет множество применений в различных областях. Некоторые примеры включают автономное вождение, робототехнику, системы рекомендаций, игры (например, AlphaGo), управление ресурсами и контроль запасов. Его можно применить к любой проблеме, когда агенту необходимо учиться и предпринимать действия, чтобы максимизировать вознаграждение или достичь определенной цели.

Каковы проблемы в обучении с подкреплением?

Обучение с подкреплением сталкивается с рядом проблем, включая компромисс между разведкой и эксплуатацией, проблему присвоения кредитов и эффективность выборки.

Исследование-эксплуатация относится к дилемме: предпринимать ли действия, которые, как известно, приносят высокие награды, или исследовать новые действия, которые могут привести к еще более высоким вознаграждениям. Проблема присвоения кредитов предполагает правильное приписывание вознаграждений действиям, предпринятым в последовательности событий.

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