TRL documentation

KTO Trainer

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

KTO Trainer

All_models-KTO-blue

Tổng quan

TRL hỗ trợ bộ huấn luyện Tối ưu hóa Kahneman-Tversky (KTO) để huấn luyện các mô hình ngôn ngữ, như được mô tả trong bài báo KTO: Model Alignment as Prospect Theoretic Optimization của Kawin Ethayarajh, Winnie Xu, Niklas Muennighoff, Dan Jurafsky, Douwe Kiela.

Tóm tắt từ bài báo như sau:

Lý thuyết triển vọng của Kahneman & Tversky cho thấy con người nhận thức các biến ngẫu nhiên theo một cách có thiên kiến nhưng được xác định rõ ràng; chẳng hạn, con người nổi tiếng là tránh thua lỗ. Chúng tôi chỉ ra rằng các hàm mục tiêu để căn chỉnh LLM với phản hồi của con người ngầm tích hợp nhiều thiên kiến này — thành công của các hàm mục tiêu này (ví dụ: DPO) so với việc tối thiểu hóa entropy chéo có thể một phần được quy cho việc chúng là các hàm mất mát nhận thức con người (HALOs). Tuy nhiên, các hàm tiện ích mà các phương pháp này gán cho con người vẫn khác so với những hàm trong tài liệu về lý thuyết triển vọng. Sử dụng mô hình tiện ích con người của Kahneman-Tversky, chúng tôi đề xuất một HALO trực tiếp tối đa hóa tiện ích của các bản sinh thay vì tối đa hóa log-likelihood của các sở thích, như các phương pháp hiện tại đang làm. Chúng tôi gọi cách tiếp cận này là Tối ưu hóa Kahneman-Tversky (KTO), và nó đạt hoặc vượt hiệu suất của các phương pháp dựa trên sở thích ở quy mô từ 1B đến 30B. Quan trọng là, KTO không cần dữ liệu sở thích — chỉ cần một tín hiệu nhị phân về việc một đầu ra có mong muốn hay không mong muốn cho một đầu vào nhất định. Điều này khiến nó dễ sử dụng hơn nhiều trong thực tế, nơi dữ liệu sở thích khan hiếm và đắt đỏ.

Mã nguồn chính thức có thể được tìm thấy tại ContextualAI/HALOs.

Phương pháp hậu huấn luyện này được đóng góp bởi Kashif Rasul, Younes Belkada, Lewis Tunstall, Pablo Vicente, và sau đó được tái cấu trúc bởi Albert Villanova del Moral.

Bắt đầu nhanh

Ví dụ này minh họa cách huấn luyện một mô hình bằng phương pháp KTO. Chúng ta sử dụng mô hình Qwen 0.5B làm mô hình cơ sở. Chúng ta sử dụng dữ liệu ưu tiên từ KTO Mix 14k. Bạn có thể xem dữ liệu trong bộ dữ liệu tại đây:

Dưới đây là script để huấn luyện mô hình:

# train_kto.py
from datasets import load_dataset
from trl import KTOConfig, KTOTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
train_dataset = load_dataset("trl-lib/kto-mix-14k", split="train")

training_args = KTOConfig(output_dir="Qwen2-0.5B-KTO")
trainer = KTOTrainer(model=model, args=training_args, processing_class=tokenizer, train_dataset=train_dataset)
trainer.train()

Chạy script bằng lệnh sau:

accelerate launch train_kto.py

Được phân phối trên 8 x GPU H100, quá trình huấn luyện mất khoảng 30 phút. Bạn có thể kiểm tra tiến độ huấn luyện bằng cách xem biểu đồ phần thưởng. Xu hướng tăng của biên độ phần thưởng cho thấy mô hình đang cải thiện và tạo ra các phản hồi tốt hơn theo thời gian.

kto qwen2 reward margin

Để xem mô hình đã huấn luyện hoạt động như thế nào, bạn có thể sử dụng Transformers Chat CLI.

$ transformers chat trl-lib/Qwen2-0.5B-KTO
<quentin_gallouedec>:
What is the best programming language?

<trl-lib/Qwen2-0.5B-KTO>:
The best programming language can vary depending on individual preferences, industry-specific requirements, technical skills, and familiarity with the specific use case or task. Here are some widely-used programming languages that have been noted as popular and widely used:

Here are some other factors to consider when choosing a programming language for a project:

 1 JavaScript: JavaScript is at the heart of the web and can be used for building web applications, APIs, and interactive front-end applications like frameworks like React and Angular. It's similar to C, C++, and F# in syntax structure and is accessible and easy to learn, making it a popular choice for beginners and professionals alike.
 2 Java: Known for its object-oriented programming (OOP) and support for Java 8 and .NET, Java is used for developing enterprise-level software applications, high-performance games, as well as mobile apps, game development, and desktop applications.
 3 C++: Known for its flexibility and scalability, C++ offers comprehensive object-oriented programming and is a popular choice for high-performance computing and other technical fields. It's a powerful platform for building real-world applications and games at scale.
 4 Python: Developed by Guido van Rossum in 1991, Python is a high-level, interpreted, and dynamically typed language known for its simplicity, readability, and versatility.

Loại và định dạng bộ dữ liệu mong đợi

KTO yêu cầu một tập dữ liệu thích thích không ghép cặp. Ngoài ra, bạn có thể cung cấp một tập dữ liệu thích thích ghép cặp (còn được gọi đơn giản là tập dữ liệu thích thích). Trong trường hợp này, trình huấn luyện sẽ tự động chuyển đổi nó sang định dạng không ghép cặp bằng cách tách các phản hồi được chọn và bị từ chối, gán label = True cho các phần hoàn thành được chọn và label = False cho các phần bị từ chối.

