LoRA (Low-Rank Adaptation)
LoRA fine-tune các model lớn bằng cách đóng băng trọng số và huấn luyện các ma trận cập nhật hạng thấp nhỏ, qua đó giảm số tham số cần huấn luyện, bộ nhớ và dung lượng lưu trữ.
LoRA, viết tắt của Low-Rank Adaptation, là phương pháp tinh chỉnh hiệu quả tham số (PEFT), điều chỉnh một model pretrained lớn cho tác vụ mới bằng cách đóng băng các trọng số ban đầu và huấn luyện một cặp ma trận nhỏ bên cạnh các layer được chọn. Tích của hai ma trận này tạo thành một cập nhật hạng thấp được cộng vào các trọng số đã đóng băng, vì vậy chỉ một phần rất nhỏ tham số nhận gradient. Được Hu và các cộng sự tại Microsoft giới thiệu năm 2021, LoRA giảm số tham số có thể huấn luyện của GPT-3 175B xuống 10.000 lần và giảm bộ nhớ GPU khi huấn luyện xuống 3 lần so với tinh chỉnh toàn bộ bằng Adam, đồng thời đạt chất lượng ngang bằng hoặc tốt hơn tinh chỉnh toàn bộ trên RoBERTa, DeBERTa, GPT-2 và GPT-3. Hiện nay, LoRA được sử dụng rộng rãi để tùy chỉnh mô hình ngôn ngữ lớn (LLM), model khuếch tán và vision transformer trên phần cứng phổ thông. LoRa, giao thức vô tuyến tầm xa dành cho thiết bị IoT, là một thuật ngữ không liên quan.
Cách LoRA hoạt động#
Tinh chỉnh thay đổi ma trận trọng số pretrained W có kích thước d × k bằng một lượng cập nhật ΔW nào đó. LoRA giả định rằng cập nhật này có hạng nội tại thấp, do đó có thể biểu diễn bằng tích của hai ma trận mỏng: ΔW = B × A, trong đó A có kích thước r × k, B có kích thước d × r và hạng r nhỏ hơn nhiều so với d hoặc k. Đầu ra của layer trở thành h = Wx + (α / r) × BAx, trong đó α là hằng số tỷ lệ cố định. A được khởi tạo bằng các giá trị ngẫu nhiên nhỏ còn B được khởi tạo bằng số 0, vì vậy quá trình huấn luyện bắt đầu đúng từ model pretrained. Chỉ A và B được cập nhật trong quá trình lan truyền ngược, đồng thời loại bỏ trạng thái optimizer của toàn bộ trọng số bị đóng băng.
Với phép chiếu kích thước 4096 × 4096, tinh chỉnh toàn bộ huấn luyện khoảng 16,8 triệu trọng số, trong khi adapter hạng 8 chỉ huấn luyện 8 × (4096 + 4096) = 65.536 trọng số. Script PyTorch dưới đây tạo adapter như vậy rồi gộp adapter vào layer đã đóng băng:
import torch
from torch import nn
# A frozen pretrained 4096 x 4096 projection, like one in a transformer attention block
base = nn.Linear(4096, 4096).requires_grad_(False)
# LoRA's trainable rank-8 update: B @ A, scaled by alpha / r
# B starts at zero, so the adapted layer initially matches the pretrained one
r, alpha = 8, 16
A = nn.Parameter(torch.randn(r, 4096) * 0.01)
B = nn.Parameter(torch.zeros(4096, r))
trainable = A.numel() + B.numel()
total = trainable + sum(p.numel() for p in base.parameters())
print(f"Trainable: {trainable:,} of {total:,} parameters ({trainable / total:.2%})")
# After training, merge the update into the base weight so inference costs nothing extra
nn.init.normal_(B, std=0.01) # stand-in for trained values
x = torch.randn(2, 4096)
adapted = base(x) + (alpha / r) * (x @ A.T @ B.T)
merged = nn.functional.linear(x, base.weight + (alpha / r) * B @ A, base.bias)
print(f"Merged layer matches adapter output: {torch.allclose(adapted, merged, atol=1e-5)}")Adapter huấn luyện 65.536 trong tổng số 16.846.848 tham số của layer, tương đương 0,39%; gộp B × A vào W cho đầu ra giống với khi chạy adapter riêng. Vì vậy, model LoRA đã gộp chạy nhanh chính xác như model gốc — một ưu điểm so với các layer adapter trước đây vốn bổ sung phép tính cho mỗi lượt lan truyền xuôi.
Ứng dụng LoRA trong thực tế#
Bài báo ban đầu chỉ điều chỉnh các phép chiếu query và value của attention trong transformer, nhưng hiện nay nhiều công thức hướng đến mọi layer tuyến tính. Hạng và α là các hyperparameter chính: thư viện Hugging Face PEFT mặc định đặt r = 8 và α = 8. Vì model nền không bị thay đổi, một deployment có thể giữ một bản sao duy nhất của model và thay đổi các adapter nhỏ dành riêng cho từng tác vụ. Với hạng 4 trên các phép chiếu query và value của GPT-3 175B, mỗi checkpoint đã điều chỉnh giảm từ 350 GB xuống khoảng 35 MB, nhỏ hơn xấp xỉ 10.000 lần.
- Mô hình ngôn ngữ: Các nhóm điều chỉnh LLM mở cho một lĩnh vực, phong cách hoặc định dạng chỉ dẫn cụ thể trên một GPU, thường kết hợp LoRA với dữ liệu instruction tuning.
- Tạo ảnh: Các file LoRA giúp Stable Diffusion và các model tương tự học một nhân vật, sản phẩm hoặc phong cách nghệ thuật; các file này được chia sẻ và xếp chồng riêng biệt với checkpoint nền.
- Model thị giác và đa phương thức: Adapter chuyên biệt hóa vision transformer và mô hình ngôn ngữ-thị giác (VLM) cho ảnh y tế, công nghiệp hoặc tài liệu mà không cần huấn luyện lại backbone.
Các biến thể#
- QLoRA: Đóng băng model nền ở độ chính xác NormalFloat 4-bit rồi huấn luyện các adapter LoRA trên đó. Dettmers và các cộng sự đã dùng phương pháp này để tinh chỉnh model 65 tỷ tham số trên một GPU 48 GB, đồng thời duy trì hiệu năng tinh chỉnh đầy đủ ở 16-bit.
- DoRA: Tách mỗi trọng số pretrained thành độ lớn và hướng, rồi chỉ áp dụng LoRA cho hướng; cách này thu hẹp khoảng cách chính xác so với tinh chỉnh toàn bộ với cùng chi phí suy luận.
LoRA và các thuật ngữ liên quan#
- Tinh chỉnh hiệu quả tham số: Thuật ngữ bao quát các phương pháp chỉ huấn luyện một phần nhỏ của model. Đóng băng layer là hình thức đơn giản nhất; Ultralytics YOLO cung cấp tính năng này qua đối số huấn luyện
freeze, giữ N layer đầu tiên của model YOLO26 ở trọng số pretrained trong khi huấn luyện các layer còn lại. - Tinh chỉnh toàn bộ: Cập nhật mọi trọng số và lưu một bản sao đầy đủ của model cho mỗi tác vụ. Trong lập trình và toán học, tinh chỉnh toàn bộ vượt trội đáng kể so với LoRA tiêu chuẩn, trong khi LoRA ít gặp hiện tượng quên thảm họa hơn đối với các kỹ năng khác của model nền.
- Tinh chỉnh prompt: Học các embedding prompt mềm được thêm vào trước đầu vào, trong khi mọi trọng số model vẫn được đóng băng.
- Học chuyển giao: Ý tưởng tổng quát về việc tái sử dụng kiến thức từ tác vụ này cho tác vụ khác. LoRA là một cách hiệu quả để thực hiện điều đó.
- Gộp model: Kết hợp trọng số của các model được tinh chỉnh riêng biệt; gộp nhiều adapter LoRA vào một model nền là trường hợp phổ biến.










