跳轉到

7.2 Self-Attention from Scratch

範例程式:Open In Colab

Self-attention 是 Transformer 的核心。本篇不用大型模型,而是用 TensorFlow 手刻 scaled dot-product attention,讓讀者看清楚 Q、K、V projection、attention weights 與輸出向量如何被算出來。

1. 學習目標

本篇聚焦 self-attention 到底在算什麼。Keras 已經有 MultiHeadAttention,但如果沒有先看過基本矩陣計算,很容易只把它當黑盒。手刻一版可以幫助理解資料 shape 與注意力權重。

2. Self-Attention 和 Attention 的差異

一般 attention 可以讓 Query 來自一個序列、Key/Value 來自另一個序列。Self-attention 則是 Query、Key、Value 都來自同一個序列,只是經過不同線性投影。也就是模型讓序列中的每個位置彼此參考。

3. 實作流程

Notebook 會:

  1. 建立一批 token embeddings。
  2. 用 Dense layer 產生 Q、K、V。
  3. 手刻 scaled_dot_product_attention()
  4. 視覺化 attention weights。
  5. 和 Keras MultiHeadAttention 的輸出 shape 對照。

4. Mask 的用途

在某些任務中,不是所有位置都可以被看見。例如 padding token 不應該被注意;語言模型預測下一個字時,也不應該偷看未來 token。這時就需要 attention mask。

5. 如何套用到自己的模型?

正式建模時通常直接使用 tf.keras.layers.MultiHeadAttention,並注意三件事:輸入 shape 必須是 (batch, sequence_length, embedding_dim);若有 padding 要提供 mask;多頭數與 embedding 維度要合理搭配。

6. 小結

Self-attention 的核心是讓序列內部位置互相參考。手刻一版後,再使用 Keras 的 MultiHeadAttention 會更容易理解輸入、輸出與權重的意義。