PEFT documentation
Prompt Tuning nhận thức ngữ cảnh: Nâng cao Học Trong Ngữ cảnh bằng các Phương pháp Đối kháng
Prompt Tuning nhận thức ngữ cảnh: Nâng cao Học Trong Ngữ cảnh bằng các Phương pháp Đối kháng

Context-Aware Prompt Tuning (CPT) được thiết kế để tăng cường phân loại few-shot bằng cách tinh chỉnh các embedding ngữ cảnh. Phương pháp này kết hợp các ý tưởng từ In-Context Learning (ICL), Prompt Tuning (PT) và tối ưu hóa đối kháng, tập trung vào việc làm cho việc thích ứng mô hình vừa hiệu quả về tham số vừa hiệu quả về kết quả. Trong CPT, chỉ các embedding của token ngữ cảnh cụ thể được tối ưu hóa, trong khi phần còn lại của mô hình được giữ nguyên. Để ngăn chặn overfitting và duy trì sự ổn định, CPT sử dụng các nhiễu có kiểm soát để giới hạn các thay đổi được phép đối với các embedding ngữ cảnh trong một phạm vi xác định. Ngoài ra, để giải quyết hiện tượng thiên kiến gần đây (recency bias) — trong đó các ví dụ gần cuối ngữ cảnh có xu hướng được ưu tiên hơn các ví dụ trước đó — CPT áp dụng một hệ số suy giảm cho hàm mất mát.
Tóm tắt từ bài báo là:
Các Mô hình Ngôn ngữ Lớn (LLM) có thể thực hiện học ít mẫu (few-shot learning) bằng cách sử dụng các phương pháp dựa trên tối ưu hóa hoặc Học Trong Ngữ cảnh (In-Context Learning - ICL). Các phương pháp dựa trên tối ưu hóa thường gặp phải vấn đề quá khớp (overfitting), vì chúng yêu cầu cập nhật một số lượng lớn tham số với dữ liệu hạn chế. Ngược lại, ICL tránh được quá khớp nhưng thường cho hiệu suất thấp hơn so với các phương pháp dựa trên tối ưu hóa và rất nhạy cảm với việc lựa chọn, thứ tự và định dạng của các ví dụ minh họa. Để khắc phục những thách thức này, chúng tôi giới thiệu Điều chỉnh Prompt Nhận thức Ngữ cảnh (Context-aware Prompt Tuning - CPT), một phương pháp lấy cảm hứng từ ICL, Điều chỉnh Prompt (Prompt Tuning - PT) và các cuộc tấn công đối kháng. CPT xây dựng dựa trên chiến lược ICL nối các ví dụ trước đầu vào, mở rộng nó bằng cách tích hợp học tập kiểu PT để tinh chỉnh nhúng ngữ cảnh (context embedding) thông qua tối ưu hóa lặp lại, từ đó trích xuất những hiểu biết sâu sắc hơn từ các ví dụ huấn luyện. Phương pháp của chúng tôi cẩn thận sửa đổi các token ngữ cảnh cụ thể, xem xét cấu trúc độc đáo của các ví dụ trong ngữ cảnh. Ngoài việc cập nhật ngữ cảnh bằng tối ưu hóa kiểu PT, CPT còn lấy cảm hứng từ các cuộc tấn công đối kháng, điều chỉnh đầu vào dựa trên các nhãn có mặt trong ngữ cảnh trong khi vẫn giữ nguyên giá trị vốn có của dữ liệu do người dùng cung cấp. Để đảm bảo tính vững chắc và ổn định trong quá trình tối ưu hóa, chúng tôi sử dụng thuật toán hạ gradient chiếu (projected gradient descent), ràng buộc các nhúng token (token embeddings) phải ở gần giá trị ban đầu của chúng và bảo vệ chất lượng của ngữ cảnh. Phương pháp của chúng tôi đã chứng minh độ chính xác vượt trội trên nhiều tác vụ phân loại sử dụng các mô hình LLM khác nhau, vượt trội hơn so với các đường cơ sở (baseline) hiện có và giải quyết hiệu quả thách thức quá khớp trong học ít mẫu.
Xem Ví dụ để có hướng dẫn từng bước về cách huấn luyện mô hình với CPT.
Nguyên lý hoạt động
Context-aware Prompt Tuning tương tự Prompt Tuning ở chỗ bạn có thể chọn một text prompt bất kỳ, nhưng chỉ các token của prompt này mới có thể huấn luyện được nhờ việc có một ma trận token embedding thứ hai chỉ áp dụng cho các token của prompt. Mỗi khi bạn truy vấn một mô hình CPT, prompt “mềm” của bạn sẽ được nối vào trước embedding của đầu vào thông thường. CPT khác với Prompt Tuning ở chỗ prompt mềm của bạn giờ có thể được đặt trong ngữ cảnh bằng cách đánh dấu các phần cụ thể KHÔNG được huấn luyện. Ma trận token embedding đặc thù của CPT bao gồm một embedding tĩnh được khởi tạo từ ma trận embedding của mô hình cơ sở và các giá trị delta đặc thù cho từng token có thể học được.
CPT hữu ích khi bạn có một prompt chứa các hướng dẫn cùng với các ví dụ và nhãn/ground-truth. Các hướng dẫn có thể chưa tối ưu và do đó sẽ được hưởng lợi từ việc tối ưu hóa trong quá trình huấn luyện (giống như với prompt tuning), nhưng các ví dụ/nhãn mà bạn đã bao gồm trong prompt không được phép thay đổi. Điều này có thể được thực thi bằng cách xác định rõ ràng nơi prompt kết thúc và các ví dụ bắt đầu. CPT cũng thêm một token loss vào loss dự đoán token tiếp theo chuẩn của mô hình của bạn cho các ví dụ trong prompt để tận dụng tối đa các ví dụ đã cho.
CPT sử dụng năm loại id khác nhau để đánh dấu các phần khác nhau trong prompt:
- 0: separator: sẽ bị bỏ qua hoàn toàn, hữu ích cho các token đầu/cuối câu
- 1: dấu phân tách đầu vào: các token mô tả prompt đánh dấu toàn bộ mẫu phía đầu vào, bao gồm thông tin bổ sung
- 2: truy vấn đầu vào: các token mô tả đầu vào của người dùng cho một ví dụ
- 3: dấu hiệu đầu ra: các token mô tả phần bắt đầu của đầu ra mong đợi của một ví dụ
- 4: label: các token thuộc về nhãn của ví dụ
Điều này khá trừu tượng, vì vậy dưới đây là một ví dụ về prompt CPT và các định danh kiểu tương ứng. Chúng ta giả định mỗi từ = 1 token để đơn giản hóa:
prompt_text = "Example 1: Input: 1+1 Answer: 2 Example 2: 1+3 Answer: 4"
token_ids = [15, 2, 11, 9, 1, 9, 11, 3, 11, 8, 9, 4, 2, 4, 9, 11, 3, 6, 8, 9, 10]
# BOS, Example 1 : Input : 1 + 1 Answer : 2 Example 2 : 1 + 3 Answer : 4
type_ids = [0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8]
# 1, 1, 1, 2, 2, 2, 3, 3, 4token_ids là prompt của bạn được mã hóa bởi tokenizer của mô hình cơ sở và tương ứng với ~CPTConfig.cpt_token_ids. type_ids là các id loại token của prompt, xác định các phần khác nhau của prompt và tương ứng với ~CPTConfig.cpt_tokens_type_mask.
Các id riêng lẻ có những tác động khác nhau đến quá trình huấn luyện:
- 0: sẽ bị bỏ qua hoàn toàn, không đóng góp vào loss và các token này không được huấn luyện, hữu ích cho các token chỉ tồn tại vì lý do kỹ thuật và nếu không sẽ làm phình không gian tham số một cách vô ích (ví dụ: token EOS)
- 1 và 3: các token này được xem xét cho việc định dạng và chuẩn tối đa của delta embedding của chúng được kiểm soát bởi
opt_projection_format_epsilon(). Chuẩn này kiểm soát độ lớn tối đa mà các delta embedding đã học cho kiểu này có thể hướng tới. Chuẩn cao hơn có nghĩa là tiềm năng thay đổi ngữ nghĩa cao hơn. - 2: các token này được xem xét cho đầu vào của một ví dụ và chuẩn tối đa của delta embedding của chúng được kiểm soát bởi
opt_projection_epsilon(). Chuẩn kiểm soát độ lớn tối đa mà các delta embedding học được cho kiểu này có thể hướng tới. Chuẩn cao hơn có nghĩa là tiềm năng thay đổi ngữ nghĩa cao hơn. - 4: Các token nhãn của prompt được thêm vào như các mục tiêu dự đoán token tiếp theo bổ sung cho hàm mất mát chuẩn trên dữ liệu huấn luyện của bạn; mọi token soft-prompt khác đều bị che khỏi hàm mất mát. Các vector nhúng delta của token nhãn không bao giờ bị thay đổi để giữ nguyên ngữ nghĩa của nhãn.
Bạn có thể đã nhận thấy rằng các số trong type_ids của ví dụ thứ hai bị dịch chuyển 4. CPT có trọng số mũ cho loss của các ví dụ bạn cung cấp trong prompt, trong đó ví dụ cuối cùng bị suy giảm ít nhất và loss của ví dụ đầu tiên bị suy giảm nhiều nhất. Điều này cho phép gán trọng số lớn hơn cho các ví dụ gần với truy vấn đầu vào thực tế hơn và được điều khiển bởi opt_loss_decay_factor() khi opt_weighted_loss_type() được đặt thành "decay". Bằng cách dịch chuyển các ví dụ 4, chúng ta có thể liệt kê các ví dụ khác nhau để loss có thể gán các trọng số suy giảm khác nhau cho từng ví dụ.
Lưu ý rằng cpt_tokens_type_mask chỉ mô tả bản thân soft prompt. Khi huấn luyện, hãy truyền thêm một tensor input_type_mask cùng với mỗi batch, gán các type id cho các token của đầu vào thực tế của bạn (sử dụng các id 0-4 như
trên, với các token padding hoặc end-of-sentence được đánh dấu là 0). CPT tự động dịch chuyển các id này theo số lượng
ví dụ trong prompt của bạn, vì vậy bạn không cần phải tự dịch chuyển chúng. Điều này tương đương với việc thêm đầu vào ở cuối
danh sách các ví dụ trong prompt của bạn. Hãy nhớ rằng các id được diễn giải theo modulo 4: việc dịch chuyển chúng theo bội số
của 4 là vô hại, nhưng bất kỳ độ lệch nào khác sẽ âm thầm thay đổi các token nào đóng góp vào loss. Nếu không truyền input_type_mask,
CPT sẽ quay lại tính loss trên toàn bộ chuỗi đầu vào, tức là giả định type 4 cho tất cả các token đầu vào.
Tổng quan về benchmark
Chưa có benchmark nào cho phương pháp này. Bạn có thể đóng góp một cấu hình thí nghiệm nhưng hãy đảm bảo tạo một issue tại đây trước.
API
CPTConfig
lớp peft.CPTConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falsenum_virtual_tokens: int = Nonetoken_dim: int = Nonenum_transformer_submodules: Optional[int] = Nonenum_attention_heads: Optional[int] = Nonenum_layers: Optional[int] = Nonemodules_to_save: Optional[list[str]] = Nonecpt_token_ids: list[int] | None = Nonecpt_mask: list[int] | None = Nonecpt_tokens_type_mask: list[int] | None = Noneopt_weighted_loss_type: typing.Literal['none', 'decay'] | None = 'none'opt_loss_decay_factor: float | None = 1.0opt_projection_epsilon: float | None = 0.1opt_projection_format_epsilon: float | None = 0.1tokenizer_name_or_path: str | None = None )
Lớp cấu hình CPT kế thừa PeftConfig cho Context-aware Prompt Tuning (CPT).
Lớp này giới thiệu các tham số bổ sung cần thiết cho CPT, chẳng hạn như:
- Mặt nạ loại token
- Khởi tạo điều chỉnh prompt
- Trọng số hóa tổn thất
- Cài đặt chiếu
Để biết thêm chi tiết, hãy xem bài báo: https://huggingface.co/papers/2410.17222
CPTEmbedding
CPTEmbedding là một lớp embedding tùy chỉnh được thiết kế cho Context-aware Prompt Tuning (CPT) trong PEFT. Nó khởi tạo embeddings, áp dụng các phép chiếu cụ thể cho prompt và tính toán loss bằng cách sử dụng label masks.
calculate_loss
< source >( base_model_outputlabelscpt_type_maskconfig ) → ModelOutput
Tham số
- base_model_output (ModelOutput) — Đầu ra từ mô hình cơ sở chứa logits.
- labels (torch.Tensor) — Nhãn đúng (ground-truth) cho các token đầu vào.
- cpt_type_mask (torch.Tensor) — Mặt nạ loại token được sử dụng để lọc các số hạng loss hợp lệ.
- config (Namespace) — Đối tượng cấu hình chứa các siêu tham số liên quan đến loss.
Trả về
ModelOutput
Đầu ra của mô hình cơ sở với tổn thất đã được tính toán.
Tính toán loss cho các mô hình CPT với tùy chọn suy giảm mũ.
forward
< source >( indices ) → torch.Tensor
Tính toán các embedding của prompt và áp dụng các điều chỉnh delta.
Áp dụng phép chiếu dựa trên epsilon vào các embedding delta để kiểm soát chuẩn của chúng.
Thiết lập một hook ngược để cập nhật có chọn lọc gradient của token dựa trên mặt nạ loại token CPT.