Chuyển đến nội dung chính

第8課:注意力機制-NLP的轉折點

直覺:為什麼我們需要注意力? Bahdanau 注意力 vs Luong 注意力。自我關注。縮放點積注意力。多頭關注。可視化注意力權重。備受關注的 Seq2Seq 誕生了 Transformer 平台。

🧠 人工智慧與機器學習 — 第 7 課 第 8 課:注意力機制-轉折點 自然語言處理

NLP 從基礎到進階:掌握自然語言處理

第 3 部分:NLP 深度學習 — RNN、LSTM 到 Transformer

亞洲開發網

簡介

“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、VQuery在Keys中搜索,取得對應的Values
縮放除以$\sqrt{d_k}$以穩定梯度
多頭許多平行的「視角」
自我關注每個令牌都關注所有其他令牌

下一篇文章

第 9 課:Transformer —「注意力就是您所需要的」 — 結合自註意力、位置編碼、層規範的完整架構 — 每個現代法學碩士的基礎。