跳到主要内容

NLP 应用 — 情感分析、自然语言推断与微调 BERT

这一章讲三件事: 整段文本归一类的情感分析,用 RNN 和用一维卷积各怎么打; 判断「前提能不能推出假设」的自然语言推断,注意力怎么不用循环就拿下它; 以及预训练时代的标准姿势:微调 BERT,三类任务只换输出层。 链条位置:第 17 章造好了表示(BERT),这一章把它接上任务头。

1. 情感分析:一段文字的总体倾向

情感分析(sentiment analysis)回答「这段文字是夸还是骂」—— 输入一整段文本,输出一个类别。基准数据集是斯坦福的 IMDb 影评: 训练集 25000 条、测试集 25000 条,正面/负面二分类1

打法一,RNN 版。 词向量(第 17 章预训练好的 GloVe)逐个喂进双向 RNN, 取最末层在首尾两个时间步的隐状态拼起来当整段文本的表示, 接一个全连接层出分类2。 思路:首时间步的隐状态(反向那条)看过整段文字, 末时间步的(正向那条)也看过整段文字,两个拼一起就是全文摘要。

打法二,textCNN 版。 换个视角:把句子看成一张「一维图像」—— 时间轴当宽、词向量维度当通道,卷积核在时间轴上滑动3。 宽度 3 的核每次看 3 个连续词,正好抓「not so good」这类短语。 textCNN 用一组不同宽度(比如 3、4、5)的核各扫一遍, 再对每种核的输出做 max-over-time pooling(时序最大池化: 整条时间轴只留最大值——「这句话里出现过这个模式的最强信号,不管出现在哪」), 每种核贡献一个数,拼接后接分类层4。 没有循环、没有长程记忆,靠多宽度核抓局部模式,又快又稳。

2. 自然语言推断:句子之间是什么关系

情感分析看单段文本;自然语言推断(NLI,natural language inference) 看一对句子:给定前提(premise)与假设(hypothesis), 判断假设能不能从前提推出来,三分类5:

  • 蕴含(entailment):假设能从前提推出;
  • 矛盾(contradiction):假设的否定能推出;
  • 中性(neutral):其余情况。

原书的例子:前提「Two women are hugging each other」, 假设「Two women are showing affection」——拥抱可以推出「表达感情」,标蕴含; 假设换成「Two women are sleeping」,则与前提矛盾。 基准数据集 SNLI 有 50 多万对标注句6。 这个任务的价值在于:它要求模型真的「理解」句子间逻辑,而不是背关键词。

3. 可分解注意力:attend、compare、aggregate

2016 年的 decomposable attention(可分解注意力)证明: 不用 RNN、不用卷积,光靠注意力就能把 NLI 做到当时的顶尖。 它把推理拆成三步7,下面拿上面那对句子走一遍。

第一步,attend(软对齐)。 前提 A 有 6 个词,假设 B 有 5 个词。对 B 里每个词, 拿它去「问」A 里每个词「你跟我有多相关」,打分归一化后加权混合—— 这就是第 12 章的注意力加权。比如处理「affection」时, 它与 A 中「hugging」的对齐权重最高(0.7)、「women」次之(0.2)、其余几乎为 0 (这几个权重是为演示编的,不是真实数值)。 结果:B 的每个词都拿到一份「前提里最相关部分」的表示 β。

第二步,compare(比较)。 把 B 的每个词与它刚领到的 β 拼在一起,过一个小型前馈网络, 输出「这个词与它对应的前提部分,关系像什么」的局部判词。 (A 的每个词对 B 同样做一遍。)

第三步,aggregate(聚合)。 把所有位置的局部判词加起来,过一个分类器,出三分类结果。

三步全部可微、没有循环,所以训练快、可并行。 它的启示比模型本身活得久:句子对任务 = 先对齐、再逐点比较、最后汇总, 这个骨架后来反复出现在各种 NLI 系统里。

