Arhn - архитектура программирования

Как понять алгоритм оптимизации проксимальной политики в RL?

Я знаю основы обучения с подкреплением, но какие термины необходимо понимать, чтобы читать статью arxiv PPO?

Каков план изучения и использования PPO?


Ответы:


1

Чтобы лучше понять PPO, полезно ознакомиться с основными вкладами статьи, а именно: (1) усеченная суррогатная цель и (2) использование нескольких периоды стохастического подъема по градиенту для выполнения каждого обновления политики.


Из исходного документа PPO:

Мы представили [PPO], семейство методов оптимизации политики, которые используют несколько эпох стохастического подъема градиента для выполнения каждого обновления политики. Эти методы обладают стабильностью и надежностью [TRPO], но их намного проще реализовать. требуется изменить всего несколько строк кода для реализации градиента стандартной политики, применимы в более общих настройках (например, при использовании совместной архитектуры для функции политики и значения) и обладают более высокой общей производительностью.


1. The Clipped Surrogate Objective

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

Для стандартных градиентов политики (например, REINFORCE) --- с которыми вы должны быть знакомы, или ознакомьтесь с, прежде чем читать это --- цель, используемая для оптимизации нейронной сети, выглядит так:

Цель PG

Это стандартная формула, которую можно увидеть в книге Саттона, и другое resources, где A-hat может быть сниженная доходность (как в REINFORCE) или функция преимущества (как в GAE), например. Сделав шаг градиентного восхождения для этой потери по отношению к параметрам сети, вы будете стимулировать действия, которые привели к более высокому вознаграждению.

Метод градиента ванильной политики использует логарифмическую вероятность вашего действия (log π(a | s)) для отслеживания влияния действий, но вы можете представить себе использование другой функции для этого. Еще одна такая функция, представленная в этой статье, использует вероятность действия согласно действующей политике (π(a|s)), деленную на вероятность действия согласно вашей предыдущей политике (π_old(a |с)). Это выглядит немного похоже на выборку по важности, если вы знакомы с этим:

r eq

Это r(θ) будет больше 1, когда действие более вероятно для вашей текущей политики, чем для вашей старой политики; он будет между 0 и 1, когда действие менее вероятно для вашей текущей политики, чем для вашей старой.

Теперь, чтобы построить целевую функцию с этим r (θ), мы можем просто заменить его на член log π (a | s). Вот что делается в TRPO:

Цель TRPO

Но что произойдет, если ваше действие будет гораздо более вероятным (например, в 100 раз) для вашей текущей политики? r(θ) будет иметь тенденцию быть действительно большим и приводить к большим градиентным шагам, которые могут разрушить вашу политика. Чтобы справиться с этой и другими проблемами, TRPO добавляет несколько дополнительных наворотов (например, ограничения KL Divergence), чтобы ограничить величину, которую может изменить политика, и помочь гарантировать, что она монотонно улучшается.

Вместо того, чтобы добавлять все эти дополнительные навороты, что, если бы мы могли встроить эти стабилизирующие свойства в целевую функцию? Как вы могли догадаться, это то, что делает PPO. Он получает те же преимущества в производительности, что и TRPO, и избегает осложнений, оптимизируя эту простую (но довольно забавно выглядящую) обрезанную суррогатную цель:

обрезанный суррогат с аннотациями

Первый член (синий) внутри минимизации — это тот же член (r(θ)A), который мы видели в задаче TRPO. Второй член (красный) — это версия, в которой (r(θ)) обрезается между (1 — e, 1 + e). (в статье они утверждают, что хорошее значение e составляет около 0,2, поэтому r может варьироваться в пределах ~ (0,8, 1,2)). Затем, наконец, берется минимизация обоих этих членов (зеленый).

Не торопитесь и внимательно посмотрите на уравнение и убедитесь, что вы знаете, что означают все символы, и что происходит с математической точки зрения. Просмотр кода также может помочь; вот соответствующий раздел в обоих OpenAI базовых показателей и anyrl-py реализации.

Большой.

Далее давайте посмотрим, какой эффект создает функция L clip. Вот диаграмма из статьи, на которой показано значение цели клипа, когда Преимущество положительное и отрицательное:

Вступительный ролик

В левой половине диаграммы, где (A > 0), это место, где действие оказало предполагаемое положительное влияние на результат. В правой половине диаграммы, где (A ‹ 0), это место, где действие оказало предполагаемое негативное влияние на результат.

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

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

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

