Всем привет! Недавно я познакомился с курсом по глубокому обучению с подкреплением от HuggingFace Deep Reinforcement Learning Course и захотел сделать выжимку самого интересного. Эта статья — своего рода шпаргалка по основам Reinforcement Learning (RL) и одному из ключевых алгоритмов — PPO, который лежит в основе тонкой настройки современных LLM (Large Language Models).

Вы наверняка слышали про такие модели, как o1 от OpenAI или QwQ от Alibaba. Их "рассуждающие" способности во многом — результат применения RL. Давайте разберемся, как обычный принцип обучения, известный по играм вроде AlphaGo, помогает языковым моделям стать умнее.

RLM - это

RLM (reasoning language model - дословно "рассуждающая языковая модель") - это языковые модели, способные не только генерировать текст, но и выполнять логические, аналитические и причинно-следственные рассуждения для решения сложных задач.

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

Рассмотрим 3-м столпа, на которых строится архитектура RLM:

  1. Прогресс в LLM

  2. RL алгоритмы, такие как AlphaZero

  3. Ресурсы высокопроизводительных вычислений (eng. HPC)

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

Reinforcement Learning

Начну с самого банального - это определение Reinforcement Learning. Reinforcement Learning (RL), или обучение с подкреплением, — это способ машинного обучения, при котором агент учится принимать решения, взаимодействуя с окружающей средой. Проще говоря, это метод проб и ошибок с поощрением за успехи.

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

  • Окружающая среда - внешняя система или мир, внутри которого действует агент.

Процесс обучения представляет собой цикл (Возьмем шаг t =0):

  1. Агент видит состояние (S_0) среды.

  2. Совершает действие (A_0).

  3. Получает от среды вознаграждение (R_1) — численную оценку своего действия.

  4. Переходит в новое состояние (S_1).

Источник https://huggingface.co/learn/deep-rl-course/unit1/rl-framework

Именно такую схему описывает Марковский процесс принятия решений (MDP) — математическая основа для большинства алгоритмов RL (статья "Reasoning Language Models: A Blueprint" ).

Дадим каждой сущности последовательности определение:

Состояние (S) (или пространство состояний)- это информация, которую агент получает из окружающей среды.

Действия (A)(или пространство действий) - это набор всех возможных действий в среде.

Награды (R) - это по сути, наша обратная связь для агента на предпринятое действие. В плоскости LLM - в процессе рассуждения RLM может перейти из одного ответа в другой - как следствие получить положительное вознаграждение (если ответ от LLM корректный), так и отрицательное (если ответ некорректный).

Накопленное вознаграждение на каждом шаге t можно представить:

R(\tau) = r_{t+1} + r_{t+2} + r_{t+3} + ... = \sum _{k=0} ^{\infty} r_{t+k+1}