4. 微调 BERT:三类任务,只换输出层

预训练时代,上面这些任务的做法被统一了:拿预训练 BERT,换个输出头就上岗。 按输出落在哪一级,任务分两类三种8:

  • 单文本分类(序列级):情感分析这类。整段文本的表示取特殊记号 的最终输出——自注意力让它看过全文, 就是「全文摘要」的固定位置—— 接一个分类层;
  • 文本对分类/回归(序列级):NLI 这类。BERT 输入本来就支持两段 ( A B ),还是取 的表示接分类层;
  • 逐词任务(token 级):词性(名词/动词这类语法类别)标注这类,每个词位置各接一个分类层。

原书的完整示范是把 BERT 微调到 SNLI 上: 架构只是在 BERT 上加一个两层 MLP,把 的表示变成 「蕴含/矛盾/中性」三个输出9; 训练时只有这个 MLP 的输出层从零学, BERT 编码器与 MLP 隐层的参数都在预训练值上微调10—— 第 16 章的微调四步,在 NLP 里一模一样地重演。

5. 作者的判断与证据

书里给了证据的: IMDb 的规模(25000+25000);RNN 版首尾隐状态拼接的做法; textCNN 的多宽度核与 max-over-time pooling;NLI 三分类定义与 SNLI 的 50 万对; 可分解注意力的三步与「当时顶尖」的定位;BERT 微调只加 MLP、 除输出层外全部微调的训练安排。

经验判断: 「双向 RNN 首尾拼接能代表全文」是工程惯例; textCNN 的核宽组合(3/4/5)是调出来的;NSP 在这几节里是 「BERT 预训练就带了句间关系能力」的证据,但第 13 章已提过 RoBERTa 的反面实验。

判断(我们的,不是书里的): 把第 1、2、4 节并排看,是 NLP 十年的浓缩: 为每个任务设计架构(textCNN、decomposable attention) → 一个通用架构加任务头(BERT 微调)。 可分解注意力的三步没有消失,它被吸收进了 Transformer 的 cross-attention 里——思想活下来,专门架构死掉了。 如果错,会错在: 在超低资源场景,为任务定制的小模型仍可能胜过 通用大模型微调;「统一」是主流,不是全部。

6. 边界与局限

  • 情感分析只做了英文二分类;方面级(aspect-level)情感原书未展开;
  • decomposable attention 的词表示仍依赖 GloVe,不是端到端学表示;
  • SNLI 有已知的标注噪声与「只给假设也能猜对」的捷径问题,原书未讨论;
  • BERT 微调的演示规模很小,没给基准分数;
  • 逐词任务只讲了分类头,没展开序列标注的解码技巧。

7. 可带走的

  1. 情感分析 = 单文本分类:RNN 版拼首尾隐状态,textCNN 版多宽度核 + 时序最大池化;
  2. NLI = 前提推假设的三分类(蕴含/矛盾/中性),SNLI 50 万对;
  3. 可分解注意力:attend 软对齐 → compare 逐点比较 → aggregate 汇总,无循环也可微;
  4. 微调 BERT 不改架构:单文本/文本对取 表示接分类层,逐词任务逐位置接;
  5. 训练安排照旧章:新加的输出层从零学,预训练参数微调。

8. 原文地图

