LLM Của Bạn Vốn Dĩ Đã 'Khôn' Hơn Bạn Tưởng — Chỉ Cần Nó Chịu 'Nghe' Chính Mình
Các nhà nghiên cứu của Apple phát hiện ra rằng việc fine-tuning một model trên chính output (chưa kiểm chứng) của nó giúp tăng khả năng sinh code lên 30%. Không cần teacher model, không RL, không verifier. Đây là lý do tại sao Simple Self-Distillation (SSD) hoạt động, và nó có ý nghĩa gì đối với cách chúng ta nghĩ về năng lực của LLM.
Mục lục
Nghe này, chuyện hơi điên rồ: sẽ ra sao nếu con nói một LLM có thể tự dạy nó code giỏi hơn bằng cách… ngồi nghe chính nó lảm nhảm?
Không cần teacher model. Không reinforcement learning. Không môi trường thực thi để xác minh code đúng hay sai. Chỉ có model, tự sampling solution của nó, rồi fine-tuning trên đống solution đó — kể cả những cái sai. Và bằng một cách nào đó, nó trở nên tốt hơn. Tốt hơn rất nhiều.
Chào mừng đến với Simple Self-Distillation (SSD), một paper mới từ Apple đang thu hút hơn 540 điểm trên Hacker News. Và nói thật? Cái tên nghe vẫn còn khiêm tốn. “Đơn giản đến đáng xấu hổ” là từ của họ, không phải của con.
Công thức: ba bước, không cần mảy may kiểm chứng
Đây là toàn bộ phương pháp. Con không bỏ sót chi tiết nào đâu:
- Sample — Đưa cho model một loạt bài toán code. Để nó tự sinh solution ở một mức nhiệt độ (temperature) và truncation nhất định.
- Fine-tune — Lấy đống output thô, chưa qua kiểm chứng đó (đúng vậy, cả bug và lỗi) và fine-tune lại model trên chính chúng bằng supervised fine-tuning (SFT) tiêu chuẩn.
- Deploy — Sử dụng model đã fine-tune với các thiết lập decoding của riêng nó.
Thế thôi. Không reward model. Không test case để lọc đúng sai. Không có pytest chạy nền. Model tự ‘ăn’ bài tập của chính nó — kể cả những lỗi sai — và bước ra thông minh hơn.
# Công thức SSD bằng pseudocode. Vâng, nó thực sự chỉ có thế này.
for prompt in coding_problems:
solution = model.generate(prompt, temp=T_train, top_k=10)
# Không kiểm chứng. Không lọc. Chỉ dựa vào 'linh cảm'.
training_data.append((prompt, solution))
model.fine_tune(training_data) # SFT tiêu chuẩn. Toàn bộ bí quyết là đây.
Những con số khiến con phải dụi mắt đọc lại
Kết quả headline: Qwen3-30B-Instruct nhảy từ 42.4% lên 55.3% pass@1 trên LiveCodeBench v6. Tăng 30% performance tương đối nhé, không phải dạng vừa đâu, mà chỉ dùng mỗi output (chưa kiểm chứng!) của chính model.
Mà hay cái là — sự cải thiện không đồng đều:
- Bài toán dễ: cải thiện +6.5pp
- Bài toán trung bình: cải thiện +14.2pp
- Bài toán khó: cải thiện +15.3pp 🔥
Bài toán càng khó, SSD càng giúp được nhiều. Và không chỉ một model — kỹ thuật này hoạt động trên cả hai họ Qwen và Llama, từ 4B đến 30B. Năm model được thử nghiệm, cả năm đều được cải thiện.
À, và tính đa dạng không bị sụp đổ. Mức tăng pass@5 thực ra còn lớn hơn mức tăng pass@1, nghĩa là model không chỉ trở nên chính xác hơn — nó còn duy trì khả năng khám phá nhiều hướng giải quyết khác nhau.
Tại sao nó hoạt động: sự giằng co giữa chính xác và sáng tạo
Đây là phần khiến con thực sự phấn khích. Paper không chỉ đưa ra kết quả; nó giải thích tại sao phương pháp đơn giản đến vô lý này lại hoạt động.
Insight quan trọng là cái mà họ gọi là sự giằng co giữa tính chính xác và khả năng khám phá (precision-exploration conflict). Khi sinh code, mỗi token rơi vào một trong hai loại:
- Ngã rẽ (Fork positions) — nơi có nhiều hướng đi hợp lệ (chọn thuật toán, cấu trúc dữ liệu). Ở đây, bạn muốn sự đa dạng.
- Điểm chốt (Lock positions) — nơi cú pháp và ngữ nghĩa đòi hỏi một token chính xác duy nhất (đóng ngoặc, khớp kiểu dữ liệu). Ở đây, bạn muốn sự chính xác.
Vấn đề là? Temperature là một cái núm vặn toàn cục. Vặn nhỏ xuống để có độ chính xác ở các ‘điểm chốt’, thì bạn sẽ bóp chết sự đa dạng sáng tạo ở các ‘ngã rẽ’. Vặn lớn lên để khám phá ở các ‘ngã rẽ’, thì những token nhiễu sẽ tràn vào ở các ‘điểm chốt’. Mọi thiết lập decoding toàn cục đều là một sự thỏa hiệp.
# Sự giằng co trong một bức tranh:
#
# Temp thấp: ✅ Điểm chốt chính xác ❌ Ngã rẽ nhàm chán
# Temp cao: ❌ Điểm chốt nhiễu ✅ Ngã rẽ sáng tạo
# SSD: ✅ Điểm chốt chính xác ✅ Ngã rẽ sáng tạo
#
# Làm thế nào? SSD định hình lại phân phối xác suất THEO NGỮ CẢNH, không phải toàn cục.
SSD giải quyết vấn đề này bằng cách học một cách ngầm định việc định hình lại phân phối xác suất phụ thuộc vào ngữ cảnh. Sau khi training trên các sample được tạo với temperature và truncation đã điều chỉnh, model sẽ triệt tiêu các token nhiễu ở ‘điểm chốt’ trong khi vẫn giữ lại sự đa dạng hữu ích ở ‘ngã rẽ’. Nó giống như đưa cho model một cái núm vặn temperature cho mỗi token thay vì một cái cho toàn bộ.
Paper chứng minh đây không phải là nói suông — họ xác minh điều này bằng các mô phỏng có kiểm soát và phân tích trên model thực. Việc quét temperature trên model gốc chỉ thay đổi pass@1 khoảng ~2pp. SSD thay đổi nó tới ~13pp.
Điều này có ý nghĩa gì (phần khiến con không ngừng suy nghĩ)
Hàm ý sâu xa hơn khá là điên rồ: các LLM hiện tại đã có những năng lực mà chúng không thể hiện ra được dưới các chiến lược decoding tiêu chuẩn. Kiến thức đã có sẵn, bị khóa bên trong các weights. SSD về cơ bản là một chiếc chìa khóa.
Điều này đảo ngược câu chuyện thông thường. Chúng ta quen nghĩ ‘model tốt hơn cần nhiều dữ liệu hơn, nhiều compute hơn.’ Nhưng SSD cho thấy có cả một chiều không gian cải tiến khác đến từ việc khai thác tốt hơn những gì model đã biết.
Một vài hàm ý con thấy cho dân thực hành:
- Post-training vừa trở nên rẻ hơn. SSD chỉ cần ~10K prompt code và một sample cho mỗi prompt. Không môi trường thực thi, không reward model, không teacher model.
- Mô hình ‘train trên output của chính mình’ chưa chết. Các cách tiếp cận self-training trước đây thường dẫn đến model collapse hoặc reward hacking. SSD tránh được điều này thông qua cơ chế chính xác-khám phá.
- Điều này có lẽ không chỉ dành riêng cho code. Cấu trúc ngã rẽ-điểm chốt tồn tại ở khắp mọi nơi: chứng minh toán học, viết lách, thậm chí cả tool-use. Con cá là SSD có thể áp dụng rộng rãi.
Thực tế: làm được ngay hôm nay không?
Nếu bạn có một model có thể fine-tune và một bộ prompt code, thì có. Công thức là:
- Chọn một bộ bài toán code đa dạng (~10K là số paper đã dùng)
- Sample một solution cho mỗi bài ở temperature hơi cao (T=1.5-2.0) với top-k truncation (k=10)
- Chỉ loại bỏ các response rỗng/tầm thường
- Fine-tune bằng SFT tiêu chuẩn trong vài nghìn bước
- Deploy với một mức evaluation temperature vừa phải
Sự tương tác của các siêu tham số rất trang nhã: T_effective = T_train × T_eval. Có một vùng ‘ngọt’ rộng xung quanh T_eff ≈ 1.2, và việc truncation trong quá trình sampling giúp nâng cao hiệu suất trong vùng đó.
Điểm mấu chốt
Simple Self-Distillation là một trong những paper khiến bạn phải xem xét lại các giả định. Chúng ta đã quá tập trung vào việc mở rộng quy mô, RLHF, và xác minh từ bên ngoài mà bỏ qua một sự thật đơn giản hơn: các model vốn dĩ đã tốt hơn những gì chiến lược decoding của chúng cho phép.
Cách khắc phục? Hãy để chúng tự nói chuyện với chính mình. Ngay cả những sai lầm cũng mang theo tín hiệu — bởi vì điều quan trọng không phải là liệu từng output riêng lẻ có đúng hay không, mà là liệu sự dịch chuyển phân phối có dạy cho model trở nên chính xác ở nơi cần chính xác và sáng tạo ở nơi cần sáng tạo hay không.
Trang nhã. Hữu ích. Và đơn giản đến đáng xấu hổ.
Paper: arXiv:2604.01193 — Zhang, Bai, Zheng, Jaitly, Collobert, Zhang (Apple, tháng 4, 2026)