TRL documentation
Функции вознаграждения
Функции вознаграждения
Этот модуль содержит ряд полезных функций вознаграждения, предназначенных в первую очередь для использования с GRPOTrainer и RLOOTrainer.
accuracy_reward
trl.rewards.accuracy_reward
< source >( 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
< source >( 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
< source >( 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()), а длина — количеством токенов завершения. Награда интерполируется по косинусной шкале между границей для короткого и длинного завершения:
Для верного завершения $(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
< source >( 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.
get_repetition_penalty_reward
trl.rewards.get_repetition_penalty_reward
< source >( 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-грамм в завершении:
где — это max_penalty. Завершение без повторяющихся n-грамм получает награду 0.0, а полностью повторяющееся стремится к max_penalty. N-граммы вычисляются по идентификаторам токенов завершения (в статье штраф применяется к повторяющимся токенам), поэтому награда определяется токенизатором и не зависит от языка. Завершения, содержащие менее ngram_size токенов, получают награду 0.0.
get_soft_overlong_punishment
trl.rewards.get_soft_overlong_punishment
< source >( max_completion_len: intsoft_punish_cache: int )
Функция вознаграждения, штрафующая за слишком длинные завершения. Она используется для наказания за слишком длинные завершения, но не для поощрения более коротких. Ссылка: уравнение (13) из статьи DAPO (https://huggingface.co/papers/2503.14476)
Пример:
>>> 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]