TRL documentation

Функции вознаграждения

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.17.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Функции вознаграждения

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

accuracy_reward

trl.rewards.accuracy_reward

< >

( completions: list[list[dict[str, str]]]solution: list[str]log_extra: collections.abc.Callable[[str, list], None] | None = None**kwargs )

Параметры

  • completions (list[list[dict[str, str]]]) — Список завершений для оценки. Каждое завершение должно быть списком из одного сообщения, то есть словарем, содержащим ключ "content" со значением, равным тексту завершения.
  • solution (list[str]) — Список решений к вопросам/задачам/промптам в виде исходного текста.
  • log_extra (callable, необязательный) — Вызываемый объект для записи дополнительных столбцов в таблицу completions, предоставляемый автоматически тренером. По умолчанию None, что позволяет вызывать функцию напрямую вне тренера (например, для тестирования).
  • **kwargs — Дополнительные именованные аргументы. Эта функция не использует их, но они необходимы в сигнатуре функции для обеспечения совместимости с тренерами, такими как GRPOTrainer.

Функция вознаграждения, проверяющая, совпадает ли завершение с эталонным значением.

  • Если и эталонный ответ, и предсказание можно распарсить → используйте проверку по математике.
  • Если gold не распарсивается → верните None, чтобы пропустить пример.

Пример:

>>> from trl.rewards import accuracy_reward

>>> solutions = [r"\frac{1}{3}", r"\frac{1}{3}"]
>>> completions = [
...     [{"role": "assistant", "content": r"My answer is \boxed{\frac{1}{3}}"}],
...     [{"role": "assistant", "content": r"My answer is \boxed{\frac{1}{2}}"}],
... ]
>>> accuracy_reward(completions, solutions)
[1.0, 0.0]

reasoning_accuracy_reward

trl.rewards.reasoning_accuracy_reward

< >

( completions: list[list[dict[str, str]]]solution: list[str]reasoning_delimiters: list[str] | None = Nonelog_extra: collections.abc.Callable[[str, list], None] | None = None**kwargs )

Параметры

  • completions (list[list[dict[str, str]]]) — Список завершений для оценки. Каждое завершение должно быть списком из одного сообщения, то есть словарем, содержащим ключ "content" со значением, равным тексту завершения.
  • solution (list[str]) — Список решений к вопросам/задачам/промптам в виде исходного текста.
  • reasoning_delimiters (list[str]], необязательный) — Список строк, указывающих, где заканчивается содержимое рассуждений. Окончательный ответ предполагается после последнего вхождения любого из этих разделителей. Если None, по умолчанию используется ["</think>"].
  • log_extra (callable, необязательный) — Вызываемый объект для записи дополнительных столбцов в таблицу completions, предоставляемый автоматически тренером. По умолчанию None, что позволяет вызывать функцию напрямую вне тренера (например, для тестирования).
  • **kwargs — Дополнительные именованные аргументы. Эта функция не использует их, но они необходимы в сигнатуре функции для обеспечения совместимости с тренерами, такими как GRPOTrainer.

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

  • Если и эталонный ответ, и предсказание можно распарсить → используйте проверку по математике.
  • Если gold не распарсивается → верните None, чтобы пропустить пример.

Пример:

>>> from trl.rewards import reasoning_accuracy_reward

>>> reasoning_delimiters = ["</think>"]
>>> solutions = [r"\frac{1}{3}", r"\frac{1}{3}", r"\frac{1}{3}"]
>>> completions = [
...     [
...         {
...             "role": "assistant",
...             "content": r"<think> Reasoning content </think> The final answer is \boxed{\frac{1}{3}}",
...         }
...     ],
...     [
...         {
...             "role": "assistant",
...             "content": r"<think> Reasoning content </think> The final answer is \boxed{\frac{1}{2}}",
...         }
...     ],
...     [
...         {
...             "role": "assistant",
...             "content": r"<think> Reasoning content with partial answers \boxed{\frac{1}{3}} but no final answer",
...         }
...     ],
... ]
>>> reasoning_accuracy_reward(completions, solutions, reasoning_delimiters=reasoning_delimiters)
[1.0, 0.0, 0.0]