KTOTrainer tương thích với cả định dạng tập dữ liệu chuẩn và đối thoại. Khi được cung cấp một tập dữ liệu đối thoại, trình huấn luyện sẽ tự động áp dụng mẫu trò chuyện (chat template) lên tập dữ liệu đó.

# Standard format
unpaired_preference_example = {"prompt": "The sky is", "completion": " blue.", "label": True}

# Conversational format
unpaired_preference_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}],
                               "completion": [{"role": "assistant", "content": "It is blue."}],
                               "label": True}

Về mặt lý thuyết, tập dữ liệu nên chứa ít nhất một phần hoàn thành được chọn và một phần hoàn thành bị từ chối. Tuy nhiên, một số người dùng đã chạy thành công KTO chỉ sử dụng chỉ dữ liệu được chọn hoặc chỉ dữ liệu bị từ chối. Nếu chỉ sử dụng dữ liệu bị từ chối, nên áp dụng tốc độ học bảo thủ.

Tìm hiểu sâu hơn về phương pháp KTO

Kahneman-Tversky Optimization (KTO) là một phương pháp huấn luyện được thiết kế để điều chỉnh một mô hình ngôn ngữ bằng cách chỉ sử dụng tín hiệu nhị phân cho biết một đầu ra là mong muốn hay không mong muốn đối với một đầu vào cụ thể, thay vì các cặp hoàn thành được ưu thích/không được ưu thích. Dựa trên lý thuyết triển vọng của Kahneman và Tversky, phương pháp này xác định một mất mát nhận thức con người (HALO) trực tiếp tối đa hóa tiện ích của các chuỗi sinh ra, trong đó các ví dụ mong muốn và không mong muốn được gán trọng số bất đối xứng để phản ánh sự né tránh tổn thất của con người.

Phần này phân tích cách KTO hoạt động trên thực tế, bao gồm các bước chính: xử lý trước và tính toán hàm mất mát.

Tiền xử lý và phân từ

Trong quá trình huấn luyện, mỗi ví dụ được kỳ vọng chứa một prompt, một completion và một label boolean cho biết completion có mong muốn (True) hay không mong muốn (False). Để biết thêm chi tiết về các định dạng được kỳ vọng, xem Dataset formats. KTOTrainer sẽ tokenize mỗi đầu vào bằng tokenizer của mô hình.

Tính toán tổn thất

Số hạng phân kỳ KL được sử dụng bởi tổn thất KTO được ước lượng bằng cách ghép mỗi prompt với một phần hoàn thành không khớp được lấy từ nơi khác trong batch. Vì lý do này, các loại tổn thất ước lượng số hạng KL (tất cả ngoại trừ apo_zero_unpaired) yêu cầu kích thước batch huấn luyện trên mỗi thiết bị lớn hơn 1 và chiến lược lấy mẫu tuần tự, để các cặp không khớp ổn định trong suốt một batch.

Mất được sử dụng trong KTO (Phương trình 7 của bài báo) được định nghĩa như sau: LKTO(θ)=E(x,y) ⁣[w(y)(1−v(x,y))] \mathcal{L}_{\mathrm{KTO}}(\theta) = \mathbb{E}_{(x,y)}\!\left[ w(y)\Big(1 - v(x, y)\Big) \right]

trong đó giá trị v(x,y) v(x, y) là v(x,y)={σ ⁣(β(log⁡πθ(y∣x)πref(y∣x)−KL))if y is desirableσ ⁣(β(KL−log⁡πθ(y∣x)πref(y∣x)))if y is undesirable v(x, y) = \begin{cases} \sigma\!\left(\beta\big(\log\frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} - \mathrm{KL}\big)\right) & \text{if } y \text{ is desirable} \\ \sigma\!\left(\beta\big(\mathrm{KL} - \log\frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)}\big)\right) & \text{if } y \text{ is undesirable} \end{cases}

Ở đây x x là prompt, y y là completion, πθ \pi_{\theta} là mô hình policy đang được huấn luyện, πref \pi_{\mathrm{ref}} là mô hình tham chiếu, σ \sigma là hàm sigmoid, β>0 \beta > 0 kiểm soát mức độ sai lệch so với mô hình tham chiếu, và KL \mathrm{KL} là số hạng phân kỳ KL ước tính. Trọng số w(y) w(y) là desirable_weight cho các completion mong muốn và undesirable_weight cho các completion không mong muốn, được sử dụng để khắc phục sự mất cân bằng giữa số lượng ví dụ mong muốn và không mong muốn.

Các loại hàm mất mát

loss_type=Mô tả
"kto" (mặc định)Mất KTO từ bài báo KTO. Một hàm mất nhận thức về con người (HALO) dựa trên lý thuyết triển vọng Kahneman-Tversky, tối đa hóa tiện ích của các phần hoàn thành mong muốn và tối thiểu hóa nó cho các phần không mong muốn, sử dụng một số hạng phân kỳ KL ước lượng làm điểm tham chiếu.
"apo_zero_unpaired"Biến thể không ghép cặp của hàm mất APO-zero từ bài báo APO. Nó làm tăng khả năng xuất hiện các phần hoàn thiện mong muốn và giảm khả năng xuất hiện các phần hoàn thiện không mong muốn mà không cần ước lượng số hạng phân kỳ KL. Hãy sử dụng hàm mất này khi bạn tin rằng các phần hoàn thiện mong muốn tốt hơn so với đầu ra mặc định của mô hình.

