Model Merging
Hợp nhất model kết hợp trọng số của các model được fine-tune từ cùng một model nền thành một model duy nhất mà không làm tăng chi phí suy luận. Nội dung bao gồm lấy trung bình và phép toán trên tác vụ.
Hợp nhất model kết hợp trọng số của hai hoặc nhiều model đã huấn luyện thành một model duy nhất, thường bằng cách lấy trung bình hoặc cộng các tham số, nhờ đó kết quả giữ lại các khả năng của từng model mà không cần chạy nhiều mạng hoặc huấn luyện lại trên toàn bộ dữ liệu của chúng. Phương pháp này hoạt động khi các model dùng chung kiến trúc và, với hầu hết phương pháp, có cùng điểm khởi đầu đã tiền huấn luyện: fine-tuning chỉ đưa mỗi bản sao đi một đoạn ngắn trong không gian trọng số, nên trọng số model vẫn khớp nhau theo từng tham số. Hợp nhất được sử dụng rộng rãi để xây dựng model ngôn ngữ lớn (LLM) nguồn mở và kết hợp adapter LoRA hoặc checkpoint Stable Diffusion; sau huấn luyện, Meta lấy trung bình các model Llama 3 thu được với dữ liệu hoặc siêu tham số khác nhau ở mỗi giai đoạn.
Cách thức hợp nhất model#
Các phương pháp hợp nhất khác nhau về những gì chúng kết hợp và cách xử lý xung đột giữa các model:
- Model soup: Lấy trung bình trọng số của các model được fine-tune từ cùng một model cơ sở với các siêu tham số khác nhau. Một model soup tham lam gồm các model ViT-G đã fine-tune đạt độ chính xác top-1 90.94% trên ImageNet, một kết quả tiên tiến nhất vào thời điểm đó.
- Trung bình trọng số ngẫu nhiên: Lấy trung bình các checkpoint được lưu tại những thời điểm khác nhau trong một lần chạy huấn luyện, thường giúp mô hình hội tụ về vùng rộng và phẳng hơn trên bề mặt hàm loss.
- Số học tác vụ: Trừ trọng số cơ sở khỏi từng model đã fine-tune để thu được vector tác vụ, sau đó cộng các vector tác vụ đã nhân tỷ lệ vào model cơ sở để kết hợp kỹ năng, hoặc trừ một vector để loại bỏ một hành vi.
- TIES-Merging: Giảm nhiễu lẫn nhau giữa các vector tác vụ qua ba bước: đặt lại các tham số chỉ thay đổi nhẹ trong quá trình fine-tuning, chọn dấu cho từng tham số, rồi chỉ hợp nhất các giá trị có dấu trùng khớp.
- DARE: Loại bỏ ngẫu nhiên phần lớn giá trị trong mỗi vector tác vụ và điều chỉnh tỷ lệ phần còn lại trước khi hợp nhất, qua đó loại bỏ các thay đổi dư thừa nhưng vẫn giữ được khả năng của từng tác vụ.
Lấy trung bình trong một lần chạy huấn luyện cũng là một phần của quy trình huấn luyện thông thường. Quá trình huấn luyện Ultralytics YOLO26 duy trì trung bình trượt hàm mũ (EMA) của trọng số model song song với các trọng số đang được tối ưu hóa, với hệ số suy giảm tăng dần lên 0.9999 khi quá trình huấn luyện tiếp diễn; các checkpoint last.pt và best.pt được lưu sẽ chứa model đã lấy trung bình này.
Các phương pháp vector tác vụ có chung một cấu trúc: biểu diễn mỗi model đã fine-tune bằng phần chênh lệch so với model cơ sở, làm sạch và kết hợp các phần chênh lệch, rồi cộng kết quả trở lại model cơ sở:
Các công cụ nguồn mở như mergekit triển khai những phương pháp này cho LLM, đồng thời hỗ trợ nội suy cầu (SLERP) giữa hai model.
Vì sao điểm khởi đầu chung lại quan trọng#
Các đơn vị ẩn trong mạng nơ-ron có thể được sắp xếp lại mà không làm thay đổi phép tính của mạng, vì vậy hai mạng được huấn luyện từ các khởi tạo ngẫu nhiên khác nhau hiếm khi lưu cùng một đặc trưng ở cùng vị trí; lấy trung bình chúng sẽ trộn lẫn các trọng số không liên quan. Các model được fine-tune từ cùng một model cơ sở giữ nguyên cách sắp xếp của model cơ sở và nằm trong cùng vùng có loss thấp, nên phép lấy trung bình vẫn hoạt động. Ví dụ này huấn luyện một bộ phân loại PyTorch nhỏ trên chữ số viết tay, fine-tune hai bản sao trên hai nửa khác nhau của phần dữ liệu huấn luyện còn lại, rồi so sánh kết quả hợp nhất của chúng với kết quả hợp nhất hai model được huấn luyện từ các khởi tạo riêng biệt:
import copy
import torch
from sklearn.datasets import load_digits
from torch import nn
torch.manual_seed(0)
X, y = load_digits(return_X_y=True)
order = torch.randperm(len(X))
X, y = torch.tensor(X / 16, dtype=torch.float32)[order], torch.tensor(y)[order]
def mlp():
"""Return a small classifier for 8x8 digit images."""
return nn.Sequential(nn.Linear(64, 64), nn.ReLU(), nn.Linear(64, 64), nn.ReLU(), nn.Linear(64, 10))
def train(model, rows, steps):
"""Train a model with SGD on the given rows and return it."""
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
for _ in range(steps):
optimizer.zero_grad()
nn.functional.cross_entropy(model(X[rows]), y[rows]).backward()
optimizer.step()
return model
base = train(mlp(), slice(0, 300), 400) # shared pretrained starting point
halves = (slice(300, 900), slice(900, 1500)) # two different fine-tuning datasets
for name, (a, b) in [
("fine-tuned from one base", [train(copy.deepcopy(base), rows, 100) for rows in halves]),
("trained from separate inits", [train(mlp(), rows, 400) for rows in halves]),
]:
# Merge: average every weight tensor of the two models
merged = copy.deepcopy(a)
merged.load_state_dict({k: (a.state_dict()[k] + b.state_dict()[k]) / 2 for k in a.state_dict()})
accuracy = [(m(X[1500:]).argmax(1) == y[1500:]).float().mean().item() for m in (a, b, merged)]
print(f"{name}: {accuracy[0]:.3f} and {accuracy[1]:.3f}, merged {accuracy[2]:.3f}")Trên 297 chữ số được giữ lại để kiểm thử, hai model được fine-tune từ cùng một model cơ sở đạt điểm lần lượt là 0.956 và 0.946; điểm của trọng số trung bình là 0.970, cao hơn cả hai model vì kết hợp được những gì mỗi model học từ một nửa dữ liệu. Hai model được huấn luyện từ các khởi tạo riêng biệt đạt điểm 0.946 và 0.956, còn điểm trung bình giảm xuống 0.808. Git Re-Basin hợp nhất các model được huấn luyện độc lập bằng cách hoán vị các đơn vị ẩn của một model để khớp với model còn lại.
Hợp nhất model và các thuật ngữ liên quan#
- Tổ hợp model: Giữ lại mọi model và kết hợp đầu ra của chúng, vì vậy mức sử dụng bộ nhớ và độ trễ suy luận tăng theo số lượng model. Model đã hợp nhất có kích thước và tốc độ như một model đơn.
- Chưng cất tri thức: Huấn luyện một model student mới để bắt chước một hoặc nhiều model teacher, đòi hỏi dữ liệu huấn luyện và tài nguyên tính toán. Hợp nhất là phép toán số học trực tiếp trên các trọng số hiện có.
- Huấn luyện đa tác vụ: Huấn luyện một model trên dữ liệu của tất cả tác vụ cùng lúc; cách này thường xác lập mức độ chính xác mà quá trình hợp nhất hướng tới khi không có quyền truy cập dữ liệu đó.
- Học liên kết: Lấy trung bình trọng số của các model được huấn luyện trên những thiết bị riêng biệt ở mỗi vòng. Mỗi vòng bắt đầu bằng việc khởi tạo tất cả client từ cùng một model toàn cục — điểm khởi đầu chung giúp phép lấy trung bình hoạt động.










