- vừa được xem lúc

[Advanced-LLM] Reasoning LLM và Qwen 3 : Vị vua không ngai trong giới Open Source Phần 3.

0 0 1

Người đăng: Hoàng Minh An

Theo Viblo Asia

Mở đầu.

phần 1 mình đã nói khá nhiều về các khái niệm của các dạng LLm, cách hoạt động và hình thành, đồng thời nói về các cách tạo nên reasoning của LLMs và phần 2 thì mình có nói đến một paper nói rằng :

  • RLVR chưa phải là một cách đột phá trong việc khiến base model tìm kiếm ra được những reasoning path vượt ra khỏi ngưỡng kiến thức của mô hình base. và việc tạo ra dataset gồm nhiều reasoning path cho một vấn đề là rất tốn công, effort và chưa xác định được tính hiệu quả.

Khá nhiều lý thuyết, nhưng mà lại chưa thật sự xem xét xem trong post training thì RL được thật sự áp dụng vào như thế nào ? Vậy thì nhân cơ hội Qwen3 Technical Report vừa ra giữa tháng 5 vừa rồi, hãy thử đi sâu vào xem các đại pháp sư đã làm gì để biến Qwen 3 thành một trong những đối thủ nặng ký, vị Vua không ngai trong giới giang hồ Open Source. 😆

Paper : Qwen3 Technical Report

Như thường lệ :

  • Đây là bài viết phân tích và chill chill ngồi đọc paper hoàn toàn mang tính chất chủ quan của mình.
  • Chỉ đơn giản là sự tò mò đưa mình đi vọc vạch đủ thứ for fun =))) hãy ăn miếng bánh uống miếng trà ngồi đọc chill chill trước khi vô đọc paper chi tiết nhé 🫠.
  • Mình là engineer, không phải là researcher, phân tích paper chỉ là thói quen duy trì để tự củng cố solution của riêng mình 🫠, khuyến khích mọi người đọc paper trực tiếp vì nó sẽ có nhiều cái vui hơn mà mình đã lược bỏ bớt.

Let's move on.

Architecture.

Oke thì như công bố Qwen 3 có release 6 dense models : 0.6B, 1.7B, 4B, 8B, 14B, 32B, và 2 MoE model : 30B-A3B và 235B-A22B.

Về mặt cấu trúc của dense model thì giống với Qwen 2.5 đều sử dụng các kỹ thuật sau :

Grouped Query Attention.

image.png

Hiểu đơn giản như này, trong transformer gốc thì chúng ta có khái niệm multi head, nơi mà mỗi head chúng ta sẽ có từng vector Q, K, V riêng biệt. Thì như ảnh, Grouped-Query sẽ làm theo kiểu group các query lại và mỗi group sẽ sử dụng chung key và value.

Note lại một vài ý nhỏ nếu bạn có quên:

  • head (trên ảnh đang có 8 head) : là từng đoạn nhỏ trong feature (d_model hay d_embed - ý chỉ chiều feature mà token đó được mã hóa). ví dụ feature : 512, có 8 head thì mỗi head : 512 / 8 = 64.
  • từ ý hiểu trên thì kích thước khi triển khai ở code :
    • Multi head : Wq = Wk = Wv = (d_model, d_model) = (d_mode, h * d_k) | h : là số head, d_k là chiều của k.
    • Grouped-Query : Wq = (d_model, d_model) = (d_model, h * d_k), Wk = Wv = (d_model, số group * d_k) : ví dụ trên ảnh thì số group 4, mỗi group chứa 2 head.

SwiGLU - Swish Gated Linear Unit.

image.png

Là một hàm kích hoạt phi tuyến đước ử dụng trong các tầng feed-forward (FFN) của mô hình transformer. Là sự cải tiến từ GLU - Gated Linear Unit, kết hợp với hàm swish để tăng khả năng biểu diễn phi tuyến và cải thiện hiệu suất mô hình. Đọc kỹ hơn về nó thì có thể đọc ở đây (Link)

Rotary Positional Embeddings.

image.png

Link Paper : link

