TRL documentation
Hàm phần thưởng
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
< source >( 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
< 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 )
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
< 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
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:
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
< source >( 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.
get_repetition_penalty_reward
trl.rewards.get_repetition_penalty_reward
< source >( 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:
trong đó 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.
get_soft_overlong_punishment
trl.rewards.get_soft_overlong_punishment
< source >( max_completion_len: intsoft_punish_cache: int )
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)
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]