0

Qwen3 hoạt động như thế nào: từ kiến trúc đến thinking mode

Technical report của Qwen3 viết rất cô đọng: "giống Qwen2.5, chỉ bỏ QKV-bias và thêm QK-Norm" — một câu như vậy chỉ có nghĩa nếu bạn đã biết Qwen2.5 xây ra sao. Bài này viết lại phần nền đó: kiến trúc Qwen3 gồm những gì, huấn luyện ra sao, và cách gọi model cho đúng khi dùng thật.

1. Kiến trúc tổng quan

Trước khi đi vào chi tiết kỹ thuật, hãy hình dung Qwen3 như một dây chuyền xử lý câu chữ, mỗi trạm làm đúng một việc:

Qwen3 nhìn như một dây chuyền xử lý câu chữ

  • Cắt chữ: câu nhập vào bị cắt thành các mảnh nhỏ, gọi là token.
  • Đổi thành vector: mỗi mảnh nhỏ được đổi thành một dãy vector, vì máy tính chỉ tính toán được với số chứ không "đọc" được chữ.
  • Lặp lại N tầng xử lý, mỗi tầng làm hai việc liên tiếp:
    • Nhìn ngữ cảnh: mỗi token nhìn lại các token đứng trước nó để hiểu câu đang nói về cái gì.
    • Tự suy nghĩ: mỗi token xử lý thông tin một mình. Ở các bản lớn, bước này không dùng một mạng duy nhất mà gọi vài expert phù hợp nhất trong một tập hợp lớn — đây chính là MoE.
  • Đoán chữ tiếp theo: sau khi đi hết N tầng, model đoán xem chữ nào nên đứng kế tiếp. Chữ đó được nối vào câu, và cả quá trình lặp lại để đoán chữ tiếp theo nữa.

Qwen3 có 6 bản dense (0.6B, 1.7B, 4B, 8B, 14B, 32B tham số) và 2 bản MoE (30B-A3B, 235B-A22B). Con số sau chữ "A" là "activated" — tham số thực sự tính toán cho mỗi token. Bản flagship 235B-A22B có tổng 235B tham số nhưng chỉ 22B trong số đó được dùng ở mỗi lượt forward, nên nó chạy nhanh hơn nhiều so với một model dense 235B thật.

Bảng thông số từng phiên bản

Report gốc công bố thông số cụ thể của từng bản qua hai bảng. Đây không phải là kiến trúc khác nhau — tất cả 8 bản đều dùng chung một bản thiết kế ở Phần 2 — mà là cách bản thiết kế đó được "phóng to" hoặc "thu nhỏ" cho từng size.

Các bản dense:

Model Số tầng Q-head / KV-head Tie Embedding Context length
Qwen3-0.6B 28 16 / 8 32K
Qwen3-1.7B 28 16 / 8 32K
Qwen3-4B 36 32 / 8 128K
Qwen3-8B 36 32 / 8 Không 128K
Qwen3-14B 40 40 / 8 Không 128K
Qwen3-32B 64 64 / 8 Không 128K

Các bản MoE:

Model Số tầng Q-head / KV-head Expert (tổng / kích hoạt) Context length
Qwen3-30B-A3B 48 32 / 4 128 / 8 128K
Qwen3-235B-A22B 94 64 / 4 128 / 8 128K

Nguồn: Qwen3 Technical Report— https://arxiv.org/html/2505.09388v1#S2.T1

Vài điểm đáng chú ý khi đọc hai bảng này:

  • Cột Q-head / KV-head chính là con số cụ thể hóa GQA. Ví dụ Qwen3-32B có 64 Q-head nhưng chỉ 8 KV-head, nghĩa là mỗi 8 Q-head chia sẻ chung một cặp K/V. Ở hai bản MoE, tỷ lệ chia sẻ còn cao hơn (64 Q-head / 4 KV-head, tức nhóm 16 Q-head chung 1 KV) — có thể do model lớn cần nén KV cache mạnh hơn để bù cho tổng compute mỗi token đã tăng vì phải chạy qua nhiều expert.
  • Tie Embedding: các bản nhỏ (0.6B, 1.7B, 4B) dùng chung một ma trận trọng số cho lớp embedding đầu vào và lớp linear ra logits ở cuối, giúp tiết kiệm tham số đáng kể khi model còn nhỏ. Từ 8B trở lên, hai ma trận này tách riêng, vì ở quy mô đó phần tiết kiệm không còn đáng so với lợi ích của việc để input/output có không gian biểu diễn riêng.
  • Context length: chỉ hai bản nhỏ nhất (0.6B, 1.7B) dừng ở 32K, còn lại đều đạt 128K — cho thấy context dài cần model đủ lớn mới khai thác hiệu quả, hoặc đơn giản là một lựa chọn đánh đổi compute có chủ đích cho các bản nhỏ.