Thì ở transformer có 1 layer postion embedding để lấy thông tin vị trí của các từ, có 2 dạng chính : Absolute Position Encoding (mã hóa vị trí tuyệt đối) và Relative Position Encoding (mã hóa tương đối).

Tư tưởng chính của RoPE là sử dụng một phương pháp xoay vector (Q, K) để biểu diễn vị trí thay vì lấy giá trị tuyệt đối như ở phiên bản gốc của transformer. Thì lý do cải tiến đơn giản là do một số yếu điểm của absolute như sau :

  • Không tận dụng được khoảng cách giữa các token, ví dụ token ở vị trí thứ 5 và 10, thì mô hình phải tự học rằng khoảng cách giữa chúng là 5 thay vì một quy luật cố định nào đó. ➞ mô hình khó hiểu tính tuần tự của văn bản tự nhiên.
  • Không ngoại suy được các văn bản dài hơn, bị giới hạn cứng ở max len khi định nghĩa từ absolute position encoding.
  • Khi biểu diễn lên không gian thì thấy các vector biểu diễn của absolute khá hỗn loạ, không theo một quy luận ➞ làm cho mô hình cố gắng học thuộc vị trí đó thay vì biểu diễn để tìm ra biểu diễn phù hợp.

Thì cải tiến chính của RoPE giúp :

  • Thì như ảnh ở trên, các vector token được xoay trong không gian theo một góc quay tỷ lệ với vị trí của nó trong chuỗi và góc : θ=100002i/d\theta=10000^{-2i /d} (như trên ảnh thì góc giữa vị trí 1 và vị trí 3 bằng 2 theta).
  • Trong transformer, các vector embedding được sử dụng để tính toán attention bằng tích vô hướng Q . K, nếu quay các vector này theo cùng 1 góc thì tích vô hướng của nó không đổi. Điều này có nghĩa là khoảng cách giữa các token được bảo toàn, bất kỳ vị trí tuyệt đối nào của chúng. ➞ Điều này giúp mô hình không cần học thuộc các vị trí mà hiểu được mối quan hệ giữa các token, ngoài ra phép quay này còn giúp mô hình mở rộng chuỗi mà không mất thông tin về sự tuần tự của văn bản.

RMSNorm - Root Mean Square Normalization.

Có một bài viết khá hay trên viblo nói đã từng nói về vấn đề này : Link

RMSNorm là một kỹ thuật normalization được sử dụng nhiều trong các mô hình LLM, nó là một biến thể đơn giản hóa của Layer Normalization, với mục tiêu cải thiện hiệu suất và ổn định của mô hình, đồng thời giảm chi phí tính toán.

Đương nhiên việc RMSNorm được ra đời bởi những dạng Norm khác như Batch Norm, Layer Norm, ... đều có những nhược điểm cần phải cải thiện, bài viết trên đã nói khá khá nhiều về các dạng Norm đó, mọi người có thể đọc thêm.

QK-Norm.

Link paper : link

Thì như tên của nó, sử dụng Normalization cho vector Q, K. Trong paper, tác giả gặp hiện tượng mất phân kỳ 🤔 (divergent training loss) sau vài ngàn bước training, nguyên nhân được xác nhận là do giá trị attention logits cực kỳ lớn, dẫn đến sự tăng trưởng không kiểm soát, gây ra entropy gần bằng không (near zero entropy) làm suy giảm hiệu suất mô hinh.

➞ Để giải quyết vấn đề này, thì tác giả dụng LyaerNorm để chuẩn hóa vector Q, K trước khi tính toán dot-product attention. Công thức trong paper đề cập đến :

softmax[1/dLN(XWQ)LN(XWK)T]softmax [ 1/√d * LN(XW^Q) * LN(XW^K)^T ]

  • d: Kích thước chiều của vector query/key.
  • X: Ma trận đầu vào.
  • LN: Hàm chuẩn hóa lớp (Layer Normalization).
  • W^Q: Ma trận trọng số cho query.
  • W^K: Ma trận trọng số cho key.

Training-Stage.

Pre-training stage.

