第 10 讲 · 自然语言处理
自然语言处理的输入是人类语言,任务包括分词、分类、序列标注、问答、翻译和生成。难点不只在词很多,还在于同一个词会随上下文改变含义,远距离词语也可能互相约束。我在这一讲先沿着“怎样表示序列、怎样预测序列”这条线发展模型,再落到情感分类实践。
语言模型:把一句话拆成逐词条件概率
对词序列 ,链式法则给出:
如果能估计每个“下一个词”的条件概率,就能给整句话打分,也能逐词生成。直接统计完整历史几乎不可能,N-gram 用有限阶 Markov 假设,只保留前 个词:
最大似然估计就是“这个上下文后某词出现次数 / 这个上下文出现次数”。N-gram 简单、可解释,但 稍大就会遇到组合爆炸和未见片段,必须平滑,而且始终看不到更远的上下文。
从 one-hot 到词向量
one-hot 给词表中每个词一个互相正交的向量。它能区分词,却表达不了“猫”和“狗”比“猫”和“微积分”更相近。
Word2Vec 根据上下文学习稠密向量:
- CBOW:用周围词预测中间词;
- Skip-gram:用中间词预测周围词。
训练后,可用余弦相似度比较方向:
静态词向量给同一个词固定表示,仍不能区分多义词的具体语境。后来的上下文模型让词表示随句子变化。
Seq2Seq:编码,再逐步解码
编码器把输入 读入隐藏状态,解码器根据编码结果和已经生成的词预测下一个输出:
训练时最大化正确输出序列的条件似然,等价于最小化逐步交叉熵。早期 Seq2Seq 把整个输入压进一个固定长度向量,句子一长,这个“单一瓶颈”就很难保留全部信息。
Attention:每一步都回头找相关位置
解码器不再只依赖最后一个编码状态,而是对所有输入位置打分并加权求和。Query 表示当前要找什么,Key 用于匹配,Value 是实际取出的内容:
缩放点积注意力为:
除以 是为了避免维度大时点积幅度过大,把 softmax 推进饱和区。注意力权重能提示模型在当前计算中关注了哪些位置,但不能自动等同为完整因果解释。
Transformer 的积木
Transformer 用注意力代替 RNN 的逐步递归,使同层位置可以并行计算。主要组件:
- 词嵌入 + 位置编码:注意力本身不认识顺序,需要显式加入位置信息;
- 多头注意力:多组投影在不同表示子空间里关注关系;
- 前馈网络:对每个位置独立做同一组非线性变换;
- 残差连接 + LayerNorm:改善深层信息流和训练稳定性;
- 掩码:解码时遮住未来 token,防止训练中偷看答案。
经典 Transformer 是编码器—解码器结构:编码器让输入内部充分交互,解码器既做带掩码的自注意力,又跨注意输入表示。第 11 讲会继续比较只用编码器的 BERT 和只用解码器的 GPT。
情感分类:先做可靠基线
课件以 ChnSentiCorp、IMDb 等数据集为例,给出从简单到复杂的路线:
词袋 + 传统分类器
把文本转成词频或 TF-IDF,再用逻辑回归、SVM、决策树。它忽略词序,却常是很强的基线,训练快、容易排查。
TextCNN
把词向量排成矩阵,用不同宽度的一维卷积捕捉局部短语,再做池化分类。它适合识别“非常好”“一点也不”之类局部模式。
BiLSTM
前向和后向 LSTM 分别读取序列,再合并上下文表示。它能建模顺序,但序列计算不如 Transformer 易并行。
预训练模型
ERNIE/BERT 类模型把输入 token 编成上下文表示,常取特殊 [CLS] 位置接分类头,再在标注数据上微调。
无论模型多复杂,流程都应包括独立测试集、类别分布检查、混淆矩阵和错误样本分析。第三次作业的垃圾短信分类采用 TF-IDF + 逻辑回归,恰好是这条路线中的基础方案。
我在这一讲回答“Transformer 怎样处理序列”;下一讲再回答“大规模预训练后,为什么同一个架构能适应许多任务,以及它仍然缺什么”。