Các chỉ số được ghi log

Trong quá trình huấn luyện và đánh giá, chúng ta ghi lại các chỉ số sau:

  • global_step: Tổng số bước tối ưu hóa đã thực hiện cho đến nay.
  • epoch: Số epoch hiện tại, dựa trên việc lặp qua tập dữ liệu.
  • num_tokens: Tổng số token đã được xử lý cho đến hiện tại.
  • loss: Mất KTO trung bình trong khoảng thời gian ghi log hiện tại.
  • entropy: Entropy trung bình của phân phối token dự đoán của mô hình trên các token không bị mask.
  • aux_loss: Tổn phụ trợ cân bằng tải của mô hình Mixture-of-Experts, trước khi được nhân với router_aux_loss_coef và cộng vào tổn. Chỉ được ghi log khi mô hình là mô hình MoE và router_aux_loss_coef khác không.
  • kl: Trung bình của độ phân kỳ KL ước tính giữa mô hình chính sách và mô hình tham chiếu, được dùng làm điểm tham chiếu trong tổn thất KTO.
  • learning_rate: Tốc độ học hiện tại, có thể thay đổi động nếu sử dụng trình lập lịch.
  • grad_norm: Chuẩn L2 của các gradient, được tính trước khi cắt gradient.
  • logits/chosen: Giá trị logit trung bình mà mô hình gán cho các token trong phần hoàn thành được chọn (mong muốn).
  • logits/rejected: Giá trị logit trung bình mà mô hình gán cho các token trong phần hoàn thành bị từ chối (không mong muốn).
  • logps/chosen: Xác suất log trung bình mà mô hình gán cho các token trong phần hoàn thành được chọn (mong muốn).
  • logps/rejected: Xác suất log trung bình mà mô hình gán cho các token trong phần hoàn thành bị từ chối (không mong muốn).
  • rewards/chosen: Phần thưởng ẩn trung bình được tính cho phần hoàn thành được chọn (mong muốn), được tính bằng βlog⁡πθ(y∣x)πref(y∣x) \beta \log \frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} .
  • rewards/rejected: Phần thưởng trung bình ẩn được tính cho phần hoàn thành bị từ chối (không mong muốn), được tính bằng βlog⁡πθ(y∣x)πref(y∣x) \beta \log \frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} .
  • rewards/margins: Biên độ phần thưởng ẩn trung bình giữa các câu trả lời được chọn và bị từ chối.

Tùy chỉnh

Tương thích và ràng buộc

Một số tổ hợp tham số bị hạn chế có chủ đích trong triển khai KTOTrainer hiện tại:

  • PEFT adapters nhắm vào lm_head không được hỗ trợ (hãy dùng modules_to_save=["lm_head"] thay thế).
  • sync_ref_model=True không được hỗ trợ khi huấn luyện với các mô hình PEFT không giữ một ref_model độc lập.
  • sync_ref_model=True không thể kết hợp với precompute_ref_log_probs=True.
  • precompute_ref_log_probs=True không được hỗ trợ với IterableDataset (train hoặc eval) hoặc với các bộ dữ liệu thị giác.
  • Các loại loss ước lượng thành phần KL divergence (tất cả ngoại trừ "apo_zero_unpaired") yêu cầu train_sampling_strategy="sequential" và kích thước train batch trên mỗi thiết bị lớn hơn 1.

Khởi tạo mô hình

Bạn có thể truyền trực tiếp các kwargs của phương thức from_pretrained() vào KTOConfig. Ví dụ, nếu bạn muốn tải một mô hình ở độ chính xác khác, tương tự như

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct", dtype=torch.bfloat16)

Bạn có thể thực hiện điều này bằng cách truyền đối số model_init_kwargs={"dtype": torch.bfloat16} vào KTOConfig.

from trl import KTOConfig

training_args = KTOConfig(
    model_init_kwargs={"dtype": torch.bfloat16},
)

Lưu ý rằng tất cả các đối số từ khóa của from_pretrained() đều được hỗ trợ.

Huấn luyện adapter với PEFT

Chúng tôi hỗ trợ tích hợp chặt chẽ với thư viện 🤗 PEFT, cho phép bất kỳ người dùng nào thuận tiện huấn luyện các adapter và chia sẻ chúng trên Hub, thay vì phải huấn luyện toàn bộ mô hình.

from datasets import load_dataset
from trl import KTOTrainer
from peft import LoraConfig

dataset = load_dataset("trl-lib/kto-mix-14k", split="train")

trainer = KTOTrainer(
    "Qwen/Qwen2-0.5B-Instruct",
    train_dataset=dataset,
    peft_config=LoraConfig(),
)

trainer.train()

Bạn cũng có thể tiếp tục huấn luyện PeftModel của mình. Để làm điều đó, trước tiên hãy tải một PeftModel bên ngoài KTOTrainer và truyền nó trực tiếp cho trainer mà không truyền đối số peft_config.

Khi huấn luyện adapter, bạn thường sử dụng tốc độ học cao hơn so với fine-tuning toàn bộ vì chỉ có các tham số mới được học.

Gọi công cụ với KTO