Но почему мы позволяем r(θ) неограниченно расти в правой части диаграммы? Сначала это кажется странным, но что может привести к тому, что r(θ) станет действительно большим в этом случае? Рост r(θ) в этой области будет вызван шагом градиента, который сделал наше действие значительным. более вероятно, и получилось сделать нашу политику хуже. Если бы это было так, мы бы хотели иметь возможность отменить этот шаг градиента. И так уж получилось, что функция L clip это позволяет. Здесь функция отрицательна, поэтому градиент скажет нам идти в другом направлении и сделает действие менее вероятным на величину, пропорциональную тому, насколько мы его испортили. (Обратите внимание, что аналогичная область есть в крайней левой части диаграммы, где действие хорошее, но мы случайно сделали его менее вероятным.)

Эти области отмены объясняют, почему мы должны включать странный член минимизации в целевую функцию. Они соответствуют несрезанному r(θ)A, имеющему меньшее значение, чем усеченная версия, и возвращаются минимизацией. Это потому, что это были шаги в неправильном направлении (например, действие было хорошим, но мы случайно сделали его менее вероятным). Если бы мы не включили min в целевую функцию, эти области были бы плоскими (градиент = 0) и мы не смогли бы исправить ошибки.

Вот диаграмма, обобщающая это:

Диаграмма клипа L

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

2. Multiple epochs for policy updating

В отличие от ванильных методов градиента политик и благодаря функции Clipped Surrogate Objective, PPO позволяет запускать несколько эпох градиентного восхождения на ваших образцах, не вызывая деструктивно больших обновлений политик. Это позволяет вам выжать больше из ваших данных и снизить неэффективность выборки.

PPO запускает политику, используя N параллельных субъектов, каждый из которых собирает данные, а затем отбирает мини-пакеты этих данных для обучения K эпох, используя функцию Clipped Surrogate Objective. См. полный алгоритм ниже (приблизительные значения параметров: K = 3-15, M = 64-4096, T (горизонт) = 128 -2048):

Алгоритм PPO

Часть параллельных участников была популяризирована документом A3C и стала довольно стандартным способом сбора данных.

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

Для каждой итерации после выборки среды с π_old (строка 3) и когда мы запускаем оптимизацию (строка 6), наша политика π будет в точности равна π_old. Так что поначалу ни одно из наших обновлений не будет обрезано, и мы гарантированно чему-то научимся на этих примерах. Однако, когда мы обновляем π, используя несколько эпох, цель начнет достигать пределов отсечения, градиент для этих выборок станет равным 0, и обучение постепенно остановится... пока мы не перейдем к следующей итерации и не соберем новые выборки. .

....

И это пока все. Если вы заинтересованы в более глубоком понимании, я бы порекомендовал более подробно изучить исходный документ. реализовать его самостоятельно или погрузиться в базовую реализацию и играю с кодом.

[изменить: 27.01.2019]: Для лучшего понимания и того, как PPO соотносится с другими алгоритмами RL, я также настоятельно рекомендую ознакомиться с OpenAI Ресурсы и реализации Spin Up.

