Welcome to MikeDaDev's Blog – notes on Java, backend & system design.

Explore
MikeDaDev's Blog
in ai

reasoning models & test-time compute

Tung Bui Thanh (TungDaDev)13 mins read

Reasoning models rl.webp

Model trả lời ngay trong 200 mili-giây thì giống phản xạ. Model biết dừng lại nghĩ, tự hỏi lại mình, thử rồi tự sửa sai trong 20 giây thì mới bắt đầu giống đang suy nghĩ thật.

Tháng 1/2025, giới công nghệ bị một phen hết hồn: DeepSeek-R1 ra mắt (20/01/2025).

Chỉ một tuần sau, ngày 27/01, cổ phiếu bán dẫn và Big Tech Mỹ rơi mạnh; riêng Nvidia mất gần 600 tỷ USD vốn hoá trong một phiên. Sao một model mở trọng số (open-weight) của một công ty AI Trung Quốc lại gây chấn động cỡ đó, trong khi OpenAI đã ra model lý luận o1 từ mấy tháng trước?

Lý do không nằm ở marketing. Nó nằm ở chỗ DeepSeek-R1 đổi luôn cách người ta nghĩ về việc làm model giỏi hơn:

  1. Cho thấy muốn model giỏi hơn thì không nhất thiết chỉ có đường đốt thêm hàng tỷ USD GPU để nuốt thêm dữ liệu trong giai đoạn pre-training.
  2. Đưa Test-Time Compute Scaling (tăng lượng tính toán lúc suy luận) thành một hướng đi chính, và công khai cách làm, điều mà OpenAI giữ kín với o1.
  3. Cho thấy model có thể tự học cách suy luận dài bằng Reinforcement Learning thuần (pure RL), không cần ví dụ suy luận nào do người viết sẵn. Đó là bản R1-Zero; bản R1 phát hành chính thức vẫn dùng thêm vài nghìn ví dụ mẫu cho dễ đọc, sẽ nói ở dưới.

Bài này mình đi vào phần kỹ thuật bên dưới của reasoning model, so DeepSeek-R1 với OpenAI o1, và nói xem thay đổi này ảnh hưởng thế nào tới cách mình thiết kế phần mềm. Nguồn chính là báo cáo kỹ thuật DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning.


# hai giai đoạn của scaling laws: từ pre-training sang test-time compute

Suốt 5 năm, công thức thành công gần như duy nhất của LLM (từ GPT-2 tới GPT-4) là Pre-training Scaling Law. Dạng hay được trích nhất là của paper Chinchilla (Hoffmann và cộng sự, 2022):

Loss(N, D) ≈ E + A / N^alpha + B / D^beta
 
N: số tham số, D: số token dữ liệu train
E: phần loss không thể giảm, A, B, alpha, beta: hằng số khớp từ thực nghiệm
(Chinchilla ước lượng alpha ≈ 0.34, beta ≈ 0.28)
Lượng tính toán train C ≈ 6 * N * D (FLOPs)

Đọc công thức sẽ thấy loss giảm theo luỹ thừa: tăng N hay D lên gấp đôi thì phần loss tương ứng chỉ giảm một tỉ lệ cố định, càng về sau càng tốn nhiều hơn cho cùng một mức cải thiện. Và vì C ≈ 6ND, muốn tăng cả hai thì tiền GPU tăng theo tích của chúng. Tới 2024 thì đường này đụng hai bức tường:

  • Dữ liệu chữ chất lượng cao đang cạn dần: sách báo, Wikipedia, Reddit, GitHub công khai... phần lớn đã được đưa vào train. Nhóm Epoch AI ước tính kho văn bản công khai do người viết có thể bị dùng hết trong khoảng 2026 đến 2032.
  • Chi phí train leo thang: theo AI Index 2024 của Stanford, chi phí tính toán ước tính để train GPT-4 khoảng 78 triệu USD, Gemini Ultra khoảng 191 triệu USD.

Reasoning model mở ra hướng thứ hai: tăng lượng tính toán lúc suy luận (Inference Scaling). Thay vì làm model to hơn, cho model "nghĩ" lâu hơn trên từng câu hỏi.

