G4.2 一層 attention,怎麼接成 Transformer?
本篇重用1 篇
一次詢問,夠不夠?
上一篇證明了一層 attention 能依內容讀取資訊,同時跟著名單重排。但它只產生一份加權摘要。回到旅行群組:安排一趟行程時,我們可能同時想知道交通、吃飯與時間,混成一份平均未必足夠。
一個自然的做法是讓幾組不同的問題各自讀一次,再把得到的內容接起來。這就是 Vaswani 等人 [1] 使用的 multi-head attention。
不同 head,用不同的比較方式
第 個 head 有自己的 :
它們在相同的點上產生不同 features,沿 feature 維度接起來,再做共享 projection:
各 head 重排後都是 ;concatenation 沒有混動 rows, 也只作用在 feature 維度。因此 。
多份摘要是我們為了表示不同互動而加入的選擇,排列要求沒有規定 head 數量。各 head 也沒有被指定成「交通 head」或「餐廳 head」;這只是生活例子的對應,不是訓練保證。
讀完資訊,還要處理它
Attention 處理點與點之間的互動。讀完後,每個點還要把這些資訊轉成自己的新 feature。我們先選逐點處理:如果同一份 feature 換到另一列,處理規則不能因此改變,所以各 row 使用同一個函數。
選 MLP 來實現這個函數,就可以寫成:
這是 position-wise feed-forward network:position-wise 指各 row 分別計算,不是每個 row 有不同參數。重排不改 的規則,所以 。
接成 block,對稱還在嗎?
如果想保留原 feature,再加入新讀到的資訊,可以用 residual 相加。兩份 feature 必須有相同的維度與 action,才能沿用 G1.3 的相加規則。
若再選 normalization 調整 feature 的尺度,也不能讓它依列號使用不同算法。這裡用 LayerNorm:在同一 row 的 channels 中算平均與 variance,各 row 共用 affine parameters。因此 。
Symmetry 並沒有要求一定使用 residual 或 LayerNorm;我們選了這些操作,再檢查它們是否保留相同 action。採用 Vaswani 等人 [1] 的 post-norm 寫法,先忽略 dropout,block 就是
先檢查第一段:
同樣代入第二段,就得到 。這是 G1.3 的 layer composition:每個操作遵守同一個 action,疊起來也遵守。
Attention 負責讀其他點,FFN 負責處理每個點讀到的內容;residual 與 normalization 把這兩種操作接成可堆疊的 Transformer block。 這裡先建立 encoder 的核心,不假設任務一定是文字生成。
補充Training 時的 dropout 要怎麼比較?
兩次 forward 若各自抽不同的 dropout mask,逐次輸出通常不會精確對齊。驗證 deterministic identity 時應用 eval mode;若要比較有 dropout 的兩次運算,須讓隨機 mask 也一起重排。獨立抽樣的 dropout 可以保留分布層級的 symmetry,但不是每次 realization 都相等。
課堂提問
把 FFN 改成「第一列用一組參數、第二列用另一組」,前面的證明還能用嗎?
先想一想,再展開看整理後的答案
不能。原證明使用各 row 相同的規則;同一個點換到另一列就換了模型,一般不再有 。
動手看一次
先比較一層 attention 的重排;完整 block 的程式測試在 G4.5。每加一個操作,都用相同的 output action 檢查,不把一層的保證直接當成整個模型的保證。