где \tau- это последовательность чередующихся состояний и действий (s_0, a_0, . . . , s_T , a_T , s_{T +1})

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

  • Значения варьируются в диапазоне от 0 до 1 (в большинстве случаев - между 0.95 и 0.99

  • Чем больше гамма, тем меньше дисконт => агент заботится о долгосрочном вознаграждении

  • Чем меньше гамма, тем больше дисконт => агент заботится больше о краткосрочном вознаграждении

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

R(\tau) = r_{t+1} + \gamma r_{t+2} + \gamma^2 r_{t+3} + ... = \sum _{k=0} ^\infty \gamma^k r_{t+k+1}
Как это применимо к языковым моделям?

Представьте, что LLM — это агент. Ее состояние — это весь сгенерированный на данный момент текст (промпт + ответ). Действие — это генерация следующего токена (слова или его части). Вознаграждение — это оценка качества всего ответа, которую может дать человек-оценщик или другая модель-критик. Например, пользователь задает вопрос LLM: "Сколько будет 2+2". Таким образом:

  1. Состояние (S)

    1. Начальное состояние (S_0) : Промпт пользователя:  "Сколько будет 2+2"

  2. Действие (А)

    1. Хотим перейти из начального состояния (S_0) в (S_1)

      1. Текущее состояние (S_0): («сколько будет 2+2»)

      2. Действие(A_0): Модель генерирует первый шаг рассуждения: «Чтобы решить это, нам нужно выполнить сложение»

      3. Результирующее состояние (S_1): Новое состояние S₁ теперь включает промпт и этот шаг: («сколько будет 2+2», «Чтобы решить это, нам нужно выполнить сложение».)

    2. Из состояния (S_1) в конечное состояние (S_2):

      1. Текущее состояние (S_1): («сколько будет 2+2», «Чтобы решить это, нам нужно выполнить сложение».)

      2. Действие (A_1): Модель генерирует ответ: «Сложение 2 и 2 дает 4». Это z(a₁) — окончательный ответ, поэтому за ним будет следовать токен eos , указывающий на конечное состояние.

      3. Результирующее состояние (S_2): («сколько будет 2+2», «Чтобы решить это, нам нужно выполнить сложение.», «Сложение 2 и 2 дает 4.») Это S_2 теперь является конечным состоянием, так как оно содержит окончательный ответ.

  3. Награда (R)

    • Конечное состояние (S_2): («Сколько будет 2+2?», «Чтобы решить это, нам нужно выполнить сложение?», «Сложение 2 и 2 дает 4?»)

    • Вознаграждение (r(S_2)): Внешний верификатор сверяет окончательный ответ «4» с истинным ответом (который равен «4»).

      • Так как ответ «4» правильный , вознаграждение (r(S_2)) равно 1.

      • Если ответ был «5» (неверный), вознаграждение будет равно -1.

      • Для промежуточных состояний s₀ и s₁ вознаграждение будет равно 0

Хорошо, мы определили формулу для вознаграждения, но появляется вопрос: как мы можем выбирать действия, которые максимизируют это ожидаемое совокупное вознаграждение агента, иными словами "Решить задачу MDP"? На этот вопрос есть ответ, но сперва дадим определения, которые помогут прийти к ответу:

Политика (policy)

Политика - это функция, присваивающая распределение вероятностей по пространству действий заданному состояниюS.

Более формально:

\pi : S -> \Delta(A)

где \Delta(A)- набор распределений вероятностей в пространстве действий A (ничего не напоминает? - посматриваю в сторону нейронных сетей и принцип действия LLM)

Таким образом, наша цель для решения задачи MDP - это найти оптимальную политику \pi^*, которая максимизирует ожидаемую доходность (return), когда агент действует согласно ей. Находим оптимальную политику посредством обучения.

Методы обучения агента по поиску оптимальной политики

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

  1. Обучение напрямую - заставляем агента понимать, какие действия следует предпринять с учетом текущего состояния (Policy-Based Methods).

  2. Косвенно - учим агента узнавать, какое состояние будет более ценно, а затем предпринимать действия, которые ведут к более ценным действиям: методы, основанные на ценностях (Value-Based Methods).

Давайте кратко рассмотрим 2 этих подхода:

Policy-based методы

Агент учит политику (\pi) — прямую инструкцию "что делать в состоянии S". Политика говорит не "делай Х", а "с вероятностью 70% сделай Х, с вероятностью 30% — Y". Именно так работают современные LLM, доработанные с помощью RL. Если кратко, то:

  • Напрямую обучаем функцию политики выбирать действие, учитывая состояние (или распределение вероятностей по действиям в этом состоянии).

  • Нет функции значения (value function)

  • Есть 2 типа политик:

    • Детерминированная (политики в заданном состоянии будет возвращать одно и то же действие) a = \pi(s)

    • Стохастический (выводит распределение вероятностей по действиям) - \pi(a|s) = P[A|S]

Value-Based методы

Агент учит функцию ценности (Q или V), а потом просто выбирает действие, которое ведет в самое "ценное" следующее состояние.

  • В данном подходе обучаем функцию значения (Value function), которая сопоставляет состояние (или action-state пары) с ожидаемым значением нахождения в этом состоянии.

  • Значение состояния (value state) - это ожидаемая дисконтная доходность (return), которую агент может получить, если начнет из определенного состояния и продолжит действовать в соответствии с политикой. Формально данное высказывание можно записать как:

V_\pi (s) = E_\pi[R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + ...| S_t = s] = E_\pi [\sum_{k=t} ^{\infty} \gamma^{k-t} R(s_k, a_k, s_{k+1})|s_t]

где E_\pi[R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + ...] - это ожидаемая дисконтная доходность (return)

Разница между 2-мя подходами в следующем (согласно HuggingFace):

  • При обучении Policy-Based метода оптимальная политика (обозначаемая π^*) находится путем непосредственного обучения политики.

  • При обучении на основе ценностей  нахождение оптимальной функции ценности (обозначаемой Q* или V*, мы рассмотрим разницу ниже) приводит к появлению оптимальной политики.

  • Policy-Based методы более естественны для задач, где действия непрерывны (как генерация текста), а Value-Based часто применяются в играх с дискретным набором ходов

Так как замечаем, что возникают "какие-то" функции Q и V - приходим к выводу, что у нас есть 2 типа value-based functions:

  • The state-value function

    • Для каждого состояния функция «состояние-значение» выводит ожидаемый доход, если агент начинает с этого состояния , а затем следует политике вечно

V_\pi(s) = E_\pi[G_t|S_t=s]
  • The action-value function

    • В функции «действие-значение» для каждой пары «состояние-действие» функция «действие-значение»  выводит ожидаемый результат,  если агент начинает в этом состоянии, выполняет это действие, а затем следует политике вечно

Q_\pi(s,a) = E_\pi[G_t|S_t=s, A_t=a]

где (насколько я могу судить) авторы привели сокращенный вариант формулы и использовали просто замену:

G_t = \sum_{k=t} ^T \gamma ^{k-t} R(s_k, a_k, s_{k+1})

Насколько можно заметить, в данных уравнениях мы повторяем вычисление значений различных состояний, что может быть вычислительно затратно, если вам нужно делать это для каждого значения состояния (state value) или значения состояния-действия (state-action value).

Вместо расчета ожидаемой доходности для каждого состояния или каждой пары состояние-действие  мы можем использовать уравнение Беллмана.

Уравнение Беллмана

Сперва рассмотрим уравнение Беллмана, которое упрощает вычисления.

Для V(S_t) надо вычислять "return" с определенного состояния, а затем следовать политике всегда.

Итак, если имеется 6 шагов и каждый шаг имеет награду "-1", то в момент t функция V(S_t) будет принимать вид:

V(S_t) = (-1)+(-1)+(-1)+(-1)+(-1)+(-1) = -6

Чтобы рассчитать функцию V(S_{t+1})- нужно рассчитать "return", начиная с S_{t+1}

V(S_{t+1}) = (-1)+(-1)+(-1)+(-1)+(-1) = -5

Как мы видим - получаем много повторных вычислений - тут к нам и приходит на помощь уравнение Беллмана.

Работает оно так: немедленная награда R_{t+1} + дисконтированная R_{t+1} . Таким образом наше уравнение для state-value function будет выглядеть следующим образом:

V_\pi(s) = E_\pi[G_t|S_t=s] => V_\pi(s)  = E_\pi[R_{t+1} + \gamma*V(S_{t+1})|S_t=s]

Тогда, возвращаясь к нашему примеру, его можно переписать следующим образом:

V(S_t) = R_{t+1} +\gamma*V(S_{t+1}) => V(S_t) = -1 + 1*(-5) = -6V(S_{t+1}) = -1 + 1*(-4) = -5

Таким образом, приходим к упрощенным вариантам этих формул:

  • The state-value function

V_\pi(s) = E_\pi[G_t|S_t=s] = E_\pi[R_{t+1} + \gamma V(S_{t+1})|S_t=s]
  • Action-value function

Q_\pi(s,a) = E_\pi[R_{t+1} + \gamma V(S_{t+1})|S_t=s|S_t=s, A_t=a]

С этой частью разобрались... можно выдохнуть... чуть-чуть... =)

