第 10 讲 · 自然语言处理

自然语言处理的输入是人类语言,任务包括分词、分类、序列标注、问答、翻译和生成。难点不只在词很多,还在于同一个词会随上下文改变含义,远距离词语也可能互相约束。我在这一讲先沿着“怎样表示序列、怎样预测序列”这条线发展模型,再落到情感分类实践。

语言模型:把一句话拆成逐词条件概率

对词序列 w1,…,wTw_1,\ldots,w_T,链式法则给出:

P(w1,…,wT)=∏t=1TP(wt∣w1,…,wt−1)P(w_1,\ldots,w_T)=\prod_{t=1}^{T}P(w_t\mid w_1,\ldots,w_{t-1})

如果能估计每个“下一个词”的条件概率,就能给整句话打分,也能逐词生成。直接统计完整历史几乎不可能,N-gram 用有限阶 Markov 假设,只保留前 n−1n-1 个词:

P(wt∣w1,…,wt−1)≈P(wt∣wt−n+1,…,wt−1)P(w_t\mid w_1,\ldots,w_{t-1}) \approx P(w_t\mid w_{t-n+1},\ldots,w_{t-1})

最大似然估计就是“这个上下文后某词出现次数 / 这个上下文出现次数”。N-gram 简单、可解释,但 nn 稍大就会遇到组合爆炸和未见片段,必须平滑,而且始终看不到更远的上下文。

从 one-hot 到词向量

one-hot 给词表中每个词一个互相正交的向量。它能区分词,却表达不了“猫”和“狗”比“猫”和“微积分”更相近。

Word2Vec 根据上下文学习稠密向量:

  • CBOW:用周围词预测中间词;
  • Skip-gram:用中间词预测周围词。

训练后,可用余弦相似度比较方向:

cos⁡(u,v)=u⊤v∥u∥∥v∥\cos(u,v)=\frac{u^\top v}{\lVert u\rVert\lVert v\rVert}

静态词向量给同一个词固定表示,仍不能区分多义词的具体语境。后来的上下文模型让词表示随句子变化。

Seq2Seq:编码,再逐步解码

编码器把输入 x1,…,xmx_1,\ldots,x_m 读入隐藏状态,解码器根据编码结果和已经生成的词预测下一个输出:

P(y1,…,yT∣x)=∏tP(yt∣y<t,x)P(y_1,\ldots,y_T\mid x)=\prod_t P(y_t\mid y_{<t},x)

训练时最大化正确输出序列的条件似然,等价于最小化逐步交叉熵。早期 Seq2Seq 把整个输入压进一个固定长度向量,句子一长,这个“单一瓶颈”就很难保留全部信息。

Attention:每一步都回头找相关位置

解码器不再只依赖最后一个编码状态,而是对所有输入位置打分并加权求和。Query 表示当前要找什么,Key 用于匹配,Value 是实际取出的内容:

查询与键计算相关性,再按权重汇总值

缩放点积注意力为:

Attention⁡(Q,K,V)=softmax⁡(QK⊤dk)V\operatorname{Attention}(Q,K,V) =\operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V

除以 dk\sqrt{d_k} 是为了避免维度大时点积幅度过大,把 softmax 推进饱和区。注意力权重能提示模型在当前计算中关注了哪些位置,但不能自动等同为完整因果解释。

Transformer 的积木

Transformer 用注意力代替 RNN 的逐步递归,使同层位置可以并行计算。主要组件:

  1. 词嵌入 + 位置编码:注意力本身不认识顺序,需要显式加入位置信息;
  2. 多头注意力:多组投影在不同表示子空间里关注关系;
  3. 前馈网络:对每个位置独立做同一组非线性变换;
  4. 残差连接 + LayerNorm:改善深层信息流和训练稳定性;
  5. 掩码:解码时遮住未来 token,防止训练中偷看答案。

经典 Transformer 是编码器—解码器结构:编码器让输入内部充分交互,解码器既做带掩码的自注意力,又跨注意输入表示。第 11 讲会继续比较只用编码器的 BERT 和只用解码器的 GPT。

情感分类:先做可靠基线

课件以 ChnSentiCorp、IMDb 等数据集为例,给出从简单到复杂的路线:

词袋 + 传统分类器

把文本转成词频或 TF-IDF,再用逻辑回归、SVM、决策树。它忽略词序,却常是很强的基线,训练快、容易排查。

TextCNN

把词向量排成矩阵,用不同宽度的一维卷积捕捉局部短语,再做池化分类。它适合识别“非常好”“一点也不”之类局部模式。

BiLSTM

前向和后向 LSTM 分别读取序列,再合并上下文表示。它能建模顺序,但序列计算不如 Transformer 易并行。

预训练模型

ERNIE/BERT 类模型把输入 token 编成上下文表示,常取特殊 [CLS] 位置接分类头,再在标注数据上微调。

无论模型多复杂,流程都应包括独立测试集、类别分布检查、混淆矩阵和错误样本分析。第三次作业的垃圾短信分类采用 TF-IDF + 逻辑回归,恰好是这条路线中的基础方案。

我在这一讲回答“Transformer 怎样处理序列”;下一讲再回答“大规模预训练后,为什么同一个架构能适应许多任务,以及它仍然缺什么”。

评论