Bạn có một mô hình ngôn ngữ lớn (LLM) với 7 tỷ tham số và muốn tinh chỉnh nó cho tác vụ riêng. Tinh chỉnh toàn bộ đòi hỏi cập nhật cả 7 tỷ tham số, cần tới 60 GB VRAM, vượt xa khả năng của phần lớn GPU phổ thông. LoRA (Low-Rank Adaptation) giải quyết bài toán này bằng cách chỉ cập nhật vài triệu tham số, giảm bộ nhớ cần thiết xuống khoảng 16-20 GB, đủ chạy trên một chiếc RTX 3090.
Ý tưởng cốt lõi: Phân rã ma trận hạng thấp
Hãy tưởng tượng bạn có một cuốn sách dày 768 trang, mỗi trang 768 dòng, tổng cộng gần 590.000 ký tự. Thay vì viết lại toàn bộ cuốn sách, LoRA chỉ ghi một bản ghi chú gồm hai cuốn sổ nhỏ hơn nhiều. Về mặt toán học, mỗi ma trận trọng số W (kích thước d×k) trong mô hình gốc được giữ nguyên, hoàn toàn đóng băng. LoRA thêm một bản cập nhật ΔW = B·A, trong đó A có kích thước r×k và B có kích thước d×r. Biến r ở đây gọi là hạng (rank), thường chỉ bằng 8, 16 hoặc 32, nhỏ hơn rất nhiều so với d và k (thường là 768 hoặc 4.096). Kết quả cụ thể: với r=32 trên ma trận 768×768, số tham số cần huấn luyện chỉ còn 49.152 thay vì 589.824, giảm 91%. Trên GPT-3 với 175 tỷ tham số, LoRA chỉ cần huấn luyện khoảng 18 triệu tham số, giảm gần 10.000 lần.
Hệ số alpha: Núm chỉnh âm lượng cho bộ điều chỉnh
LoRA có một siêu tham số gọi là alpha (α), hoạt động giống như núm chỉnh âm lượng cho phần cập nhật. Công thức đầy đủ khi suy luận: đầu ra = W·x + (α/r)·B·A·x. Tỷ lệ α/r quyết định adapter ảnh hưởng bao nhiêu đến kết quả cuối cùng. Ví dụ nếu r=8 và α=16, hệ số nhân là 2.0, nghĩa là đóng góp của adapter được khuếch đại gấp đôi trước khi cộng vào trọng số gốc. Mặc định phổ biến (do Microsoft đề xuất trong bài báo gốc) là α = 2×r. Tăng α giúp tinh chỉnh mạnh hơn nhưng có nguy cơ ghi đè kiến thức cũ. Giảm α giúp bảo toàn hành vi gốc của mô hình.
Chọn tầng nào để áp dụng?
Trong kiến trúc Transformer, mỗi tầng attention có bốn ma trận chiếu: Q (query), K (key), V (value), O (output), còn tầng feed-forward có hai ma trận chiếu lên và chiếu xuống. Cấu hình cơ bản chỉ áp dụng LoRA lên Q và V, đủ tốt cho phần lớn tác vụ thông thường như phân loại văn bản hay trả lời câu hỏi. Nghiên cứu thực nghiệm cho thấy áp dụng lên tất cả các tầng tuyến tính sẽ cho kết quả tốt nhất, dù tốn thêm bộ nhớ. Điểm hay của LoRA: khi triển khai production, hai ma trận A và B có thể được gộp ngược vào trọng số gốc (W' = W + B·A), nên không tạo thêm bất kỳ độ trễ nào khi suy luận so với mô hình gốc.
Tiết kiệm bộ nhớ: So sánh thực tế
Trên mô hình 7 tỷ tham số: tinh chỉnh toàn bộ cần khoảng 60 GB VRAM, LoRA tiêu chuẩn chỉ cần 16-20 GB (giảm 66-73%), và QLoRA (kết hợp lượng tử hóa 4-bit) chỉ cần 12 GB, chạy được trên GPU tiêu dùng. Về lưu trữ, chênh lệch còn ấn tượng hơn: bản lưu toàn bộ của GPT-3 nặng 1,2 TB, trong khi bộ điều chỉnh LoRA chỉ 35 MB, giảm 34.000 lần. Đây là lý do LoRA đặc biệt phổ biến trong cộng đồng mã nguồn mở, nơi người dùng có thể chia sẻ và hoán đổi adapter cho nhiều tác vụ khác nhau mà không cần phân phối lại toàn bộ mô hình nặng hàng trăm gigabyte.
Chọn hạng bao nhiêu là đủ?
Không có một con số cố định cho mọi trường hợp, nhưng vẫn có vài nguyên tắc thực tế: r=8-16 cho tác vụ đơn giản như chỉnh giọng văn, r=32-64 cho tinh chỉnh tiêu chuẩn như phân loại hoặc trích xuất thực thể, và r=128-256 cho tác vụ phức tạp như sinh mã hoặc suy luận toán học. Hạng càng cao đồng nghĩa số tham số càng nhiều và nguy cơ quá khớp càng lớn. Tuy nhiên, nghiên cứu cho thấy khi hạng đủ lớn, từ 256 trở lên, LoRA có thể đạt hiệu quả ngang tinh chỉnh toàn bộ. Một lợi thế ít ai nhắc đến: LoRA giúp giảm tình trạng mô hình quên kiến thức cũ khi huấn luyện thêm. Phần lớn mạng nơ-ron vẫn đóng băng, nhờ đó mô hình giữ lại nền tảng ban đầu tốt hơn nhiều so với cập nhật toàn bộ trọng số.





