Q-Learning на Python

Опубликовано: 25 Июля, 2021

Предварительные требования: обучение с подкреплением

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

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

  1. Q-значения или Action-Values: Q-значения определены для состояний и действий. оценка того, насколько хорошо предпринимать действия в государстве . Эта оценка будет итеративно вычисляться с использованием правила TD-Update, которое мы увидим в следующих разделах.
  2. Награды и эпизоды: агент в течение своей жизни начинает с начального состояния, совершает ряд переходов из текущего состояния в следующее состояние в зависимости от своего выбора действия, а также среды, в которой агент взаимодействует. На каждом этапе перехода, агент из состояния выполняет действие, наблюдает за наградой из окружающей среды, а затем переходит в другое состояние. Если в какой-то момент агент попадает в одно из конечных состояний, это означает, что дальнейший переход невозможен. Говорят, что это завершение эпизода.
  3. Временная разница или TD-обновление:

    Правило Temporal Difference или TD-Update может быть представлено следующим образом:

    Это правило обновления для оценки значения Q применяется на каждом временном шаге взаимодействия агентов с окружающей средой. Используемые термины поясняются ниже. :

    • : Текущее состояние агента.
    • : Текущее действие Выбрано в соответствии с некоторой политикой.
    • : Следующее состояние, в котором заканчивается агент.
    • : Следующее лучшее действие, которое нужно выбрать с использованием текущей оценки Q-значения, т.е. выбрать действие с максимальным Q-значением в следующем состоянии.
    • : Текущая награда, наблюдаемая из окружающей среды в ответ на текущее действие.
    • (> 0 и <= 1): коэффициент дисконтирования для будущих вознаграждений. Будущие награды менее ценны, чем текущие, поэтому их нужно сбрасывать со счетов. Поскольку Q-значение является оценкой ожидаемого вознаграждения от государства, здесь также применяется правило дисконтирования.
    • : Длина шага, используемая для обновления оценки Q (S, A).
  4. Выбор действия с помощью -жадная политика:

    -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. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.