TRL documentation

Hàm phần thưởng

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

and get access to the augmented documentation experience

to get started

Hàm phần thưởng

Module này chứa một số hàm phần thưởng hữu ích, chủ yếu được thiết kế để sử dụng với GRPOTrainer và 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 )

Tham số

  • completions (list[list[dict[str, str]]]) — Danh sách các completion cần được đánh giá. Mỗi completion phải là một danh sách chứa một message, tức là một dictionary chứa khóa "content" với giá trị là văn bản của completion.
  • solution (list[str]) — Danh sách các giải pháp dạng văn bản thô cho các câu hỏi/bài toán/lời nhắc.
  • log_extra (callable, tùy chọn) — Callable để ghi log các cột bổ sung vào bảng completions, được cung cấp tự động bởi trainer. Mặc định là None để cho phép gọi hàm trực tiếp bên ngoài trainer (ví dụ: để kiểm thử).
  • **kwargs — Các đối số từ khóa bổ sung. Hàm này không sử dụng chúng, nhưng chúng là bắt buộc trong chữ ký hàm để đảm bảo tương thích với các trainer như GRPOTrainer.

Hàm phần thưởng kiểm tra xem kết quả hoàn thành có khớp với giá trị thực tế hay không.

  • Nếu cả gold và prediction đều có thể phân tích được → sử dụng kiểm tra toán học.
  • Nếu gold không thể phân tích được → trả về None để bỏ qua ví dụ.

Ví dụ:

>>> 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 )

Tham số

  • completions (list[list[dict[str, str]]]) — Danh sách các completion cần được đánh giá. Mỗi completion phải là một danh sách chứa một message, tức là một dictionary chứa khóa "content" với giá trị là văn bản của completion.
  • solution (list[str]) — Danh sách các giải pháp dạng văn bản thô cho các câu hỏi/bài toán/lời nhắc.
  • reasoning_delimiters (list[str]], tùy chọn) — Danh sách các chuỗi chỉ định nơi nội dung suy luận kết thúc. Phần trả lời cuối cùng được giả định là nằm sau lần xuất hiện cuối cùng của bất kỳ bộ phân tách nào trong danh sách này. Nếu là None, mặc định là ["</think>"].
  • log_extra (callable, tùy chọn) — Callable để ghi log các cột bổ sung vào bảng completions, được cung cấp tự động bởi trainer. Mặc định là None để cho phép gọi hàm trực tiếp bên ngoài trainer (ví dụ: để kiểm thử).
  • **kwargs — Các đối số từ khóa bổ sung. Hàm này không sử dụng chúng, nhưng chúng là bắt buộc trong chữ ký hàm để đảm bảo tương thích với các trainer như GRPOTrainer.

Hàm phần thưởng loại bỏ nội dung suy luận và kiểm tra xem câu trả lời cuối cùng có khớp với đáp án chuẩn hay không.

  • Nếu cả gold và prediction đều có thể phân tích được → sử dụng kiểm tra toán học.
  • Nếu gold không thể phân tích được → trả về None để bỏ qua ví dụ.

Ví dụ:

>>> 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

Tham số

  • max_len (int) — Độ dài tối đa của phần hoàn thành (tính bằng token) được sử dụng để chuẩn hóa lịch cosine, $L_{\max}$.
  • min_value_wrong (float, tùy chọn, mặc định là -1.0) — Phần thưởng cho một câu trả lời sai ở độ dài ngắn nhất.
  • max_value_wrong (float, tùy chọn, mặc định là -0.5) — Phần thưởng cho một câu trả lời sai ở độ dài tối đa.
  • min_value_correct (float, không bắt buộc, mặc định là 0.5) — Phần thưởng cho một câu trả lời đúng ở độ dài dài nhất.
  • max_value_correct (float, tùy chọn, mặc định là 1.0) — Phần thưởng cho một câu trả lời đúng ở độ dài ngắn nhất.

Trả về

Callable

Một hàm phần thưởng nhận các câu trả lời, giải pháp tương ứng và các id token, sau đó trả về một danh sách các phần thưởng (None cho các ví dụ có giải pháp chuẩn không thể phân tích được).