Oke, thì ở giai đoạn pretrain stage thì tác giả có trình bày qua 3 giai đoạn chính :

  • Generate Stage (S1) : Mô hình được train với 30 nghìn tỷ token (=)) siêu to không lồ), và với 119 ngôn ngữ (bản cũ của họ có 29 ngôn ngữ thôi 🤔) với mục tiêu xây dựng một nền tảng vững chắc về khả năng ngôn ngữ và kiến thức chung trên phạm vi toàn cầu. Độ dài token : 4096
  • Reasoning Stage (S2) : Ở giai đoạn này thì dữ liệu được tối ưu hoá đặc biệt trong các lĩnh vực STEM, code, math, ... để cải thiện khả năng tư duy và giải quyết vấn đề logic của mô hình. Độ dài token : 4096
  • Long Context Stage : ở giai đoạn này thì tăng độ dài của dữ liệu từu 4096 lên 32768 tokens, với 75% từ 16384 đến 32768 và 25% từ 4096 đến 16384.

Ở giai đoạn này thì mô hình đang được học với một lượng dữ liệu khổng lồ, đặc biệt là data về 119 loại ngôn ngữ khác nhau, cùng với đó thì kéo léo kết hợp với data long context giúp mô hình thích ứng dần trong việc xử lý dữ liệu dài. (ở đây thì tác giả có đề cập đến việc sử dụng RoPe với abse là 1M thay vì là 10k như bình thường, và sử dụng thêm các ký thuật giúp tăng context như YaRN, Dual Chunk Attention., ...).

Kết luận chung là : đoạn này author cũng đốt khớ khớ tiền về data ấy 🫠 đổi lại thì chúng ta có được một trong những model base chất lượng nhất của open source.

Post-training.

image.png

Trong ảnh đã mô tả toàn bộ pipeline training cho qwen 3, hiện tại thì training có 2 dạng model, flagship models được training trược tiếp từ RL và lightweight models được distrillation từ các model flagship.

Ở đây thì tác giả nhấn mạnh đến 2 yếu tố của quá trình post-training :

Think Control.

Mục tiêu post-training của Qwen 3 là việc kiểm soát khả năng tư duy, một tính năng cho phép tích hợp cả 2 chế độ riêng biệt non-thinking (ý chỉ fast thinking) và thinking (slow thinking). Hiểu đơn giản thì ở đây tác giả áp dụng một template

image.png

Khi mà không muốn think nữa thì đơn giản truyền thẳng think token vào để tránh model think nữa. Ngoài ra tác giả còn giới thiệu token budget để kiểm soát độ sâu của tư duy, ở trong model local thì không có option để làm việc này. Tuy nhiên thì có một chỗ giải thích khá hay về việc này : link ➞ ở đây đơn giản chỉ là họ làm thêm 1 custom process để mỗi khi think context vượt qua số lượng token (token budget) thì dừng chèn thêm token <think> để đóng đoạn tư duy của model.

Strong-to-Weak Distillation.

Thì như tên của nó, nhằm tối ưu hóa và tận dụng kiến thức từ các mô hình lớn, và để mô hình nhỏ có thể học được hành vi (kiến thức hay data distribution của model lớn). ➞ nâng cao chất lượng mô hình nhỏ.

Note.

Ở trong post training, tác giả có nhấn mạnh đến việc sử dụng multi stage post training approach nhằm tối đa hóa khả năng sử dụng 2 cơ chế thinknon-think của mô hình Qwen3. Cụ thể có 4 giai đoạn được chia thành 2 phần chính :

  • Stage 1 và Stage 2 : tác giả tập trung chính vào việc đẩy mạnh khả năng reasoning của mô hình thông qua việc sử dụng Long CoT Cold Start Finetuniing và RL trên các nhiệm vụ về toán và Code. (Giai đoạn tăng cường khả năng tư duy)
  • Stage 3 và Stage 4 : Tác giả kết hợp cả 2 loại dữ liệu : có reasoning (CoT) và dữ liệu chỉ có câu trả lời (không có CoT) nhằm tăng cường khả năng khả năng fast thinking của mô hình (Thinking mode fusion). Sau đó sử dụng general RL nhằm tinh chỉnh và tăng hiệu suất của mô hình trên nhiều nhiệm vụ khác nhau (downstream tasks).

