簡介
“Seq2Seq 的瓶頸:將整個句子壓縮為單一固定大小的向量。”
注意力機制允許模型在生成輸出時查看所有輸入標記 - 無需將所有資訊壓縮到單個向量中。這是 Transformer 的直接基礎。
1.沒有Attention的Seq2Seq問題
Encoder: "I love natural language processing"
│
▼
[context vector] ← Toàn bộ câu nén vào 1 vector!
│
▼
Decoder: "Tôi yêu xử lý ngôn ngữ tự nhiên"
句子越長→訊息損失越大。
2.注意力-核心思想
解碼器不只是使用最終的上下文向量,而是回顧編碼器的隱藏狀態:
$$\text{注意力}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
其中:
- Q(查詢):「我在尋找什麼?」— 隱藏解碼器的當前狀態
- K(鍵): “每個輸入中有什麼?” — 編碼器的隱藏狀態
- V (Value):「真實訊息」-與基本注意力中的 K 相同
縮放點積注意力
import torch
import torch.nn.functional as F
import math
def scaled_dot_product_attention(Q, K, V, mask=None):
"""
Q: (batch, seq_q, d_k)
K: (batch, seq_k, d_k)
V: (batch, seq_k, d_v)
"""
d_k = Q.size(-1)
# 1. Tính attention scores
scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k)
# scores: (batch, seq_q, seq_k)
# 2. Mask (optional)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9)
# 3. Softmax → attention weights
weights = F.softmax(scores, dim=-1)
# 4. Weighted sum of Values
output = torch.matmul(weights, V)
return output, weights
3. 多頭注意力
使用**多個「頭」**而不是 1 個注意力-每個頭學習不同類型的關係:
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
super().__init__()
assert d_model % num_heads == 0
self.d_k = d_model // num_heads
self.num_heads = num_heads
self.W_q = nn.Linear(d_model, d_model)
self.W_k = nn.Linear(d_model, d_model)
self.W_v = nn.Linear(d_model, d_model)
self.W_o = nn.Linear(d_model, d_model)
def forward(self, Q, K, V, mask=None):
batch_size = Q.size(0)
# Linear projections rồi split thành heads
Q = self.W_q(Q).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
K = self.W_k(K).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
V = self.W_v(V).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
# Attention cho từng head
out, weights = scaled_dot_product_attention(Q, K, V, mask)
# Concat heads
out = out.transpose(1, 2).contiguous().view(batch_size, -1, self.num_heads * self.d_k)
return self.W_o(out)
4. 自註意力
當Q、K、V都來自相同的序列時 → 自我注意。每個標記「看到」句子中的所有其他標記。
Input: "The cat sat on the mat"
Self-attention cho từ "sat":
→ "The": 0.05 (ít liên quan)
→ "cat": 0.45 (chủ ngữ, rất liên quan!)
→ "sat": 0.20 (chính nó)
→ "on": 0.15
→ "the": 0.05
→ "mat": 0.10
5. 比較注意力類型
| 類型 | 問 | K、V | 使用 |
|---|---|---|---|
| 巴達瑙 | 解碼器隱藏 | 編碼器隱藏 | Seq2Seq 翻譯 |
| 薪資 | 解碼器隱藏 | 編碼器隱藏 | Seq2Seq(更簡單) |
| 自我關注 | 相同的順序 | 相同的順序 | 變壓器編碼器 |
| 交叉注意力 | 解碼器 | 編碼器 | 變壓器解碼器 |
| 因果自註意力 | 相同+掩蓋未來 | 類似 | GPT(自回歸) |
總結
| 概念 | 意義 |
|---|---|
| 注意 | 允許模型「回顧」所有輸入 |
| Q、K、V | Query在Keys中搜索,取得對應的Values |
| 縮放 | 除以$\sqrt{d_k}$以穩定梯度 |
| 多頭 | 許多平行的「視角」 |
| 自我關注 | 每個令牌都關注所有其他令牌 |
下一篇文章
第 9 課:Transformer —「注意力就是您所需要的」 — 結合自註意力、位置編碼、層規範的完整架構 — 每個現代法學碩士的基礎。