03.06.2018
  • Вы написали прекрасный ответ. Спасибо! 20.06.2018
  • Поскольку градиент обрезанных сэмплов равен нулю, означает ли это, что вы эффективно отбрасываете все обрезанные сэмплы? 28.06.2018
  • @jaromiru, это хороший вопрос. Я думаю, будет справедливо сказать, что вы фактически выбрасываете эти сэмплы, потому что градиент упадет до 0. Это похоже на их трату впустую, но я думаю, что это жертва, которая приносится, чтобы гарантировать, что вы не слишком шагаете далеко в этом направлении и ухудшает вашу политику. Другими словами: иногда вы жертвуете движением, чтобы никогда не идти в неправильном направлении. 28.06.2018
  • А поскольку вы всегда сравниваете текущую и старую политику, вы сможете сделать следующий шаг и продолжить движение в этом направлении, если оно все еще окажется хорошим. 28.06.2018
  • редактировать 9/9/2018: я пересмотрел раздел о нескольких эпохах, и я думаю, что это прояснило ситуацию 10.09.2018
  • если $r_t$ очень велико, то разве мы не говорим, что моя текущая политика, оглядываясь назад, является плохим обновлением, потому что она сильно отличается? Не слишком ли поздно, потому что я уже сделал обновление? .. Извините, если это глупый вопрос 12.09.2018
  • @tryingtolearn, если r(θ) очень велико, это не всегда означает плохое обновление. Это может быть плохим признаком, потому что это означает, что вы сильно изменились по сравнению со старой политикой (π_old). Но функция алгоритма/потери заботится об этом случае только в том случае, если (A ‹ 0), как показано на графике. И это не будет слишком поздно, потому что, хотя мы уже сделали обновление, мы проводим много раундов оптимизации и оцениваем функцию отсечения L, поэтому мы сможем исправить это, потому что градиент подскажет нам обновить в другом направлении. . 12.09.2018
  • Любые мысли о том, почему они использовали adam вместо rmsprop? Я думал, что оптимизаторы на основе импульса были плохими в RL из-за смещения распределения пространства состояний по мере улучшения вашего агента. 14.09.2018
  • Я ломал голову над тем, почему операция min работает, когда преимущество ‹ 0, но я упустил это преимущество из своей математики. Это работает, потому что знак минус перед преимуществом делает клип меньшим отрицательным числом для операции min. Например, новая политика = 0,3, старая политика = 0,5, эпсилон = 0,2 даст min (0,6 (-At), clip (0,6, 0,8, 1,2) (-At)). Это приводит к min(-0,6 At, -0,8 At). 08.04.2019
  • Выполняются ли одни и те же образцы для нескольких эпох? или разделить образцы на N фрагментов и обновить с помощью N эпох? 21.08.2020

  • 2

    PPO, включая TRPO, пытается консервативно обновлять политику, не оказывая отрицательного влияния на ее производительность между каждым обновлением политики.

    Для этого вам нужен способ измерить, насколько политика изменилась после каждого обновления. Это измерение выполняется путем просмотра расхождения KL между обновленной политикой и старой политикой.

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

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

    С помощью PPO мы упрощаем задачу, превращая расхождение KL из ограничения в штрафной член, аналогичный, например, штрафу за вес L1, L2 (для предотвращения роста весов до больших значений). PPO вносит дополнительные изменения, устраняя необходимость все вместе вычислять расхождение KL, путем жесткого ограничения коэффициента политики (соотношение обновленной политики и старой), чтобы он находился в пределах небольшого диапазона около 1,0, где 1,0 означает, что новая политика такая же, как и старая.

    15.01.2018

    3

    PPO — это простой алгоритм, который относится к классу алгоритмов оптимизации политик (в отличие от методов, основанных на значениях, таких как DQN). Если вы «знаете» основы RL (я имею в виду, если вы хотя бы вдумчиво прочитали несколько первых глав книгу Саттона), то первым логическим шагом будет знакомство с алгоритмами градиента политик. Вы можете прочитать эту статью. или глава 13 нового издания книги Саттона. Кроме того, вы также можете прочитать эту статью о TRPO, которая является предыдущей работой первого автора PPO ( в этой статье много ошибок в обозначениях; просто обратите внимание). Надеюсь, это поможет. --Мехди

    28.09.2017

    4

    Я думаю, что реализация для дискретного пространства действия, такого как Cartpole-v1, проще, чем для непрерывного пространства действия. Но для пространств с непрерывным действием это самая простая реализация, которую я нашел в Pytorch, поскольку вы можете ясно видеть, как они получают mu и std, чего я не мог с более известными реализациями, такими как Openai Baselines и Spinning up или Stable Baselines.

    RL-Adventure PPO

    Эти строки из ссылки выше:

    class ActorCritic(nn.Module):
        def __init__(self, num_inputs, num_outputs, hidden_size, std=0.0):
            super(ActorCritic, self).__init__()
    
            self.critic = nn.Sequential(
                nn.Linear(num_inputs, hidden_size),
                nn.ReLU(),
                nn.Linear(hidden_size, 1)
            )
    
            self.actor = nn.Sequential(
                nn.Linear(num_inputs, hidden_size),
                nn.ReLU(),
                nn.Linear(hidden_size, num_outputs),
            )
            self.log_std = nn.Parameter(torch.ones(1, num_outputs) * std)
    
            self.apply(init_weights)
    
        def forward(self, x):
            value = self.critic(x)
            mu    = self.actor(x)
            std   = self.log_std.exp().expand_as(mu)
            dist  = Normal(mu, std)
            return dist, value
    

    и вырезка:

    def ppo_update(ppo_epochs, mini_batch_size, states, actions, log_probs, returns, advantages, clip_param=0.2):
        for _ in range(ppo_epochs):
            for state, action, old_log_probs, return_, advantage in ppo_iter(mini_batch_size, states, actions, log_probs, returns, advantages):
                dist, value = model(state)
                entropy = dist.entropy().mean()
                new_log_probs = dist.log_prob(action)
    
                ratio = (new_log_probs - old_log_probs).exp()
                surr1 = ratio * advantage
                surr2 = torch.clamp(ratio, 1.0 - clip_param, 1.0 + clip_param) * advantage
    

    Я нашел ссылку над комментариями к этому видео на Youtube:

    ARXIV Insights PPO

    24.05.2019
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..