2. Kiến trúc chi tiết: bên trong một tầng xử lý

Causal Self-Attention (Nhìn ngữ cảnh)

Mỗi token tạo ra ba vector: Query, Key, Value. Attention score tính từ tích Q·K, qua softmax để ra trọng số, rồi nhân với V. "Causal" nghĩa là token thứ i chỉ được nhìn các token trước nó — không nhìn tương lai. Đây là cơ chế bắt buộc cho generation tuần tự, nếu không model sẽ "gian lận" bằng cách nhìn trước câu trả lời khi training.

RoPE — đánh dấu vị trí token

Transformer tự nó không biết thứ tự token. RoPE giải quyết bằng cách xoay vector Q và K theo một góc phụ thuộc vị trí, thay vì cộng thêm một vector vị trí như cách cũ. Cách này giữ được khoảng cách tương đối giữa hai token ngay trong phép nhân Q·K, và là nền cho các kỹ thuật mở rộng context sau này như YaRN.

QK-Norm — chi tiết dễ bỏ sót

So với Qwen2, Qwen3 bỏ QKV-bias và thêm QK-Norm: chuẩn hóa RMSNorm lên vector Q và K trước khi tính attention score. Mục đích là giữ attention logit không phóng đại quá mức khi model lớn dần, giúp training ổn định hơn. Đây là một trong số ít thay đổi kiến trúc thực sự so với Qwen2.5, phần còn lại gần như giữ nguyên.

GQA — giảm bộ nhớ cho "nhìn ngữ cảnh"

Multi-Head Attention chuẩn cho mỗi head một cặp K/V riêng, khiến KV cache phình to theo số head. Ở thái cực ngược lại, Multi-Query Attention (MQA) cho tất cả head dùng chung đúng một cặp K/V — cache nhỏ nhất nhưng dễ mất chất lượng vì các head mất đi sự đa dạng. GQA nằm giữa hai thái cực đó: chia các Q-head thành từng nhóm nhỏ, mỗi nhóm dùng chung một cặp K/V riêng của nhóm mình. Ví dụ 8 Q-head có thể chia thành 2 nhóm, mỗi nhóm 4 head chung một cặp K/V — cache giảm 4 lần so với MHA mà chất lượng gần như không đổi.

So sánh MHA, GQA, MQA

Cả model dense lẫn MoE của Qwen3 đều dùng GQA.

KV Cache

Khi sinh token tuần tự, Key và Value của các token đã sinh không đổi ở các bước sau, nên được lưu lại thay vì tính lại. Đây là lý do inference nhanh hơn nhiều so với chạy lại attention từ đầu mỗi lần. Đổi lại, bộ nhớ tăng theo độ dài sequence, số layer, và số head — GQA tồn tại một phần để giảm chi phí này.

FFN / SwiGLU (Tự suy nghĩ)

Sau attention, mỗi token đi qua một mạng feed-forward độc lập, không còn tương tác giữa các token. SwiGLU dùng cơ chế gating: một nhánh chiếu tuyến tính đi qua SiLU, nhân element-wise với một nhánh chiếu tuyến tính khác. So với FFN chuẩn dùng ReLU, cách này cho hiệu năng tốt hơn với cùng số tham số.

Mixture-of-Experts

Với các model MoE (30B-A3B, 235B-A22B), FFN không còn là một mạng duy nhất dùng chung cho mọi token. Thay vào đó có 128 "expert" song song, và một mạng gating (router) chọn ra 8 expert phù hợp nhất cho từng token.

Cơ chế chọn cụ thể: router tính một score cho từng expert trong 128 expert, đưa qua softmax để ra phân phối xác suất, rồi lấy 8 expert có score cao nhất. Token đi qua cả 8 expert đó, mỗi expert trả về một output riêng, và output cuối là tổng có trọng số của 8 output này — trọng số chính là score sau softmax. 120 expert còn lại không được tính toán gì cho token đó.