Stage 1 : Long CoT Cold Start.

Oke, thì bước đầu tiên Long CoT Cold Start :

  • Long Chain of Thought : thì như mặt nghĩa đây là CoT với độ dài lớn, gồm nhiều loại, nhiệm vụ khác nhau như toán, code, logic reasoning, STEM, .... (Có thể tham khảo 1 những bộ long CoT ví dụ link)
  • Cold Start : Hiểu đơn giản là trước đó mô hình chưa được train hay học với bất kỳ một kỹ thuật suy luận nào đó.

➝ Đây là một trong những bước quan trọng :

  • Vì trước đó ở giai đoạn pre-train, mô hình được train với 1 bộ dữ liệu không lồ tổng hợp, nhưng chưa có khả năng suy luận tốt trên từng nhiệm vụ vấn đề cụ thể.
  • Việc sử dụng Supervised Fine Tuning ở đây giúp mô hình tối ưu hóa loss chuỗi token để sinh ra được các bước suy luận dài, suy luận từng bước.
  • Đây là bước tạo nền tảng quan trọng, là điều kiện tiên quyết khi mô hình đã có khả năng suy luận từng bước và suy luận dài để áp dụng các giai đoạn tiếp theo như RLVR hay Thinking Mode Fusion.

Stage 2 : Reasoning RL

Đây chính là giai đoạn sử dụng RLVR với data đầu vào bao gồm Query - Verifier (Câu hỏi và bộ kiểm tra) - là những samples bao gồm vấn đề (Query) và đáp án hoặc cách xác nhận đúng (verifier). Tác giả có đề cập đến các tiêu chí chọn samples :

  • They were not used during the cold-start phase : bắt buộc dữ liệu này phải là các cặp dữ liệu mới để tạo ra thách thức cho mô hình.
  • They are learnable for the cold-start model : các samples này phải nằm trong khả năng học tập của mô hình và nó không thể quá khó để mô hình không thể hiểu hoặc xử lý.
  • They are as challenging as possible. Tuy ở điều kiện 2 là mô hình có thể học được, nhưng phải đủ khó để đẩy giới hạn của mô hình và giúp cải thiện hiệu xuất.
  • They cover a broad range of sub-domains : bao quát, trải dài trên nhiều lĩnh vực.

