于是诞生了 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 中是一个 word);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) Mismatch between training and decoding
训练时用 teacher forcing(喂真实前词),推理时喂自己的预测,分布不一致(exposure bias)
b) Error propagation, unable to locate intermediate error
错误沿时间步传播、累积,且难以定位是哪一步出错
c) Tends to generate "blank" or "generic" language
倾向生成空泛、安全的高频表达,缺乏具体信息
d) Vanishing gradient
梯度沿时间反向传播时指数衰减,长距离依赖学不到
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 优缺点
Pros
Cons
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写成行向量,分别乘以三个投影矩阵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 质量。