Что такое градиент политики?

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

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

Теорема о градиенте политики

Градиент политики напрямую оптимизирует политику π. Теория, лежащая в основе того, как вычислять градиенты для политики, дана в Теореме о градиенте политики (которая очень четко объяснена в книге Саттона).

УКРЕПИТЬ

REINFORCE — это простейшая реализация градиента политики. Это метод, основанный на методе Монте-Карло, т. е. он отбирает траектории из среды с использованием текущей политики и использует ее для обновления политики с использованием градиентного спуска. Функция Q в теореме градиента политики оценивается с использованием траекторий, отобранных агентом.

Осведомленный о рисках / чувствительный RL

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

Откуда берется риск?

Существует 3 основных типа неопределенностей, которые вызывают риск для наших моделей.

  • Неопределенность параметров: это неопределенность параметров MDP. Модель среды может иметь ошибки в оценке, которые представляют риск для агента.
  • Неопределенность вознаграждения: этот риск связан с неопределенностью самого вознаграждения, которая возникает из-за стохастического характера вознаграждения. Цель, которую мы используем в RL, то есть ожидание будущей суммы вознаграждения, не отражает этого.
  • Неопределенность модели: этот риск возникает из-за несоответствия модели, которое возникает из-за того, что модель наблюдений или признаков не известна точно.

Управление рисками важно во многих областях, где цена ошибки высока, например

  • Финансы
  • Здоровье
  • Робототехника

Как мы измеряем риск?

Здесь мы поговорим о нескольких способах измерения риска. Эти цели позволяют нам количественно оценить риск, и как только мы сможем его количественно определить, мы сможем попробовать подходы к его минимизации. Ниже приведены три способа измерения риска.

1. Средняя дисперсия

Средняя дисперсия — это классическая мера риска, обычно используемая в финансах. Цель заключается в следующем. J — это вознаграждение, а V — дисперсия вознаграждения, а c измеряет вес, придаваемый части дисперсии цели.

Наша цель состоит в том, чтобы максимизировать вышеуказанную цель.

2. Коэффициент Шарпа

Коэффициент Шарпа — еще одна популярная мера риска, используемая почти исключительно в финансах. Цель заключается в следующем. J — вознаграждение, а V — дисперсия вознаграждения J.

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

3. CVAR

CVaR относится к категории мер риска, известных как согласованные меры риска. CVaR также известен как ES (ожидаемый дефицит). Эта мера риска также широко используется в финансах. Цель говорит о наихудшем α% доходности. Это процентная мера.

Когда α приближается к 100%-ному процентилю доходности, цель снижается до стандартной цели RL.

Ниже приведены 5 способов сделать ваш алгоритм градиента политики осведомленным о рисках.

Следующие методы имеют ссылки на документы и основную идею, описанную в них. Псевдокод для реализации алгоритмов предполагает следующее

  • модель представляет собой модель типа нейронной сети с выходами softmax. Если есть n действий, то модель будет иметь n выходов
  • Реализация градиента политики REINFORCE без базовой линии.
  • Функция calculate_loss принимает (s, a, r) ​​в качестве входных данных для вычисления функции потерь. В некоторых случаях (s, a, r) ​​содержит данные для нескольких траекторий.

1. Экспоненциальное формирование вознаграждения

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

Переменная c — это вес, придаваемый дисперсии вознаграждения. Приведенное выше формирование вознаграждения реализует уравнение 1.

import torch
from torch.distributions import Categorical

def discount_rewards(r,gamma):
    disc_rewards = []
    R = 0
    for r_ in r[::-1]:
        R = r_ + gamma*R
        disc_rewards.append(R)
    disc_rewards.reverse()
    returns = torch.tensor(np.array(disc_rewards))
    return returns

def compute_loss(s, a, r, model, gamma):
    o = model(s)
    dist = Categorical(o)
    action_log_prob = dist.log_prob(a)
    r = [ 1 - np.exp(-c*r_))/c for r_ in r ]
    discounted_rewards = discount_rewards(r, gamma)
    loss = action_log_prob * discounted_rewards
    return loss

