Attention, self-attention và Transformer
Nút thắt thought vector, cơ chế chú ý ba khía cạnh, self-attention, encoder hai chiều decoder và vì sao Transformer tỏa sáng.
KhóThuật toán ~60 phút
Ôn lại trước khi học
Giới thiệu
Bài này học nhìn lại chỗ quan trọng khi dịch câu. Dùng để sửa bệnh nhồi cả câu vào 1 vector.
Kiến thức cần nhớ
Nút thắt thought vector
- Định nghĩa: nhồi cả câu dài vào 1 vector duy nhất.
- Câu ngắn còn xoay sở, câu dài mất đầu câu.
- Ví dụ đời thường: như tóm tắt sách vào 1 mẩu giấy.
- Đây là động lực sinh ra attention.
- Muốn dịch dài phải cho nhìn lại nguồn.
Cơ chế chú ý
- Định nghĩa: mỗi từ ra tham khảo lại mọi từ vào.
- Truy vấn là thứ đang cần viết hiện tại.
- Khóa là nhãn từng vị trí nguồn, giá trị là nội dung.
- Ví dụ đời thường: như tra mục lục trước khi chép.
- Trọng số cao rơi đúng chỗ cần tham khảo nhất.
| Thành phần | Vai trò | Ví như |
|---|---|---|
| Truy vấn | Thứ đang cần viết | Câu hỏi hiện tại |
| Khóa | Nhãn vị trí nguồn | Mục lục sách |
| Giá trị | Nội dung mang theo | Trang sách thật |
Self-attention và Transformer
- Định nghĩa: mỗi từ trong cùng câu hỏi lẫn nhau.
- Từ đa nghĩa kéo ngữ cảnh khác nên nghĩa cuối khác.
- Ví dụ đời thường: như chữ "quả" trong táo và bóng.
- Transformer bỏ RNN, chỉ dùng attention nên song song tốt.
- Encoder hiểu 2 chiều, decoder sinh từng từ một.
Ví dụ
- Input: dịch "con mèo đen" -> Output: viết "mèo" thì nhìn vùng "mèo".
- Giải thích: trọng số chú ý dồn đúng chỗ đang dịch.
# Trung bình có trọng số theo chú ý
ngu_canh = sum(w * v for w, v in zip(trong_so, gia_tri))
print(ngu_canh) # ngữ cảnh động
💻 Bài tập
Ngôn ngữ: Python 3 với NumPy cho Bài 1-2, PyTorch cho Bài 3. Nộp vào day-102/.
Bài 1: Scaled dot-product attention
def softmax(x, axis=-1): ... # trừ max để ổn định số
def attention(Q, K, V, mask=None):
"""Q: (n_q, d_k), K: (n_k, d_k), V: (n_k, d_v).
Trả (output: (n_q, d_v), weights: (n_q, n_k)). weights = softmax(Q K^T / sqrt(d_k)).
mask: True ở vị trí cấm, gán -inf trước softmax."""
Mỗi hàng weights tổng bằng 1
Q trùng hẳn 1 hàng của K, d_k lớn -> weight hàng đó gần 1
Causal mask 4x4 -> weights là tam giác dưới
So với torch.nn.functional.scaled_dot_product_attention.
Bài 2: Multi-head self-attention và positional encoding
- Cài
MultiHeadSelfAttention(d_model, n_heads): chiếuXthành Q, K, V, táchn_headsđầu, attention từng đầu, ghép và chiếu ra. - Cài sinusoidal positional encoding. Vẽ heatmap
PEcho 50 vị trí, 64 chiều. - Chứng minh self-attention không có positional encoding thì hoán vị input chỉ hoán vị output tương ứng (tương biến hoán vị).
Bài 3: Transformer nhỏ đảo chuỗi (nâng cao)
Bài toán: input là chuỗi 10 chữ số, output là chuỗi đảo ngược.
- Dựng
nn.Transformernhỏ (2 lớp encoder, 2 lớp decoder,d_model = 64). - Huấn luyện tới accuracy từng token trên 99%.
- Vẽ heatmap cross-attention của decoder cho 1 ví dụ. Chỉ ra đường chéo ngược: vị trí ra
inhìn vào vị trí vào9 - i. - So thời gian 1 epoch với seq2seq LSTM cùng số tham số.
✅ Tiêu chí hoàn thành
-
attentionkhớp PyTorch sai số1e-6, mask đúng. - Có heatmap positional encoding và chứng minh tương biến hoán vị.
- Transformer đảo chuỗi đạt 99%, có heatmap attention.
- Giải thích được vai trò Q, K, V bằng ví dụ dịch câu.
❓ Câu hỏi ôn tập
- Nút thắt thought vector là gì?
- 3 thành phần chú ý là gì?
- Self-attention khác attention sao?
- Vì sao Transformer song song tốt?
🌕 Bạn đã hoàn thành ngày 102. Làm hết bài tập phía trên rồi sang ngày tiếp theo.