KTOTrainer hỗ trợ đầy đủ việc tinh chỉnh mô hình có khả năng tool calling. Trong trường hợp này, mỗi ví dụ trong bộ dữ liệu nên bao gồm:

  • Các tin nhắn hội thoại (prompt và completion), bao gồm các cuộc gọi công cụ (tool_calls) và phản hồi công cụ (tin nhắn có vai trò tool)
  • Danh sách các công cụ khả dụng trong cột tools, thường được cung cấp dưới dạng schema JSON

Để biết chi tiết về cấu trúc bộ dữ liệu mong đợi, hãy xem phần Định dạng Dataset — Tool Calling.

Huấn luyện Mô hình Ngôn ngữ Thị giác

KTOTrainer hỗ trợ đầy đủ việc huấn luyện các Mô hình Ngôn ngữ - Thị giác (VLM). Để huấn luyện một VLM, hãy cung cấp một tập dữ liệu có cột image (một hình ảnh cho mỗi mẫu) hoặc cột images (danh sách các hình ảnh cho mỗi mẫu). Để biết thêm thông tin về cấu trúc tập dữ liệu mong đợi, hãy xem phần Định dạng tập dữ liệu — Tập dữ liệu thị giác.

from trl import KTOConfig, KTOTrainer
from datasets import load_dataset

trainer = KTOTrainer(
    model="Qwen/Qwen2.5-VL-3B-Instruct",
    args=KTOConfig(max_length=None),
    train_dataset=load_dataset("trl-internal-testing/zen-image", "conversational_unpaired_preference", split="train"),
)
trainer.train()

Đối với VLM, việc cắt ngắn có thể loại bỏ các token hình ảnh, dẫn đến lỗi trong quá trình huấn luyện. Để tránh điều này, hãy đặt max_length=None trong KTOConfig. Điều này cho phép mô hình xử lý độ dài chuỗi đầy đủ mà không cắt ngắn các token hình ảnh.

KTOConfig(max_length=None, ...)

Chỉ sử dụng max_length khi bạn đã xác minh rằng việc cắt bớt sẽ không loại bỏ các token hình ảnh cho toàn bộ bộ dữ liệu.

Mẫu script

Chúng tôi cung cấp một script mẫu để huấn luyện mô hình bằng phương pháp KTO. Script này có sẵn tại trl/scripts/kto.py

Để kiểm tra kịch bản KTO với mô hình Qwen2 0.5B trên dataset UltraFeedback, hãy chạy lệnh sau:

accelerate launch trl/scripts/kto.py \
    --model_name_or_path Qwen/Qwen2-0.5B-Instruct \
    --dataset_name trl-lib/kto-mix-14k \
    --num_train_epochs 1 \
    --output_dir Qwen2-0.5B-KTO

Mẹo sử dụng

Đối với các Mô hình Hỗn hợp Chuyên gia: Bật tổn thất bổ trợ

MOE đạt hiệu quả cao nhất khi tải được phân bổ gần như đồng đều giữa các chuyên gia.
Để đảm bảo việc huấn luyện MOE tương tự trong quá trình tinh chỉnh theo sở thích, việc bổ sung tổn thất phụ từ bộ cân bằng tải vào tổn thất cuối cùng là rất có lợi.

Tùy chọn này được bật bằng cách đặt output_router_logits=True trong cấu hình mô hình (ví dụ MixtralConfig).
Để điều chỉnh mức độ đóng góp của tổn thất phụ vào tổng tổn thất, hãy sử dụng siêu tham số router_aux_loss_coef=... (mặc định: 0.001) trong cấu hình mô hình.

Gợi ý về kích thước lô

Hãy sử dụng kích thước lô (batch size) cho mỗi bước ít nhất là 4, và kích thước lô hiệu dụng nằm trong khoảng từ 16 đến 128. Ngay cả khi kích thước lô hiệu dụng của bạn lớn, nếu kích thước lô cho mỗi bước không tốt, thì ước lượng KL trong KTO sẽ không chính xác.

Gợi ý về tốc độ học

Mỗi lựa chọn của beta có một tốc độ học tối đa mà nó có thể chịu đựng trước khi hiệu suất học suy giảm. Với cài đặt mặc định là beta = 0.1, tốc độ học thường không nên vượt quá 1e-6 đối với hầu hết các mô hình. Khi beta giảm, tốc độ học cũng cần được giảm tương ứng. Nhìn chung, chúng tôi khuyến nghị mạnh mẽ giữ tốc độ học trong khoảng từ 5e-7 đến 5e-6. Ngay cả với các bộ dữ liệu nhỏ, chúng tôi cũng không khuyến khích sử dụng tốc độ học nằm ngoài khoảng này. Thay vào đó, hãy chọn nhiều epoch hơn để đạt được kết quả tốt hơn.

Dữ liệu mất cân bằng

Các tham số desirable_weight và undesirable_weight của KTOConfig đề cập đến trọng số được gán cho các tổn thất của các ví dụ mong muốn/dương và không mong muốn/âm. Mặc định, cả hai đều bằng 1. Tuy nhiên, nếu bạn có nhiều hơn một trong hai loại, bạn nên tăng trọng số cho loại ít phổ biến hơn sao cho tỷ lệ giữa (desirable_weight ×\times số lượng ví dụ dương) và (undesirable_weight ×\times số lượng ví dụ âm) nằm trong khoảng từ 1:1 đến 4:3.

KTOTrainer

lớp trl.KTOTrainer

< >

