自然语言处理:应用
本章来源:本文整理自《动手学深度学习》(zh.d2l.ai)第 15 章《自然语言处理:应用》,原书作者 Aston Zhang、李沐、Zachary C. Lipton、Alexander J. Smola。
本章讲什么
上一章讲了词嵌入和 BERT 预训练。这一章把它们用到真实任务上:情感分析(判断一段文本是积极还是消极)和自然语言推断(判断两句话的逻辑关系)。我们会看到同一个问题可以有不同的解法——用 RNN、用 CNN、用注意力,而最省事的是微调 BERT。
情感分析
情感分析研究文本(产品评论、博客、论坛)中"隐藏"的情绪,应用于政治、金融、营销。任务本质是文本分类:把可变长度文本序列映射为固定长度的类别(积极/消极)。
常用的数据是斯坦福大型电影评论数据集 IMDb(2.5 万条训练 + 2.5 万条测试,正负平衡)。预处理的关键工程点:词元化、过滤低频词建词表,以及截断 + 填充——评论长度不一,统一截断/填充到固定长度以便小批量训练。
用 RNN 做情感分析
思路是"复用大语料上学到的词表示,避免小数据过拟合":嵌入层装载预训练词向量(训练中冻结不更新),双向 LSTM 编码整个序列,把首尾时间步的隐状态拼接作为整个文本的向量表示,再经全连接层输出积极/消极两类。
关键概念是"用双向网络把整段文本压缩成一个固定长度向量"——把一段话读一遍后总结成一个总印象。这是"序列 → 单个表示 → 类别"的通用范式。
用 CNN 做情感分析
把图像里的卷积搬到文本:把文本序列想象成一维图像,一维卷积就能捕捉 n-gram 这类局部特征(比 RNN 并行性好)。
textCNN 模型三步走:
- 多个不同宽度的一维卷积核分别扫过词嵌入序列——不同宽度捕获不同长度的相邻词元特征(如三元、四元、五元语法);
- 用最大时间池化层把每个通道压成最大值——相当于挑出整条序列里每个特征最强的激活;
- 全连接层输出类别。
自然语言推断
情感分析只处理单条文本。自然语言推断(NLI)要判断一对文本之间的逻辑关系:给定前提和假设,判别是:
- 蕴涵:假设可由前提推出。比如"两个女人拥抱 → 两个女人在示爱"。
- 矛盾:假设的否定可由前提推出。比如"正在运行编码示例 → 该男子在睡觉"。
- 中性:其他情况。比如"音乐家为我们表演 → 音乐家有名"。
这对信息检索、开放域问答等应用很重要。基准是斯坦福 SNLI 数据集(约 55 万带标签句对)。
用注意力做自然语言推断
针对 NLI 设计的可分解注意力模型不用 RNN/CNN,只用注意力 + MLP,以更少参数达到当时最佳效果。核心思想是"对齐—比较—汇总"三步:
- 对齐:把前提与假设的词元两两"软对齐"(用注意力权重做加权平均)。比如"我累"的"累"去对齐"我确实需要睡眠"的"睡眠"。
- 比较:用 MLP 比较对齐后的信息。
- 汇总:把比较结果汇总成一个向量用于三分类。
这种"软对齐"是注意力在 NLP 的典型应用——机器学会让句子里的对应部分彼此"对上眼"。
微调 BERT:一个模型适配所有任务
为每个 NLP 任务手工设计专用模型不可行。BERT 的价值是"一个预训练模型 + 最小架构改动"适配各类任务:
- 单文本分类(情感分析、语法可接受性判断):取
<cls>的 BERT 表示,接一个全连接 MLP 输出类别。 - 文本对分类/回归(自然语言推断、语义文本相似度):两个序列分别用片段 A/B 嵌入,
<cls>表示接输出层。 - 文本标注/词性标注(词元级):每个词元的 BERT 表示都送入同一全连接层,为每个词输出标签。
- 问答(SQuAD):把问题与段落作为两个序列输入,用两个全连接层把每个段落词元的表示转成"起始分数"和"结束分数",取分数最高的文本跨度作为答案。
微调规则统一:额外输出层从头训练,预训练 BERT 全部参数微调。"下载的预训练参数 + 任务专属输出头 + 监督微调"三位一体,只需最少的架构改动即可迁移到具体任务。
小结
- 情感分析是文本分类,把变长序列映射为积极/消极类别。
- RNN 用双向网络把整段文本压缩成一个向量;CNN(textCNN)把文本当一维图像捕捉 n-gram 特征。
- 自然语言推断判断前提和假设是蕴涵、矛盾还是中性。
- 可分解注意力模型用"对齐—比较—汇总"解决 NLI。
- 微调 BERT 用最小架构改动适配文本分类、文本对、标注、问答等各类任务。
关键术语
| 术语 | 一句话解释 |
|---|---|
| 情感分析 | 判断文本中隐藏的情绪(积极/消极) |
| 文本分类 | 把文本序列映射为类别 |
| 双向 LSTM | 同时利用前后文编码整个序列 |
| textCNN | 用一维卷积捕捉 n-gram 特征的文本分类模型 |
| 最大时间池化 | 每通道取时间维最大值 |
| 自然语言推断(NLI) | 判断前提与假设的蕴涵/矛盾/中性关系 |
| 可分解注意力 | 用"对齐—比较—汇总"做文本对推理 |
| 软对齐 | 用注意力权重做加权平均 |
<cls> 表示 |
聚合整句信息的 BERT 输出 |
| SQuAD | 问答数据集,答案是段落中的文本片段 |
| BERT 微调 | 预训练参数 + 任务专属输出头 + 监督微调 |