Appearance
第 4 讲 神经语言模型与序列建模
对应课程
lecture-04-neural-lms。核心变化是用可微函数和共享参数替代 n-gram 计数表,同时保留最大似然与 next-token prediction 目标。
1. 前馈神经语言模型
固定窗口神经 LM 取最近
输出层给词表中每个 token 一个 logit:
对真实 token 的负对数似然就是多分类交叉熵。与 n-gram 相比,相似词共享 embedding,模型能在未见过但语义相似的上下文间泛化;代价是窗口仍固定,且输出 softmax 很昂贵。
2. 反向传播与训练
一个 batch 的 causal LM 损失为
训练时使用 teacher forcing:预测第
实现要点:
- 输入与标签错一位:
input = tokens[:-1],label = tokens[1:]。 - padding 位置不能计入损失,用 attention/loss mask 屏蔽。
- logits 直接传给稳定的 cross-entropy,不要先手动 softmax。
- 监控训练/验证 loss、PPL、梯度范数和学习率。
3. RNN
RNN 用递归状态压缩任意长度历史:
所有时间步共享参数,因此能处理变长序列。但
BPTT 与梯度问题
反向传播通过时间展开后,远距离梯度包含多次 Jacobian 连乘:
谱范数持续小于 1 会梯度消失,持续大于 1 会爆炸。实践中使用梯度裁剪、合适初始化、归一化与门控结构;截断 BPTT 用较短片段训练以控制显存,但限制超长依赖学习。
4. LSTM 与 GRU
LSTM 引入 cell state
加法更新为梯度提供较顺畅的路径。forget gate 决定保留旧记忆,input gate 决定写入,output gate 决定暴露。GRU 合并部分门与状态,参数更少;二者都缓解而非彻底消除长依赖和串行瓶颈。
5. Encoder–Decoder 与序列到序列
早期 seq2seq 用 encoder RNN 把输入压成最后状态,再由 decoder 生成输出:
单一向量
6. 优化基础
SGD 更新
| 现象 | 可能原因 | 排查 |
|---|---|---|
| loss 约为 $\log | V | $ 且不降 |
| 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 使用加法更新,局部导数包含
当 forget gate
GRU 省去独立 cell state,以 update gate 在旧状态和候选状态间插值:
参数更少、速度更快,但 LSTM/GRU 都必须按时间步串行,难以充分利用 GPU 并行。
10. 从固定上下文到动态注意力
经典 encoder–decoder 把整句压成最终状态
decoder 由
11. 参数量与计算视角
NPLM 的主要参数约为 embedding