Стратегии обучения

Монте-Карло

Монте-Карло использует целый эпизод перед обучением. То есть сначала ожидание эпизода, вычисление G_tи далее обновление V(S_t). Более формально:

V(S_t) <-\ V(S_t) + \alpha*[G_t - V(S_t)]

Temporal Difference learning (TDL)

TDL использует только одно взаимодействие (то есть 1 шаг) S_{t+1} для формирования TD цели и обновления V(S_t), используя R_{t+1} и \gamma*V(S_{t+1})(так как не проходим эпизод полностью и не знаем G_t).

V(S_t) <-\ V(S_t) + \alpha*[R_{t+1} +\gamma*V(S_t)- V(S_t)]

(На курсе приведен классный пример с мышкой, иллюстрирующий эту формулу)

PPO

Наконец-то добрались до самой интересной части (если вы не устали от формул и не ушли с этой статейки), ради которой я и затевал эту статью - разобрать до полного понимания PPO - Proximal Policy Optimization — это алгоритм градиента политики, который позволяет стабильно обучать policy-based агентов, и именно он используется для тонкой настройки LLM (например, в RLHF).

Хотелки, которые лежали в основе PPO - это повысить стабильность обучения политики.

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

В чем была проблема?

Представьте, что вы учитесь ходить по канату. Если делать слишком маленькие шаги, вы никуда не дойдете. Если сделать слишком резкий и большой шаг — вы упадете. Так же и в RL:

  1. Слишком маленький шаг - процесс обучения медленный

  2. Слишком большой шаг - слишком мало вариаций в обучении