Tác giả đã thu thập 3995 query-verifier samples, và sử dụng GRPO để cập nhật trọng số mô hình. ➝ Chỉ với một lượng nhỏ quality samples đã có thể tăng chất lượng của mô hình lên khá nhiều (từ 70 lên 85.1 score trong AIME'24 với 170 RL training steps mà không cần can thiệp thủ công)

Stage 3 : Thinking Mode Fusion.

Thì ở 2 stage trước đó, pipeline tập trung chính vào khả năng reasoning của mô hình, tại stage 3, mục tiêu chính là việc tích hợp khả năng non-think vào mô hình.

Ở đây đơn giản, tác giả tiếp tục train SFT trên chính reasoning RL model trước đó, và sử dụng một Chat Template để kết hợp cả 2 kiểu. (hình ảnh mô tả ở think control).

Ở đây có 3 ý cần phải nói đến :

  • Construction of SFT data : SFT dataset được kết hợp với cả 2 dạng data think (được ấy từ những rejection sampels ở stage 1 và được sinh ra từ chính mô hình ở stage 2 nhằm đảm bảo chất lượng mô hình ở stage 2), và non-think data được được chọn lọc cẩn thận từ rất nhiều downstream task và domain khác nhau.
  • Chat Template Design : là bước chủ chốt để chuyển đổi mô hình từ chế độ think và non-think dựa trên đầu vào của user. Đối với format, chat template được thể hiện chính ở hình ảnh trên luôn rồi, nhưng mà ở đây, tác giả có trình bày thêm một ý là Mode Flags, /think và /no_think . Đây không phải là template thuần mà là việc truyền trực tiếp từ input của user để kiểm soát việc có sự dụng think hay không (tuy nhiên chỉ áp dụng khi sử dụng chế độ think - hay tức là chat template phải được bật chế độ think.)
  • Thinking budget : ở trên về think control mình cũng đã nói về việc này, chỉ đơn giản là kiểm soát độ dài - độ sâu của mức độ suy luận của mô hình. Vì không thấy think budget được đề cập trong việc sử dụng mô hình local nên khá khó để biết kiểm soát ở đây, ý tác giả muốn nói đến là gì ? nếu mà giới hạn được khả năng suy luận thì nó lại bá quá 😆. và tác giả cũng có nói thêm rằng khả năng này chỉ vô tình xảy ra khi training stage 3.

Stage 4 : General RL.

Mục tiêu chính ở stage này là cố năng nâng cao khả năng và tính ổn định của mô hình trên nhiều kịch bản khác nhau (diverse scenarios), nhóm tác giả thực hiện xây dựng một sophisticated reward system - một reward system rất phức tạp. Việc này nhằm tăng cường các khả năng các khả năng cơ bản của một LLM:

  • Instruction following : Đảm bảo việc tuân thủ các instruction có trong prompt của người dùng.
  • Format Following : Bắt buộc mô hình phải tuân thủ các quy tắc cụ thể, như các dụng model flag /think, /no_think , hãy format <think> think context </think> để phân biệt think context với answer context bên ngoài.
  • Preference Alignment : đối với các câu hỏi mở thì hướng mô hình trả lời theo các tính hữu ích, phong cách, tự nhiên hơn, ... để phù hợp với người dùng.
  • Agent Ability : tăng cường khả năng sử dụng tool, ... thay đổi thực hiện các nhiệm vụ thông qua việc nhận feedback từ môi trường thực, để cải thiện khả năng quyết định trong những nhiệm vụ dài hạn.
  • Abilities for Specialized Scenarios : Cải thiện khả năng làm các nhiệm vụ, kịch bản cụ thể, ví dụ các nhiệm vụ RAG, ... giảm thiểu khả năng bị hallucination.

Cuối cùng thì, các thành phần chính tạo nên hệ thống reward mà tác giả đang trình bày :

  • Rule-based Reward : Phần thưởng thường được sử dụng cho các nhiệm vụ chung như tuân thủ hướng dẫn và format đầu ra. ➝ ngăn chặn các vấn đề liên quan đến reward hacking, đảm bảo định dạng đầu ra.
  • Model-based Reward with Reference Answer : Đơn giản ở đây thì sử dụng Reward model để đánh giá output của mô hình, tuy nhiên thì ở đây không tự train reward model như bình thường, ở đây nhóm tác giả sử dụng mô hình Qwen 2.5 72b để làm reaward model luôn.
  • Model-based Reward without Reference Answer: thì nghược với trên, ở đây tác giả training reward model để đánh giá output model.

Strong-to-Weak Distillation.

Được thiết kế với mục tiêu đảm bảo các mô hình weak có được khả năng, hành vi của mô hình strong, như các cơ chế chuyển đổi linh hoạt giữa chế độ /think, /no_think, ... hay các cách suy luận, kiến thức của mô hình strong.

Quá trình Distillation có 2 giai đoạn chính :

  • Off-policy Distillation : Ở giai đoạn này, mô hình weak sử dụng các output của mô hính strong (sử dụng cả /think và /no_think) để học. Ở giai đoạn này mô hình weak bắt đầu hình thành nên những kỹ thuật nền tảng, khả năng reasoning, và đây là bước đệm cho giai đoạn tiếp theo.
  • On-policy Distillation : Ở đây mô hình weak được tinh chỉnh trực tiếp bằng việc so sánh các logits của mô hình strong, nhằm giảm thiểu KL divergence (một hàm giúp đo sự khác biệt giữa 2 phân phối xác suất - hay nói đơn giản hơn ở đây mô hình weak đang cố học distribution của mô hình strong)

Kết luận.

Oke, đã quá dài lý thuyết rồi, một chút kết luận nhỏ nào.

  • Đầu tiên thì, theo mình, đây là một trong những open source cực kỳ chất lượng và cầu kỳ đến từ team Qwen, từ khả năng đa ngôn ngữ hơn 119 ngôn ngữ (thật sự rất lớn - trong khi bản cũ chỉ là đâu đấy 25 ngôn ngữ thôi) và khả năng reasoning, ở các mô hình nhỏ vượt trội hoàn toàn so với các bản qwen 2.5 với kích thước lớn hơn nhiều lần. Nhìn report ở pretraining thì thật sự đây là một lượng dữ liệu không lồ ➞ đặt nền móng kiến thức lớn cho sự phát triển sau này (ở phần 2 mình có nói qua về distribution phụ thuộc khá nhiều ở base model, ....)
  • Việc tận dụng Multi stage training và việc tích hợp Think Mode Fusion đã khiến mô hình đạt được cả fast thinking và slow thinking như ở bài 1 mình trình bày, tuy nhiên, mình kỳ vọng ở việc mô hình phải tự hiểu việc nên tự biết lúc nào cần think và lúc nào cần non-think, đây là một rào cản lớn trong sự phát triển tiếp theo. Đương nhiên, việc này khá khó, việc tận dụng Chat Template Design để tích hợp khả năng non think vào reasoning model trước đó tạo thành hybrid model như bên đội hermes từng làm và vẫn giữ được chất lượng mô hình như hiện tại thì thể hiện sự thành công khá lớn trong việc kết hợp SFT và RL xen kẽ nhau như bài 1 mình cũng từng nói.

Mình định thêm một vài cái thực hành, nghịch nghịch Qwen 3 với Cline nhưng mà bài viết dài quá rồi (thật ra mình cũng lười nữa 😗) thôi thì hẹn mọi người ở bài tiếp theo. Một bài cũng khá hay nữa về những lập luận mô hình có đang thật sự reasoning và điều gì ẩn dấu thực sự phía sau nhé.

References.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Hướng dẫn finetune mô hình LLM đơn giản và miễn phí với Unsloth

Chào mừng các bạn đến với bài viết hướng dẫn chi tiết cách finetune (tinh chỉnh) một mô hình ngôn ngữ lớn (LLM) một cách đơn giản và hoàn toàn miễn phí sử dụng thư viện Unsloth. Trong bài viết này, ch

0 0 7

- vừa được xem lúc

SERIES INDEX NÂNG CAO - BÀI 1: PHÂN TÍCH NHỮNG SAI LẦM PHỔ BIẾN KHI SỬ DỤNG INDEX TRONG MYSQL

Nếu anh em thấy hay thì ủng hộ tôi 1 follow + 1 upvote + 1 bookmark + 1 comment cho bài viết này tại Mayfest 2025 nhé. Còn nếu bài viết chưa hữu ích thì tôi cũng hi vọng anh em để lại những góp ý thẳn

0 0 8

- vừa được xem lúc

"Hack" Não Số Lớn Với Digit DP!

Xin chào anh em, những chiến binh thuật toán kiên cường. Phản ứng đầu tiên của nhiều anh em (có cả tôi): "Ối dào, dễ! Quất cái for từ 1 đến 101810^{18}1018 rồi check thôi!".

0 0 10

- vừa được xem lúc

So Sánh StatelessWidget và StatefulWidget & Các Widget Nâng Cao

Chào mọi người! Hôm nay chúng ta sẽ tiếp tục hành trình khám phá Flutter và đến với bài học về StatelessWidget và StatefulWidget. Trong bài này, mình sẽ giúp các bạn phân biệt sự khác nhau giữa hai lo

0 0 7

- vừa được xem lúc

React Lifecycle & Hooks Cơ Bản

React cung cấp các phương thức lifecycle và hooks để quản lý các giai đoạn khác nhau trong vòng đời của component. Việc hiểu rõ các phương thức này giúp bạn có thể tối ưu hóa ứng dụng React của mình.

0 0 7

- vừa được xem lúc

Kafka Fundamental - Bài 4: Consumers, Deserialization, Consumer Groups & Consumer Offsets

Xin chào, lại là mình - Đức Phúc, anh chàng hơn 6 năm trong nghề vẫn nghèo technical nhưng thích viết Blog để chia sẻ kiến thức bản thân học được trong quá trình “cơm áo gạo tiền” đây. Các bạn có thể

0 0 5