於是誕生了 Transformer:其 Encoder 使用 Self-Attention 而非 RNN(論文 Attention Is All You Need, 2017)。
“
圖 4-1 Transformer 整體架構(左 Encoder、右 Decoder,各堆疊 N 層;底部為 Input/Output Embedding + Positional Encoding)。來源:Vaswani et al., Attention Is All You Need, NeurIPS 2017, Figure 1。
這是我在墨爾本大學上 COMP90042 NLP 時的筆記,這篇整理課程中神經網路與詞表示的內容:從 FFNN、RNN、LSTM 到 Transformer,再到計數式詞向量、Word2Vec 和評估方法。
1. 前饋神經網路 FFNN
1.1 深度學習基礎
Feed-forward NN(前饋神經網路)
單個神經元:一個函數
h = f(x)x,計算一個純量hw縮放輸入,並加上偏置bw和b是模型的參數(parameters)h = \tanh\!\left(\sum_j w_j x_j + b\right)活化函數
公式
特點
Sigmoid
\sigma(z)=\dfrac{1}{1+e^{-z}}輸出 (0,1),可當機率;兩端飽和導致梯度消失
Tanh
\tanh(z)=\dfrac{e^z-e^{-z}}{e^z+e^{-z}}輸出 (-1,1),零中心,比 sigmoid 好訓練
ReLU
\max(0, z)計算快、緩解梯度消失;負半軸「死亡」
1.2 輸出層
二元分類(binary classification)
P(y=1\mid x)\in(0,1)。多類別分類(multi-class classification)
\text{softmax}(z_i) = \frac{\exp(z_i)}{\sum_j \exp(z_j)}1.3 訓練方法
(a) Loss function 損失函數
L:L = \prod_{i=1}^{m} P(y_i \mid x_i)-\log L(負對數概似 / 交叉熵),找出最佳參數:-\log L = -\sum_{i} \log P(y_i \mid x_i)(b) Gradient descent 梯度下降
\theta \leftarrow \theta - \eta \nabla_\theta \mathcal{L}(c) Regularisation 正則化
方式
公式/做法
效果
L1-norm
\lambda\sum\vert \theta\vert稀疏權重(特徵選擇)
L2-norm
\lambda\sum\theta^2約束權重幅度;普通 SGD 下與權重衰減有對應關係
Dropout
訓練時隨機把部分神經元輸出置 0
減少神經元共適應,可理解為近似組合許多共享參數的子網路
(d) Dropout
1.4 應用一:主題分類(Topic Classification)
任務:給定文件,分類到預先定義的主題集合(economy / politics / sport…)。輸入:bag-of-words。
訓練
W和b\vec{x} = [0,2,3,0] \;\rightarrow\; \vec{h} = \tanh(W_2\vec{x} + \vec{b}_1) \;\rightarrow\; \vec{y} = \text{softmax}(W_3\vec{h})\vec{y} = [0.1, 0.6, 0.3],對應C_1, C_2, C_3C_1:L = -\log(0.1) \approx 2.303預測
\vec{x} = [1,3,5,0]\vec{y} = [0.2, 0.1, 0.7]= C_3(取 argmax)改進方向
1.5 應用二:詞向量(Word Embedding)
W_1的每一欄就是一個詞的向量。1.6 應用三:FFNN 語言模型
預測
P(w_i = \text{grass} \mid w_{i-3}=\text{a},\, w_{i-2}=\text{cow},\, w_{i-1}=\text{eats})流程:
W_1)\vec{h} = \tanh(W_2\vec{x} + \vec{b}_1),\vec{y} = \text{softmax}(W_3\vec{h})\vec{y}給出整個詞彙表上的機率分布參數量分布:
W_1(size= d_1 \times \vert V\vert)W_3(size= \vert V\vert \times d_h,其中d_h是隱藏層維度)1.7 FFNN 語言模型 vs 計數式 N-gram
維度
Count-based N-gram
FFNN N-gram
訓練成本
極低(只需統計計數)
較高(需梯度下降)
稀疏性
嚴重(未見 n-gram 機率為 0)
緩解(相似詞共享參數,泛化到未見組合)
長上下文
上下文變長時參數/稀疏問題惡化
可平滑擴展(但仍受固定視窗限制)
詞的性質
無法刻畫詞之間的語法/語意相似(film vs movie 視為兩個無關符號)
自動捕捉詞屬性,得到更穩健的估計
2. 循環神經網路 RNN
2.1 定義
s_i = f(s_{i-1}, x_i), \qquad s_{i+1} = f(s_i, x_{i+1})f在所有時間步重複使用。2.2 節點(Node)
X的長度可以變化,但每個輸入向量x_i的維度和狀態向量s_i的維度仍由模型固定。Simple RNN 的兩個公式
s_i = \tanh(W_s s_{i-1} + W_x x_i + b)y_i = \text{softmax}(W_y s_i)W_s:狀態到狀態的權重(記憶如何傳遞)W_x:輸入到狀態的權重W_y:狀態到輸出的權重b:偏置2.3 網路(Network)
W_s, W_x, b, W_y),並透過狀態連接前後位置,因此參數量不隨序列長度直接增長。2.4 訓練
x(LM 中是一個詞);y(因為狀態不同);L = L(y_1) + L(y_2) + L(y_3) + \dots = \sum_t L(y_t)2.5 訓練範例(語言模型)
句子:a cow eats grass
x_i是當前詞(如 eats),先映射為 embeddings_{i-1}包含前文(a, cow)的資訊y_i預測下一個詞(grass)網路按時間展開:
數值範例(詞彙表 {a, cow, eats, grass})
位置
輸入
狀態
s輸出分布
y目標
Loss
1
a
s_1[0.40, 0.30, 0.20, 0.10]
cow
-\log(0.30)2
cow
s_2[0.30, 0.20, 0.30, 0.20]
eats
-\log(0.30)3
eats
s_3[0.50, 0.10, 0.20, 0.20]
grass
-\log(0.20)L_{\text{total}} = L_1 + L_2 + L_32.6 RNN 的問題
問題
說明
a) 訓練與解碼不一致
訓練時用 teacher forcing(餵真實前詞),推論時餵自己的預測,分布不一致(exposure bias)
b) 錯誤傳播,難以定位中間錯誤
錯誤沿時間步傳播、累積,且難以定位是哪一步出錯
c) 傾向產生空泛或通用的語句
傾向產生空泛、安全的高頻表達,缺乏具體資訊
d) 梯度消失
梯度沿時間反向傳播時指數衰減,長距離依賴學不到
2.7 梯度消失(Vanishing Gradient)
3. 長短期記憶網路 LSTM
3.1 定義與動機
Memory 由閘門(gate)控制:
3.2 RNN vs LSTM 結構
C_t。3.3 如何理解 Memory / 如何控制
如何理解 memory:
C_t提供了一條貫穿時間步的加法更新路徑。遺忘閘門接近 1 時,資訊和梯度更容易保留;是否能長期記住仍取決於閘門的取值與訓練結果。如何控制 Memory:四個步驟
步驟
作用
Forget
決定從舊 cell state
C_{t-1}中丟棄多少Input
決定把多少新資訊寫入
Update
用 forget 和 input 的結果更新 cell state
Output
決定從 cell state 中提取多少作為當前隱藏狀態
h_t3.4 三個閘門與狀態更新公式
Forget gate(遺忘閘門)
f_t = \sigma\left(W_f\,[h_{t-1}, x_t] + b_f\right)f_t控制舊 memory cellC_{t-1}中保留多少資訊:接近 0 時丟棄,接近 1 時保留。Input gate(輸入閘門)
i_t = \sigma\left(W_i\,[h_{t-1}, x_t] + b_i\right)\tilde{C}_t = \tanh\left(W_C\,[h_{t-1}, x_t] + b_C\right)i_t:控制多少新資訊寫入 memory cell;\tilde{C}_t:新的候選資訊(distilled information),例如關於 boy 的資訊。Update(更新 cell state)
C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_tC_t直接回流 → 緩解梯度消失。Output gate(輸出閘門)
o_t = \sigma\left(W_o\,[h_{t-1}, x_t] + b_o\right)h_t = o_t \odot \tanh(C_t)h_t。3.5 參數數量
設
\text{Hidden}_{dim}= memory 的維度(也是h_t的維度)\text{Input}_{dim}= word embedding 的維度\#\text{params} = 4 \times (\text{Hidden}_{dim} + \text{Input}_{dim}) \times \text{Hidden}_{dim} + 4 \times \text{Hidden}_{dim}W_f, W_i, W_C, W_o,且每組的維度相同(row, column)。\text{Hidden}_{dim};\text{Hidden}_{dim} + \text{Input}_{dim};4 \times \text{Hidden}_{dim}是 4 組 bias 常數。舉例:Hidden = 256, Input = 300
4 \times (256+300)\times 256 + 4\times256 = 569{,}344 + 1{,}024 = 570{,}3683.6 RNN / LSTM 的應用
應用
說明
Wikipedia Generator
訓練語料規整,產生百科式文本
Code Generator
產生程式碼(結構性強,易評估)
語音辨識
把聲學特徵序列映射為文本
Text Classification
用最後隱藏狀態或池化作為文件表示
Sequence Labelling
POS、NER(每個位置輸出一個標籤)
3.7 變體
變體
要點
Peephole connections
允許閘門「看到」 cell state(
C_{t-1}也參與閘門的計算)GRU(Gated Recurrent Unit)
簡化版:只有 2 個閘門(reset / update),沒有獨立 memory cell,參數更少、訓練更快,效果常與 LSTM 相當
Multi-layer LSTM
堆疊多層,逐層抽象(但實務上不易堆太深)
Bidirectional LSTM
正向 + 反向兩個 LSTM,串接兩方向隱藏狀態 → 每個位置同時擁有左右上下文(不能用於自迴歸生成)
3.8 優缺點
優點
缺點
4. Transformer
4.1 定義
4.2 動機:從 RNN 到 Attention
4.3 使用情境
任何「輸入文本 → 輸出文本」的任務:
本質都是「一段輸入文本 → 另一段輸出文本」,Transformer 非常適合。
4.4 Self-Attention:Query / Key / Value
直覺類比:
例子:句子 I made her duck,目標詞 her
角色
內容
Query
q目標詞 her 的查詢向量
Key
k/ Valuev上下文詞(I, made, duck)以及目標詞自身的鍵/值
步驟
x_i寫成列向量(row vector),分別乘以三個投影矩陣W_Q, W_K, W_V:q_i = x_i W_Q,\qquad k_i = x_i W_K,\qquad v_i = x_i W_Vq與所有詞的k做內積(dot product),得到相關性分數;v加權求和,得到目標詞的輸出向量z;z,按位置排列即為一個 attention head 的輸出。核心結論:目標詞的最終表示 = 上下文詞(含自身)value 向量的加權和,權重由 query–key 的相似度決定。
4.5 公式
單一 query 形式
\text{SelfAttention}(q, K, V) = \sum_i \frac{\exp(q \cdot k_i)}{\sum_j \exp(q \cdot k_j)}\, v_i矩陣形式(將各個
q_i、k_i、v_i分別按列堆疊為Q、K、V)\text{SelfAttention}(Q, K, V) = \text{softmax}(QK^\top)\,VScaled Dot-Product Attention(實際使用)
\text{SelfAttention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V\sqrt{d_k}?d_k是 key 向量的維度。內積的變異數隨維度增長,維度大時 softmax 的輸入數值過大 → 分布極端(接近 one-hot)→ 梯度極小。除以\sqrt{d_k}縮放使數值穩定(避免數值過大/梯度消失)。4.6 Multi-Head Attention
動機:句子中不同詞之間可以透過多種方式相互關聯:
關係類型
例子
syntactically(句法)
主詞與動詞的一致關係(noun–verb agreement)
semantically(語意)
同義詞
discourse(篇章)
it 指代前文的 the dog
Multi-head attention 讓模型能在不同的表示子空間中並行關注不同關係,因此:
h次(不同 head 有各自的W_Q^{(i)}, W_K^{(i)}, W_V^{(i)});z^{(i)}concatenate 起來;W_O,把串接結果映射回模型維度d,融合多頭資訊;\text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W_O\text{head}_i = \text{Attention}(QW_Q^{(i)}, KW_K^{(i)}, VW_V^{(i)})4.7 Transformer Block
以原始 Transformer 的 Encoder block 為例,除 self-attention 外還包含:
元件
數量
作用
Feedforward layer
1×
逐位置的兩層 MLP(先升維再降維),提供非線性變換能力
Residual connection(殘差連接)
2×
把輸入與子層輸出相加(
x + f(x)),保留資訊和梯度的直接傳播路徑,便於訓練深層網路Normalisation layer(LayerNorm)
2×
對各位置的隱藏特徵做正規化,並學習縮放和偏置,有助於穩定訓練
4.8 堆疊(Stack Them Up)
4.9 位置資訊問題
問題:不加入位置資訊時,self-attention 本身無法區分詞序。對輸入作同樣的置換,輸出也只是隨之置換,而不會憑空知道哪個詞在前、哪個詞在後;因此需要額外的位置表示來區分 dog bites man 與 man bites dog。
Positional Embeddings(可學習位置嵌入)
X= word embeddings + position embeddings(兩者相加);Static Functions(正弦位置編碼)
PE_{(pos, 2i)} = \sin\!\left(\frac{pos}{10000^{2i/d}}\right), \qquad PE_{(pos, 2i+1)} = \cos\!\left(\frac{pos}{10000^{2i/d}}\right)4.10 Decoder-only 架構
5. 詞向量:計數法
5.1 詞向量(Word Vector Embedding)總覽
5.2 文件作為上下文:向量空間模型(VSM)
視角
列/欄
含義
文件視角
每列是一篇文件
文件由它包含的詞表示
詞視角
每欄是一個詞
詞由它出現的文件表示(欄向量就是詞向量)
詞–文件矩陣範例(列 = 文件 id,欄 = 詞)
state
fun
heaven
425
0
1
0
426
3
0
0
427
0
0
0
5.3 TF-IDF
Term Frequency(詞頻)
tf_{t,d}(也可取\log(1+tf)或正規化)。Inverse Document Frequency(逆文件頻率)
idf_w = \log \frac{\vert D\vert }{df_w}\vert D\vert= 文件總數df_w= 包含詞w的文件數組合
\text{TF-IDF} = TF \times IDF\log\frac{1+\vert D\vert }{1+df_w}+1);範例(tf 矩陣 → tf-idf 矩陣)
tf 矩陣(列 425/426/427,欄 the/country/hell):
the
country
hell
425
43
5
1
426
24
1
0
427
37
0
3
df500
14
7
這裡顯示完整語料中的三列文件;設總文件數
\vert D\vert=500,採用底數為 2 的對數,並把 country、hell 的 IDF 分別近似為 5.2、6.2 後再相乘。→ the 出現在全部 500 篇文件裡,因此
idf=0;而 hell 只出現在 7 篇中,權重相對升高。the
country
hell
425
0
26.0
6.2
426
0
5.2
0
427
0
0
18.6
5.4 降維(Dimensionality Reduction)
SVD(奇異值分解)
A = U \Sigma V^\topA是\vert V\vert \times \vert D\vert的詞–文件矩陣U:\vert V\vert \times m,新的詞矩陣(每列是一個詞的表示)\Sigma:m \times m的奇異值對角矩陣(按重要性降序)V^\top:m \times \vert D\vert,新的文件矩陣m = \text{Rank}(A)保留全部非零奇異值時,這是一種等價分解;實際降維和去噪通常依靠下面的截斷版本。
Latent Semantic Analysis(LSA,潛在語意分析)
k個奇異值及對應方向,用U_k或U_k\Sigma_k的各列作為 word vector;k常取 100–300);完整的 TF-IDF 詞向量流程
5.5 詞作為上下文(Word as Context)
5.6 點互資訊 PMI(Pointwise Mutual Information)
\text{PMI}(x, y) = \log_2 \frac{P(x, y)}{P(x)\,P(y)}含義:實際共現機率相對於「若兩詞獨立則應有的共現機率」的比值。
\text{PMI} > 0:共現多於偶然,正相關(相關詞)\text{PMI} = 0:這一詞對的共現機率等於獨立假設下的機率\text{PMI} < 0:共現少於偶然,負相關(互補/排斥)範例:計算 PMI(heaven, hell)
共現矩陣(視窗共現計數,節選)
the
country
hell
Σ
state
1973
10
1
12786
fun
54
2
0
633
heaven
55
1
3
627
Σ
1047519
3817
780
15871304
P(\text{heaven}) = 627 / 15871304P(\text{hell}) = 780 / 15871304P(\text{heaven}, \text{hell}) = 3 / 15871304(若該格計數為 3)代回公式:
\text{PMI}(\text{heaven},\text{hell})=\log_2\frac{3\times15871304}{627\times780}\approx6.61PMI 矩陣(節選)
the
country
hell
state
1.22
1.78
0.63
fun
0.37
3.79
-inf
heaven
0.41
2.80
6.61
5.7 PMI 的三個額外技巧
技巧
做法
原因
把
-\infty或負數替換為 0\text{PPMI} = \max(\text{PMI}, 0)保留高於獨立假設的共現關係,減少低頻負關聯估計不可靠帶來的影響
Normalised PMI(NPMI)
\text{NPMI}(x,y) = \dfrac{\text{PMI}(x,y)}{-\log_2 P(x,y)}分子、分母使用同一對數底;對
0<P(x,y)<1正規化到[-1,1],便於跨詞對比較PMI 也可以做 SVD 化簡
對 PMI 矩陣做 SVD 取前
k維降維去噪,得到稠密低維詞向量
6. 詞向量:神經法 Word2Vec
6.1 Word2Vec 概述
模型
方向
說明
Skip-gram
用目標詞預測周圍詞
實務上更擅長低頻詞
CBOW(Continuous Bag of Words)
用周圍詞預測目標詞
更快,且更擅長高頻詞
6.2 Skip-gram 模型
目標:最大化給定目標詞時,其上下文中出現正確詞的機率。
句子範例:... Bereft of life he rests in peace! If you hadn't nailed him ...,目標詞 rests,
L=2的上下文為 {he, in, life, peace}。機率建模:上下文詞的機率 = 以目標詞為條件的聯合機率:
P(\text{context} \mid w_t) = \prod_{i \in [-L, \dots, -1, 1, \dots, L]} P(w_{t+i} \mid w_t)假設:給定中心詞後,各上下文詞按條件獨立處理,因此可以寫成連乘;這個基本版本不區分上下文詞的先後次序。
6.3 用羅吉斯迴歸實作(softmax 形式)
P(w_O \mid w_I) = \frac{\exp(v'_{w_O}{}^\top v_{w_I})}{\sum_{w \in V} \exp(v'_{w}{}^\top v_{w_I})}其中
v是輸入(中心詞)向量,v'是輸出(上下文詞)向量。可以轉化為一個神經網路:
6.4 Embedding 參數化:兩個矩陣
關鍵細節:Word2Vec 有兩套詞向量矩陣:
W(\vert V\vert \times d):target word embedding(中心詞/輸入 embedding)C(d \times \vert V\vert):context word embedding(上下文/輸出 embedding)怎麼選
d? 把維度作為超參數,結合語料規模、下游任務和計算預算調校;100–300 維是常見的起點。訓練目的:輸入任何一個單詞,就能得到「每個詞是它 context word 的機率」,並希望正確的 context word 機率最大。
問題:太慢——分母要對整個詞彙表(
\vert V\vert可達百萬)求和,每個訓練樣本都要遍歷全部詞。6.5 優化:Negative Sampling(負取樣)
把「預測
P(\text{context} \mid \text{word})」轉化為一個二元分類問題:為什麼需要負取樣?
最大概似估計
\max \ \sum_{(w,c)\in D} \log \sigma(u_c^\top v_w) + \sum_{(w,c)\in D'} \log \sigma(-u_c^\top v_w)其中
D、D'分別是正、負詞對集合,v_w是輸入向量,u_c是輸出向量。P(+\mid \text{word},\text{context});P(-\mid \text{word},\text{context}),也就是壓低它被判為真實共現的機率。對於 embedding 的直覺:經常共現的輸入詞與輸出上下文向量傾向於有較大的內積;擁有相似上下文的詞可能學到相近表示。內積也受向量長度影響,不能直接等同於餘弦相似度。
6.6 Loss function
實務上對每個正樣本取
k個負樣本(常見k=5\sim20,具體需按語料調節)。下面T表示正樣本詞對數,c_t是中心詞,o_t是觀察到的上下文詞:J(\theta) = -\frac{1}{T}\sum_{t=1}^{T}\left[\log \sigma(u_{o_t}^\top v_{c_t}) + \sum_{i=1}^{k} \mathbb{E}_{w_i \sim P_n(w)}\log \sigma(-u_{w_i}^\top v_{c_t})\right]P_n(w)(通常與詞頻的 3/4 次方成正比)取樣,既避免高頻詞壟斷,也不會取到太多罕見詞。優點:
7. 詞向量評估
7.1 內在評估一:詞相似度(Word Similarity)
問題:怎麼知道單詞的 embedding 做得好不好?
方法:用 cosine similarity 計算兩個語意相似詞(如 well & good)的向量餘弦相似度,與人工評分的相似度做相關性比較(Spearman 相關)。
\cos(u, v) = \frac{u \cdot v}{\Vert u\Vert \,\Vert v\Vert }7.2 內在評估二:詞類比(Word Analogy)
方法:在 embedding 空間中做向量運算,看最近鄰是否符合語意關係。
\text{king} - \text{man} + \text{woman} \approx \text{queen}向量相加還可以示意語意組合,不過這不是標準的類比評測:
\text{breakfast} + \text{lunch} + \text{dinner} \approx \text{與 meal 相關的方向} \quad\text{(僅作語意組合的直覺範例,不是恆等式)}7.3 外在評估:下游任務(Downstream Tasks)
方法:直接把 embedding 用到實際任務(分類、NER、翻譯…)裡,用任務效能反過來衡量 embedding 品質。