get_cosine_scaled_reward

trl.rewards.get_cosine_scaled_reward

< >

( max_len: intmin_value_wrong: float = -1.0max_value_wrong: float = -0.5min_value_correct: float = 0.5max_value_correct: float = 1.0 ) → Callable

Параметры

  • max_len (int) — Максимальная длина завершения (в токенах), используемая для нормализации косинусной расписки, $L_{\max}$.
  • min_value_wrong (float, необязательный, по умолчанию -1.0) — Награда за неверное завершение минимальной длины.
  • max_value_wrong (float, необязательный, по умолчанию -0.5) — Награда за неверное завершение при максимальной длине.
  • min_value_correct (float, необязательный, по умолчанию 0.5) — Награда за правильный ответ при максимальной длине.
  • max_value_correct (float, необязательный, по умолчанию 1.0) — Награда за правильное завершение минимальной длины.

Возвращает

Callable

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

Функция вознаграждения, масштабирующая награду за правильность в зависимости от длины завершения по косинусной шкале, чтобы поощрять лаконичное рассуждение. Ссылка: Приложение C.1 статьи «Demystifying Long Chain-of-Thought Reasoning» (https://huggingface.co/papers/2502.03373).

Корректность определяется математической проверкой (как в accuracy_reward()), а длина — количеством токенов завершения. Награда интерполируется по косинусной шкале между границей для короткого и длинного завершения: Rcosine(y)=vmin⁡+12(vmax⁡−vmin⁡)(1+cos⁡(∣y∣Lmax⁡π)) R_{\text{cosine}}(y) = v_{\min} + \frac{1}{2}(v_{\max} - v_{\min})\left(1 + \cos\left(\frac{|y|}{L_{\max}}\pi\right)\right)

Для верного завершения $(v{\min}, v{\max}) = (\texttt{min_value_correct}, \texttt{max_value_correct})$, поэтому более короткое завершение получает более высокую награду. Для неверного завершения границы меняются местами: $(v{\min}, v{\max}) = (\texttt{max_value_wrong}, \texttt{min_value_wrong})$, поэтому более короткое завершение наказывается сильнее (более длинное неверное завершение наказывается слабее, что сохраняет разведку). Если эталонное решение невозможно разобрать, пример пропускается (награда None), как в accuracy_reward().

Пример:

>>> from trl.rewards import get_cosine_scaled_reward

>>> cosine_scaled_reward = get_cosine_scaled_reward(max_len=100)
>>> completions = [[{"content": r"\boxed{\frac{1}{3}}"}], [{"content": r"\boxed{\frac{1}{2}}"}]]
>>> solution = [r"\frac{1}{3}", r"\frac{1}{3}"]
>>> completion_ids = [[1] * 50, [1] * 50]  # both completions are 50 tokens, half of max_len
>>> cosine_scaled_reward(completions, solution, completion_ids)
[0.75, -0.75]

think_format_reward

trl.rewards.think_format_reward

< >

( completions: list[list[dict[str, str]]]**kwargs ) → list[float]

Параметры

  • completions (list[list[dict[str, str]]]) — Список завершений для оценки. Каждое завершение должно быть списком из одного сообщения, то есть словарем, содержащим ключ "content" со значением, равным тексту завершения.
  • **kwargs — Дополнительные именованные аргументы. Эта функция не использует их, но они необходимы в сигнатуре функции для обеспечения совместимости с тренерами, такими как GRPOTrainer.

Возвращает

list[float]

Список вознаграждений, где каждое вознаграждение равно 1.0, если завершение соответствует ожидаемому формату, иначе 0.0.

Функция вознаграждения, проверяющая, заключён ли процесс рассуждения в теги "<think>" и "</think>". Функция возвращает вознаграждение 1.0, если формат корректен, иначе 0.0.

Пример:

>>> from trl.rewards import think_format_reward

>>> completions = [
...     [{"content": "<think>\nThis is my reasoning.\n</think>\nThis is my answer."}],
...     [{"content": "<think>\nThis is my reasoning.\nThis is my answer."}],
... ]
>>> think_format_reward(completions)
[1.0, 0.0]

get_repetition_penalty_reward

trl.rewards.get_repetition_penalty_reward

< >

( ngram_size: int = 3max_penalty: float = -1.0 ) → Callable

Параметры

  • ngram_size (int, необязательный, по умолчанию 3) — Размер токенов n-грамм, которые следует учитывать.
  • max_penalty (float, необязательный, по умолчанию -1.0) — Максимально отрицательное штрафное значение, применяемое к полностью повторяющемуся завершению. Должно быть неотрицательным.

Возвращает

Callable

Функция вознаграждения, которая принимает список идентификаторов токенов завершения и возвращает список штрафов (каждый в диапазоне [max_penalty, 0.0]).

Функция вознаграждения, штрафующая за повторяющиеся n-граммы в завершении, используется для предотвращения дегенеративного, повторяющегося текста (типичный режим отказа и стратегия обмана вознаграждения при использовании вознаграждений, формирующих длину или формат). Ссылка: Приложение C.2 статьи «Demystifying Long Chain-of-Thought Reasoning» (https://huggingface.co/papers/2502.03373).

Штраф пропорционален доле повторяющихся n-грамм в завершении: Rrepetition(y)=(1−# unique n-grams# total n-grams)×p R_{\text{repetition}}(y) = \left(1 - \frac{\#\,\text{unique } n\text{-grams}}{\#\,\text{total } n\text{-grams}}\right) \times p

где pp — это max_penalty. Завершение без повторяющихся n-грамм получает награду 0.0, а полностью повторяющееся стремится к max_penalty. N-граммы вычисляются по идентификаторам токенов завершения (в статье штраф применяется к повторяющимся токенам), поэтому награда определяется токенизатором и не зависит от языка. Завершения, содержащие менее ngram_size токенов, получают награду 0.0.

Пример:

>>> from trl.rewards import get_repetition_penalty_reward

>>> repetition_penalty = get_repetition_penalty_reward(ngram_size=2, max_penalty=-1.0)
>>> completion_ids = [[1, 2, 3, 4], [5, 5, 5, 5, 5]]
>>> repetition_penalty(completion_ids)
[0.0, -0.75]

get_soft_overlong_punishment

trl.rewards.get_soft_overlong_punishment

< >

( max_completion_len: intsoft_punish_cache: int )

Параметры

  • max_completion_len (int) — Максимальная длина завершения, ( L_{\max} ).
  • soft_punish_cache (int) — Минимальная длина завершения, ( L_{\text{cache}‌} ). Если установлено значение 0, минимальная длина не применяется.

Функция вознаграждения, штрафующая за слишком длинные завершения. Она используется для наказания за слишком длинные завершения, но не для поощрения более коротких. Ссылка: уравнение (13) из статьи DAPO (https://huggingface.co/papers/2503.14476) Rlength(y)={0,∣y∣≤Lmax⁡−Lcache(Lmax⁡−Lcache)−∣y∣Lcache,Lmax⁡−Lcache<∣y∣≤Lmax⁡−1,Lmax⁡<∣y∣ R_{\text{length}}(y) = \begin{cases} 0, & |y| \le L_{\max} - L_{\text{cache}} \\ \dfrac{(L_{\max} - L_{\text{cache}}) - |y|}{L_{\text{cache}}}, & L_{\max} - L_{\text{cache}} < |y| \le L_{\max} \\ -1, & L_{\max} < |y| \end{cases}

Пример:

>>> from trl.rewards import get_soft_overlong_punishment

>>> soft_overlong_punishment = get_soft_overlong_punishment(max_completion_len=100, soft_punish_cache=20)
>>> completion_ids = [[1] * 90]  # simulating a completion with 90 tokens. 90 is between 80 and 100.
>>> soft_overlong_punishment(completion_ids)
>>> [-0.5]
Update on GitHub