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ầnVai tròVí như
Truy vấnThứ đang cần viếtCâu hỏi hiện tại
KhóaNhãn vị trí nguồnMục lục sách
Giá trịNội dung mang theoTrang 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

  1. Cài MultiHeadSelfAttention(d_model, n_heads): chiếu X thành Q, K, V, tách n_heads đầu, attention từng đầu, ghép và chiếu ra.
  2. Cài sinusoidal positional encoding. Vẽ heatmap PE cho 50 vị trí, 64 chiều.
  3. 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.

  1. Dựng nn.Transformer nhỏ (2 lớp encoder, 2 lớp decoder, d_model = 64).
  2. Huấn luyện tới accuracy từng token trên 99%.
  3. Vẽ heatmap cross-attention của decoder cho 1 ví dụ. Chỉ ra đường chéo ngược: vị trí ra i nhìn vào vị trí vào 9 - i.
  4. So thời gian 1 epoch với seq2seq LSTM cùng số tham số.

✅ Tiêu chí hoàn thành

  • attention khớ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.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.