2. Градиент политики с риском среднего отклонения

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

Переменные J и V — это текущие оценки ожидаемого вознаграждения и его дисперсии.

def update_J(J, R, alpha):
    return J + alpha*( R - J )

def update_V(V, J, R, alpha):
    return V + alpha*( R**2 - J**2 - V )

def compute_loss(s, a, r, model, J, V, alpha, lambda_):
    T = len(r)
    o = model(s)
    dist = Categorical(o)
    action_log_prob = dist.log_prob(a)
    R = sum(r)
    J = update_J(J, R, alpha)
    V = update_V(V, J, R, alpha)
    rewards = [R - lambda_*(V - b)*(R**2 - 2*J)]*T
    loss = action_log_prob * torch.tensor(rewards)
    return loss

3. Градиент политики с риском Шарпа

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

Переменные J и V такие же, как и в предыдущем методе.

def update_J(J, R, alpha):
    return J + alpha*( R - J )

def update_V(V, J, R, alpha):
    return V + alpha*( R**2 - J**2 - V )

def compute_loss(s, a, r, model, J, V, alpha):
    T = len(r)
    o = model(s)
    dist = Categorical(o)
    action_log_prob = dist.log_prob(a)
    R = sum(r)
    J = update_J(J, R, alpha)
    V = update_V(V, J, R, alpha)
    rewards = [(1/np.sqrt(V))*(R-(J*R**2 - 2*R*J**2)/(2*V))]*T
    loss = action_log_prob * torch.tensor(rewards)
    return loss

4. Градиент политики с волатильностью вознаграждения на ходу

Этот подход взят из Оптимизация области доверия, не склонной к риску, для снижения волатильности вознаграждения. В статье об оптимизации средней дисперсии говорится с несколько иной точки зрения. Обычная цель средней дисперсии имеет член sqrt (V), который затрудняет вывод уравнений оптимальности Беллмана. Авторы используют V вместо sqrt (V), что делает уравнения оптимальности Беллмана справедливыми при оптимизации риска дисперсии.

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

def compute_J_estimate(r, gamma):
    T = len(r)

    R_sum = 0
    for j in range(T):
      R_sum += (gamma ** j) * r[j]

    return R_Sums * ((1 - gamma)/(1 - gamma**T))

def compute_loss(s, a, r, model, gamma):
    T = len(r)
    o = model(s)
    dist = Categorical(o)
    action_log_prob = dist.log_prob(a)
    J_est = compute_J_estimate(r, gamma)
    r = [ r_ - lambda_ * ((1-gamma)/(1-gamma**T) * (r_ - J_est)**2 \
          for r_ in r ]
    discounted_rewards = discount_rewards(r, gamma)
    gamma_ = [ gamma**i for i in range(T) ]
    discounted_rewards = discounted_rewards * gamma_
    loss = action_log_prob * discounted_rewards
    return loss

5. Градиент политики с CVaR (условное значение риска)

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

import numpy as np

def compute_alpha_v(r, alpha):
    N = len(r)
    rewards = []
    for r_ in r:
        rewards += [ sum(r_) ]
    alpha_v = np.percentile(rewards, alpha*100)
    return alpha_v

# s, a, r have data of multiple trajectories
def compute_loss(s, a, r, model, alpha):
    N = len(r)
    T = len(r[0])

    alpha_v = compute_alpha_v(r, alpha)
    losses = []
    for i in range(N):
        o = model(s[i])
        action_log_prob = dist.log_prob(a[i])
        if sum(r[i]) < alpha_v:
            rewards = [ sum(r[i]) - alpha_v ] * T
        else:
            continue
        loss = action_log_prob * torch.tensor(rewards)
        losses.append(loss)
    total_loss = torch.sum(losses)
    return total_loss        

Рекомендации