Đưa cho model kiểu cũ một bài logic hóc búa, nó nhả token đầu tiên sau 0.2 giây, dựa trên việc mấy chữ này hay đi với nhau trong dữ liệu đã học. Model không có chỗ nào để "nháp", nên rất dễ dính bẫy và trả lời sai.

Reasoning model thì được train để sinh ra một chuỗi suy nghĩ nội bộ (internal chain-of-thought) trước khi trả lời. Với DeepSeek-R1, chuỗi này nằm trong thẻ <think> ... </think> và dài hàng nghìn, có khi hàng chục nghìn token: thử một hướng, thấy bí, gạch đi, quay lại thử hướng khác, tới khi thấy chắc mới đưa câu trả lời cuối cho người dùng. Mỗi token nghĩ là một lượt tính toán thêm, nên "nghĩ lâu hơn" đúng nghĩa là "tốn nhiều compute hơn lúc chạy". Một số API cho bạn chỉnh mức này, ví dụ reasoning_effort của OpenAI hay thinking budget (số token tối đa dành cho phần nghĩ) của Claude.

Lưu ý là R1 không chạy thuật toán tìm kiếm kiểu cây (Tree of Thoughts, MCTS) nào ở bên ngoài. Nó chỉ sinh một chuỗi token dài theo cách bình thường, việc "quay lui" hay "thử hướng khác" đều diễn ra ngay trong chuỗi chữ đó. Báo cáo của DeepSeek còn ghi lại là họ đã thử MCTS và Process Reward Model (chấm điểm từng bước) nhưng không thành công khi mở rộng quy mô.

TIP

Inference-Time Compute Scaling cho bạn đổi độ trễ và tiền token lấy độ chính xác: để model nghĩ thêm 10 - 30 giây, đổi lại tỉ lệ đúng tăng rõ ở mấy bài khó như kiến trúc phân tán, thiết kế thuật toán hay audit lỗ hổng bảo mật. Với câu hỏi đơn giản thì ngược lại: model vẫn có thể nghĩ dài dòng, tốn tiền và chậm mà không đúng hơn. Đừng dùng reasoning model cho mọi request.


# "aha moment" và chuyện pure rl làm được gì

Một trong những phát hiện đáng chú ý nhất trong báo cáo DeepSeek-R1 là bản DeepSeek-R1-Zero: train bằng RL thuần, bỏ hẳn bước Supervised Fine-Tuning (SFT) mở đầu.

Trước đó, cách phổ biến để dạy model suy luận là cho nó bắt chước thật nhiều lời giải từng bước có sẵn (SFT), rồi mới dùng RL để tinh chỉnh.

Nhóm DeepSeek thử một cách khá liều:

  1. Lấy base model DeepSeek-V3-Base, chưa được dạy suy nghĩ từng bước.
  2. Không đưa nó bất kỳ lời giải mẫu nào của người. Prompt chỉ yêu cầu đúng một khuôn: nghĩ trong <think>, trả lời trong <answer>.
  3. Chấm điểm bằng luật cố định (Rule-based Reward) chứ không dùng model chấm điểm: câu trả lời toán khớp đáp án, hoặc code qua được bộ test case, thì được thưởng (accuracy reward); thêm một phần thưởng cho việc đặt suy nghĩ đúng trong thẻ <think> (format reward). Họ cố ý không dùng reward model bằng mạng nơ-ron vì model được train lâu sẽ tìm ra cách "lừa" reward model (reward hacking).
  4. Tối ưu policy bằng thuật toán GRPO (Group Relative Policy Optimization).

GRPO là phần đáng hiểu kỹ. PPO, thuật toán RL quen thuộc khi train LLM, cần thêm một model "critic" cỡ tương đương để ước lượng mỗi câu trả lời tốt hơn mức trung bình bao nhiêu. Với model hàng trăm tỷ tham số, nuôi thêm một critic cỡ đó rất tốn. GRPO bỏ critic đi: với mỗi câu hỏi, cho model sinh ra một nhóm G câu trả lời, chấm điểm từng câu, rồi so mỗi câu với trung bình của chính nhóm đó:

Advantage_i = (r_i - mean(r_1..r_G)) / std(r_1..r_G)

Câu nào điểm cao hơn trung bình nhóm thì được đẩy xác suất lên, thấp hơn thì bị kéo xuống. Hàm mục tiêu còn có một phần phạt KL để policy mới không trôi quá xa so với model tham chiếu. Giống chấm thi theo kiểu xếp hạng trong lớp: không cần biết thang điểm tuyệt đối, chỉ cần biết bài nào tốt hơn bài nào.

Kết quả khá bất ngờ. Sau vài nghìn bước RL, điểm pass@1 của R1-Zero trên đề thi toán AIME 2024 tăng từ 15.6% lên 71.0% (86.7% nếu lấy đáp án đa số trong nhiều lần chạy), ngang o1-0912 của OpenAI. Câu trả lời cũng tự dài ra theo thời gian train: model tự học cách nghĩ lâu hơn mà không ai bảo nó làm vậy.

Trích từ Table 3 trong báo cáo DeepSeek-R1 (một checkpoint trung gian của R1-Zero):
 
Question: If a > 1, then the sum of the real solutions of sqrt(a - sqrt(a + x)) = x is equal to
Response: <think>
To solve the equation sqrt(a - sqrt(a + x)) = x, let's start by squaring both ...
...
Wait, wait. Wait. That's an aha moment I can flag here.
Let's reevaluate this step-by-step to identify if the correct sum can be ...

Hiện tượng này được gọi là "Aha Moment": model tự học được cách nghi ngờ chính mình, kiểm tra lại các bước trước và đổi hướng, mà không có ai dạy nó câu "nghĩ lại đi". Có điều nên biết thêm: nghiên cứu Understanding R1-Zero-Like Training: A Critical Perspective (Sea AI Lab, 2025) chỉ ra rằng chính DeepSeek-V3-Base, khi chưa qua RL, đã có "aha moment" ở mức nào đó. Nghĩa là RL không tạo ra khả năng tự sửa từ con số không mà chủ yếu khuếch đại thứ model đã nhặt được từ dữ liệu pretraining.

R1-Zero có hai nhược điểm lớn: suy nghĩ khó đọc và hay trộn lẫn ngôn ngữ (đang tiếng Anh nhảy sang tiếng Trung). Vì vậy bản DeepSeek-R1 phát hành chính thức train theo nhiều chặng: SFT trên vài nghìn ví dụ suy luận dễ đọc ("cold start"), RL giống R1-Zero, sinh dữ liệu mới từ chính model rồi SFT lần nữa, và một vòng RL cuối. Kết quả được báo cáo ngang o1-1217 trên các bài suy luận.


# kiến trúc: MoE & MLA

R1 không phải model mới từ đầu, nó được train tiếp từ DeepSeek-V3-Base. Phần lớn lý do R1 rẻ khi chạy nằm ở hai kỹ thuật kiến trúc của dòng V2/V3:

Sơ đồ trên vẽ đơn giản cho dễ nhìn. Trong model thật, MoE và attention lặp lại ở từng layer, và expert không chia theo chủ đề rõ ràng kiểu "expert toán", "expert code" như người ta hay tưởng; router học cách phân token theo những đặc trưng khó gọi tên.

# kiến trúc hỗn hợp chuyên gia moe

DeepSeek-R1 có tổng cộng 671 tỷ tham số (671B), nhưng mỗi token chỉ kích hoạt 37 tỷ (37B). Ở mỗi layer MoE của V3 có 256 expert, router chọn 8 expert cho mỗi token, cộng thêm một expert dùng chung luôn chạy. Vì thế lượng tính toán cho mỗi token chỉ như một model 37B.

Cái giá là bộ nhớ: expert không được chọn vẫn phải nằm sẵn trong VRAM vì token tiếp theo có thể cần tới nó. Chạy đủ bản 671B (trọng số FP8, khoảng 700 GB) cần cả một cụm GPU, chứ không phải máy cá nhân. MoE tiết kiệm FLOPs, không tiết kiệm RAM.