Идея PPO: "Доверяй, но проверяй"

Таким образом, приходим к идеи PPO - ограничить обновление политики с помощью новой целевой функции (Clipped), которая будет ограничивать изменения политики в небольшом диапазоне с помощью "клипа", иначе она не позволит новой политике (\pi_\theta) слишком сильно отклоняться от старой (\pi_{\theta_{old}}).

Таким образом, получим формулу для PPO с Clipped Surrogate Objective:

L(\theta) = E_{t}[min( r_{t}(\theta) * A_{t}, clip(r_{t}(\theta), 1-ε, 1+ε) * A_{t} )]
  • r_t(θ) (Probability Ratio): Отношение вероятностей действия по новой и старой политике. r_{t}(\theta) = \pi_{\theta}(a_{t}|s_{t}) / \pi_{\theta_{old}}(a_{t}|s_{t}).

    • r_{t}(\theta) > 1: Действие стало более вероятным.

    • 0 < r_{t}(\theta) < 1: Действие стало менее вероятным.

  • A_{t}(Advantage): Насколько действие в данном состоянии лучше, чем "среднее" действие по текущей политике. A_t = Q(s_t,a_t) - V(s_t). Положительное преимущество означает, что действие стоит поощрять, отрицательное — что его следует избегать.

  • Clipping (Обрезка): Самая важная часть PPO. Мы "обрезаем" значение r_{t}(\theta), не позволяя ему выходить за пределы диапазона [1 - ε, 1 + ε]

  • ε (Clip Range): Гиперпараметр, обычно равный 0.2. Он определяет диапазон [1-ε, 1+ε] (т.е. [0.8, 1.2]), за пределами которого функция "обрезается"

"Клиппинг" на примере
  • Если действие хорошее (A_t > 0), мы его поощряем, но не даем r_t стать больше 1+ε. Иначе новую политику может "заклинить" на этом одном действии.

  • Если действие плохое (A_t < 0), мы его наказываем, но не даем r_t упасть ниже 1-ε. Иначе модель может навсегда перестать использовать это действие, даже если в другом контексте оно могло бы быть полезным.

Пример Probability Ratio для LLM

Контекст: "The weather today is"
Действие: "sunny" (токен ID: 1234)

π_{\theta_{old}}("sunny" | "The weather today is") = 0.15 (15% вероятность по старой модели)
π_θ("sunny" | "The weather today is") = 0.25 (25% вероятность по новой модели)

r(\theta) = 0.25 / 0.15 = 1.67

Это значит, что новая модель стала значительно чаще предлагать слово "sunny" в этом контексте. PPO проверит, не слишком ли большой это скачок, и, если r(\theta) > 1.2 (при ε=0.2), будет использовать для обновления "обрезанное" значение 1.2, чтобы не переборщить.

Отлично! Мы рассмотрели ключевые механизмы PPO и теперь стоит задуматься - где нам применять эти знания в плоскости LLM? Далеко ходить не надо - одно из самых значимых применений PPO сегодня — обучение с подкреплением на основе человеческих предпочтений (Reinforcement Learning from Human Feedback, RLHF) для согласования LLM, таких как ChatGPT и Llama 2.