主题原书章原文位置
IMDb 数据集Sentiment Analysis and the Datasettext/120-sentiment-analysis-and-the-dataset.txt:35(搜「large movie review dataset」)
RNN 版首尾拼接Sentiment Analysis: Using Recurrent Neural Networkstext/121-sentiment-analysis-using-recurrent-neural-networ.txt:70(搜「at both the initial and final time steps」)
textCNN 与一维卷积Sentiment Analysis: Using Convolutional Neural Networkstext/122-sentiment-analysis-using-convolutional-neural-ne.txt:25(搜「textCNN」) · text/122-sentiment-analysis-using-convolutional-neural-ne.txt:62(搜「One-Dimensional Convolutions」)
时序最大池化Sentiment Analysis: Using Convolutional Neural Networkstext/122-sentiment-analysis-using-convolutional-neural-ne.txt:174(搜「max-over-time pooling」)
NLI 三分类Natural Language Inference and the Datasettext/123-natural-language-inference-and-the-dataset.txt:15(搜「hypothesis」)
SNLI 规模Natural Language Inference and the Datasettext/123-natural-language-inference-and-the-dataset.txt:51(搜「500000」)
可分解注意力三步Natural Language Inference: Using Attentiontext/124-natural-language-inference-using-attention.txt:26(搜「attending, comparing, and aggregating」)
两类三种任务Fine-Tuning BERT for Sequence-Level and Token-Level Applicationstext/125-fine-tuning-bert-for-sequence-level-and-token-le.txt:29(搜「sequence-level and token-level」)
cls 表示全文Fine-Tuning BERT for Sequence-Level and Token-Level Applicationstext/125-fine-tuning-bert-for-sequence-level-and-token-le.txt:67(搜「encodes the information of the entire input text」)
BERT+MLP 微调 SNLINatural Language Inference: Fine-Tuning BERTtext/126-natural-language-inference-fine-tuning-bert.txt:291(搜「BERT representation of the special」) · text/126-natural-language-inference-fine-tuning-bert.txt:330(搜「learned from scratch」)

Footnotes

  1. 出处:「Sentiment Analysis and the Dataset」第 35-38 段(text/120-sentiment-analysis-and-the-dataset.txt:35,搜「large movie review dataset」)。训练集与测试集各 25000 条。

  2. 出处:「Sentiment Analysis: Using Recurrent Neural Networks」第 68-71 段(text/121-sentiment-analysis-using-recurrent-neural-networ.txt:70,搜「at both the initial and final time steps」)。双向 RNN 最末层首、末时间步的隐状态拼接。

  3. 出处:「Sentiment Analysis: Using Convolutional Neural Networks」第 18-25 段(text/122-sentiment-analysis-using-convolutional-neural-ne.txt:25,搜「textCNN」)与第 62-70 段(一维互相关走查)。

  4. 出处:「Sentiment Analysis: Using Convolutional Neural Networks」第 167-209 段(text/122-sentiment-analysis-using-convolutional-neural-ne.txt:174,搜「max-over-time pooling」)。

  5. 出处:「Natural Language Inference and the Dataset」第 15-27 段(text/123-natural-language-inference-and-the-dataset.txt:15,搜「hypothesis」)。拥抱/表达感情的前提-假设对在第 25-27 段。

  6. 出处:「Natural Language Inference and the Dataset」第 51 段(text/123-natural-language-inference-and-the-dataset.txt:51,搜「500000」)。

  7. 出处:「Natural Language Inference: Using Attention」第 4 段(text/124-natural-language-inference-using-attention.txt:4,搜「decomposable attention model」)与第 26 段(text/124-natural-language-inference-using-attention.txt:26,搜「attending, comparing, and aggregating」)。

  8. 出处:「Fine-Tuning BERT for Sequence-Level and Token-Level Applications」第 29-34 段(text/125-fine-tuning-bert-for-sequence-level-and-token-le.txt:29,搜「sequence-level and token-level」)与第 61-68 段(text/125-fine-tuning-bert-for-sequence-level-and-token-le.txt:67,搜「encodes the information of the entire input text」)。

  9. 出处:「Natural Language Inference: Fine-Tuning BERT」第 288-294 段(text/126-natural-language-inference-fine-tuning-bert.txt:291,搜「BERT representation of the special」)。

  10. 出处:「Natural Language Inference: Fine-Tuning BERT」第 330-331 段(text/126-natural-language-inference-fine-tuning-bert.txt:330,搜「learned from scratch」)。