Hàm phần thưởng nhân phần thưởng độ chính xác với độ dài câu trả lời theo lịch cosine, nhằm ưu tiên lập luận ngắn gọn. Tham khảo: Phụ lục C.1 của bài báo “Demystifying Long Chain-of-Thought Reasoning” (https://huggingface.co/papers/2502.03373).

Tính chính xác được xác định bằng cách kiểm tra toán học (như trong accuracy_reward()), và độ dài là số lượng token hoàn thành. Phần thưởng được nội suy theo lịch cosine giữa cận hoàn thành ngắn và cận hoàn thành dài: 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ới một câu trả lời đúng, $(v{\min}, v{\max}) = (\texttt{min_value_correct}, \texttt{max_value_correct})$, do đó câu trả lời ngắn hơn sẽ được thưởng nhiều hơn. Với một câu trả lời sai, các cận sẽ được hoán đổi thành $(v{\min}, v{\max}) = (\texttt{max_value_wrong}, \texttt{min_value_wrong})$, do đó câu trả lời ngắn hơn sẽ bị phạt nhiều hơn (câu trả lời sai dài hơn sẽ bị phạt ít hơn, giúp duy trì khả năng khám phá). Khi giải pháp chuẩn không thể phân tích được, ví dụ đó sẽ bị bỏ qua (thưởng là None), giống như trong accuracy_reward().

Ví dụ:

>>> 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]

Tham số

  • completions (list[list[dict[str, str]]]) — Danh sách các completion cần được đánh giá. Mỗi completion phải là một danh sách chứa một message, tức là một dictionary chứa khóa "content" với giá trị là văn bản của completion.
  • **kwargs — Các đối số từ khóa bổ sung. Hàm này không sử dụng chúng, nhưng chúng là bắt buộc trong chữ ký hàm để đảm bảo tương thích với các trainer như GRPOTrainer.

Trả về

list[float]

Một danh sách các phần thưởng, trong đó mỗi phần thưởng là 1.0 nếu kết quả hoàn thành khớp với định dạng mong đợi, ngược lại là 0.0.

Hàm thưởng kiểm tra xem quá trình suy luận có được bao bọc trong các thẻ "<think>" và "</think>" hay không. Hàm này trả về phần thưởng 1.0 nếu định dạng đúng, ngược lại là 0.0.

Ví dụ:

>>> 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

Tham số

  • ngram_size (int, tùy chọn, mặc định là 3) — Kích thước của các n-gram token cần xem xét.
  • max_penalty (float, tùy chọn, mặc định là -1.0) — Phạt tiêu cực nhất, được áp dụng cho một phần hoàn thành lặp lại hoàn toàn. Phải không dương.

Trả về

Callable

Một hàm phần thưởng nhận vào một danh sách các id token hoàn thành và trả về một danh sách các hình phạt (mỗi hình phạt nằm trong [max_penalty, 0.0]).

Hàm phần thưởng phạt các n-gram lặp lại trong một câu trả lời, được sử dụng để ngăn chặn văn bản suy thoái, lặp đi lặp lại (một chế độ lỗi phổ biến và chiến lược gian lận phần thưởng khi sử dụng các phần thưởng định hình độ dài hoặc định dạng). Tham khảo: Phụ lục C.2 của bài báo “Demystifying Long Chain-of-Thought Reasoning” (https://huggingface.co/papers/2502.03373).

Phạt tỷ lệ thuận với tỷ lệ n-gram lặp lại trong phần hoàn thành: 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

trong đó pp là max_penalty. Một completion không có n-gram lặp lại sẽ nhận phần thưởng là 0.0, trong khi một completion hoàn toàn lặp lại sẽ tiến gần đến max_penalty. Các n-gram được tính trên các token id của completion (bài báo áp dụng hình phạt cho các token lặp lại), do đó phần thưởng được định nghĩa bởi tokenizer và không phụ thuộc vào ngôn ngữ. Các completion có ít hơn ngram_size token sẽ nhận phần thưởng là 0.0.

Ví dụ:

>>> 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 )

Tham số

  • max_completion_len (int) — Độ dài tối đa của phần hoàn thành, ( L_{\max} ).
  • soft_punish_cache (int) — Độ dài tối thiểu của phần hoàn thành, ( L_{\text{cache}‌} ). Nếu đặt thành 0, sẽ không áp dụng độ dài tối thiểu.

Hàm phần thưởng phạt các câu trả lời quá dài. Nó được sử dụng để phạt các câu trả lời quá dài, nhưng không dùng để thưởng cho các câu trả lời ngắn hơn. Tham khảo: Phương trình (13) từ bài báo 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}

Ví dụ:

>>> 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