![MoE routing trong Qwen3](image.png

Điểm đáng chú ý là Qwen3 MoE không có shared expert — khác với Qwen2.5-MoE, nơi luôn có một expert cố định chạy song song với các expert được route, cộng thêm vào output bất kể router chọn gì. Qwen team cũng dùng global-batch load balancing loss để tránh tình trạng một vài expert bị quá tải trong khi số còn lại gần như không được dùng — nếu không có cơ chế này, router có xu hướng hội tụ về việc chỉ dùng một nhóm nhỏ expert quen thuộc, làm phí phần lớn dung lượng model.

Kết quả của thiết kế này: tổng tham số rất lớn nhưng compute cho mỗi token nhỏ hơn nhiều — đây là cách MoE đánh đổi giữa dung lượng kiến thức và chi phí tính toán.

3. Training

Pretraining: 36 nghìn tỷ token, ba bước

Qwen3 pretrain trên 36 nghìn tỷ token, bao phủ 119 ngôn ngữ và phương ngữ — tăng đáng kể so với 29 ngôn ngữ của Qwen2.5. Một hệ thống annotation gán nhãn 30T token theo giá trị giáo dục, domain, và độ an toàn, dùng để tối ưu tỷ lệ trộn dữ liệu.

Một chi tiết đáng nói: để mở rộng corpus, Qwen team dùng chính Qwen2.5-VL để OCR văn bản từ một lượng lớn tài liệu dạng PDF. Model đời trước tạo dữ liệu huấn luyện cho model đời sau — mô hình này lặp lại ở nhiều nơi khác trong hệ sinh thái Qwen, ví dụ Qwen2.5-Math được dùng để sinh bài toán.

Ba bước pretraining:

  1. General Stage — học kiến thức tổng quát trên khối lượng dữ liệu lớn nhất.
  2. Reasoning Stage — tăng tỷ trọng dữ liệu STEM, code, logic. Đây là nền cho khả năng suy luận, không phải thứ được tạo ra hoàn toàn ở giai đoạn RL sau này.
  3. Long Context Stage — mở rộng sequence length lên 32,768 token, với 75% văn bản dài 16,384–32,768 token và 25% dài 4,096–16,384 token. RoPE base frequency tăng từ 10,000 lên 1,000,000 (kỹ thuật ABF), kết hợp YaRN và Dual Chunk Attention để đạt độ dài context gấp bốn lần lúc inference. Context cuối cùng model hỗ trợ: 128K token.

Post-training: nơi thinking mode ra đời

Pipeline post-training gồm bốn bước:

  1. Long-CoT Cold Start — curate dataset chuỗi suy luận dài, trải rộng toán, code, logic, STEM. Dữ liệu được lọc qua hai pha: loại bỏ prompt không có đáp án verify được, và loại chuỗi suy luận có nội dung không nhất quán hoặc chất lượng thấp.
  2. Reasoning RL — RL trên các bài có đáp án verify được, chủ yếu math và code, để nâng chất lượng chuỗi suy luận.
  3. Thinking Mode Fusion — hợp nhất thinking và non-thinking vào cùng một model. Điểm cần lưu ý: hai chế độ này được huấn luyện như hai phân phối dữ liệu curated riêng biệt, không đơn thuần là một công tắc bật/tắt gắn vào model đã huấn luyện xong. Cách làm này giữ được sự ngắn gọn ở non-thinking mode trong khi vẫn có suy luận sâu ở thinking mode.
  4. General RL — RL cuối cùng để cải thiện alignment và khả năng tuân lệnh tổng quát.

Kết quả của bước 3 chính là thứ bạn sẽ chạm vào trực tiếp khi dùng model: một model duy nhất, hai cách trả lời.

4. Hướng dẫn sử dụng

Bật/tắt thinking mode

Có hai cách chọn chế độ:

  • Cách "cứng": set enable_thinking=True hoặc False khi gọi API hoặc code.
  • Cách "mềm": gõ /think hoặc /no_think ngay trong prompt. Model sẽ theo lệnh gần nhất trong hội thoại nhiều lượt, nên bạn có thể đổi chế độ giữa chừng cuộc trò chuyện.

Nguyên tắc chọn: bài toán, code, hoặc câu hỏi logic phức tạp thì bật thinking. Chat thông thường hoặc câu hỏi đơn giản thì tắt đi để trả lời nhanh hơn và đỡ tốn token.

Chỉnh sampling parameters khác nhau cho từng chế độ

Đây là chi tiết hay bị bỏ qua nhưng ảnh hưởng rõ rệt tới chất lượng output. Qwen team khuyến nghị hai bộ tham số khác nhau:

Tham số Thinking mode Non-thinking mode
Temperature 0.6 0.7
Top-P 0.95 0.8
Top-K 20 20
Min-P 0 0

Lưu ý quan trọng: tuyệt đối không dùng greedy decoding (temperature = 0) ở thinking mode — nó gây lặp vô hạn và giảm chất lượng trả lời. Nếu gặp tình trạng lặp câu kéo dài, có thể chỉnh thêm presence_penalty trong khoảng 0–2, tùy framework có hỗ trợ hay không.

Độ dài output và thinking budget

Khuyến nghị chung là khoảng 32,768 token cho hầu hết câu hỏi. Đây cũng chính là "thinking budget" — bạn có thể tăng lên nếu bài toán cần chuỗi suy luận dài hơn, đổi lại là latency cao hơn. Đây là một trade-off có thể chỉnh, không phải con số cố định.

Chọn size model theo nhu cầu, không phải "càng to càng tốt"

  • 0.6B – 4B: chạy được trên máy yếu, thiết bị edge, phù hợp task đơn giản.
  • 8B – 32B: điểm cân bằng phổ biến nhất, đủ mạnh cho phần lớn công việc thực tế.
  • 30B-A3B (MoE): chất lượng gần bản dense lớn nhưng compute cho mỗi token nhẹ hơn nhiều — hợp khi cần tốc độ mà vẫn muốn chất lượng cao.
  • 235B-A22B: dùng khi cần chất lượng tối đa, chấp nhận chi phí hạ tầng lớn hơn tương ứng.

Context length và cái giá phải trả

Các bản từ 4B trở lên hỗ trợ tới 128K token — hữu ích khi cho model đọc tài liệu dài. Nhưng context càng dài thì KV cache càng nặng RAM, vì cache tăng theo độ dài sequence. Đây cũng là lý do GQA tồn tại trong kiến trúc: nó là thứ giúp context dài khả thi về mặt bộ nhớ, không chỉ là một chi tiết tối ưu phụ.

Kết luận

Nhìn tổng thể, Qwen3 không phải là một kiến trúc được thay đổi hoàn toàn so với thế hệ trước. Phần lớn những gì model làm vẫn xoay quanh những thành phần quen thuộc của Transformer: Attention để xử lý ngữ cảnh, FFN để xử lý thông tin, còn với các bản MoE thì phần FFN được mở rộng thành nhiều expert để tăng dung lượng model mà không phải tính toán toàn bộ tham số cho mỗi token.

Điểm đáng chú ý nằm ở cách Qwen3 ghép những thành phần này lại. GQA giúp giảm đáng kể KV cache khi inference, QK-Norm giúp attention ổn định hơn, còn MoE cho phép model có hàng trăm tỷ tham số nhưng chỉ kích hoạt một phần nhỏ trong mỗi lượt xử lý. Phía sau đó là một pipeline training khá dài, từ pretraining trên dữ liệu quy mô lớn cho tới các giai đoạn reasoning và RL. Thinking mode mà người dùng nhìn thấy khi sử dụng Qwen3 cũng là kết quả của cả quá trình này, chứ không đơn giản là một tùy chọn được thêm vào sau khi model đã train xong.

Vì vậy, khi sử dụng Qwen3, không nên chỉ nhìn vào con số tham số để chọn model. Kích thước model, kiến trúc dense hay MoE, số Q/KV head, context length và cách thiết lập thinking mode đều ảnh hưởng trực tiếp đến tốc độ, bộ nhớ và chất lượng đầu ra.

Nắm được những phần này cũng giúp việc đọc các technical report sau này dễ hơn rất nhiều. Thay vì phải tìm hiểu lại Transformer từ đầu, bạn chỉ cần tập trung vào câu hỏi: thế hệ model mới đã thay đổi điều gì so với nền tảng này, và thay đổi đó giải quyết vấn đề gì?

Tài liệu tham khảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí