解鎖Transformer核心!手把手帶你看懂自注意力機制:三個輸入一步步算到底
很多課程都會通過公式來說明Transformer,但是沒有給你算過數(shù),也沒讓你明白一件更重要的事:
“自注意力給出來的輸出,實際上表示了什么?”
本文就想用一個質化、好懂、可實際運算的例子,帶你真正看懂 Self-Attention 是怎么工作的,并解釋它的輸出真正意義!
1. 讓我們再來回顧下什么是“注意力機制”?
你看一段文字時,總會下意識的想:我要看哪些詞?哪些字是我目前理解這句話的關鍵?
注意力機制就是這樣一種方法,它允許模型根據(jù)“當前信息”,自動地從全文里找到最關鍵的部分來作為參考,并給他們分配權重。
不是每個詞均分重,而是“重要的看一眼,不重要的算個數(shù)”。
但是“自注意力”比較特殊:
每個輸入,都在想“我該看誰?” 每個輸出,都是它看完周圍后,自己新生出的表示
2.自注意機制是怎么計算的?
我們用 3 個 2D 向量(比如詞嵌入)作為輸入序列:
x? = [1, 0] # 可能是詞“我”
x? = [0, 1] # 可能是詞“愛”
x? = [1, 1] # 可能是詞“你”
把它組成矩陣
X = [[1, 0],
[0, 1],
[1, 1]]
我們手動設定 Q、K、V 的權重矩陣:
W_Q = [[1, 0],
[1, 1]]
W_K = [[1, 2],
[0, 1]]
W_V = [[2, 0],
[0, 1]]
接下來計算QKT:
Q = X · W_Q
K = X · W_K
V = X · W_V
比如計算Q
Q =
[[1, 0], => [1*1 + 0*1, 1*0 + 0*1] = [1, 0]
[0, 1], [0*1 + 1*1, 0*0 + 1*1] = [1, 1]
[1, 1]] [1*1 + 1*1, 1*0 + 1*1] = [2, 1]
由此可得K和V:
K = [[1, 2], V = [[2, 0],
[0, 1], [0, 1],
[1, 3]] [2, 1]]
接下來計算計算 Attention Score(Q·K?)
計算 Q·K?(點積)再除以 √2(d=2):
我們用 Q? 和所有 K 做 dot product,Q? 和所有 K 做 dot product,依此類推:
縮放除以 √2 ≈ 1.414:
S_scaled ≈ [[0.71, 0, 0.71],
[2.12, 0.71, 2.83],
[2.83, 0.71, 3.54]]
計算每一行的 softmax:
softmax([0.71, 0, 0.71]) = [0.401, 0.198, 0.401]
softmax([2.12, 0.71, 2.83]) ≈ [0.289, 0.075, 0.636]
softmax([2.83, 0.71, 3.54]) ≈ [0.288, 0.057, 0.655]
Attention Weight × V:
output? = 0.401*[2,0] + 0.198*[0,1] + 0.401*[2,1]
= [0.802 + 0.802, 0 + 0.198 + 0.401] = [1.604, 0.599]
output? = 0.289*[2,0] + 0.075*[0,1] + 0.636*[2,1]
= [0.578 + 1.272, 0.075 + 0.636] = [1.85, 0.711]
output? = 0.288*[2,0] + 0.057*[0,1] + 0.655*[2,1]
= [0.576 + 1.31, 0.057 + 0.655] = [1.886, 0.712]
我們可以得到最后的輸出:
Output =
[[1.604, 0.599],
[1.85, 0.711],
[1.886, 0.712]]
3. 輸出到底表示啥?(熱點論壇)
它已經(jīng)不僅僅是原始的詞向量了,而是:
1. 考慮了當前詞的內容(通過 Query)
2. 也考慮了它和所有其他詞的關系(通過與 Key 的點積)
3. 最后通過注意力權重,把相關的詞信息從 Value 中“加權融合”了進來
比如:
第一個詞“我”,原來是 [1, 0],輸出是 [1.604, 0.599]
它在融合了“愛”“你”的信息后,變成了一個更富語義的表示
總結一句話:自注意力輸出 = 原詞向量 + 上下文理解 = 更聰明的表示!
這就是為什么 Transformer 模型可以強大到理解復雜語義、做翻譯、對話、生成等任務。
本文轉載自??人工智能訓練營??,作者:人工智能訓練營
