W3 · Training / inference workflow
Mạng truyền thẳng và cổng kích hoạt sau attention
Khối mạng truyền thẳng (FFN, thường dạng SwiGLU) biến đổi riêng từng vị trí token sau attention: mở rộng chiều, lọc bằng cổng phi tuyến rồi thu về chiều cũ.
1Định nghĩa
Khối mạng truyền thẳng (feed-forward network, FFN, hay MLP) nằm ngay sau Self-Attention trong mỗi lớp Transformer và biến đổi sâu vector đặc trưng của từng vị trí token một cách độc lập. Nếu attention là nơi các vị trí trao đổi thông tin với nhau, thì MLP là nơi mỗi vị trí tự xử lý những gì vừa thu được.
Ở hầu hết mô hình hiện đại dùng cấu trúc SwiGLU, MLP chiếu vector từ chiều d lên chiều trung gian m qua hai nhánh song song: một nhánh đi qua hàm phi tuyến SiLU làm cổng rồi nhân từng phần tử với nhánh còn lại, sau đó chiếu ngược về chiều d và cộng vào đường residual. Trong kiến trúc MoE, chính khối MLP đơn lẻ này được thay bằng một dàn nhiều chuyên gia MLP song song và một bộ chọn.
Ví dụ đời thường: Nếu bước attention giống buổi thảo luận nhóm nơi các thành viên trao đổi thông tin với nhau, thì MLP giống lúc mỗi thành viên quay về bàn riêng để suy ngẫm: mở rộng ghi chú thành nhiều ý (chiều m), dùng một bộ lọc để giữ ý đáng giữ (cổng), rồi đúc kết lại thành bản tóm tắt gọn bằng độ dài ban đầu trước khi vào vòng thảo luận ở lớp tiếp theo.
2Luồng
Đây là ô 2B. Mũi tên vào và ra đều mang bảng (T × d); bên trong ô, chiều tạm thời nở từ d lên m rồi thu lại. Mỗi hàng đi qua ô độc lập với các hàng khác, khác với attention ở ô 2A.
- Vector sau attention và norm
Mỗi hàng của X là vector d của một vị trí.
- Hai phép chiếu lên chiều m
Nhánh cổng (gate) và nhánh nội dung (up) cùng nhận X, mỗi nhánh một ma trận.
- Cổng nhân nội dung
SiLU lên nhánh gate, rồi nhân từng phần tử với nhánh up.
- Thu về chiều d và cộng residual
Ma trận down chiếu từ m về d; kết quả được cộng vào đường residual, hoặc gộp kết quả của các expert trong MoE.
Mã Mermaid
flowchart TD
step1["Vector sau attention và norm"]
step2["Hai phép chiếu lên chiều m"]
step3["Cổng nhân nội dung"]
step4["Thu về chiều d và cộng residual"]
step1 --> step2
step2 --> step3
step3 --> step4 3Giải pháp
Vị trí trên sơ đồ: ô 2B "MLP/FFN" trong cột 2 · Forward qua Transformer, ngay sau ô 2A (attention). Nó nhận bảng (T × d) sau attention, chuẩn hóa và residual, và trả bảng cùng shape để cộng vào đường residual.
Vấn đề cần giải. Attention chủ yếu lấy trung bình có trọng số của các Value, tức là trộn thông tin giữa các vị trí. Mô hình còn cần biến đổi phi tuyến vector của từng vị trí để tạo đặc trưng mới; nếu chỉ chồng nhiều phép nhân ma trận liên tiếp mà không có phi tuyến thì chúng gộp lại thành một phép nhân ma trận duy nhất.
Khái niệm tối thiểu. Phép chiếu là nhân vector với một ma trận. Hàm kích hoạt (activation function) là hàm phi tuyến áp lên từng số. SiLU(z) = z nhân sigmoid(z) với sigmoid(z) = 1 / (1 + e^(−z)). Cổng (gate) là nhánh dùng để 'mở' hay 'đóng' từng chiều của nhánh còn lại. Trục: X có T hàng (vị trí) và d cột; mọi hàng dùng chung các ma trận trọng số.
Từng thao tác và lý do. (1) gate = X nhân W_gate và up = X nhân W_up, mỗi ma trận d × m: tạo hai bản chiếu lên chiều rộng hơn. (2) a = SiLU(gate): lớp phi tuyến, giá trị rất âm gần như bị chặn lại. (3) hidden = a ⊙ up: gate điều tiết chiều nào của nội dung được đi qua. (4) out = hidden nhân W_down với W_down kích thước m × d: thu về chiều d để cộng được vào residual.
Ví dụ có số (minh họa, tính tay, d = 2, m = 2). Vector một vị trí x = [1, 2]. W_gate = [[1, 0], [0, 0,5]] cho gate = [1, 1]. W_up = [[0,5, 1], [1, 0]] cho up = [0,5 + 2; 1 + 0] = [2,5; 1]. SiLU(1) = 1 × sigmoid(1) = 0,7311 nên a = [0,7311; 0,7311]. hidden = a ⊙ up = [1,8276; 0,7311]. W_down = [[1, −1], [0,5, 0,5]] cho out = [1,8276 + 0,3655; −1,8276 + 0,3655] = [2,1932; −1,4621].
Cách đọc. Đầu ra out có cùng độ dài 2 với x, nên cộng được vào đường residual. Hidden = [1,83; 0,73] cho thấy cổng không đóng hẳn chiều nào mà chỉ co hai chiều với cùng hệ số 0,73 vì hai giá trị gate bằng nhau. Mỗi vị trí được xử lý độc lập: đổi token ở vị trí khác không đổi đầu ra MLP của vị trí này (nhưng nó vẫn đổi đầu vào của MLP, vì attention đã trộn thông tin trước đó). Không thể kết luận 'chiều thứ hai của hidden lưu kiến thức X' từ ví dụ này; ví dụ chỉ chứng minh phép tính.
Biến thể và thực thi. Trong MoE, mỗi token được gửi tới một số expert được chọn, và việc gửi nhận đó (dispatch) cũng tốn thời gian; một kernel nhanh nhưng dispatch chậm vẫn không cải thiện cả bước. Với mô hình dense thì mọi token dùng cùng mạng. Tối ưu thường là ghép phép nhân ma trận, ghép activation để giảm đọc ghi bộ nhớ (xem kernel), nhưng checkpoint xác định phép tính phải thực hiện: không đổi activation hay cấu trúc expert chỉ vì một kernel nhanh hơn.
Để chạy khối này trên dữ liệu thật của một forward, mở giai đoạn 3 · Forward (khối MLP) của Bài Lab tổng hợp. Hãy dự đoán shape của gate, up và hidden từ T, d, m rồi đối chiếu.
4Profiling
- Chi phí từng phép chiếu
Kiểm tra tính đúng trước: tích gate nhân up phải khớp hidden của cài đặt tham chiếu. Sau đó tách riêng thời gian của hai phép chiếu lên m, của activation và của phép chiếu xuống d ở shape đại diện, giữ nguyên kiểu số và phần cứng khi so sánh. MLP thường chiếm phần lớn phép tính của lớp, nhưng hãy đo thay vì giả định.
- Sai số và bộ nhớ
So đầu ra và gradient với cài đặt tham chiếu; sai số tăng sau khi ghép kernel (fusion) là dấu hiệu cần xem xét. Theo dõi thêm bộ nhớ và hiện tượng tràn thanh ghi khi ghép nhiều phép vào một kernel; fusion giảm đọc ghi nhưng không phải lúc nào cũng nhanh hơn.
- Với expert
Đo riêng thời gian chọn expert, gửi token đi, tính và gom lại. Phân bố token giữa các expert không đều làm một số expert chờ lâu. Kết luận 'kernel nhanh' chỉ có giá trị khi thời gian cả bước (step) cũng giả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ụ
Dense SwiGLU
Hai phép chiếu đầu chạy trên từng token để tạo gate và up, SiLU và phép nhân từng phần tử gộp hai nhánh, và một phép chiếu cuối đưa vector về chiều model. Tự kiểm tra: với d = 2, m = 2, mỗi lớp MLP của ví dụ trên có bao nhiêu tham số? Đáp án: ba ma trận 2 × 2 nên 3 × 4 = 12 (3dm với d = m = 2 là 12).
Mạng expert
Mỗi token tới các expert được chọn. Dự đoán: nếu một expert nhận 60% số token của batch thì điều gì xảy ra với thời gian cả bước? Đáp án: expert đó là điểm nghẽn, các expert còn lại chờ; cần đo phân bố token theo expert thay vì chỉ đo thời gian kernel của một expert.
Tự kiểm tra: hai vị trí khác nhau
Cho hai vị trí có cùng vector x = [1, 2] sau attention. MLP có cho cùng đầu ra không? Có, vì mọi vị trí dùng chung trọng số và MLP không nhìn vị trí khác; sự khác nhau giữa chúng chỉ xuất hiện nếu vector đầu vào khác nhau, mà vector đó do attention và embedding quyết định.
6Thuật ngữ
- Multi-Layer Perceptron (MLP) / FFN
- Mạng truyền thẳng gồm các phép nhân ma trận xen hàm phi tuyến, áp dụng độc lập lên vector của từng vị trí.
- Sigmoid Linear Unit (SiLU)
- Hàm kích hoạt silu(z) = z nhân sigmoid(z): gần 0 khi z rất âm, gần z khi z rất dương.
- SwiGLU và cổng (gate)
- Hai nhánh song song: nhánh cổng qua SiLU nhân từng phần tử với nhánh nội dung (up). Cổng quyết định mỗi chiều được cho đi qua bao nhiêu.
- Chiều trung gian m
- Chiều rộng của lớp ẩn, thường lớn hơn chiều d của vector token để mô hình có không gian biến đổi rộng hơn.
- Phép nhân từng phần tử
- Hai vector cùng độ dài nhân từng cặp số tương ứng, ký hiệu ⊙.
Glossary (6)
- Vector
- Danh sách d số biểu diễn một token ở một vị trí.
- Activation
- Giá trị trung gian tạo ra trong forward; ở bài này là các vector gate, up và hidden.
- Tensor shape
- Kích thước các chiều; MLP biến (T, d) thành (T, m) rồi lại (T, d).
- Kernel
- Hàm tính toán chạy trên GPU; nhiều phép của MLP có thể gộp thành ít kernel hơn.
- Forward pass
- Lượt tính từ đầu vào đến đầu ra; MLP là một khâu trong mỗi lớp.
- Context
- Các token đứng trước một vị trí; MLP không đọc context, chỉ đọc vector của chính vị trí đó.
