Model Editing
Chỉnh sửa model thay đổi một sự kiện hoặc hành vi cụ thể của model đã huấn luyện, chẳng hạn như một câu trả lời của LLM, mà không cần huấn luyện lại hoặc làm ảnh hưởng đến các đầu ra không liên quan.
Chỉnh sửa model là thay đổi có chủ đích một sự thật hoặc hành vi cụ thể trong model đã huấn luyện, chẳng hạn câu trả lời mà mô hình ngôn ngữ lớn (LLM) đưa ra cho câu “Space Needle tọa lạc tại thành phố nào”, mà không huấn luyện lại model và không làm thay đổi đầu ra của model với các đầu vào không liên quan. Phương pháp này chủ yếu được dùng để sửa, cập nhật hoặc bổ sung kiến thức thực tế trong LLM, khi việc huấn luyện lại toàn bộ quá tốn kém còn fine-tuning trên một ví dụ đơn lẻ thường gây overfit hoặc làm hỏng kiến thức khác. Công cụ chỉnh sửa hoặc tính toán một thay đổi nhỏ, cục bộ trong trọng số model, hoặc lưu chỉnh sửa bên ngoài các trọng số rồi định tuyến đầu vào liên quan đến đó. Phương pháp nổi tiếng nhất, Rank-One Model Editing (ROME), do Kevin Meng, David Bau, Alex Andonian và Yonatan Belinkov giới thiệu trong bài Định vị và chỉnh sửa các liên kết dữ kiện trong GPT, được trình bày tại NeurIPS 2022.
Cách chỉnh sửa model hoạt động#
Yêu cầu chỉnh sửa nêu đầu vào, thường là một chủ thể và một quan hệ, cùng đầu ra mới; ví dụ, đổi thành phố của Space Needle từ Seattle thành Paris. Các phương pháp chỉnh sửa thuộc một vài nhóm:
- Định vị rồi chỉnh sửa: ROME trước tiên dùng truy vết nhân quả, một kỹ thuật diễn giải tính có thể làm sai lệch rồi khôi phục các trạng thái ẩn, để tìm vị trí các model GPT ghi nhớ một dữ kiện. Phép tính quyết định nằm ở các lớp truyền thẳng (MLP) giữa mạng, tại token cuối cùng của chủ thể. ROME xem phép chiếu đầu ra của một MLP là bộ nhớ key-value rồi chèn dữ kiện mới bằng cập nhật trọng số hạng một dạng đóng; trong GPT-2 XL, phương pháp này chỉnh sửa lớp 18 trong tổng số 48 lớp. MEMIT phân bổ cập nhật trên nhiều lớp để chèn hàng nghìn dữ kiện cùng lúc.
- Công cụ chỉnh sửa được học: MEND huấn luyện một hypernetwork nhỏ để chuyển gradient của ví dụ chỉnh sửa thành bản cập nhật trọng số hạng thấp, giúp chỉnh sửa nhanh ngay cả với model có hàng tỷ tham số.
- Công cụ chỉnh sửa dựa trên bộ nhớ: SERAC lưu các chỉnh sửa trong bộ nhớ tường minh và dùng bộ phân loại phạm vi để chuyển đầu vào liên quan đến một chỉnh sửa sang model phản thực nhỏ, không đụng đến trọng số cơ sở. GRACE chèn một codebook gồm các adaptor key-value rời rạc tại một lớp để xử lý chuỗi chỉnh sửa dài. Đưa dữ kiện mới vào prompt, như cách retrieval-augmented generation thực hiện, là cách chỉnh sửa đơn giản nhất thuộc nhóm này.
Cập nhật của ROME dựa trên một tính chất của các lớp tuyến tính: ma trận trọng số W ánh xạ các key được lưu trữ sang value, và có thể gán value mới v* cho key mới k* bằng cách cộng một ma trận hạng một. ROME điều chỉnh cập nhật bằng ma trận hiệp phương sai nghịch đảo C của các key mà lớp đã thấy, được ước tính từ một mẫu văn bản Wikipedia, nhờ đó hướng thay đổi tránh xa những hướng mà các key hiện có sử dụng. Ví dụ PyTorch này áp dụng cập nhật đó lên một lớp ngẫu nhiên lưu trữ 5.000 key và so sánh với cập nhật hạng một thông thường bỏ qua hiệp phương sai:
import torch
torch.manual_seed(0)
scales = torch.logspace(0, -2, 256) # key dimensions with very different variances, as in real activations
keys = torch.randn(5000, 256) * scales # keys of 5,000 facts the layer already stores
W = torch.randn(128, 256) # the layer maps each key to a value
C = keys.T @ keys / len(keys) # second-moment statistics of the stored keys
k_new = torch.randn(256) * scales # key of the subject to edit
v_new = W @ keys[0] # new value: one already stored for another subject, as in "Seattle" -> "Paris"
# Plain rank-one update vs. ROME's update, which steers the change away from directions stored keys use
plain = W + torch.outer(v_new - W @ k_new, k_new) / (k_new @ k_new)
c_inv_k = torch.linalg.solve(C, k_new)
rome = W + torch.outer(v_new - W @ k_new, c_inv_k) / (k_new @ c_inv_k)
for name, edited in [("Plain rank-one", plain), ("ROME", rome)]:
error = (edited @ k_new - v_new).norm() / v_new.norm()
drift = ((keys @ (edited - W).T).norm(dim=1) / (keys @ W.T).norm(dim=1)).median()
print(f"{name}: new-fact error {error:.4f}, median change on stored facts {drift:.2%}")Cả hai bản cập nhật đều ánh xạ chính xác key mới sang value mới, với sai số 0.0000. Bản cập nhật thông thường làm thay đổi đầu ra trung vị của 5.000 key được lưu trữ một lượng 10.99%, còn bản cập nhật có trọng số hiệp phương sai của ROME làm thay đổi một lượng 5.02%, vì vậy chỉnh sửa này ít ảnh hưởng hơn đến những gì lớp đã biết.
Đánh giá một chỉnh sửa#
Các chỉnh sửa được đánh giá đồng thời trên nhiều thuộc tính. Độ tin cậy cho biết đầu vào đã chỉnh sửa có đưa ra câu trả lời mới hay không; khả năng khái quát hóa cho biết các cách diễn đạt lại có làm được điều đó hay không; tính cục bộ, còn gọi là tính đặc hiệu, cho biết đầu vào không liên quan có giữ nguyên câu trả lời cũ hay không; và khả năng chuyển giao cho biết suy luận phụ thuộc vào dữ kiện đó có thay đổi theo hay không. Các tác giả ROME xây dựng bộ dữ liệu CounterFact gồm 21.919 chỉnh sửa phản thực để đo lường đồng thời các yếu tố này, vì các benchmark trước đó cho phép các phương pháp đánh đổi khả năng khái quát hóa lấy tính đặc hiệu mà không bị phát hiện.
Các chỉnh sửa thường thất bại ở những bài kiểm tra khó hơn. Trên 5.000 chỉnh sửa của benchmark RippleEdits, các phương pháp chỉnh sửa nổi bật không tạo được thay đổi nhất quán cho những dữ kiện có liên kết logic với dữ kiện được chỉnh sửa, còn baseline chỉnh sửa đơn giản trong ngữ cảnh đạt điểm cao nhất. Gupta và cộng sự phát hiện rằng việc áp dụng ROME và MEMIT tuần tự khiến model quên các chỉnh sửa trước đó và kỹ năng liên quan phía sau, ban đầu diễn ra từ từ rồi đột ngột, qua đó giới hạn số chỉnh sửa mà model có thể tiếp nhận.
Chỉnh sửa model thị giác#
Cơ chế hạng một tương tự cũng áp dụng cho hình ảnh. Santurkar và cộng sự đã chỉnh sửa các bộ phân loại hình ảnh bằng cách viết lại quy tắc mà một lớp áp dụng cho khái niệm thị giác, chẳng hạn ánh xạ biểu diễn của tuyết sang biểu diễn của đường để model xử lý được xe cộ trên đường phủ tuyết mà không cần thu thập dữ liệu huấn luyện mới. Ultralytics YOLOE thực hiện chỉnh sửa không cần gradient đối với detection head của chính nó khi export: các lớp được cấu hình bằng set_classes() được nhân vào lớp tích chập cuối cùng của mỗi nhánh phân loại, nhờ đó model đã export có thể phát hiện bộ từ vựng mới mà không cần huấn luyện hay text encoder.
Chỉnh sửa model và các khái niệm liên quan#
- Fine-tuning: Cập nhật nhiều trọng số từ một tập dữ liệu để thay đổi hành vi trên diện rộng. Chỉnh sửa nhắm đến một cặp đầu vào-đầu ra và giới hạn mọi thay đổi khác.
- Retrieval-augmented generation (RAG): Cung cấp dữ kiện hiện hành trong prompt ở mỗi yêu cầu và giữ nguyên model, nhờ đó dễ hoàn tác và mở rộng cho nhiều dữ kiện.
- Machine unlearning: Loại bỏ ảnh hưởng của dữ liệu huấn luyện cụ thể. Chỉnh sửa thay thế hoặc bổ sung một dữ kiện; chỉnh sửa xóa bỏ dữ kiện là một dạng unlearning.
- Task arithmetic: Cộng hoặc trừ các thay đổi trọng số của toàn bộ tác vụ đã fine-tune. Chỉnh sửa model hoạt động ở cấp độ một dữ kiện đơn lẻ.
- Mechanistic interpretability: Giải thích cách model thực hiện tính toán. Truy vết nhân quả của ROME bắt nguồn từ lĩnh vực này và xác định lớp mà chỉnh sửa nhắm đến.










