Skip to content

第 4 讲 神经语言模型与序列建模

对应课程 lecture-04-neural-lms。核心变化是用可微函数和共享参数替代 n-gram 计数表,同时保留最大似然与 next-token prediction 目标。

1. 前馈神经语言模型

固定窗口神经 LM 取最近 n1 个 token,经 embedding lookup 后拼接:

xt=[E[wtn+1];;E[wt1]],qquadht=ϕ(Wxt+b).

输出层给词表中每个 token 一个 logit:

p(wt=jht)=softmax(Uht+c)j.

对真实 token 的负对数似然就是多分类交叉熵。与 n-gram 相比,相似词共享 embedding,模型能在未见过但语义相似的上下文间泛化;代价是窗口仍固定,且输出 softmax 很昂贵。

2. 反向传播与训练

一个 batch 的 causal LM 损失为

L=1iTiit=1Tilogpθ(wt(i)w<t(i)).

训练时使用 teacher forcing:预测第 t 个 token 时喂入真实历史,而不是模型前一步的采样。这允许并行构造监督标签,但带来 exposure bias:推理时模型只能接收自己的历史错误。

实现要点:

  • 输入与标签错一位:input = tokens[:-1]label = tokens[1:]
  • padding 位置不能计入损失,用 attention/loss mask 屏蔽。
  • logits 直接传给稳定的 cross-entropy,不要先手动 softmax。
  • 监控训练/验证 loss、PPL、梯度范数和学习率。

3. RNN

RNN 用递归状态压缩任意长度历史:

ht=tanh(Wxxt+Whht1+b),qquadp(wt+1wt)=softmax(Uht+c).

所有时间步共享参数,因此能处理变长序列。但 ht 是固定维度瓶颈,且时间步必须串行计算。

BPTT 与梯度问题

反向传播通过时间展开后,远距离梯度包含多次 Jacobian 连乘:

hthk=i=k+1thihi1.

谱范数持续小于 1 会梯度消失,持续大于 1 会爆炸。实践中使用梯度裁剪、合适初始化、归一化与门控结构;截断 BPTT 用较短片段训练以控制显存,但限制超长依赖学习。

4. LSTM 与 GRU

LSTM 引入 cell state ct 与门:

it=σ(Wi[xt,ht1]+bi),ft=σ(Wf[xt,ht1]+bf),ot=σ(Wo[xt,ht1]+bo),c~t=tanh(Wc[xt,ht1]+bc),ct=ftct1+itc~t,ht=ottanh(ct).

加法更新为梯度提供较顺畅的路径。forget gate 决定保留旧记忆,input gate 决定写入,output gate 决定暴露。GRU 合并部分门与状态,参数更少;二者都缓解而非彻底消除长依赖和串行瓶颈。

5. Encoder–Decoder 与序列到序列

早期 seq2seq 用 encoder RNN 把输入压成最后状态,再由 decoder 生成输出:

p(y1:Tx)=tp(yty<t,cx).

单一向量 cx 对长句形成信息瓶颈。注意力机制允许 decoder 在每一步重新从所有 encoder states 中取加权信息,成为通向 Transformer 的桥梁。

6. 优化基础

SGD 更新 θθηL;mini-batch 是吞吐与梯度方差的折中。Adam 维护一、二阶矩估计,适合大多数神经 LM。常见训练故障:

现象可能原因排查
loss 约为 $\logV$ 且不降
loss 变 NaN学习率过大、溢出降 LR、裁剪梯度、检查混合精度
训练降而验证升过拟合dropout、权重衰减、早停、更多数据
生成重复暴露偏差或解码过贪心检查数据、采样策略与重复惩罚

7. 非线性与表示学习

若多层网络之间没有激活函数,多个线性层仍可合并为一个线性变换,深度没有增加表达能力。XOR 是课堂中的最小反例:单层感知机无法用一条直线分开正负点;加入带 ReLU/tanh 的隐藏层后,网络可以先把输入映射到新的表示空间,再用线性输出层分类。

常见激活函数的取舍:sigmoid 输出有概率含义但两端饱和;tanh 零中心但仍可能梯度消失;ReLU 正区间梯度稳定却可能出现“死亡神经元”;Transformer 中常见 GELU/SwiGLU,在平滑性与门控表达上更适合大规模训练。

8. 序列任务的四种形态

课堂把序列学习整理为四类:

  • 一对多:图像到描述;
  • 多对一:句子到情感标签;
  • 多对多且不对齐:翻译、摘要;
  • 多对多且对齐:词性标注、NER、分词。

同一个 RNN 可在每个时间步输出,也可只使用最终状态。双向 RNN 同时编码左右上下文,适合序列标注,却不能直接用于严格左到右的在线生成。

9. LSTM 为什么能保留梯度

简单 RNN 的状态反复经过矩阵与非线性,远距离梯度是 Jacobian 连乘。LSTM 的 cell state 使用加法更新,局部导数包含

ctct1=ft.

当 forget gate ft 接近 1 时,梯度能沿 cell state 长距离传递;当需要遗忘时再主动压低。它不是“永不梯度消失”,而是让模型学习何时建立近似恒等通道。实践中常把 forget bias 初始化为正值,让训练初期更愿意保留信息。

GRU 省去独立 cell state,以 update gate 在旧状态和候选状态间插值:

ht=(1zt)ht1+zth~t.

参数更少、速度更快,但 LSTM/GRU 都必须按时间步串行,难以充分利用 GPU 并行。

10. 从固定上下文到动态注意力

经典 encoder–decoder 把整句压成最终状态 c,长句翻译质量随输入长度明显下降。Bahdanau attention 在每个解码步重新计算对齐:

et,i=vTtanh(Wsst1+Whhi),αt,i=softmaxi(et,i),ct=iαt,ihi.

decoder 由 (st1,yt1,ct) 预测下一词。上下文从固定向量变成按需读取的加权和,注意力矩阵还能可视化源词与目标词的软对齐。这一步解除信息瓶颈,但 encoder/decoder 本身仍是 RNN;Transformer 的下一步是连循环也去掉,让所有位置直接用自注意力交互。

11. 参数量与计算视角

NPLM 的主要参数约为 embedding |V|d、隐藏映射 h(nd) 与输出层 |V|h,随窗口 n 线性增加;n-gram 计数表则随 |V|n 指数增长。RNN 通过共享 Wh 让参数量不随序列长度增长,但运行时间仍随 T 串行增长。理解“参数共享解决统计稀疏,但不等于计算并行”是进入 Transformer 的关键。