Процесс RLHF состоит из нескольких этапов, и PPO является ядром этого процесса:

  • Шаг 1: Начальная тонкая настройка с учителем (SFT)

    • Модель обучается на наборе высококачественных данных "вопрос-ответ", чтобы научиться следовать инструкциям

  • Шаг 2: Обучение Модели Вознаграждения (Reward Model, RM)

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

  • Шаг 3: Fine-Tuning с помощью PPO

    • На этом этапе SFT-модель становится агентом, политику (π) которого нужно оптимизировать.

Архитектура обучения в этот момент включает несколько моделей:

  1. Актор (Actor): Текущая политика (LLM), которую мы обновляем с помощью PPO.

  2. Критик (Critic): Сеть, которая оценивает value-function (V(S)), чтобы снизить дисперсию Advantage-функции. (в курсе HuggingaFace есть классный раздел про Actor-Critic)

  3. Модель вознаграждения (Reward Model): Выдает основное вознаграждение.

  4. Референсная модель (Reference Model): Замороженная копия исходной SFT-модели, используемая для расчета KL-штрафа

Реальный пример из практики RLHF

Задача: Научить модель давать более вежливые ответы

Контекст: "Мне не нравится твой ответ"
Старая модель: "Ну и что?" (вероятность ответа p=0.3)
Новая модель: "Понимаю, как я могу улучшить ответ?" (вероятность ответаp=0.25)

Вычисление для токена "Понимаю":
π_{old}("Понимаю" | контекст) = 0.08
π_{new}("Понимаю" | контекст) = 0.15
r(θ) = 0.15 / 0.08 = 1.875

Предположим, что у нас есть Reward модель такая, что:

  • Reward модель: +2.3 (высокий - ответ вежливый и конструктивный)

  • Reward: 0.2 (низкий - ответ грубый)

Advantage: +1.8 (Предположим, что Advantage через GAE = 1.8 (высокий, т.к. эмпатия сильно ценится))

r(θ) *Advantage = 1.875 1.8 = 3.375

PPO обновление: усиливаем генерацию "Понимаю"
НО: r(θ) > 1.2 → обрезаем до 1.2 → плавное обновление

Таким образом, получаем clip(r(θ), 1-\epsilon, 1+\epsilon)*Advantage = 1.2*1.8 = 2.16(если бы не было функции clip, то r(θ)*Advantage = 1.875*1.8 = 3.375)

Для последующих токенов применяется аналогично.

И в конце - давайте порисуем!

Для понимания как работает PPO - создадим пару простых примеров на python и визуализируем:

Код на python для визуализации
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

def plot_ppo_clipping_mechanism():
    """График 1: Механизм клиппинга"""
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))

    # Левый график - функция потерь PPO
    r_theta = np.linspace(0.1, 3, 100)
    advantage = 1.0  # Положительное преимущество
    epsilon = 0.2

    # PPO clipped objective
    clip_min = 1 - epsilon
    clip_max = 1 + epsilon

    unclipped = r_theta * advantage
    clipped = np.clip(r_theta, clip_min, clip_max) * advantage
    ppo_loss = np.minimum(unclipped, clipped)

    ax1.plot(r_theta, unclipped, 'r--', alpha=0.7, label='Без клиппинга')
    ax1.plot(r_theta, clipped, 'g--', alpha=0.7, label='Clipped')
    ax1.plot(r_theta, ppo_loss, 'b-', linewidth=2, label='PPO Loss')
    ax1.axvline(x=1, color='k', linestyle=':', alpha=0.5)
    ax1.axvspan(clip_min, clip_max, alpha=0.2, color='green', label='Область клиппинга')
    ax1.set_xlabel('r(θ) = π_new/π_old')
    ax1.set_ylabel('Loss')
    ax1.set_title('Функция потерь PPO с клиппингом')
    ax1.legend()
    ax1.grid(True, alpha=0.3)

    # Правый график - сравнение стабильности
    episodes = np.arange(1000)

    # Имитация обучения разных алгоритмов
    np.random.seed(42)

    # PPO - плавный рост
    ppo_reward = np.cumsum(np.random.normal(0.1, 0.3, 1000))
    ppo_reward = np.maximum(ppo_reward, 0)

    # TRPO - возможны резкие падения
    trpo_reward = np.cumsum(np.random.normal(0.15, 0.8, 1000))
    trpo_reward = np.maximum(trpo_reward, 0)

    ax2.plot(episodes, ppo_reward, 'b-', label='PPO', linewidth=2)
    ax2.plot(episodes, trpo_reward, 'r-', label='TRPO', alpha=0.7)
    ax2.set_xlabel('Эпизоды')
    ax2.set_ylabel('Награда')
    ax2.set_title('Сравнение стабильности обучения')
    ax2.legend()
    ax2.grid(True, alpha=0.3)

    plt.tight_layout()
    plt.show()

