TROISINH
FoundationsSequence & Language Modeling

Self-Attention — Mỗi token tự hỏi 'ai quan trọng với tôi?'

Hiểu bản chất Self-Attention: mỗi token trong câu tự động 'nhìn' tất cả các token khác để tìm ngữ cảnh, thay vì chỉ xử lý tuần tự như RNN.

Self-Attention là lý do tại sao ChatGPT có thể xử lý cả đoạn văn dài trong một lượt, thay vì đọc từng chữ một như con người. Đây là cơ chế cho phép mỗi từ trong câu "nhìn thẳng" vào tất cả các từ khác ngay lập tức, tự quyết định đâu là thông tin quan trọng với mình. Không còn phải chờ đợi tuần tự, không còn quên lãng sau 20 câu — đây là bước ngoặt khiến Transformer thay thế hoàn toàn kiến trúc RNN cũ.

Vấn đề

Trước Transformer, các mô hình ngôn ngữ dùng RNN (Recurrent Neural Network) hoặc LSTM — đọc câu từ trái sang phải, mang theo một "trạng thái ẩn" (hidden state) như cách con người đọc sách. Vấn đề là:

  • Chậm: Không thể tính song song. Muốn biết từ thứ 10, bắt buộc phải tính xong 9 từ trước đó.
  • Hay quên: Trạng thái ẩn giống như trí nhớ ngắn hạn bị nén liên tục. Sau 50 từ, thông tin từ đầu câu bị pha loãng gần như mất hẳn (vanishing gradient).
  • Khó học xa: Để từ cuối câu "nhớ" tới từ đầu câu, gradient phải truyền ngược qua hàng chục bước, khiến việc huấn luyện cực kỳ khó khăn.

Cần một cách để tất cả từ trong câu "nhìn nhau" trực tiếp, bất kể khoảng cách, và làm điều đó song song.

Ý tưởng cốt lõi

Mỗi token đóng vai một người trong phòng họp đang tìm kiếm thông tin.

Hãy tưởng tượng bạn đang đọc câu: "Con mèo ngồi trên thảm vì nó mệt." Khi đến từ "nó", bạn không tự dưng biết "nó" là ai — bạn phải nhìn lại các từ trước để tìm danh từ phù hợp. Self-Attention chính là cơ chế cho phép mỗi token làm điều này một cách toán học: tự hỏi "ai trong câu này liên quan đến tôi?"

Cơ chế hoạt động gồm ba vai trò:

Query (Q) — Câu hỏi: Mỗi token tạo ra một vector câu hỏi đặc trưng: "Tôi cần tìm loại từ gì?" Với "nó", query có thể là "tìm danh từ số ít, động vật."

Key (K) — Nhãn hiệu: Mỗi token cũng tạo ra vector "nhãn hiệu" mô tả bản thân: "mèo" có key là "danh từ, động vật, số ít"; "thảm" có key là "danh từ, vật vô tri."

Value (V) — Giá trị thực: Đây là nội dung thực tế mà token mang lại. Dù "mèo""thảm" đều là danh từ, nhưng value của chúng khác nhau — một mang nghĩa con vật, một mang nghĩa vật dụng.

Thuật toán đơn giản như sau: Token "nó" lấy Query của mình, chấm vô hướng (dot product) với Key của tất cả token khác. Kết quả cho biết độ "tương thích": "mèo" sẽ có điểm cao, "thảm" điểm thấp, "vì" điểm gần zero. Softmax biến các điểm này thành xác suất (tổng bằng 1), rồi lấy trung bình có trọng số của các Value — chủ yếu là Value của "mèo". Kết quả: "nó" giờ đây mang thông tin của "mèo" trong representation của nó.

Đây chính là điểm "Aha": Không có ma thuật gì cả. Chỉ là ba ma trận (Q, K, V) và một phép nhân ma trận cơ bản. Mỗi token tự quyết định mình nên "copy" thông tin từ đâu, thay vì chờ kiến trúc cố định truyền thông tin cho nó.

Phá vỡ hiểu lầm: Nhiều người nghĩ Self-Attention biết vị trí từ (ví dụ từ đầu hay cuối câu). Thực ra, bản thân Self-Attention không biết gì về thứ tự — nó chỉ nhìn nội dung (content-based). Chính Positional Encoding (được thêm vào trước khi vào Attention) mới cung cấp thông tin vị trí. Nếu không có Positional Encoding, Self-Attention sẽ nhìn câu "mèo con chó""chó con mèo" như nhau hoàn toàn.

Tại sao nó hoạt động

Mặc dù ý tưởng trực quan, Self-Attention cần một vài điều chỉnh toán học tinh tế để hoạt động với mô hình lớn:

1. Scaling bằng √d (căn bậc hai của chiều) Khi bạn nhân Q và K (cả hai vector chiều d), kết quả có variance tăng theo d. Nếu d=64, giá trị dot product có thể rất lớn, khiến Softmax rơi vào vùng "bão hòa" — gradient gần như bằng zero, mô hình ngừng học. Chia cho √d giữ các giá trị ở mức ổn định, tương tự cách chuẩn hóa dữ liệu.

2. Công thức tổng quát

Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V
  • QKTQK^T: Tính độ tương đồng giữa mọi cặp token, tạo ra ma trận "attention score" kích thước n×nn \times n (với nn là độ dài câu).
  • Softmax: Biến score thành xác suất, đảm bảo mỗi token phân bổ tổng cộng 100% "sự chú ý" của mình cho các token khác.
  • Nhân V: Trích xuất thông tin thực tế từ các token được chọn.

3. Tính song song hoàn toàn Khác RNN, tất cả các phép tính Q, K, V cho mọi token có thể thực hiện đồng thời. Dù câu dài 10 từ hay 1000 từ, thời gian tính Q, K, V chỉ phụ thuộc kích thước ma trận, không phụ thuộc tuần tự.

# PyTorch pseudo-code minh họa
import torch
import torch.nn as nn

d_model = 512  # Chiều của embedding
d_k = 64       # Chiều của Q, K, V

# Giả sử đã có embedding x (batch_size, seq_len, d_model)
x = torch.randn(1, 10, d_model)  # Câu 10 từ

# Tạo Q, K, V bằng linear projection
W_q = nn.Linear(d_model, d_k)
W_k = nn.Linear(d_model, d_k)
W_v = nn.Linear(d_model, d_k)

Q = W_q(x)  # (1, 10, 64)
K = W_k(x)  # (1, 10, 64)
V = W_v(x)  # (1, 10, 64)

# Attention scores: Q nhân K chuyển vị
scores = torch.matmul(Q, K.transpose(-2, -1)) / (d_k ** 0.5)  # (1, 10, 10)

# Softmax theo chiều cuối (mỗi từ nhìn các từ khác)
attn_weights = torch.softmax(scores, dim=-1)

# Output là weighted sum của V
output = torch.matmul(attn_weights, V)  # (1, 10, 64)

Ý nghĩa thực tế

Self-Attention không chỉ là một lớp neural network — nó là sự thay đổi paradigms từ "xử lý tuần tự" sang "toàn cục song song".

Đặc điểmRNN/LSTMSelf-Attention
Khoảng cáchKhó nhớ xa (>50 tokens)Nhìn trực tiếp mọi khoảng cách
Tốc độ trainingTuần tự, chậmSong song, nhanh (GPU tối ưu)
Độ phức tạpO(n) thời gian, O(1) bộ nhớ mỗi bướcO(n²) tính toán, O(n²) bộ nhớ
Nắm bắt ngữ cảnhYếu dần theo khoảng cáchĐồng đều mọi vị trí

Impact thực tế:

  • GPT, BERT, T5: Tất cả đều dựa trên Self-Attention. Không có nó, không có ChatGPT hay Claude.
  • Dịch máy: Cụm từ "bank" trong "river bank" vs "bank account" được phân biệt nhờ Self-Attention nhìn ngữ cảnh xung quanh.
  • Vision Transformer (ViT): Self-Attention được áp dụng lên ảnh, cho phép mô hình nhìn "từng mảnh" ảnh như từng token.

Giới hạn: Complexity O(n²) là vấn đề với context dài. Với câu 100K tokens, ma trận attention có 10 tỷ phần tử — không vừa GPU. Đây là lý do các kỹ thuật như Flash AttentionKV Cache ra đời để tối ưu (xem Level 1).

Đào sâu hơn

Paper gốc: "Attention Is All You Need" (Vaswani et al., 2017) — Giới thiệu Transformer và Self-Attention, vẫn là paper đọc nhiều nhất trong lịch sử NLP.

Bài viết liên quan TroiSinh:

Cùng cụm (sequence-modeling):

  • Word2Vec & GloVe — Làm sao từ ngữ trở thành vector trước khi vào Attention
  • Multi-Head Attention — Chạy nhiều Self-Attention song song để bắt nhiều loại mối quan hệ khác nhau
  • Transformer Architecture — Xem Self-Attention ngồi trong kiến trúc tổng thể như thế nào
  • Positional Encoding — Bổ sung "địa chỉ" cho Self-Attention vì bản thân nó không biết vị trí

Đọc tiếp (Level 1 — Efficiency):

  • Flash Attention — Giải quyết vấn đề O(n²) memory của Self-Attention bằng cách tính toán trên SRAM thay vì HBM
  • KV Cache — Tối ưu inference bằng cách không tính lại K, V của các token cũ

On this page