( model: str | PreTrainedModel | PeftModelref_model: transformers.modeling_utils.PreTrainedModel | None = Noneargs: trl.trainer.kto_config.KTOConfig | None = Nonedata_collator: collections.abc.Callable[[list[typing.Any]], dict[str, typing.Any]] | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | None = Noneeval_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | datasets.dataset_dict.DatasetDict | datasets.dataset_dict.IterableDatasetDict | dict[str, datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset] | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.processing_utils.ProcessorMixin | None = Nonecompute_metrics: collections.abc.Callable[[transformers.trainer_utils.EvalPrediction], dict] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[typing.Optional[torch.optim.Optimizer], typing.Optional[torch.optim.lr_scheduler.LambdaLR]] = (None, None)quantization_config: BitsAndBytesConfig | None = Nonepeft_config: PeftConfig | None = None )

Tham số

  • model (str hoặc PreTrainedModel hoặc PeftModel) — Mô hình cần huấn luyện. Có thể là:
    • Một chuỗi, là model id của một model được huấn luyện trước lưu trữ trong một model repo trên huggingface.co, hoặc một đường dẫn đến một thư mục chứa các trọng số model được lưu bằng save_pretrained, ví dụ: './my_model_directory/'. Model được nạp bằng <ModelArchitecture>.from_pretrained (trong đó <ModelArchitecture> được suy ra từ cấu hình model) với các tham số từ khóa trong args.model_init_kwargs. Nếu dtype không được chỉ định trong args.model_init_kwargs, giá trị mặc định sẽ là float32. Điều này khác với from_pretrained, nơi mà (từ Transformers v5) dtype được suy ra từ cấu hình model.
    • Một đối tượng PreTrainedModel. Chỉ hỗ trợ các mô hình ngôn ngữ nhân quả.
    • Một đối tượng PeftModel. Chỉ hỗ trợ các mô hình ngôn ngữ nhân quả.
  • ref_model (PreTrainedModel, tùy chọn) — Mô hình tham chiếu được sử dụng để tính toán các xác suất log tham chiếu. Nếu được cung cấp, mô hình này sẽ được sử dụng trực tiếp làm chính sách tham chiếu. Nó không thể là một PeftModel. Nếu là None, trainer sẽ tự động sử dụng chính sách ban đầu tương ứng với model, tức là trạng thái mô hình trước khi bắt đầu huấn luyện KTO.
    • Nếu được cung cấp, mô hình này được sử dụng trực tiếp làm chính sách tham chiếu. Nó không thể là PeftModel.
    • Nếu None, trainer sẽ tự động sử dụng chính sách ban đầu tương ứng với model, tức là trạng thái mô hình trước khi bắt đầu huấn luyện KTO.
  • args (KTOConfig, tùy chọn) — Cấu hình cho trainer này. Nếu là None, một cấu hình mặc định sẽ được sử dụng.
  • data_collator (DataCollator, tùy chọn) — Hàm được sử dụng để tạo một batch từ danh sách các phần tử của train_dataset hoặc eval_dataset đã được xử lý. Mặc định sẽ là DataCollatorForUnpairedPreference nếu mô hình là mô hình ngôn ngữ và DataCollatorForVisionUnpairedPreference nếu mô hình là mô hình thị giác-ngôn ngữ. Các collator tùy chỉnh phải cắt ngắn các chuỗi trước khi đệm; trainer không áp dụng việc cắt ngắn sau khi collate.
  • train_dataset (Dataset hoặc IterableDataset) — Dataset dùng cho huấn luyện. Trainer này hỗ trợ phong cách preference không ghép cặp . Định dạng của các mẫu có thể là:
    • Chuẩn: Mỗi mẫu chứa văn bản thuần túy.
    • Conversational: Mỗi mẫu chứa các tin nhắn có cấu trúc (ví dụ: role và content).

    Khi train_dataset là một IterableDataset (ví dụ: một dataset dạng streaming), max_steps phải được cài đặt trong các đối số huấn luyện, vì độ dài của nó không thể suy ra được và tổng số bước huấn luyện là cần thiết để giới hạn vòng lặp huấn luyện và cấu hình trình lập lịch tốc độ học.

  • eval_dataset (Dataset, IterableDataset, DatasetDict, IterableDatasetDict hoặc dict[str, Dataset | IterableDataset]) — Dataset được sử dụng để đánh giá. Nó phải đáp ứng các yêu cầu tương tự như train_dataset.
  • processing_class (PreTrainedTokenizerBase hoặc ProcessorMixin, tùy chọn) — Lớp xử lý được dùng để xử lý dữ liệu. Bên đệm (padding side) phải được đặt là “left”. Nếu None, lớp xử lý sẽ được tải từ tên mô hình bằng from_pretrained. Một token đệm, tokenizer.pad_token, phải được đặt. Nếu lớp xử lý chưa đặt token đệm, tokenizer.eos_token sẽ được dùng làm mặc định.
  • compute_metrics (Callable[[EvalPrediction], dict], tùy chọn) — Hàm sẽ được sử dụng để tính các chỉ số đánh giá. Hàm này phải nhận một EvalPrediction và trả về một từ điển ánh xạ từ chuỗi sang giá trị chỉ số. Khi truyền SFTConfig với batch_eval_metrics được đặt thành True, hàm compute_metrics của bạn phải nhận một đối số boolean compute_result. Đối số này sẽ được kích hoạt sau batch đánh giá cuối cùng để báo hiệu rằng hàm cần tính toán và trả về các thống kê tổng hợp toàn cục thay vì tích lũy các thống kê ở cấp độ batch. Các logits mà hàm nhận được sẽ được tính lại bằng một bước forward bổ sung. Tính năng này đã bị ngừng hỗ trợ và sẽ bị loại bỏ trong v2.0.0.
  • callbacks (danh sách TrainerCallback, tùy chọn) — Danh sách các callback để tùy chỉnh vòng lặp huấn luyện. Những callback này sẽ được thêm vào danh sách các callback mặc định được mô tả chi tiết tại đây.

    Nếu bạn muốn xóa một trong các callback mặc định đang được sử dụng, hãy dùng phương thức remove_callback.

  • optimizers (tuple[torch.optim.Optimizer | None, torch.optim.lr_scheduler.LambdaLR | None], tùy chọn, mặc định là (None, None)) — Một tuple chứa optimizer và scheduler cần sử dụng. Mặc định sẽ là một instance của AdamW trên model của bạn và một scheduler được cung cấp bởi get_linear_schedule_with_warmup được điều khiển bởi args.
  • quantization_config (BitsAndBytesConfig, tuỳ chọn) — Cấu hình lượng tử hóa được sử dụng khi tải mô hình từ một định danh mô hình. Kết hợp với peft_config cho huấn luyện QLoRA. Bị bỏ qua nếu mô hình đã được khởi tạo.
  • peft_config (PeftConfig, tùy chọn) — Cấu hình PEFT được sử dụng để bọc model. Nếu là None, model sẽ không được bọc.

