F · Training Methods & Model Adaptation
Pretraining và continued pretraining · học nền tảng rồi học tiếp
Pretraining dạy model đoán token kế tiếp trên kho văn bản khổng lồ để có tri thức nền; continued pretraining nạp lại checkpoint đó để học thêm một lĩnh vực.
1Định nghĩa
Pretraining là giai đoạn huấn luyện ban đầu, bắt đầu từ các ma trận trọng số khởi tạo ngẫu nhiên và chạy trên hàng nghìn tỷ token văn bản, để mô hình nắm được ngữ pháp, tri thức chung và khả năng suy luận cơ bản. Với mô hình sinh văn bản kiểu Decoder-only, mục tiêu tự giám sát chuẩn là dự đoán token kế tiếp tại mọi vị trí trong chuỗi; không cần ai gắn nhãn vì đáp án nằm ngay trong văn bản.
Mỗi lượt huấn luyện gồm các bước quen thuộc: đóng gói văn bản thành token, dịch chuỗi một vị trí để lấy đáp án, chạy forward ra điểm số, đo loss, lan truyền ngược gradient rồi cập nhật trọng số bằng AdamW. Khi muốn bổ sung lượng lớn kiến thức đặc thù như tài liệu y khoa hay một ngôn ngữ mới, kỹ sư dùng continued pretraining: nạp checkpoint có sẵn rồi chạy tiếp cùng mục tiêu trên dữ liệu chuyên ngành, trước khi dạy model cách trả lời bằng fine-tuning.
Ví dụ đời thường: pretraining giống như một đứa trẻ đọc hàng nghìn cuốn sách phổ thông từ nhỏ đến lớn để nắm vững tiếng mẹ đẻ và kiến thức xã hội; continued pretraining giống như khi người đó vào đại học y và đọc ngấu nghiến hàng trăm giáo trình chuyên sâu trước khi đi thực tập. Ví dụ dừng lại ở chỗ: người đọc sách hiểu nội dung, còn mô hình chỉ điều chỉnh xác suất của token kế tiếp theo thống kê của kho văn bản đã đọc.
2Luồng
Bảy bước đầu là một vòng huấn luyện lặp đi lặp lại: dữ liệu và nhãn chuẩn bị một lần, rồi forward, loss, backward và AdamW chạy nhiều triệu lượt, còn bước 7 quyết định khi nào đo và lưu. Bước cuối cho thấy hai lối đi tiếp theo sau pretraining. Chọn từng nút để mở bài liên quan.
- Làm sạch dữ liệu và đổi thành token ID
Loại trùng, tách tập đánh giá, tokenize và đóng gói thành lô (giai đoạn 1 của Bài Lab tổng hợp).
- Tạo nhãn token kế tiếp
Dịch chuỗi một vị trí để mỗi vị trí có đáp án là token đứng sau nó.
- Forward qua embedding, Transformer và LM head
Ra logits cho từng vị trí; causal mask chặn nhìn token tương lai.
- Cross-entropy đo mức sai
Trung bình −ln xác suất của token đáp án, thành một số duy nhất.
- Backward tính gradient từng lớp
Quy tắc đạo hàm hợp đi ngược từ loss qua từng lớp về mọi trọng số.
- AdamW cập nhật trọng số
Trung bình trượt của gradient và bình phương gradient, kèm learning rate theo lịch.
- Vòng lặp, đánh giá và lưu checkpoint
Lặp hàng triệu bước, đo loss trên dữ liệu giữ riêng, lưu bản để resume và bản để phục vụ.
- Continued pretraining hoặc chuyển sang fine-tuning
Học thêm lĩnh vực bằng cùng mục tiêu, hoặc dạy model làm theo chỉ dẫn.
Mã Mermaid
flowchart TD
step1["Làm sạch dữ liệu và đổi thành token ID"]
step2["Tạo nhãn token kế tiếp"]
step3["Forward qua embedding, Transformer và LM head"]
step4["Cross-entropy đo mức sai"]
step5["Backward tính gradient từng lớp"]
step6["AdamW cập nhật trọng số"]
step7["Vòng lặp, đánh giá và lưu checkpoint"]
step8["Continued pretraining hoặc chuyển sang fine-tuning"]
step1 --> step2
step2 --> step3
step3 --> step4
step4 --> step5
step5 --> step6
step6 --> step7
step7 --> step8 3Giải pháp
Bài toán: tạo ra một model có tri thức nền mà không cần nhãn thủ công
Muốn có một model biết ngôn ngữ, ta không thể nhờ người viết đáp án cho hàng nghìn tỷ ví dụ. Pretraining tránh việc đó bằng cách biến chính văn bản thành bài tập: cho model xem phần đầu của một câu và bắt nó đoán token tiếp theo, rồi đối chiếu với token thực sự có mặt. Một kho văn bản đủ lớn và đa dạng buộc model phải học ngữ pháp, sự kiện và cả những quy luật suy luận ngầm để đoán đúng.
Kết quả là một model nền (base model) giỏi viết tiếp văn bản nhưng chưa biết làm theo chỉ dẫn; bước đó dành cho SFT. Pretraining là giai đoạn tốn nhất của cả vòng đời một model, và các giai đoạn sau đều khởi đầu từ checkpoint của nó.
Khái niệm tối thiểu cần nắm trước khi đi vào các bước
Token là một mảnh văn bản; tokenizer chuyển văn bản thành dãy token ID, và ID là chỉ số hàng trong bảng embedding (bảng vector học được). Từ điển (vocabulary) có V token; tại mỗi vị trí model xuất V điểm số gọi là logits, và softmax đổi chúng thành xác suất cộng bằng 1.
Loss là một con số đo mức sai của dự đoán; cross-entropy tại một vị trí bằng trừ ln của xác suất model gán cho token đúng. Gradient cho biết mỗi trọng số nên đổi theo hướng nào để loss giảm; optimizer dùng gradient để cập nhật, và learning rate là độ lớn của mỗi lần cập nhật. Bài này chỉ nối các bước lại với nhau; cơ chế chi tiết nằm ở các bài workflow được liên kết.
Ví dụ chạy xuyên suốt cả bài
Ta dùng một câu tự chọn để minh họa: "Hà Nội là thủ đô của Việt Nam". Để dễ đọc, coi mỗi từ là một token và gán ID tưởng tượng 12, 87, 9, 301, 15, 44, 220, 77 (tokenizer thật sẽ cắt và đánh số khác). Câu này có 8 token, nên cho 7 cặp đầu vào – đáp án.
Bước 1 · Dữ liệu thành token ID và các lô huấn luyện
Đầu vào là kho văn bản thô. Thao tác: làm sạch, loại trùng lặp, tách riêng một phần làm tập đánh giá chưa dùng để cập nhật trọng số, tokenize thành ID, rồi cắt và ghép (packing) thành các chuỗi có độ dài ngữ cảnh cố định (ví dụ 2048 token) và gom thành lô. Lý do: GPU xử lý các tensor có kích thước đều nhau hiệu quả, và tập đánh giá phải tách từ đầu, vì lẫn vào sau sẽ làm loss giả đẹp.
Đầu ra là các lô token ID. Cách kiểm tra: tokenizer phải khớp checkpoint nếu là continued pretraining; đếm số token thực sự học; kiểm tra rò rỉ giữa tập huấn luyện và tập đánh giá. Chi tiết ở bài chuẩn bị dữ liệu; các giai đoạn 1 đến 7 của Bài Lab tổng hợp chạy chuỗi bước này ở quy mô nhỏ.
Bước 2 · Nhãn token kế tiếp bằng cách dịch một vị trí
Với chuỗi token ID có T phần tử, đầu vào là T − 1 phần tử đầu và nhãn là T − 1 phần tử sau. Trong ví dụ, đầu vào là (12, 87, 9, 301, 15, 44, 220) và nhãn là (87, 9, 301, 15, 44, 220, 77): ở vị trí đầu tiên model thấy "Hà" và phải đoán "Nội"; ở vị trí thứ ba thấy "Hà Nội là" và phải đoán "thủ". Nhờ causal mask, cả bảy dự đoán tính song song trong một lượt forward mà vị trí i không nhìn trộm đáp án ở vị trí sau (kỹ thuật này gọi là teacher forcing, xem bài tạo nhãn mục tiêu).
Encoder kiểu BERT dùng mục tiêu khác: che ngẫu nhiên một số token rồi đoán lại, được nhìn cả hai phía. Cách đọc: nhãn dịch lệch một vị trí vẫn cho loss giảm nhưng model học sai việc, nên phải in thử vài cặp đầu vào – nhãn để đối chiếu.
Bước 3 · Forward qua embedding, các lớp Transformer và LM head
Mỗi token ID tra bảng embedding thành một vector; vector đi qua chồng lớp Transformer, mỗi lớp gồm chuẩn hóa, attention (mỗi vị trí trộn thông tin từ các vị trí bên trái), cộng residual và mạng MLP; cuối cùng LM head chiếu ra V logits cho mỗi vị trí. Với B chuỗi mỗi chuỗi T token, tensor logits có kích thước B × T × V. Ví dụ ước lượng minh họa: B = 8, T = 2048, V = 50.000 cho 819.200.000 số, khoảng 1,6 GB ở BF16 (2 byte mỗi số), nên người ta tính loss theo từng khúc để tránh giữ nguyên tensor đó.
Xem chi tiết ở các bài forward, attention, MLP và chuẩn hóa và residual.
Bước 4 · Cross-entropy đo mức sai
Tại mỗi vị trí, loss là trừ ln xác suất model gán cho token nhãn; loss của lô là trung bình trên các vị trí hợp lệ. Mốc để đọc: một model đoán mò đều trên V token có loss ln V; với V = 50.000 đó là khoảng 10,82. Lúc mới khởi tạo ngẫu nhiên, loss nên gần mức này, và nếu xa nhiều thì thường có lỗi trong dữ liệu hay nhãn. Loss giảm nghĩa là model đặt nhiều xác suất hơn lên token đúng.
Perplexity bằng e mũ loss, đọc như số lựa chọn đều nhau mà model đang phân vân: loss 2,3 tương ứng perplexity xấp xỉ 10. Cả hai chỉ đo dự đoán token kế tiếp trên dữ liệu đã đo, chưa nói gì về việc trả lời đúng câu hỏi. Chi tiết ở bài hàm mất mát.
Bước 5 · Backward tính gradient từng lớp
Từ loss, lượt backward đi ngược qua từng lớp theo quy tắc đạo hàm hợp để tìm gradient của mọi trọng số: nhánh residual tách đường đi, MLP, chuẩn hóa và attention đều nhận phần gradient của chúng (xem backward và gradient qua một lớp). Để tính được, forward phải giữ lại activation trung gian, và đây là phần lớn bộ nhớ khi huấn luyện.
Hai kỹ thuật phổ biến giảm áp lực đó khi model lớn: tính lại activation khi cần (đổi thêm compute lấy bớt bộ nhớ) và chia trạng thái huấn luyện cho nhiều GPU bằng ZeRO/FSDP. Cách đọc: gradient norm ổn định theo thời gian; tăng vọt hoặc xuất hiện NaN báo learning rate hoặc dữ liệu có vấn đề.
Bước 6 · AdamW cập nhật trọng số
AdamW giữ hai số bổ sung cho mỗi trọng số (trung bình trượt của gradient và của bình phương gradient) rồi cập nhật bước nhỏ, kèm weight decay tách rời. Learning rate thường theo lịch: tăng dần lúc đầu (warmup) rồi giảm dần; đây là lựa chọn phổ biến chứ không phải luật. Nhiều cấu hình còn cắt gradient (gradient clipping) khi norm quá lớn. Xem AdamW.
Hệ quả bộ nhớ: mỗi tham số cần trọng số, gradient và hai số optimizer, nên huấn luyện đòi nhiều lần dung lượng của model, và đây là lý do các bài ZeRO và LoRA tồn tại.
Bước 7 · Vòng lặp, đánh giá định kỳ và lưu checkpoint
Vòng huấn luyện lặp bước 1 đến 6 hàng triệu lần, có thể cộng dồn gradient qua nhiều lô nhỏ để có batch hiệu dụng lớn. Cứ sau một số bước, đo loss trên tập đánh giá giữ riêng, ghi nhật ký và lưu checkpoint. Cần phân biệt hai loại: checkpoint để resume phải chứa trọng số, trạng thái optimizer, scheduler, bộ sinh số ngẫu nhiên và vị trí trong dữ liệu; checkpoint để phục vụ chỉ cần trọng số, config và tokenizer.
Ngân sách dữ liệu cũng cần suy nghĩ. Một quy tắc kinh nghiệm hay được trích dẫn từ bài Chinchilla là cỡ 20 token cho mỗi tham số để dùng compute hiệu quả; với 7 tỷ tham số đó là khoảng 140 tỷ token. Đây chỉ là mốc ước lượng, và thêm dữ liệu không tự tăng số tham số. Chi tiết vòng lặp ở bài vòng huấn luyện.
Continued pretraining: học thêm một lĩnh vực
Continued pretraining chạy đúng chuỗi bước trên nhưng bắt đầu từ checkpoint sẵn có thay vì số ngẫu nhiên, trên tập tài liệu chuyên ngành. Tokenizer và config phải khớp checkpoint, và văn bản đầu vào phải đúng định dạng. Rủi ro chính là catastrophic forgetting khi tập mới quá hẹp: hãy thử trộn thêm dữ liệu chung hoặc giảm learning rate, và đo bằng thí nghiệm vì không có một tỉ lệ trộn tối ưu chung.
Văn bản thô không tự dạy model trả lời theo định dạng ứng dụng. Nếu sản phẩm cần hỏi đáp theo chỉ dẫn, hãy nối tiếp bằng SFT. Cũng đừng nhầm với truy xuất tài liệu vào prompt: continued pretraining thay đổi trọng số còn truy xuất thì không.
Từ checkpoint sang suy luận
Sau pretraining, bản checkpoint chỉ gồm trọng số được nạp lên GPU để suy luận: prefill xử lý prompt rồi decode sinh từng token. Một base model chưa SFT sẽ viết tiếp prompt thay vì trả lời, và đó chính là hành vi mà SFT sửa. Giai đoạn 13 của Bài Lab tổng hợp theo dõi bước chuyển này.
Kết luận được rút ra và không được rút ra
Có thể kết luận: loss trên tập đánh giá giữ riêng giảm nghĩa là model dự đoán token kế tiếp tốt hơn trên phân phối dữ liệu đó. Không thể kết luận: model làm đúng mọi câu hỏi, hiểu như người, hoặc giữ được khả năng chung sau continued pretraining nếu chưa đo. Loss thấp trên tập huấn luyện nhưng cao trên tập giữ riêng cho thấy học vẹt.
4Profiling
- Loss trên dữ liệu chưa dùng để cập nhật
So checkpoint trước và sau trên tập lĩnh vực mới cùng một tập chung. Với causal loss có thể báo thêm perplexity, miễn là cùng tokenizer và cùng mặt nạ. Sụt khả năng chung mới là sụt thật; chỉ cảm giác thì chưa đủ.
- Dữ liệu và ngân sách compute
Đếm token thực sự đã học, loại trùng và rò rỉ tập đánh giá, đo số token mỗi giây và bộ nhớ đỉnh, rồi giữ cấu hình để tái lập. Không công bố tốc độ hay chi phí nếu chưa đo trong cùng điều kiện.
- Độ ổn định của huấn luyện
Theo dõi loss ban đầu so với ln V, gradient norm và độ lớn cập nhật. Các chỉ số này lệch trước khi chất lượng kịp lộ ra, nên là tín hiệu cảnh báo sớm.
Mẹo đo lường: ghim số liệu trên workload thật, ghi cả p50/p95/p99 thay vì chỉ trung bình, và luôn ghi lại điều kiện chạy (batch, cache, đồng thời, phần cứng) trước và sau khi tối ưu. Số đo thiếu điều kiện chạy thì không so sánh được.
5Ví dụ
Tạo cặp đầu vào – nhãn
Dùng câu xuyên suốt "Hà Nội là thủ đô của Việt Nam". Hãy tự viết 7 cặp và cho biết model thấy gì tại vị trí cuối. Đáp án: các cặp lần lượt là (Hà → Nội), (Hà Nội → là), (Hà Nội là → thủ), (… → đô), (… → của), (… → Việt), (… → Nam); tại vị trí cuối model thấy bảy token đầu và phải đoán token thứ tám là "Nam".
Loss khởi tạo và loss sau khi học
Một model từ vựng 50.000 token có loss đầu tiên bằng 3,0. Hãy nhận xét. Đáp án: thấp hơn nhiều so với ln 50.000 ≈ 10,82 trong khi model còn ngẫu nhiên, nên cần nghi ngờ rò rỉ dữ liệu hoặc nhãn bị sai, chưa thể kết luận model học tốt.
Model đọc văn bản kỹ thuật
Nạp checkpoint nền tảng và học tiếp trên tài liệu lĩnh vực đã chuẩn bị, rồi dùng ví dụ hỏi đáp riêng nếu sản phẩm cần trả lời câu hỏi theo chỉ dẫn. Tự kiểm tra: tại sao đo loss trên tập lĩnh vực chưa đủ? Đáp án: cần đo cả tập chung để biết có quên khả năng cũ không, và cần đánh giá hỏi đáp riêng vì văn bản thô không dạy định dạng trả lời.
Đối chiếu với Bài Lab tổng hợp
Mở các giai đoạn 1 đến 7 của Bài Lab tổng hợp và tìm lại từng bước của bài này theo đúng thứ tự. Hãy dự đoán loss ở bước đầu so với ln V của từ điển lab, rồi đối chiếu với giá trị lab in ra; lệch lớn nghĩa là có bước chuẩn bị dữ liệu hay nhãn cần xem lại. Việc giữ checkpoint để suy luận không có nghĩa lab đã học tiếp checkpoint trên một bộ dữ liệu khác.
6Thuật ngữ
- Pretraining
- Tiền huấn luyện: giai đoạn học các quy luật nền tảng của ngôn ngữ từ trọng số khởi tạo ngẫu nhiên, trước khi điều chỉnh cho nhiệm vụ cụ thể.
- Continued pretraining
- Tiếp tục tiền huấn luyện: nạp trọng số đã học rồi chạy tiếp cùng mục tiêu nền tảng trên dữ liệu của một lĩnh vực mới.
- Next-token prediction (causal language modeling)
- Mục tiêu tự giám sát của model sinh văn bản; tại mỗi vị trí đoán token đứng ngay sau, chỉ được nhìn các token đứng trước.
- Masked language modeling
- Mục tiêu của encoder kiểu BERT; che một số token trong chuỗi rồi đoán lại, được nhìn cả hai phía.
- Context length (độ dài ngữ cảnh)
- Số token tối đa mỗi chuỗi huấn luyện; văn bản dài được cắt và ghép (packing) thành các chuỗi có độ dài này.
- Logits và perplexity
- Logits là điểm số cho mỗi token của từ điển; perplexity bằng e mũ loss, đọc như số lựa chọn đều nhau mà model đang phân vân.
- Gradient accumulation
- Cộng dồn gradient qua nhiều lô nhỏ trước khi cập nhật, để mô phỏng một batch lớn mà không cần thêm bộ nhớ.
- Learning-rate schedule
- Lịch thay đổi learning rate theo bước huấn luyện, thường tăng dần lúc đầu (warmup) rồi giảm dần.
- Resume checkpoint và weights-only checkpoint
- Bản để huấn luyện tiếp cần cả optimizer, scheduler, bộ sinh số ngẫu nhiên và vị trí dữ liệu; bản để phục vụ chỉ cần trọng số, config và tokenizer.
- Catastrophic forgetting
- Model học lĩnh vực mới nhưng mất dần khả năng chung; một rủi ro chính của continued pretraining.
Glossary (9)
- Token và token ID
- Token là một mảnh văn bản (một từ, một phần từ hoặc một dấu); tokenizer gán cho mỗi token một số nguyên gọi là token ID, chính là chỉ số hàng trong bảng embedding.
- Checkpoint
- Bản lưu trạng thái model; phạm vi states phụ thuộc mục đích serving hay resume.
- Tokenizer
- Bộ chuyển đổi văn bản và chuỗi mã token theo bảng từ vựng.
- Mask
- Quy tắc vị trí nào được nhìn nhau hoặc được tính vào loss.
- Forward pass
- Tính kết quả model từ đầu vào theo weights hiện tại.
- Backward pass
- Tính gradients ngược qua các phụ thuộc của forward graph.
- Batch
- Nhóm công việc hoặc mẫu được xử lý trong một lượt tính.
- Model weights
- Các tham số số học được học và lưu trong checkpoint.
- Random Number Generator
- Bộ sinh số ngẫu nhiên; trạng thái có thể cần lưu để resume tương ứng.
