Toán cho AI nhúng, bắt đầu từ số 0
Loạt bảy bài dạy đủ phần toán để hiểu một model ngôn ngữ chạy trên chip nhúng.
Yêu cầu đầu vào: cộng, trừ, nhân, chia, số âm, bình phương, căn bậc hai. Đúng chừng đó. Hết lớp 9 là đủ vốn. Mọi thứ khác, kể cả đạo hàm, được xây từ đầu trong bài.
Không cần biết Python. Không cần biết C, dù ai biết C sẽ thấy quen vì mọi công thức đều được viết lại thành vòng for.
Vì sao học theo hướng này
Học toán để thi thì đi từ định nghĩa tới định lý tới bài tập. Loạt bài này đi ngược: bắt đầu bằng một hiện tượng có thật trong model đã train, hỏi vì sao, rồi mới dựng khái niệm và công thức để trả lời.
Mỗi phép toán đi qua năm chặng:
công thức toán -> ví dụ số nhỏ tính tay -> vòng for trong C
-> phần cứng làm nó thế nào -> chỗ nó nằm trong model thật
Chặng cuối là lý do loạt bài này khác sách giáo khoa. Tích vô hướng không dừng ở Σ aᵢbᵢ, nó đi tiếp tới lệnh MAC của DSP và tới attention.
Bảy bài
| Bài | Nội dung | Ra tới đâu |
|---|---|---|
| 1. Vector và tích vô hướng | vector, cộng trừ, tích vô hướng, độ dài, chuẩn hoá, khoảng cách, cosine | lệnh MAC, bộ lọc FIR |
| 2. Ma trận | shape, chuyển vị, MATVEC, MATMUL, đếm phép tính | GEMM, vì sao xử lý theo lô nhanh hơn |
| 3. Rút gọn và softmax | phép từng phần tử, rút gọn, RMSNorm, hàm kích hoạt, exp, log, softmax | tràn số và cách sửa |
| 4. Attention | Linear, Q K V, QKᵀ, che tương lai, nhiều head | vì sao câu dài đắt |
| 5. Đạo hàm và cách model học | đạo hàm, đạo hàm riêng, gradient, quy tắc dây chuyền, gradient descent, loss | vì sao train tốn RAM hơn chạy |
| 6. Lượng tử hoá | scale, int4, sai số, đóng gói nibble | nhân cộng số nguyên trên chip nhúng |
| 7. FLOPs và băng thông | FLOPs, cường độ số học, băng thông | memory-bound hay compute-bound |
Đọc theo thứ tự. Bài sau dùng lại bài trước, và bài 4 dùng lại cả ba bài đầu.
Hình vẽ cũng sinh từ số thật
Mỗi bài có một hình hình học, đặt ngay sau phần cơ chế mà nó minh hoạ:
| Bài | Hình | Việc nó giải thích trong LLM |
|---|---|---|
| 1 | góc và độ dài của hai cặp từ | vì sao đo nghĩa bằng cosine chứ không bằng tích vô hướng thô |
| 2 | chiếu vector lên một hướng | mỗi hàng của ma trận đo phần của x nằm dọc theo hướng của hàng đó |
| 3 | ba vector về đường tròn đơn vị | RMSNorm bỏ độ lớn, giữ hướng |
| 4 | điểm trung bình có trọng số | attention chọn chỗ đứng giữa các vector Value |
| 5 | tiếp tuyến trên parabol loss | đạo hàm là độ dốc, và bước đi tỉ lệ với độ dốc |
| 6 | trục số 15 vạch của int4 | sai số là đoạn tới vạch gần nhất |
| 7 | roofline với ba bậc đo thật | vì sao bậc đọc ít byte hơn lại chạy chậm hơn |
Toạ độ trong hình được tính từ công thức, không đặt tay. Hình bài 1 lấy độ dài và góc thẳng từ checkpoint, nên nó vẽ đúng tỉ lệ của model thật. Hình bài 7 lấy ba điểm từ kết quả make -C samples/cpu run.
Vẽ lại:
uv run python docs/toan/img/gen_hinh.py docs/toan/img # tiếng Việt
uv run python docs/toan/img/gen_hinh.py docs/toan/img en # tiếng Anh
Hình tự đổi màu theo giao diện sáng hoặc tối của trình duyệt.
Mọi con số trong bài đều đo được lại
Không có con số nào chép từ sách. Embedding lấy từ checkpoint đã train trong repo, sai số lượng tử hoá tính trên weight thật, tốc độ đo trên MacBook Pro M3.
Kiểm toàn bộ bằng một lệnh:
uv run python docs/toan/tools/so_that.py
Script chạy lại từng ví dụ, so với con số đang in trong bài, và thoát mã 1 nếu có một chỗ lệch. Nó đã bắt được ba chỗ sai trong lúc viết loạt bài này.
Xem số của riêng một bài:
uv run python docs/toan/tools/so_that.py --giai-doan 4
Số phần cứng ở bài 7 đo bằng:
make -C samples/cpu run
Máy khác sẽ ra số khác. Đó là điều nên xảy ra, và bài 7 dạy cách đọc số của chính máy bạn chứ không phải cách nhớ số của máy tôi.
Khi nào coi là đã hiểu
Đánh dấu được hết những dòng dưới đây thì phần toán coi như xong.
Bài 1 và 2:
- Giải thích vector bằng một mảng C
- Tính tích vô hướng bằng tay
- Viết tích vô hướng bằng C mà không nhìn lại bài
- Phân biệt nhân từng phần tử với tích vô hướng
- Giải thích norm và chuẩn hoá
- Tính cosine, và nói được vì sao không dùng tích vô hướng thô để so giống nhau
- Đọc được shape, biết khi nào hai ma trận nhân được
- Tính tay ma trận nhân vector và ma trận nhân ma trận
- Giải thích vì sao nhân ma trận là nhiều tích vô hướng
Bài 3 và 4:
- Phân biệt phép từng phần tử với phép rút gọn
- Tự viết RMSNorm, và nói được vì sao cần hai vòng lặp
- Giải thích vai trò hàm kích hoạt
- Tính softmax bằng tay
- Giải thích mẹo trừ max, và vì sao kết quả không đổi
- Giải thích Q, K, V
- Lần được
QKᵀbằng shape - Nói được vì sao che tương lai dùng âm vô cùng
Bài 5:
- Giải thích đạo hàm và ý nghĩa dấu của nó
- Giải thích đạo hàm riêng và gradient
- Áp dụng quy tắc dây chuyền cho hai tầng
- Làm tay một bước gradient descent, kiểm loss có giảm không
- Giải thích cross entropy phạt gì
- Nói được backpropagation khác gì với việc tính đạo hàm thông thường
Bài 6 và 7:
- Tính scale và lượng tử hoá một nhóm nhỏ bằng tay
- Giải thích vì sao sai số không vượt nửa vạch
- Đếm byte của một hàng ở int4 kèm scale
- Tính FLOPs của một MATVEC
- Tính cường độ số học
- Phân biệt memory-bound với compute-bound, và nói được cách kiểm
- Nhìn một vòng
fortrong C và nhận ra phép toán AI phía sau
Phần cố ý không dạy
Ở giai đoạn này chưa cần tích phân, phương trình vi phân, giải tích phức, biến đổi Laplace, đại số trừu tượng, hay xác suất thống kê nâng cao.
Một nhầm lẫn đáng nói riêng, vì hai thứ trông giống nhau:
tích vô hướng: Σ aᵢbᵢ cộng dồn rời rạc
tích phân: ∫ f(x)g(x) dx cộng dồn liên tục
Chúng chung ý tưởng cộng dồn, nhưng model chạy trên số rời rạc trong mảng, nên thứ cần nắm là vế trái.
Liên quan
Loạt bài này lo phần toán. Phần kiến trúc model, huấn luyện và triển khai nằm ở docs/begin_0/, bắt đầu từ chương 1 về vector rồi đi tới Transformer, KV cache và runtime trên ESP32, Jetson và DSP.