Trainer cho phương pháp Tối ưu hóa Kahneman-Tversky (KTO). Thuật toán này ban đầu được đề xuất trong bài báo KTO: Model Alignment as Prospect Theoretic Optimization. Lớp này là một lớp bao quanh lớp Trainer và kế thừa tất cả các thuộc tính và phương thức của nó.

Ví dụ:

>>> from trl import KTOTrainer
>>> from datasets import load_dataset

>>> dataset = load_dataset("trl-lib/kto-mix-14k", split="train")

>>> trainer = KTOTrainer(
...     model="Qwen/Qwen2.5-0.5B-Instruct",
...     train_dataset=dataset,
... )
>>> trainer.train()

train

< >

( resume_from_checkpoint: str | bool | None = Nonetrial: optuna.Trial | dict[str, Any] | None = Noneignore_keys_for_eval: list[str] | None = None ) → ~trainer_utils.TrainOutput

Tham số

  • resume_from_checkpoint (str hoặc bool, tùy chọn) — Nếu là str, đường dẫn cục bộ đến một checkpoint đã lưu bởi một phiên Trainer trước đó. Nếu là bool và bằng True, tải checkpoint cuối cùng trong args.output_dir do một phiên Trainer trước đó lưu lại. Nếu có, quá trình huấn luyện sẽ tiếp tục từ trạng thái model/optimizer/scheduler được tải ở đây.
  • trial (optuna.Trial hoặc dict[str, Any], tùy chọn) — Lần chạy thử nghiệm hoặc từ điển siêu tham số cho việc tìm kiếm siêu tham số.
  • ignore_keys_for_eval (list[str], tùy chọn) — Một danh sách các khóa trong đầu ra của mô hình của bạn (nếu đó là một từ điển) cần được bỏ qua khi thu thập các dự đoán để đánh giá trong quá trình huấn luyện.

Trả về

~trainer_utils.TrainOutput

Đối tượng chứa số bước toàn cục, tổn thất huấn luyện và các chỉ số.

Điểm vào chính cho quá trình huấn luyện.

save_model

< >

( output_dir: str | None = None_internal_call: bool = False )

Sẽ lưu mô hình, để bạn có thể tải lại bằng from_pretrained().

Chỉ lưu từ tiến trình chính.

push_to_hub

< >

( commit_message: str | None = 'End of training'blocking: bool = Truetoken: str | None = Nonerevision: str | None = None**kwargs )

Tham số

  • commit_message (str, tùy chọn, mặc định là "End of training") — Thông điệp để commit khi đẩy lên.
  • blocking (bool, tùy chọn, mặc định là True) — Xác định xem hàm có chỉ trả về khi git push đã hoàn tất hay không.
  • token (str, tùy chọn, mặc định là None) — Token có quyền ghi để ghi đè lên các args gốc của Trainer.
  • revision (str, tùy chọn) — Phiên bản git để commit từ. Mặc định là đầu của nhánh “main”.
  • kwargs (dict[str, Any], tùy chọn) — Các đối số từ khóa bổ sung được truyền đến ~Trainer.create_model_card.

Tải self.model và self.processing_class lên 🤗 model hub tại repo self.args.hub_model_id.

KTOConfig

lớp trl.KTOConfig

< >

( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 1e-06lr_scheduler_type: transformers.trainer_utils.SchedulerType | str = 'linear'lr_scheduler_kwargs: dict | str | None = Nonewarmup_steps: float = 0optim: transformers.training_args.OptimizerNames | str = 'adamw_torch_fused'optim_args: str | None = Noneweight_decay: float = 0.0adam_beta1: float = 0.9adam_beta2: float = 0.999adam_epsilon: float = 1e-08optim_target_modules: None | str | list[str] = Nonegradient_accumulation_steps: int = 1average_tokens_across_devices: bool = Truemax_grad_norm: float = 1.0label_smoothing_factor: float = 0.0bf16: bool | None = Nonefp16: bool = Falsebf16_full_eval: bool = Falsefp16_full_eval: bool = Falsetf32: bool | None = Nonegradient_checkpointing: bool = Truegradient_checkpointing_kwargs: dict[str, typing.Any] | str | None = Nonetorch_compile: bool = Falsetorch_compile_backend: str | None = Nonetorch_compile_mode: str | None = Noneuse_liger_kernel: bool = Falseliger_kernel_config: dict[str, bool] | None = Noneuse_cache: bool = Falseneftune_noise_alpha: float | None = Nonetorch_empty_cache_steps: int | None = Noneauto_find_batch_size: bool = Falselogging_strategy: transformers.trainer_utils.IntervalStrategy | str = 'steps'logging_steps: float = 10logging_first_step: bool = Falselog_on_each_node: bool = Truelogging_nan_inf_filter: bool = Trueinclude_num_input_tokens_seen: str | bool = 'no'log_level: str = 'passive'log_level_replica: str = 'warning'disable_tqdm: bool | None = Nonereport_to: None | str | list[str] = 'none'run_name: str | None = Noneproject: str = 'huggingface'trackio_space_id: str | None = Nonetrackio_bucket_id: str | None = Nonetrackio_static_space_id: typing.Union[str, NoneType, typing.Literal[False]] = Noneeval_strategy: transformers.trainer_utils.IntervalStrategy | str = 'no'eval_steps: float | None = Noneeval_delay: float = 0per_device_eval_batch_size: int = 8prediction_loss_only: bool = Falseeval_on_start: bool = Falseeval_do_concat_batches: bool = Trueeval_use_gather_object: bool = Falseeval_accumulation_steps: int | None = Noneinclude_for_metrics: list[str] = <factory>batch_eval_metrics: bool = Falsesave_only_model: bool = Falsesave_strategy: transformers.trainer_utils.SaveStrategy | str = 'steps'save_steps: float = 500save_on_each_node: bool = Falsesave_total_limit: int | None = Noneenable_jit_checkpoint: bool = Falsepush_to_hub: bool = Falsehub_token: str | None = Nonehub_private_repo: bool | None = Nonehub_model_id: str | None = Nonehub_strategy: transformers.trainer_utils.HubStrategy | str = 'every_save'hub_always_push: bool = Falsehub_revision: str | None = Noneload_best_model_at_end: bool = Falsemetric_for_best_model: str | None = Nonegreater_is_better: bool | None = Noneignore_data_skip: bool = Falserestore_callback_states_from_checkpoint: bool = Falsefull_determinism: bool = Falseseed: int = 42data_seed: int | None = Noneuse_cpu: bool = Falseaccelerator_config: dict | str | None = Noneparallelism_config: accelerate.parallelism_config.ParallelismConfig | None = Nonedataloader_drop_last: bool = Falsedataloader_num_workers: int = 0dataloader_pin_memory: bool = Truedataloader_persistent_workers: bool = Falsedataloader_prefetch_factor: int | None = Nonedataloader_multiprocessing_context: str | None = Nonedataloader_in_order: bool = Trueremove_unused_columns: bool = Truelabel_names: list[str] | None = Nonetrain_sampling_strategy: str = 'sequential'length_column_name: str = 'length'ddp_find_unused_parameters: bool | None = Noneddp_bucket_cap_mb: int | None = Noneddp_broadcast_buffers: bool | None = Noneddp_static_graph: bool | None = Noneddp_backend: str | None = Noneddp_timeout: int = 1800fsdp: str | None = Nonefsdp_config: dict[str, typing.Any] | str | None = Nonedeepspeed: dict | str | None = Nonedebug: str | list[transformers.debug_utils.DebugOption] = ''skip_memory_metrics: bool = Truedo_train: bool = Falsedo_eval: bool = Falsedo_predict: bool = Falseresume_from_checkpoint: str | None = Nonelocal_rank: int = -1model_init_kwargs: dict[str, typing.Any] | str | None = Nonetrust_remote_code: bool = Falserouter_aux_loss_coef: float | None = Nonedisable_dropout: bool = Truedataset_num_proc: int | None = Nonemax_length: int | None = 1024pad_to_multiple_of: int | str | None = 'auto'precompute_ref_log_probs: bool = Falseprecompute_ref_batch_size: int | None = Noneloss_type: str = 'kto'beta: float = 0.1desirable_weight: float = 1.0undesirable_weight: float = 1.0activation_offloading: bool = Falsesync_ref_model: bool = Falseref_model_mixup_alpha: float = 0.6ref_model_sync_steps: int = 512 )

Các tham số điều khiển mô hình

  • model_init_kwargs (dict[str, Any], tùy chọn) — Các đối số dạng từ khóa cho from_pretrained, được sử dụng khi đối số model của KTOTrainer được cung cấp dưới dạng chuỗi. Giá trị revision cũng được sử dụng khi nạp lớp xử lý.
  • trust_remote_code (bool, tùy chọn, mặc định là False) — Có cho phép tải các model và tokenizer có kèm theo mã Python tùy chỉnh từ Hub hay không. Tham số này được chuyển tiếp đến from_pretrained và from_pretrained.
  • router_aux_loss_coef (float, tùy chọn) — Hệ số của tổn thất phụ cân bằng tải cho các mô hình Mixture-of-Experts (MoE), được cộng vào tổn thất huấn luyện với trọng số này. Khi không được đặt, giá trị được khai báo trong cấu hình mô hình sẽ được sử dụng. Đặt thành 0.0 để tắt nó. Gặp lỗi khi sử dụng với mô hình không phải MoE.
  • disable_dropout (bool, tùy chọn, mặc định là True) — Có vô hiệu hóa dropout trong mô hình và mô hình tham chiếu hay không.