# multi-head latent attention (mla)

Khi sinh từng token, model phải giữ lại Key và Value của mọi token trước đó (KV Cache) để khỏi tính lại. Với Multi-Head Attention kiểu cũ, KV Cache lớn theo số layer, số head và độ dài ngữ cảnh, nên với chuỗi suy nghĩ hàng chục nghìn token thì nó ngốn VRAM rất nhanh. MLA chiếu Key và Value xuống một vector tiềm ẩn (latent vector) nhỏ hơn nhiều rồi mới cất vào cache, lúc cần thì chiếu ngược ra. Theo báo cáo DeepSeek-V2, cách này giảm KV Cache tới 93.3% so với model dense DeepSeek 67B đời trước. Cache nhỏ thì nhét được nhiều request hơn vào cùng một GPU, và đó là chỗ tiết kiệm tiền khi phục vụ reasoning model sinh ra rất nhiều token.


# dev phần mềm rút ra được gì

Reasoning model làm thay đổi khá nhiều cách mình đưa AI vào hệ thống:

# bớt viết prompt dài dòng

Trước đây muốn model giải toán hay viết code cho đúng, mình phải viết prompt dài cả trang: "Hãy suy nghĩ từng bước một", "Hãy đóng vai chuyên gia và làm theo 5 giai đoạn...". Với reasoning model, chỉ cần nói rõ yêu cầu và điều kiện thế nào là đúng. Nó tự tìm đường đi, mình không cần cầm tay chỉ từng bước (micro-management). Chính báo cáo DeepSeek-R1 ghi nhận few-shot prompting (nhét vài ví dụ mẫu vào prompt) làm R1 kém đi, và khuyên mô tả bài toán trực tiếp theo kiểu zero-shot. Hướng dẫn của OpenAI cho dòng o1 cũng khuyên tương tự: không cần dặn "think step by step".

# chưng cất tri thức (knowledge distillation)

Thứ DeepSeek cho cộng đồng mà mình thấy giá trị nhất là họ dùng khoảng 800 nghìn mẫu do R1 sinh ra để distill (SFT) sang sáu model dense nhỏ dựa trên Qwen2.5 và Llama: 1.5B, 7B, 8B, 14B, 32B và 70B.

  • Theo báo cáo, bản 7B (DeepSeek-R1-Distill-Qwen-7B) đạt 55.5% trên AIME 2024 và vượt GPT-4o (bản 05/2024) trên các benchmark suy luận được đo. Một model cỡ này chạy được trên MacBook Pro nhiều RAM hay card gaming như RTX 4090 khi đã lượng tử hoá (quantize).
  • Doanh nghiệp có thể đưa khả năng suy luận này vào thiết bị biên (edge device) hay app nội bộ mà không phụ thuộc API bên ngoài, đổi lại phải tự lo phần cứng và vận hành.

Một chi tiết thú vị khác trong báo cáo: với model nhỏ, distill từ R1 cho kết quả tốt hơn hẳn việc tự chạy RL quy mô lớn trên chính model nhỏ đó.


# tổng kết

DeepSeek-R1 và OpenAI o1 đánh dấu chuyện năng lực của model giờ có thêm một trục để tăng: cho nó nghĩ lâu hơn lúc chạy, và dạy nó nghĩ bằng RL với phần thưởng kiểm chứng được.

Về mặt thực hành, nên dùng reasoning model cho những việc khó mà kiểm chứng được kết quả, như bài toán, code có test, phân tích nhiều ràng buộc; còn những việc đơn giản và cần nhanh thì model thường vẫn rẻ và hợp hơn. Muốn đào sâu thì đọc thẳng báo cáo DeepSeek-R1, phần GRPO và phần "Unsuccessful Attempts" đáng đọc nhất.


Chỉ là những ghi chép cá nhân với hy vọng mang lại chút giá trị. Nếu thấy hữu ích, đừng ngại chia sẻ cho bạn bè & đồng nghiệp nhé!

Happy coding 😎 👍🏻 🚀 🔥.