def plot_kl_control_in_rlhf():
    """График 4: KL-контроль в RLHF"""
    iterations = np.arange(200)

    # Имитация различных стратегий контроля KL
    np.random.seed(42)

    # Без KL-штрафа
    no_kl = np.cumsum(np.random.normal(0.2, 0.3, 200))

    # С фиксированным KL-штрафом
    with_kl = 2 + np.sin(iterations * 0.1) + np.random.normal(0, 0.1, 200)

    # Адаптивный KL
    adaptive_kl = 1.5 + 0.5 * np.sin(iterations * 0.05) + np.random.normal(0, 0.05, 200)

    plt.figure(figsize=(12, 6))
    plt.plot(iterations, no_kl, 'r-', label='Без KL-штрафа', linewidth=2)
    plt.plot(iterations, with_kl, 'g-', label='С KL-штрафом', linewidth=2)
    plt.plot(iterations, adaptive_kl, 'b-', label='Адаптивный PPO', linewidth=2)

    # Целевой диапазон
    plt.axhspan(1.0, 2.0, alpha=0.2, color='green', label='Целевой диапазон KL')

    plt.xlabel('Итерации PPO')
    plt.ylabel('KL-дивергенция')
    plt.title('Контроль KL-дивергенции в RLHF для LLM')
    plt.legend()
    plt.grid(True, alpha=0.3)
    plt.show()

# Запуск визуализаций
plot_ppo_clipping_mechanism()
plot_kl_control_in_rlhf()
График 1 - Функция потерь PPO с клиппингом и График 2 - Сравнение стабильности обучения
График 1 - Функция потерь PPO с клиппингом и График 2 - Сравнение стабильности обучения
График 3 - Контроль KL-дивергенции в RLHF для LLM
График 3 - Контроль KL-дивергенции в RLHF для LLM

Главные выводы из графиков:

  1. График 1: PPO создает "песочницу" для обновлений политики - внутри зеленой зоны алгоритм свободно экспериментирует, но не может выйти за безопасные границы.

  2. График 2: По сравнению с TRPO (предшественник PPO), PPO показывает более плавную и предсказуемую динамику обучения без резких катастрофических падений.

  3. График 3:

    1. По мере стабилизации политики клиппинг применяется реже.

    2. В RLHF критически важно контролировать KL-дивергенцию, иначе модель может "убежать" в странные области пространства политик.

Именно благодаря Probability Ratio и механизму клиппинга PPO стал таким эффективным для RLHF — он находит баланс между обучением новому поведению и сохранением существующих capabilities модели

Обязательно оставляйте комментарии!

Будут неточности - пишите, если понравилась статья и она Вам помогла понять аспекты RL/RLHF - тоже пишите!

Всех обнял приподнял!!!

Полезные ссылки

https://arxiv.org/abs/2501.11223 - Reasoning Language Models: A Blueprint

https://huggingface.co/learn/deep-rl-course/unit1/introduction - очень классный курс для изучения RL с нуля с теорией и практикой

https://arxiv.org/abs/1707.06347 - оригинальная статья Proximal Policy Optimization Algorithms

Комментарии (2)


  1. qqqqq2
    20.10.2025 05:55

    Хотя бы один пример привели реального обучения


  1. Neo_Art_Z
    20.10.2025 05:55

    Локально это возможно сделать?