Chương 2: Nền tảng toán học
Xây dựng trực giác đại số tuyến tính, xác suất và giải tích mà AI Infra cần: toán đứng sau GEMM tiling, Softmax, lan truyền ngược và huấn luyện mixed precision
AI Infra không đòi bạn mỗi ngày tự chứng minh định lý phức tạp. Nó đòi khi nhìn thấy công thức, bạn trả lời ngay được ba câu hỏi kỹ thuật: tensor có shape nào, cần bao nhiêu tính toán và bộ nhớ, và triển khai thế nào cho ổn định.
Chương này xây trực giác toán quanh ba câu hỏi đó. Ta bắt đầu từ vector và ma trận, nối sang GEMM và tiling; từ phân phối xác suất sang Softmax, cross-entropy và sampling; từ quy tắc chuỗi sang lan truyền ngược; cuối cùng là số dấu phẩy động, sai số và mixed precision. Mục tiêu không phải chứng minh mọi kết luận, mà đạt mức “đọc được công thức, suy được chiều, ước được bậc độ lớn, phán được rủi ro số”.
📑 Mục lục
- 1. Mục tiêu học, ký hiệu và ba câu hỏi
- 2. Đại số tuyến tính: tensor, phép biến đổi và phân tích
- 3. Ma trận khối và trực giác kỹ thuật GEMM
- 4. Xác suất: từ biến ngẫu nhiên đến phân phối mô hình
- 5. Softmax, cross-entropy và KL divergence
- 6. Giải tích và lan truyền ngược
- 7. Tối ưu, ổn định gradient và chuẩn hóa
- 8. Tính toán số và mixed precision
- 9. Ví dụ tổng hợp AI Infra
- Tóm tắt
- Checklist tự kiểm
- Bài tập
- Tài liệu tham khảo
1. Mục tiêu học, ký hiệu và ba câu hỏi
Sau chương này, bạn nên:
- Phân biệt được scalar, vector, ma trận và tensor bậc cao, và suy shape sau phép toán một cách thành thạo;
- Giải thích được trực giác của tích vô hướng, chuẩn (norm), nhân ma trận, hạng (rank), phân tích riêng và SVD;
- Tách nhân ma trận thành block và hiểu vì sao GEMM tiling tương đương về mặt toán;
- Tính kỳ vọng, phương sai, hiệp phương sai; hiểu các phân phối thường gặp và xác suất có điều kiện;
- Từ logits ra Softmax ổn định; hiểu temperature, cross-entropy, entropy và KL divergence;
- Đọc computation graph bằng quy tắc chuỗi; tự suy gradient của linear layer và Softmax cross-entropy;
- Giải thích gradient biến mất/bùng nổ, residual connection và chuẩn hóa ảnh hưởng thế nào tới huấn luyện;
- Phân biệt độ chính xác và dải động của FP32, TF32, FP16, BF16 và FP8;
- Nhận ra overflow, underflow, catastrophic cancellation, tính không kết hợp và các rủi ro số khác;
- Ước số tham số, kích thước activation, FLOPs, lượng truy cập bộ nhớ và arithmetic intensity của một toán tử.
1.1 Ký hiệu trong chương
| Ký hiệu | Nghĩa |
|---|---|
| Scalar, hoặc biến khi ngữ cảnh rõ | |
| Vector | |
| Ma trận hoặc tensor bậc cao | |
| Phần tử hàng , cột của ma trận | |
| Tập ma trận thực hàng, cột | |
| Chuyển vị | |
| Nghịch đảo (nếu tồn tại) | |
| Chuẩn L2 của vector | |
| Kỳ vọng | |
| Phương sai | |
| Gradient của theo | |
| Đạo hàm riêng | |
| Nhân từng phần tử |
Code deep learning thường dùng ký hiệu batch-first:
- : batch size;
- : sequence length;
- : hidden size;
- : vocabulary size;
- : số attention head;
- : chiều mỗi head.
1.2 Ba câu hỏi khi đọc công thức
Lấy phép chiếu đầu ra của language model làm ví dụ:
Câu một: shape có khớp không? Chiều trong giống nhau, đầu ra là .
Câu hai: chi phí bao nhiêu? Mỗi phần tử đầu ra làm lần nhân-cộng, tổng khoảng:
Ở đây một phép nhân và một phép cộng mỗi cái tính một thao tác dấu phẩy động.
Câu ba: rủi ro triển khai là gì? Weight lớn, logits đầu ra lớn; cần nghĩ tới dtype, memory layout, tiling, chiến lược song song và ổn định số của Softmax.
Ba câu hỏi này xuyên suốt cả stack AI Infra.
2. Đại số tuyến tính: tensor, phép biến đổi và phân tích
2.1 Scalar, vector, ma trận và tensor
- Scalar là một số, ví dụ learning rate ;
- Vector là mảng có thứ tự một chiều, ví dụ hidden state của một token ;
- Ma trận là mảng hai chiều, ví dụ weight linear layer ;
- Tensor là mảng nhiều chiều, ví dụ hidden state của một batch chuỗi .
Trong kỹ thuật, “tensor” còn mang thông tin ngoài shape toán học:
data address + shape + stride + dtype + device + layout
Hai tensor cùng shape chưa chắc cùng memory layout. Giá trị giống nhau cũng chưa chắc cùng dtype và hành vi sai số.
2.2 Shape, chỉ số và stride
Xét ma trận row-major shape :
Bộ nhớ liên tục bên dưới là [1, 2, 3, 4, 5, 6], stride theo phần tử là . Offset tuyến tính của là:
View chuyển vị có shape , stride thành , thường không cần copy dữ liệu. Nhưng khi quét theo chiều cuối sau chuyển vị, truy cập không còn liên tục.
reshape có copy hay không phụ thuộc layout gốc có biểu diễn được bằng shape/stride mới hay không. Khi thấy view, reshape, transpose, contiguous, hãy nghĩ đồng thời tới chiều logic và layout vật lý.
2.3 Phép từng phần tử và broadcasting
Cộng từng phần tử đòi các phần tử tương ứng ghép được với nhau:
Broadcasting cho phép một số chiều độ dài 1 hoặc thiếu được mở rộng về mặt logic. Ví dụ:
tái sử dụng cùng một bias trên chiều batch và sequence; shape kết quả vẫn .
Khi căn từ chiều đuôi về trước, mỗi cặp chiều phải thỏa:
- Hai kích thước bằng nhau; hoặc
- Ít nhất một kích thước bằng 1; hoặc
- Một phía không có chiều đó.
Broadcasting thường là view logic, không materialize sẵn cả tensor. Nhưng pattern truy cập và reduce của kernel sau đó vẫn bị ảnh hưởng. Nguy hiểm hơn: shape sai vẫn “vừa broadcast”, code không báo lỗi nhưng ngữ nghĩa tính sai.
2.4 Tích vô hướng: độ tương đồng và tổng có trọng số
Tích vô hướng của hai vector chiều:
Hai trực giác thường dùng:
Tổng có trọng số: là trọng số, là giá trị.
Độ tương đồng hướng:
Vậy cosine similarity là:
Attention dùng tích vô hướng Query–Key để đo mức khớp. Embedding retrieval thường dùng tích vô hướng đã chuẩn hóa để xấp xỉ cosine similarity.
Nếu chuẩn vector gần 0, mẫu số không ổn định; triển khai thường cộng thêm nhỏ.
2.5 Chuẩn: độ dài, sai số và ràng buộc
Các chuẩn vector thường gặp:
Chuẩn Frobenius của ma trận xem mọi phần tử như một vector dài:
Trong kỹ thuật, chuẩn dùng để:
- Đo quy mô tham số, activation hoặc gradient;
- Gradient clipping;
- So sai số giữa bản tham chiếu và bản tối ưu;
- Regularization;
- Chuẩn hóa vector.
Khi so kết quả dấu phẩy động, sai số tuyệt đối và tương đối đều có vai trò:
Khi giá trị tham chiếu gần 0, sai số tương đối bị phóng đại, nên thư viện kiểm thử thường kết hợp absolute tolerance atol và relative tolerance rtol:
2.6 Nhân ma trận là một tập tích vô hướng
Nếu:
thì:
Mỗi phần tử là:
Coi shape như kiểm tra giao diện:
(M, K) @ (K, N) -> (M, N)
ở giữa bị reduce; phía ngoài được giữ. GEMM chuẩn thường viết:
Nhân ma trận nói chung không giao hoán: và có thể khác shape hoặc khác giá trị. Nhưng có tính kết hợp:
Bằng nhau về toán không có nghĩa kết quả dấu phẩy động giống từng bit, cũng không có nghĩa chi phí tính toán giống nhau. Đổi thứ tự kết hợp có thể đổi mạnh kích thước tensor trung gian và FLOPs.
2.7 Batched matrix multiplication
Trong multi-head Attention thường gặp:
Sau khi chuyển vị hai chiều cuối:
Nhân ma trận theo batch:
Hai chiều đầu là chiều batch; mỗi (batch, head) chạy một phép nhân ma trận độc lập. Đừng thần thánh hóa “nhân tensor bậc cao”: thường chỉ là nhân ma trận trên hai chiều cuối, các chiều trước lo batch và broadcast.
2.8 Phép biến đổi tuyến tính và affine
Phép biến đổi tuyến tính nghiêm ngặt thỏa:
Nhân ma trận là tuyến tính. “Linear layer” trong mạng nơ-ron thường còn có bias:
Về toán đó là phép affine. Nhiều lớp linear/affine không activation có thể gộp thành một, nên activation phi tuyến mới là thứ giúp mạng sâu biểu diễn hàm phức tạp.
2.9 Chuyển vị, ma trận đơn vị và nghịch đảo
Chuyển vị đổi hàng–cột:
Quy tắc hay dùng:
Ma trận đơn vị thỏa:
Nếu ma trận vuông có nghịch đảo:
Khi giải , toán học có thể viết , nhưng triển khai số thường không lập nghịch đảo tường minh; dùng LU, QR, Cholesky… để giải trực tiếp. Lập nghịch đảo tường minh thường tốn hơn và sai số lớn hơn.
2.10 Độc lập tuyến tính, không gian sinh và hạng
Nếu trong một tập vector có vector viết được bằng tổ hợp tuyến tính của các vector còn lại, chúng phụ thuộc tuyến tính. Hạng (rank) của ma trận có thể hiểu là số hướng độc lập:
Hạng thấp nghĩa là thông tin trong ma trận thừa, có thể xấp xỉ bằng hai ma trận nhỏ hơn:
Số tham số giảm từ xuống , và đó là nền tảng toán của low-rank adapter cùng nén mô hình.
2.11 Giá trị riêng và vector riêng
Với ma trận vuông , nếu tồn tại vector khác không và scalar sao cho:
thì là vector riêng, là giá trị riêng tương ứng. Trực giác: trên hướng đó phép biến đổi chỉ scale, không đổi hướng.
Giá trị riêng giúp hiểu:
- Hệ động học tuyến tính khuếch đại hay suy giảm;
- Độ cong Hessian theo các hướng khác nhau;
- Vì sao gradient bùng nổ hoặc biến mất khi nhiều Jacobian nhân liên tiếp;
- Hướng biến thiên chính của ma trận hiệp phương sai (PCA).
Không phải ma trận nào cũng phân tích riêng tốt trên trường thực. Trong kỹ thuật hãy chọn thuật toán khớp cấu trúc ma trận, đừng coi eig là công cụ vạn năng.
2.12 Phân tích giá trị singular (SVD)
Mọi ma trận thực đều viết được:
trong đó:
- Các cột của là left singular vector;
- Các cột của là right singular vector;
- Đường chéo chứa singular value .
Giữ singular value lớn nhất:
là một xấp xỉ rank- tối ưu (theo chuẩn 2 và Frobenius thông thường). Trực giác: singular value nhỏ tương ứng hướng ảnh hưởng yếu, có thể bỏ để đổi lấy nén.
Bản thân SVD cũng có chi phí tính và bộ nhớ. Nén weight mô hình lớn thường dùng truncation, thuật toán ngẫu nhiên, hoặc huấn luyện trực tiếp nhân tử hạng thấp, chứ không SVD đầy đủ trên mọi ma trận khổng lồ.
2.13 Cập nhật hạng thấp của LoRA
Với weight tiền huấn luyện , LoRA đóng băng và chỉ huấn luyện cập nhật hạng thấp:
với:
Số tham số mới giảm từ của cập nhật đầy đủ xuống:
Ví dụ , :
Hạng thấp chỉ giảm tham số huấn luyện được và optimizer state tương ứng; không tự loại bỏ chi phí weight nền, activation và tính forward. Khi deploy có thể gộp weight, hoặc giữ adapter để chuyển động; hai cách đánh đổi VRAM, latency và độ linh hoạt khác nhau.
3. Ma trận khối và trực giác kỹ thuật GEMM
3.1 Vì sao có thể tính theo khối
Cắt ma trận theo , và chiều reduce . Ví dụ block :
thì:
Các block khác tương tự. Mỗi block đầu ra cộng dồn nhiều tích cục bộ theo hướng . Vì vậy GPU kernel có thể:
- Lấy một khối nhỏ và một khối nhỏ ;
- Đưa vào shared memory / register trên chip;
- Tái sử dụng dữ liệu đó để tính nhiều phần tử đầu ra;
- Lặp theo và cộng dồn;
- Cuối cùng ghi block đầu ra về HBM.
Đó là cơ sở toán của tiling. Nó đổi thứ tự tính và cách chuyển dữ liệu, không đổi công thức đích.
3.2 Tính toán và truy cập bộ nhớ của GEMM ngây thơ
Với :
- Số phần tử đầu ra: ;
- Mỗi phần tử làm lần nhân-cộng;
- FLOPs khoảng .
Triển khai ngây thơ nếu mỗi lần nhân-cộng đều load và từ global memory thì cùng một phần tử bị đọc lại rất nhiều lần. Hiệu năng GEMM đến từ tái sử dụng dữ liệu:
- Một phần tử của được tái sử dụng trên nhiều cột cùng hàng đầu ra;
- Một phần tử của được tái sử dụng trên nhiều hàng cùng cột đầu ra;
- Accumulator trong register tái sử dụng lần.
3.3 Ước arithmetic intensity đơn giản
Arithmetic intensity định nghĩa:
Lý tưởng, FP16 GEMM mỗi ma trận đầu vào chỉ đọc một lần từ HBM, đầu ra ghi một lần; số byte thô khoảng:
Vậy:
Thực tế còn cache, căn chỉnh, read-modify-write, kết quả tạm và phép fused. Ước này không phải mô hình hiệu năng chính xác, nhưng giúp phán toán tử nghiêng về bị giới hạn bởi compute hay bởi băng thông.
3.4 Tile không phải càng lớn càng tốt
Tile lớn hơn tăng tái sử dụng dữ liệu, nhưng cũng tiêu nhiều hơn:
- Shared memory;
- Register;
- Thread và đồng bộ mỗi block;
- Chi phí xử lý biên.
Tài nguyên quá cao làm giảm số block/warp một SM giữ được đồng thời, hại latency hiding. Chọn tile là đánh đổi giữa tái sử dụng dữ liệu, occupancy, hiệu quả lệnh và khớp shape.
3.5 Tail block và padding
Khi không chia hết cho tile size, khối cuối vượt biên hợp lệ. Cách thường gặp:
- Thêm kiểm tra biên / mask;
- Padding đầu vào tới kích thước căn chỉnh;
- Fast path cho shape đẹp thường gặp, shape khác đi đường generic.
Padding tăng tính toán và lưu trữ; nhánh tăng chi phí điều khiển. Cách nào nhanh hơn phụ thuộc shape và phần cứng.
3.6 Vì sao kết quả tiling dấu phẩy động có thể khác
Cộng số thực có tính kết hợp, nhưng cộng dấu phẩy động không nghiêm ngặt:
Tile khác, cây reduce của thread khác, đường Tensor Core khác sẽ đổi thứ tự cộng dồn, nên kết quả tối ưu và tham chiếu có thể không khớp từng bit. Kiểm đúng đắn nên dùng dung sai lỗi phù hợp dtype và quy mô bài toán, và để ý lỗi có phóng đại có hệ thống theo độ dài reduce hay không.
4. Xác suất: từ biến ngẫu nhiên đến phân phối mô hình
4.1 Biến ngẫu nhiên và phân phối xác suất
Biến ngẫu nhiên ánh xạ kết quả ngẫu nhiên thành số. Biến rời rạc dùng hàm khối xác suất:
Biến liên tục dùng hàm mật độ xác suất:
Xác suất tại một điểm của biến liên tục thường bằng 0; xác suất trên khoảng lấy bằng tích phân mật độ. Phân phối hay gặp trong mô hình:
| Phân phối | Giá trị | Tình huống điển hình |
|---|---|---|
| Bernoulli | Phân loại nhị phân, Dropout mask | |
| Categorical | Phân phối token tiếp theo | |
| Uniform | Khoảng / tập hữu hạn | Khởi tạo, lấy mẫu ngẫu nhiên |
| Gaussian | Số thực | Khởi tạo, nhiễu, phân tích xấp xỉ |
4.2 Xác suất đồng thời, biên và có điều kiện
Xác suất đồng thời mô tả nhiều sự kiện xảy ra cùng lúc:
Cộng hoặc tích phân hết biến kia cho xác suất biên:
Xác suất có điều kiện:
Language model tự hồi quy phân tích xác suất chuỗi bằng quy tắc chuỗi:
Điều đó giải thích vì sao next-token prediction lúc huấn luyện và sinh từng token lúc suy luận là hai quá trình của cùng một mô hình xác suất.
4.3 Độc lập và độc lập có điều kiện
Nếu:
thì độc lập. Độc lập mạnh hơn “không tương quan”; hiệp phương sai bằng 0 chưa chắc độc lập.
Độc lập có điều kiện cho viết:
Lấy mẫu phân tán, data parallel và ước lượng thống kê thường ngầm giả định i.i.d. Dữ liệu thật có thể phá giả định đó bằng mẫu trùng, lệch shard hoặc tương quan chuỗi.
4.4 Công thức Bayes
Trong đó là prior, là likelihood, là posterior. Huấn luyện LLM thông thường không tự tính tay Bayes, nhưng đó vẫn là nền của suy luận xác suất, ước lượng tham số và mô hình hóa bất định.
4.5 Kỳ vọng: trung bình có trọng số xác suất
Biến rời rạc:
Biến liên tục:
Kỳ vọng có tính tuyến tính, không đòi biến độc lập:
Mục tiêu huấn luyện thường là kỳ vọng loss trên phân phối dữ liệu:
Không thể duyệt phân phối thật, nên xấp xỉ bằng trung bình mẫu mini-batch.
4.6 Phương sai và độ lệch chuẩn
Phương sai đo dao động quanh trung bình:
Độ lệch chuẩn cùng đơn vị với biến gốc:
Nếu độc lập:
Nhiễu gradient lúc huấn luyện, thang khởi tạo, chuẩn hóa và sai số lượng tử hóa đều liên quan tới phương sai.
4.7 Hiệp phương sai và hệ số tương quan
Hiệp phương sai đo hai biến cùng biến thiên:
Chuẩn hóa được hệ số tương quan:
Với biến ngẫu nhiên dạng vector, ma trận hiệp phương sai là:
Nó đối xứng bán xác định dương. PCA phân tích riêng ma trận hiệp phương sai để tìm hướng trực giao có phương sai lớn nhất.
4.8 Trung bình mẫu, phương sai và mini-batch
Cho mẫu , trung bình mẫu:
Phương sai mẫu không chệch thường dùng:
“Phương sai” trong toán tử deep learning chia cho hay phụ thuộc định nghĩa cụ thể. LayerNorm thường dùng dạng tổng thể (chia cho số phần tử); thư viện thống kê có thể mặc định khác. Khi tái hiện toán tử hãy xem ngữ nghĩa API, đừng chỉ nhìn tên.
4.9 Maximum likelihood và negative log-likelihood
Cho dữ liệu , ước lượng maximum likelihood chọn tham số làm dữ liệu quan sát khả dĩ nhất:
Tích dễ underflow số và bất tiện khi lấy đạo hàm. Lấy log biến tích thành tổng:
Tương đương tối thiểu hóa negative log-likelihood (NLL):
Logarithm là cầu nối quan trọng giữa tính toán số và mô hình xác suất.
5. Softmax, cross-entropy và KL divergence
5.1 Logits không phải xác suất
Lớp cuối mô hình xuất số thực tùy ý:
Các giá trị này gọi là logits. Chúng có thể âm và không cần cộng bằng 1. Softmax biến chúng thành phân phối categorical:
Rõ ràng và .
Softmax bất biến với dịch chuyển đồng nhất:
vì tử và mẫu đều nhân thêm . Tính chất này chính là chỗ dựa của triển khai ổn định.
5.2 Softmax ổn định số
Tính thẳng sẽ overflow với số dấu phẩy động hữu hạn. Đặt:
Dạng ổn định:
Đầu vào mũ lớn nhất là 0 nên mũ lớn nhất bằng 1; các giá trị khác không vượt quá 1. Pseudocode:
def stable_softmax(x):
maximum = max(x)
exps = [exp(value - maximum) for value in x]
denominator = sum(exps)
return [value / denominator for value in exps]
Trừ max chống overflow chiều xuôi, nhưng hạng rất nhỏ vẫn có thể underflow về 0. Thường nghĩa là so với hạng lớn nhất thì có thể bỏ qua; nếu sau đó còn lấy log, hãy dùng log_softmax ổn định trực tiếp, tránh thành 0 rồi log(0).
5.3 LogSumExp
Định nghĩa:
Dạng ổn định:
Vậy:
Triển khai cross-entropy thường fuse log_softmax + NLLLoss, vừa giảm tensor trung gian và truy cập bộ nhớ, vừa tránh đường không ổn định “Softmax rồi mới log”.
5.4 Tham số temperature
Softmax với temperature :
- : phóng đại chênh lệch logit, phân phối nhọn hơn;
- : thu hẹp chênh lệch, phân phối phẳng hơn;
- : dần chỉ chọn logit lớn nhất;
- : dần về phân phối đều.
Temperature đổi phân phối sampling, không bằng sửa weight mô hình. Triển khai nên scale logits trước, rồi Softmax ổn định, và cẩn thận với temperature rất nhỏ.
5.5 Cross-entropy
Cross-entropy giữa phân phối thật và phân phối mô hình :
Nếu nhãn thật one-hot với lớp đúng :
thì:
Mô hình gán lớp đúng xác suất càng cao thì loss càng nhỏ. Nếu , loss bằng 0; nếu gần 0, loss rất lớn.
5.6 Entropy thông tin
Entropy của bản thân phân phối:
Entropy đo độ bất định:
- Toàn bộ xác suất tập trung một lớp thì entropy nhỏ nhất;
- lớp phân bố đều thì entropy lớn nhất, bằng .
Cơ số log quyết định đơn vị: log tự nhiên là nat, cơ số 2 là bit. Loss machine learning thường dùng log tự nhiên.
5.7 KL divergence
KL divergence từ phân phối tới :
Nó thỏa:
và bằng 0 khi hai phân phối trùng. Nhưng thường không đối xứng:
nên KL divergence không phải khoảng cách theo nghĩa chặt.
Cross-entropy phân tích thành:
Khi huấn luyện phân phối thật cố định, không phụ thuộc tham số mô hình, nên tối thiểu hóa cross-entropy tương đương tối thiểu hóa KL tương ứng.
KL xuất hiện trong knowledge distillation, khớp phân phối, ràng buộc RLHF/PPO và phân tích speculative decoding. Khi triển khai hãy rõ API nhận xác suất, log-probability hay logits, và chiều của KL.
5.8 Perplexity
Nếu NLL trung bình mỗi token là , perplexity:
Trực giác là “số ứng viên hiệu dụng” mô hình đối mặt mỗi bước. Nhưng tokenizer khác, tiền xử lý khác, độ dài ngữ cảnh khác, và có bỏ special token hay không đều làm đổi PPL; không so ngang giữa các thiết lập đánh giá.
5.9 Sampling Top-k và Top-p
Sau khi mô hình xuất phân phối, chiến lược giải mã quyết định chọn token thế nào:
- Greedy: chọn token xác suất lớn nhất;
- Top-k: chỉ lấy mẫu trong token xác suất cao nhất;
- Top-p (nucleus): chọn tập ứng viên nhỏ nhất có xác suất tích lũy ít nhất , chuẩn hóa lại rồi lấy mẫu.
Kích thước tập Top-p đổi theo độ nhọn của phân phối. Triển khai thường lọc logits trước, đặt hạng bị loại thành âm vô cực, rồi Softmax ổn định và lấy mẫu.
Suy luận phân tán nếu vocabulary bị cắt theo tensor parallelism thì global top-k/top-p cần gom ứng viên cục bộ giữa các thiết bị, hoặc dùng thuật toán phân tán tương đương.
6. Giải tích và lan truyền ngược
6.1 Đạo hàm: tốc độ biến thiên cục bộ
Đạo hàm hàm một biến:
Gần , thay đổi nhỏ của đầu vào ảnh hưởng đầu ra:
Đạo hàm thường gặp:
6.2 Đạo hàm riêng và gradient
Với hàm scalar nhiều biến , tốc độ đổi theo một biến là đạo hàm riêng. Xếp mọi đạo hàm riêng thành vector được gradient:
Gradient chỉ hướng tăng nhanh nhất, nên gradient descent cập nhật theo hướng ngược:
là learning rate.
6.3 Jacobian và Hessian
Với hàm vector , Jacobian:
Nó mô tả ảnh hưởng cục bộ của từng thành phần đầu vào lên từng thành phần đầu ra.
Hessian của hàm scalar là ma trận đạo hàm riêng bậc hai:
Hessian mô tả độ cong cục bộ. Số tham số deep learning quá lớn nên thường không dựng Hessian đầy đủ tường minh, nhưng Hessian-vector product, xấp xỉ độ cong và phân tích giá trị riêng vẫn dùng trong nghiên cứu tối ưu và ổn định.
6.4 Quy tắc chuỗi
Nếu:
thì:
Mạng nhiều lớp là hàm hợp. Với:
gradient lan từ loss ngược lại:
Về khái niệm là tích Jacobian; autodiff thực tế không dựng Jacobian khổng lồ mà tính hiệu quả vector-Jacobian product (reverse mode).
6.5 Computation graph và autodiff reverse mode
Đặt:
Giai đoạn xuôi lưu các lượng trung gian cần thiết. Ngược bắt đầu từ:
rồi:
Vì :
ảnh hưởng theo hai đường, gradient phải cộng:
Điều đó giải thích vì sao một tensor dùng ở nhiều chỗ trên graph phải tích lũy gradient.
6.6 Lan truyền ngược qua linear layer
Dùng quy ước hàng là batch:
với:
Cho gradient thượng nguồn:
thì:
Chỉ nhìn shape cũng kiểm nhanh được công thức:
dX: (B, dout) @ (dout, din) -> (B, din)
dW: (din, B) @ (B, dout) -> (din, dout)
db: reduce theo chiều batch -> (dout,)
Chiều ngược của một linear layer thường gồm hai GEMM và một lần reduce; đó cũng là một lý do compute huấn luyện cao hơn hẳn một lần forward.
6.7 Jacobian của Softmax
Softmax:
Đạo hàm riêng:
Viết dạng ma trận:
Mỗi đầu ra Softmax phụ thuộc mọi đầu vào, nên Jacobian không chéo. Nhưng backward thực tế vẫn tính trong mà không cần materialize ma trận .
6.8 Gradient gọn của Softmax + cross-entropy
Nhãn one-hot , loss:
Lấy đạo hàm kết hợp với Softmax được:
Đây là một trong những rút gọn quan trọng nhất của deep learning. Với lớp đúng, gradient là ; với lớp khác là . Dự đoán càng sai, lực đẩy sửa logits càng mạnh.
Kernel cross-entropy fused có thể chia sẻ max và kết quả reduce, giảm tensor xác suất trung gian, và sinh thẳng gradient cần thiết.
6.9 Kiểm gradient
Triển khai autodiff có thể kiểm ở quy mô nhỏ bằng sai phân hữu hạn:
Sai phân trung tâm thường chính xác hơn một phía, nhưng không được quá lớn hay quá nhỏ: quá lớn có truncation error, quá nhỏ bị sai số làm tròn dấu phẩy động át. Kiểm gradient hợp kích thước nhỏ, double precision và hàm xác định; không hợp kiểm trực tiếp job huấn luyện có ngẫu nhiên hoặc tensor khổng lồ.
7. Tối ưu, ổn định gradient và chuẩn hóa
7.1 Gradient toàn batch, SGD và mini-batch
Rủi ro thực nghiệm:
Gradient toàn batch mỗi bước dùng mọi mẫu, chi phí cao. Gradient mini-batch:
là ước lượng ngẫu nhiên của gradient đầy đủ. Cập nhật SGD cơ bản:
Batch lớn hơn thường giảm phương sai ước lượng gradient và tăng tận dụng phần cứng, nhưng cần thêm bộ nhớ activation, và siêu tham số tối ưu có thể phải chỉnh theo.
7.2 Momentum
Một dạng momentum thường gặp:
Momentum lấy trung bình mũ của gradient lịch sử, giảm nhiễu ngắn hạn, và tăng tốc trên hướng giữ nhất quán.
7.3 Trực giác thích ứng thang của Adam
Adam đồng thời giữ EMA của moment bậc một và bậc hai:
Sau hiệu chỉnh bias:
Bình phương và căn đều từng phần tử. Adam lưu thêm state cho mỗi tham số; nếu state dùng FP32, chi phí bộ nhớ thường là phần lớn của huấn luyện mô hình lớn, và đó cũng là lý do có kỹ thuật sharding như ZeRO.
7.4 Gradient biến mất và bùng nổ
Gradient của hàm hợp sâu chứa nhiều tích Jacobian:
Nếu các phép biến đổi trên hướng liên quan lâu dài có thang nhỏ hơn 1, gradient suy mũ; lâu dài lớn hơn 1, gradient tăng mũ.
Triệu chứng kỹ thuật gồm:
- Chuẩn gradient gần 0, lớp sớm hầu như không cập nhật;
- Chuẩn gradient đột ngột rất lớn, loss thành
inf/nan; - Mixed precision kích hoạt underflow hoặc overflow sớm hơn.
Cách giảm gồm khởi tạo hợp lý, residual connection, chuẩn hóa, gradient clipping, learning rate phù hợp và dtype ổn định.
7.5 Vì sao residual connection giúp lan truyền gradient
Khối residual:
có Jacobian:
Đường identity cung cấp lối gradient không phụ thuộc hoàn toàn vào . Nó không đảm bảo mãi mãi không bùng nổ/biến mất, nhưng cải thiện rõ điều kiện tối ưu của mạng sâu.
7.6 Khởi tạo và lan truyền phương sai
Xét:
Nếu độc lập, kỳ vọng 0:
Để phương sai activation các lớp tương đối ổn định, đặt cùng bậc . Xavier, Kaiming chọn thang theo fan-in, fan-out và hàm activation.
Không phải càng nhỏ càng ổn định: quá nhỏ làm tín hiệu và gradient suy; quá lớn gây bão hòa hoặc bùng nổ.
7.7 LayerNorm
Với hidden vector của một token :
LayerNorm reduce theo chiều ẩn, không phụ thuộc mẫu khác trong batch, nên hợp chuỗi độ dài biến thiên và mô hình tự hồi quy.
Góc nhìn kernel: ít nhất gồm reduce trung bình, reduce phương sai và biến đổi từng phần tử. Triển khai ngây thơ đọc/ghi HBM nhiều lần; bản tối ưu fuse reduce với phép affine và xử lý reduce song song trên vector dài.
7.8 RMSNorm
RMSNorm không trừ trung bình, chỉ scale theo căn quân phương:
Nó bỏ phần tính liên quan trung bình, nhưng “ít công thức hơn” không tự động đồng nghĩa tăng tốc end-to-end theo cùng tỉ lệ. Lợi ích thực phụ thuộc fusion, truy cập bộ nhớ và bottleneck tổng thể của mô hình.
7.9 Gradient clipping
Clipping theo chuẩn L2 toàn cục:
Khi chuẩn gradient vượt ngưỡng , toàn bộ bị thu theo tỉ lệ, hướng giữ nguyên. Trong huấn luyện phân tán, nếu gradient bị shard, tính chuẩn toàn cục cần gom tổng bình phương cục bộ giữa các rank:
Vậy một thao tác toán trông đơn giản cũng có thể kéo theo collective communication.
8. Tính toán số và mixed precision
8.1 Số dấu phẩy động là tập hữu hạn
Biểu diễn điển hình của số nhị phân dấu phẩy động:
Bit được chia cho dấu, số mũ và phần định trị (mantissa). Bit mũ quyết định dải động; bit định trị quyết định độ mịn giữa các số biểu diễn được kề nhau.
| Định dạng | Tổng bit | Bit mũ | Bit trường định trị | Đặc điểm chính |
|---|---|---|---|---|
| FP32 | 32 | 8 | 23 | Dải và độ chính xác cân bằng hơn |
| TF32 | 19 (ngữ nghĩa đầu vào nhân) | 8 | 10 | Giữ dải FP32, giảm độ chính xác nhân, thường cộng dồn FP32 |
| FP16 | 16 | 5 | 10 | Độ chính xác còn chấp nhận được nhưng dải động nhỏ hơn |
| BF16 | 16 | 8 | 7 | Dải động gần FP32, độ chính xác thấp hơn FP16 |
| FP8 E4M3 | 8 | 4 | 3 | Ưu tiên độ chính xác, dải nhỏ hơn; mã hóa cụ thể theo đặc tả |
| FP8 E5M2 | 8 | 5 | 2 | Ưu tiên dải, độ chính xác thấp hơn nữa; mã hóa cụ thể theo đặc tả |
Bảng không tính bit dẫn ẩn trong trường định trị. TF32 thường là chế độ tính của NVIDIA Tensor Core, không phải dtype lưu trong bộ nhớ thông thường.
8.2 Độ chính xác và dải động là hai chuyện khác nhau
FP16 có trường định trị rộng hơn BF16, nên ở cùng bậc độ lớn thường biểu diễn được chênh lệch mịn hơn; nhưng FP16 ít bit mũ hơn, giá trị hữu hạn lớn nhất chỉ 65504, và dải số khác không cũng hẹp hơn nhiều.
BF16 đổi một phần độ chính xác lấy cùng số bit mũ với FP32, nên lúc huấn luyện thường ít overflow/underflow hơn. Nó vẫn có sai số làm tròn rõ, nhất là khi cộng increment rất nhỏ vào số lớn.
8.3 Làm tròn và độ chính xác máy
Nhiều số thập phân không biểu diễn chính xác bằng dấu phẩy động nhị phân:
>>> 0.1 + 0.2 == 0.3
False
Khoảng cách giữa các số float tăng theo giá trị tuyệt đối. Nếu nhỏ hơn nhiều so với khoảng biểu diễn được quanh hiện tại:
Đó là vì sao optimizer thường giữ FP32 master weights: cập nhật quá nhỏ trên weight độ chính xác thấp có thể bị làm tròn mất hẳn.
8.4 Không kết hợp và thứ tự reduce
Vì mỗi bước đều làm tròn:
Reduce song song dùng cộng dạng cây; số thread khác, chia block khác và thứ tự atomic khác có thể cho kết quả hơi khác. Không xác định không tự động nghĩa là lỗi triển khai, nhưng phải nằm trong sai số chấp nhận được và khớp yêu cầu tái hiện của bài toán.
Cách nâng độ chính xác reduce gồm:
- Cộng dồn ở độ chính xác cao hơn;
- Cộng từng cặp / dạng cây, tránh cộng lâu dài các thang cực đoan;
- Tổng bù như Kahan (thêm chi phí lệnh);
- Reduce cục bộ trước, rồi gộp tổng riêng phần.
8.5 Overflow, underflow và giá trị không hữu hạn
- overflow: trị tuyệt đối vượt giá trị hữu hạn lớn nhất, thường thành ;
- underflow: kết quả quá gần 0, vào subnormal hoặc làm tròn về 0;
NaN: ví dụ , hoặc phép bất hợp lệ;inftham gia phép sau có thể lan nhanh thànhNaN.
Khi loss thành NaN, hãy tìm tensor không hữu hạn đầu tiên, đừng chỉ nhìn loss cuối. Nguồn thường gặp: logits quá lớn, chia cho 0, căn số âm, mask sai, gradient overflow và biên kernel tùy chỉnh sai.
8.6 Catastrophic cancellation
Hai số lớn gần bằng nhau trừ nhau sẽ triệt chữ số có nghĩa cao; sai số tương đối của phần còn lại có thể rất lớn. Ví dụ tính phương sai bằng:
hai hạng có thể đều lớn và gần nhau, trừ xong mất nhiều độ chính xác.
Cách ổn định hơn gồm two-pass variance hoặc thuật toán online Welford. Cách sau cập nhật dần trung bình và độ lệch bình phương:
Phương sai tổng thể là . Welford còn gộp được thống kê từ các khối khác nhau, hợp reduce song song.
8.7 Condition number: sai số đầu vào bị phóng đại bao nhiêu
Condition number của bài toán mô tả ảnh hưởng của nhiễu nhỏ ở đầu vào lên đầu ra. Với ma trận khả nghịch, trong một chuẩn nhất quán:
Condition number lớn nghĩa là bài toán ill-conditioned: dù thuật toán đúng và đầu vào chỉ có sai số làm tròn nhỏ, đầu ra vẫn có thể đổi mạnh.
Cần tách:
- bản thân bài toán có ill-conditioned không;
- thuật toán chọn có ổn định số không.
Thêm bit giảm được sai số làm tròn, nhưng không triệt tiêu độ nhạy đến từ ill-conditioning.
8.8 Mẫu cơ bản của huấn luyện mixed precision
Mixed precision không phải “đổi hết sang FP16”. Mẫu thường gặp:
- Nhân ma trận lớn dùng đầu vào FP16/BF16, tăng tốc bằng Tensor Core;
- Nhân-cộng hoàn tất ở FP32 hoặc độ chính xác cộng dồn cao hơn được chỉ định;
- Phép nhạy như reduce, chuẩn hóa, Softmax giữ hoặc nâng nội bộ lên FP32;
- Optimizer state và/hoặc master weights giữ FP32;
- Chọn output dtype theo phần cứng và toán tử.
Chiến lược cụ thể khác nhau theo framework và phần cứng; hãy xem tài liệu toán tử thật và profiler, đừng đoán đường tính bên trong từ dtype đầu vào.
8.9 Vì sao Loss Scaling hữu ích
Gradient FP16 nhỏ trong backward có thể underflow về 0. Với hệ số scale :
thì:
Gradient được phóng trước vào dải FP16 biểu diễn được; sau backward chia lại cho :
Dynamic Loss Scaling sẽ:
- Chạy backward với scale hiện tại;
- Kiểm tra gradient có
inf/NaNkhông; - Nếu overflow, bỏ cập nhật và giảm scale;
- Sau vài bước ổn định liên tiếp, thử tăng scale.
Loss Scaling chủ yếu chống underflow gradient nhỏ; scale quá lớn lại gây overflow. BF16 dải động lớn hơn, thường không phụ thuộc Loss Scaling, nhưng mô hình vẫn có thể sinh giá trị không hữu hạn vì bản thân không ổn định.
8.10 Thuật toán ổn định thường cũng hợp fusion hơn
Ổn định số và tối ưu hiệu năng không phải lúc nào cũng xung đột:
- Stable Softmax reduce max trước, rồi exp/sum; Online Softmax có thể gộp state theo block;
- Fuse
log_softmax + NLLgiảm ghi xác suất trung gian; - Welford giữ thống kê hợp reduce theo khối của LayerNorm;
- GEMM đầu vào độ chính xác thấp, cộng dồn độ chính xác cao cân bằng throughput và sai số.
Điểm then chốt là chọn dạng toán có state kết hợp được, để kernel xử lý theo tile trong bộ nhớ trên chip hữu hạn.
9. Ví dụ tổng hợp AI Infra
9.1 Ví dụ 1: Shape và chi phí linear layer Transformer
Đầu vào:
Weight:
Làm phẳng hai chiều đầu:
Đầu ra:
rồi reshape thành . FLOPs:
Nếu :
Đó mới chỉ một phép chiếu linear forward, cho thấy vì sao mô hình lớn phụ thuộc mạnh vào Tensor Core GEMM.
9.2 Ví dụ 2: Đầy đủ chiều multi-head Attention
Từ:
sinh Q/K/V rồi reshape và chuyển vị:
với .
Ma trận điểm:
Áp causal mask và Softmax:
trong đó vị trí tương lai được mask logic thành để xác suất Softmax bằng 0.
Đầu ra:
Gộp head rồi về .
Nếu materialize tường minh kiểu FP16, chỉ nó đã cần:
Khi :
và đó chưa tính xác suất, lượng trung gian backward và các lớp khác. Ý chính của FlashAttention là không ghi ma trận trung gian đầy đủ về HBM, mà hoàn tất Softmax ổn định và cộng dồn theo tile trên chip.
9.3 Ví dụ 3: Vì sao chia
Giả sử độc lập, kỳ vọng 0, phương sai 1:
Mỗi hạng kỳ vọng khoảng 0, phương sai khoảng 1, nên tổng có phương sai khoảng , độ lệch chuẩn khoảng .
Chia đưa phương sai điểm về khoảng 1:
Tránh logits nở quá khi chiều tăng và Softmax rơi vào vùng bão hòa cực đoan.
9.4 Ví dụ 4: Gộp block Online Softmax
Một hàng logits bị cắt thành nhiều block. Phần đã xử lý có max và tổng mũ :
State block mới là . Gộp max:
Đưa về cùng mốc rồi gộp tổng mũ:
Nhờ đó Softmax tính được theo tile, streaming và ổn định số. Nếu đồng thời giữ accumulator Value có trọng số, còn tránh lưu ma trận attention đầy đủ—một lõi toán của FlashAttention.
9.5 Ví dụ 5: Tham số và tính toán của LoRA
Linear layer đầy đủ:
LoRA:
Shape:
x: (..., din)
A^T: (din, r) -> (..., r)
B^T: (r, dout) -> (..., dout)
Adapter online thêm hai GEMM nhỏ; nếu gộp sẵn vào weight nền, suy luận vẫn là một GEMM lớn nhưng mất tiện ích chuyển adapter động với chi phí thấp.
9.6 Ví dụ 6: Vì sao trung bình phân tán phải có trọng số
Hai rank có số mẫu cục bộ , trung bình cục bộ . Trung bình toàn cục không đơn giản là , trừ khi . Giá trị đúng:
Tổng quát hơn, mỗi rank gom sum và count cục bộ trước, AllReduce rồi mới chia. Loss, metric và thống kê throughput phân tán đều cần mẫu số rõ, nhất là batch cuối không đầy hoặc sequence mask khác nhau.
9.7 Ví dụ 7: Ước VRAM
Nếu tensor shape , mỗi phần tử byte, kích thước lưu liên tục:
Ví dụ BF16 :
Đỉnh VRAM lúc huấn luyện còn gồm tham số, gradient, optimizer state, activation đã lưu, workspace tạm, buffer giao tiếp, phân mảnh bộ nhớ và ngữ cảnh framework. Ước một tensor chỉ là điểm khởi đầu.
9.8 Checklist cố định từ công thức tới kernel
Khi gặp toán tử mới, tháo theo thứ tự:
- Shape của đầu vào, đầu ra và lượng trung gian là gì?
- Chiều nào giữ, chiều nào reduce?
- Có tiling được không? State các tile gộp thế nào?
- FLOPs và lượng truy cập bộ nhớ tối thiểu lý thuyết là bao nhiêu?
- Có broadcast, chuyển vị hoặc stride không liên tục không?
- Phép nào nhạy độ chính xác, cần cộng dồn độ chính xác cao?
- Có thể gặp overflow exp, chia 0, cancellation hoặc sai số reduce dài không?
- Tensor trung gian có fuse bỏ được không?
- Shape biên và tail block xử lý thế nào?
- Dùng bản tham chiếu nào, dung sai dtype nào và đầu vào cực đoan nào để kiểm?
Checklist này biến toán trừu tượng thành workflow Infra có thể thực thi.
Tóm tắt
Chương này dựng bốn mạch chính nối với nhau:
- Đại số tuyến tính mô tả tensor biến đổi thế nào: shape quyết định tính hợp lệ, hạng và phân tích quyết định khả năng nén, chia khối quyết định cách tái sử dụng dữ liệu;
- Xác suất mô tả ý nghĩa đầu ra mô hình: logits qua Softmax thành phân phối, cross-entropy tương ứng negative log-likelihood, KL đo chênh lệch phân phối;
- Giải tích mô tả tham số học thế nào: quy tắc chuỗi lan ngược theo computation graph, backward linear layer vẫn gồm GEMM và reduce;
- Tính toán số quyết định công thức trên phần cứng có đáng tin không: độ chính xác hữu hạn sẽ làm tròn, overflow và underflow, nên công thức ổn định và chiến lược mixed precision cũng quan trọng không kém.
Với kỹ sư AI Infra, “hiểu toán” cuối cùng thể hiện ở chỗ: dịch được công thức thành shape, reduce, tiling, chuyển dữ liệu, chọn độ chính xác và tiêu chuẩn kiểm chứng.
Checklist tự kiểm
- Thấy
(B, S, H) @ (H, V)viết ngay được output shape - Phân biệt được nhân từng phần tử, tích vô hướng, nhân ma trận và batched matmul
- Từ shape/stride phán được view chuyển vị có liên tục không
- Giải thích được trực giác của chuẩn, hạng, giá trị riêng và singular value
- Tính được tỉ lệ tiết kiệm tham số của phân tích hạng thấp và LoRA
- Từ nhân ma trận block giải thích được tính đúng của GEMM tiling
- Ước được FLOPs, lượng truy cập tối thiểu và arithmetic intensity của GEMM
- Tính được kỳ vọng, phương sai, hiệp phương sai và xác suất có điều kiện
- Viết được Softmax ổn định và LogSumExp
- Nói được quan hệ giữa cross-entropy, entropy và KL divergence
- Dùng quy tắc chuỗi suy gradient trên computation graph đơn giản
- Viết được shape gradient của linear layer theo đầu vào, weight và bias
- Biết gradient Softmax + cross-entropy theo logits là
p - y - Giải thích được vì sao residual connection cải thiện đường gradient
- Phân biệt được độ chính xác, dải động, overflow và underflow
- Nói được vì sao FP16 thường cần Loss Scaling còn BF16 thường không
- Giải thích được vì sao reduce song song có thể không khớp từng bit
- Từ shape Attention suy được lượng trung gian và chi phí VRAM
Bài tập
- Suy output shape của
(B, Nh, Sq, Dh) @ (B, Nh, Dh, Sk), và đánh dấu chiều batch với chiều reduce. - Cho FP16 GEMM , ước FLOPs và số byte đầu vào/đầu ra tối thiểu lý tưởng.
- Viết chương trình kiểm , và so bản ngây thơ với bản ổn định trên logits lớn.
- Từ Softmax Jacobian và cross-entropy, tự suy .
- Suy shape backward của
Y = GELU(XW + b); không cần bung đạo hàm cụ thể của GELU. - So sai số FP16, BF16 và FP32 khi cộng dãy
[1, 1e-3, 1e-3, ...], và thử đổi thứ tự cộng. - Cài Welford variance, so với
E[x²] - E[x]²trên dữ liệu “trung bình lớn, phương sai nhỏ”. - Với weight , tính tỉ lệ tham số và FLOPs forward thêm của LoRA rank 8, 16, 64.
- Tính kích thước ma trận Attention score FP16 tường minh khi .
- Hai rank xử lý lần lượt 7 và 5 token hợp lệ, trung bình loss cục bộ 2.0 và 3.0; tính trung bình toàn cục đúng, và giải thích vì sao trung bình đơn giản sai.
- Dùng sai phân hữu hạn kiểm backward linear layer nhỏ viết tay; thử các khác nhau và quan sát đường cong sai số.
- Chọn một toán tử PyTorch, viết một trang phân tích theo “shape, reduce, FLOPs, truy cập bộ nhớ, rủi ro số, cách kiểm”.
Tài liệu tham khảo
- Deep Learning Book:Linear Algebra
- Deep Learning Book:Probability and Information Theory
- Deep Learning Book:Numerical Computation
- Matrix Calculus for Deep Learning
- Automatic Differentiation in Machine Learning: a Survey
- LoRA: Low-Rank Adaptation of Large Language Models
- Attention Is All You Need
- FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness
- NVIDIA Mixed Precision Training
- NVIDIA TensorFloat-32
- PyTorch Numerical Accuracy
- PyTorch Broadcasting Semantics