Các tham số kiểm soát tiền xử lý dữ liệu

  • dataset_num_proc (int, tùy chọn) — Số lượng tiến trình được sử dụng để xử lý tập dữ liệu.
  • max_length (int hoặc None, tùy chọn, mặc định là 1024) — Độ dài tối đa của chuỗi đã được token hóa. Các chuỗi dài hơn max_length sẽ bị cắt bớt từ phía bên phải. Nếu là None, sẽ không áp dụng cắt bớt.
  • pad_to_multiple_of (int hoặc str, tùy chọn, mặc định là "auto") — Nếu được đặt, các chuỗi sẽ được đệm (padding) đến một bội số của giá trị này. "auto" sẽ đệm đến bội số của 128 trên Neuron (AWS Trainium), nơi biên dịch một lần cho mỗi hình dạng đầu vào, và không đệm ở các nơi khác.
  • precompute_ref_log_probs (bool, tùy chọn, mặc định là False) — Có nên tính trước log probabilities của mô hình tham chiếu cho toàn bộ tập dữ liệu huấn luyện trước khi bắt đầu huấn luyện hay không. Điều này cho phép tiết kiệm bộ nhớ trong quá trình huấn luyện, vì mô hình tham chiếu không cần được giữ trong bộ nhớ.
  • precompute_ref_batch_size (int, tuỳ chọn) — Kích thước batch sử dụng khi tiền xử lý log xác suất của mô hình tham chiếu. Giá trị này có thể được đặt cao hơn kích thước batch huấn luyện để tăng tốc độ tiền xử lý. Nếu là None, mặc định sẽ là per_device_train_batch_size cho huấn luyện và per_device_eval_batch_size cho đánh giá.

Các tham số kiểm soát quá trình huấn luyện

  • loss_type (str, tuỳ chọn, mặc định là "kto") — Loại loss cần sử dụng. Các giá trị có thể là:
    • "kto": Tổn thất KTO từ bài báo KTO.
    • "apo_zero_unpaired": Biến thể không ghép cặp của hàm mất mát APO-zero từ bài báo APO.
  • beta (float, tùy chọn, mặc định là 0.1) — Tham số kiểm soát mức độ sai lệch so với mô hình tham chiếu. β càng cao thì mức độ sai lệch so với mô hình tham chiếu càng thấp.
  • desirable_weight (float, tùy chọn, mặc định là 1.0) — Các tổn thất mong muốn được nhân với hệ số này để bù lại sự chênh lệch về số lượng giữa các cặp mong muốn và không mong muốn.
  • undesirable_weight (float, tùy chọn, mặc định là 1.0) — Các tổn thất không mong muốn được nhân với hệ số này để bù lại sự chênh lệch về số lượng giữa các cặp mong muốn và không mong muốn.
  • activation_offloading (bool, tùy chọn, mặc định là False) — Có nên chuyển các activation sang CPU hay không.
  • sync_ref_model (bool, tùy chọn, mặc định là False) — Liệu có đồng bộ hóa mô hình tham chiếu với mô hình đang hoạt động mỗi ref_model_sync_steps bước hay không, sử dụng tham số ref_model_mixup_alpha. Quá trình đồng bộ hóa này bắt nguồn từ bài báo TR-DPO. sync_ref_model=True hiện chưa tương thích với PEFT hoặc precompute_ref_log_probs=True.
  • ref_model_mixup_alpha (float, tùy chọn, mặc định là 0.6) — tham số α từ bài báo TR-DPO, kiểm soát sự pha trộn giữa chính sách hiện tại và chính sách tham chiếu trước đó trong quá trình cập nhật. Chính sách tham chiếu được cập nhật theo phương trình: π_ref = α * π_θ + (1 - α) * π_ref_prev. Để sử dụng tham số này, bạn phải đặt sync_ref_model=True.
  • ref_model_sync_steps (int, tùy chọn, mặc định là 512) — tham số τ từ bài báo TR-DPO, xác định tần suất đồng bộ hóa chính sách hiện tại với chính sách tham chiếu. Để sử dụng tham số này, bạn phải đặt sync_ref_model=True.

Lớp cấu hình cho KTOTrainer.

Lớp này chỉ bao gồm các tham số đặc thù cho việc huấn luyện KTO. Để xem danh sách đầy đủ các đối số huấn luyện, hãy tham khảo tài liệu TrainingArguments. Lưu ý rằng các giá trị mặc định trong lớp này có thể khác với các giá trị trong TrainingArguments.

Sử dụng HfArgumentParser, chúng ta có thể chuyển lớp này thành các đối số argparse có thể được chỉ định trên dòng lệnh.

Các tham số này có giá trị mặc định khác với TrainingArguments:

  • logging_steps: Mặc định là 10 thay vì 500.
  • gradient_checkpointing: Mặc định là True thay vì False.
  • bf16: Mặc định là True nếu fp16 không được đặt, thay vì False.
  • learning_rate: Mặc định là 1e-6 thay vì 5e-5.
  • train_sampling_strategy: Mặc định là "sequential" thay vì "random". Các loại loss ước lượng thành phần KL divergence (tất cả ngoại trừ "apo_zero_unpaired") yêu cầu lấy mẫu tuần tự vì phần hoàn tất KL cho mỗi ví dụ được tính trước dựa trên các hàng xóm của nó trong một batch có thứ tự cố định; bất kỳ chiến lược nào khác sẽ phá vỡ sự ghép cặp đó.
Update on GitHub