PEFT documentation
TinyLoRA: Học cách suy luận với 13 tham số
TinyLoRA: Học cách suy luận với 13 tham số
TinyLoRA là một kỹ thuật tinh chỉnh cực kỳ hiệu quả về tham số, được xây dựng dựa trên phương pháp LoRA-XS bằng cách sử dụng phân rã SVD của các trọng số đóng băng và chiếu một vector có thể huấn luyện nhỏ gọn thông qua các tensor ngẫu nhiên cố định. Khi kết hợp với các phương pháp huấn luyện học tăng cường (RL) như GRPO, TinyLoRA có thể đạt được hiệu suất cạnh tranh với chỉ từ 1 đến 13 tham số có thể huấn luyện.
Đột phá chính của TinyLoRA là thay thế ma trận hạng thấp có thể huấn luyện R bằng tổng có trọng số của các ma trận chiếu ngẫu nhiên cố định: R = Σᵢ vᵢ Pᵢ, trong đó v ∈ R^u là một vector huấn luyện nhỏ có kích thước u và Pᵢ là các ma trận ngẫu nhiên cố định. Điều này giảm đáng kể số lượng tham số có thể huấn luyện trong khi vẫn duy trì hiệu suất cạnh tranh.
TinyLoRA hỗ trợ việc gán trọng số thông qua tham số weight_tying, một tỷ lệ nằm trong khoảng từ 0.0 đến 1.0, kiểm soát số lượng module chia sẻ cùng một vector có thể huấn luyện v. Đặt weight_tying=0.0 (mặc định) có nghĩa là không chia sẻ, trong khi weight_tying=1.0 có nghĩa là chia sẻ hoàn toàn trên tất cả các module đích — đạt được hiệu quả tham số cực cao với chỉ một vector duy nhất gồm u tham số có thể huấn luyện cho toàn bộ mô hình.
Khi lưu các tham số adapter, bạn có thể bỏ qua việc lưu các ma trận chiếu ngẫu nhiên bằng cách đặt save_projection=False trên TinyLoraConfig. Trong trường hợp đó, các ma trận này sẽ được khôi phục dựa trên hạt ngẫu nhiên cố định từ đối số projection_seed. Điều này giúp giảm kích thước của checkpoint, nhưng chúng tôi không thể đảm bảo khả năng tái lập trên tất cả các thiết bị và cho tất cả các phiên bản PyTorch trong tương lai. Nếu bạn muốn đảm bảo khả năng tái lập, hãy đặt save_projection=True (đây là mặc định).
TinyLoRA hiện có các ràng buộc sau:
- Chỉ các lớp
nn.Linear,nn.Embeddingvàtransformers.pytorch_utils.Conv1Dđược hỗ trợ.
Tóm tắt từ bài báo là:
Nghiên cứu gần đây cho thấy các mô hình ngôn ngữ có thể học cách suy luận, thường thông qua học tăng cường. Một số công việc thậm chí huấn luyện các tham số hóa bậc thấp cho suy luận, nhưng LoRA thông thường không thể mở rộng xuống dưới kích thước của mô hình. Chúng tôi đặt câu hỏi liệu ngay cả LoRA với rank=1 có thực sự cần thiết để học cách suy luận hay không, và đề xuất TinyLoRA, một phương pháp để mở rộng các adapter bậc thấp xuống kích thước nhỏ đến mức chỉ một tham số. Trong tham số hóa mới của chúng tôi, chúng tôi có thể huấn luyện kích thước 8B tham số của Qwen2.5 đạt độ chính xác 91% trên GSM8K với chỉ 13 tham số được huấn luyện trong bf16 (tổng cộng 26 byte). Chúng tôi nhận thấy xu hướng này đúng một cách tổng quát: chúng tôi có thể khôi phục 90% cải thiện hiệu suất trong khi huấn luyện ít hơn 1000 lần số tham số trên một bộ các benchmark học cách suy luận khó hơn như AIME, AMC và MATH500. Đáng chú ý, chúng tôi chỉ có thể đạt được hiệu suất mạnh mẽ như vậy với RL: các mô hình được huấn luyện bằng SFT cần các cập nhật lớn hơn 100-1000 lần để đạt được hiệu suất tương đương.
Tổng quan về benchmark
API
TinyLoraConfig
lớp peft.TinyLoraConfig
< 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 = Falser: int = 2u: int = 64weight_tying: float = 0.0projection_seed: int = 42save_projection: bool = Trueinit_v_bound: float = 0.02target_modules: Optional[Union[list[str], str]] = Nonetinylora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: Union[bool, str] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )
Tham số
- r (
int, tuỳ chọn, mặc định là2) — Bậc SVD cho phân rã U, Sigma, V đã đóng băng. Bài báo khuyến nghị r=2. - u (
int, tuỳ chọn, mặc định là64) — Kích thước vector có thể huấn luyện cho mỗi nhóm. Tham số này kiểm soát khả năng diễn đạt của quá trình thích ứng. Có thể giảm xuống mức 1-13 để đạt hiệu quả tham số cực cao. - weight_tying (
float, tùy chọn, mặc định là0.0) — Mức độ ràng buộc trọng số giữa các module đích, dưới dạng tỷ lệ từ 0.0 đến 1.0. Kiểm soát số lượng module chia sẻ cùng một vector v có thể huấn luyện. 0.0 nghĩa là không chia sẻ (mỗi module có v riêng). 1.0 nghĩa là chia sẻ hoàn toàn (tất cả các module chia sẻ một v duy nhất). Các giá trị ở giữa cho phép chia sẻ một phần. - projection_seed (
int, tùy chọn, mặc định là42) — Hạt ngẫu nhiên để tạo các ma trận chiếu cố định P. - save_projection (
bool, tùy chọn, mặc định làTrue) — Có nên lưu các tensor chiếu P trong state dict hay không. Nếu là False, chúng sẽ được tạo lại từ seed khi tải. - init_v_bound (
float, tuỳ chọn, mặc định là0.02) — Giới hạn khởi tạo đều cho vector v có thể huấn luyện. Các giá trị được khởi tạo trong khoảng [-init_v_bound, init_v_bound]. - target_modules (
Union[List[str], str], tuỳ chọn) — Tên của các module cần áp dụng TinyLoRA. Đây có thể là một danh sách tên module (ví dụ['q_proj', 'v_proj']), một mẫu regex (ví dụ'.*decoder.*(q|v)_proj$'), hoặc từ khóa đặc biệt"all-linear"để nhắm đến tất cả các module tuyến tính. Chỉ hỗ trợ các lớpnn.Linear,nn.Embeddingvàtransformers.pytorch_utils.Conv1D. - tinylora_dropout (
float, tùy chọn, mặc định là0.0) — Xác suất dropout cho các lớp TinyLoRA. - fan_in_fan_out (
bool, tùy chọn, mặc định làFalse) — Đặt giá trị này thành True nếu lớp cần thay thế lưu trọng số theo dạng (fan_in, fan_out). Ví dụ, gpt-2 sử dụngConv1D, lưu trọng số theo dạng (fan_in, fan_out). - bias (
str, optional, defaults to"none") — Bias type for TinyLoRA. Can be ‘none’, ‘all’ or ‘tinylora_only’. - modules_to_save (
List[str], tùy chọn) — Danh sách các module ngoài các lớp TinyLoRA cần được đặt là có thể huấn luyện và được lưu lại. - init_weights (
bool|Literal["uniform"], tuỳ chọn, mặc định làTrue) — Cách khởi tạo vector v có thể huấn luyện. TruyềnTrue(mặc định) sẽ khởi tạo v thành các số 0, khiến adapter trở thành một phép toán không (identity operation). Truyền"uniform"sẽ khởi tạo v bằng các giá trị ngẫu nhiên phân bố đều trong khoảng[-init_v_bound, init_v_bound]. TruyềnFalsesẽ để v chưa được khởi tạo (dành cho các trường hợp sử dụng nâng cao). - layers_to_transform (
Union[List[int], int], tùy chọn) — Chỉ số của các lớp cần chuyển đổi. Nếu được chỉ định, chỉ các lớp này sẽ được thích ứng. - layers_pattern (
Optional[Union[List[str], str]], tùy chọn) — Tên mẫu lớp, chỉ được sử dụng nếulayers_to_transformkhácNone.
Đây là lớp cấu hình để lưu trữ cấu hình của TinyLoraModel.
TinyLoRA là một phương pháp tinh chỉnh cực kỳ hiệu quả về tham số, dựa trên bài báo “Learning to Reason in 13 Parameters” (arXiv:2602.04118). Phương pháp này sử dụng phân rã SVD của các trọng số đóng băng và chiếu một vector có thể huấn luyện nhỏ gọn thông qua các tensor ngẫu nhiên cố định.
Bài báo: https://arxiv.org/abs/2602.04118
Ví dụ:
from peft import get_peft_model, TinyLoraConfig
config = TinyLoraConfig(
r=2, # SVD rank (paper recommends 2)
u=64, # Trainable vector dimension
weight_tying=0.0, # No weight tying (0.0 = none, 1.0 = full)
target_modules=["q_proj", "v_proj"],
projection_seed=42,
)
model = get_peft_model(base_model, config)TinyLoraModel
lớp peft.TinyLoraModel
< source >( modelconfigadapter_namelow_cpu_mem_usage = False**kwargs ) → torch.nn.Module
Tham số
- model (PreTrainedModel) — Mô hình cần được thích ứng.
- config (TinyLoraConfig) — Cấu hình của mô hình TinyLoRA.
- adapter_name (
str) — Tên của adapter, mặc định là"default". - low_cpu_mem_usage (
bool, tùy chọn, mặc định làFalse) — Tạo trọng số adapter rỗng trên meta device. Hữu ích để tăng tốc quá trình tải.
Trả về
torch.nn.Module
Mô hình TinyLoRA.
Tạo mô hình TinyLoRA từ một mô hình transformers được huấn luyện trước.
TinyLoRA là một phương pháp tinh chỉnh cực kỳ hiệu quả về tham số, sử dụng phân rã SVD của các trọng số đóng băng và chiếu một vector có thể huấn luyện nhỏ qua các tensor ngẫu nhiên cố định. Dựa trên bài báo “Learning to Reason in 13 Parameters” (arXiv:2602.04118).
Ví dụ:
>>> from transformers import AutoModelForCausalLM
>>> from peft import TinyLoraConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = TinyLoraConfig(r=2, u=64, target_modules=["q_proj", "v_proj"])
>>> model = get_peft_model(base_model, config)Thuộc tính:
- model (PreTrainedModel) — Mô hình cần được thích ứng.
- peft_config (TinyLoraConfig): Cấu hình của mô hình TinyLoRA.
Xóa một adapter và dọn dẹp các tham số v dùng chung ở cấp độ mô hình.