ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于预训练文本表示的下游 NLP 实战:情感分析与自然语言推断(d2l-en 章节全解)

基于预训练文本表示的下游 NLP 实战:情感分析与自然语言推断(d2l-en 章节全解) 文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载导读本篇文章围绕开源深度学习教材《Dive into Deep Learningd2l-en》中“自然语言处理应用”章节chapter_natural-language-processing-applications/index.md展开系统讲解如何将预训练文本表示GloVe、BERT接入各类深度学习架构解决真实的下游自然语言处理任务。全文以情感分析单文本分类与自然语言推断文本对关系判定两个代表性任务为主线覆盖从 IMDb/SNLI 数据集读取、双向 RNN 与 textCNN 建模、可分解注意力模型到 BERT 序列级/token 级微调的完整技术链路。读完后你将掌握数据加载管线load_data_imdb/load_data_snli的底层实现、RNN/CNN/Attention/MLP 四类架构的建模差异以及 BERT 在单文本分类、文本对分类、文本标注与问答四种应用上的最小架构改动方法能够独立复现并迁移到自己的下游 NLP 任务中。章节定位从“表示学习”到“下游应用”在本书的预训练章节chapter_natural-language-processing-pretraining/中我们已经掌握了如何表示文本序列中的 token并通过训练获得其表示例如词向量、BERT 的上下文表示。本章则回答一个更实际的问题这些预训练文本表示如何喂给不同模型去解决具体的自然语言处理任务。需要特别指出的是本书前面的章节其实已经“无预训练”地讨论过一些 NLP 应用目的是讲解深度学习架构本身在循环神经网络章节chapter_recurrent-neural-networks/用 RNN 设计语言模型生成小说风格的文本在现代循环网络章节chapter_recurrent-modern/与注意力机制与 Transformer 章节chapter_attention-mechanisms-and-transformers/基于 RNN 和注意力机制设计机器翻译模型。而本章并不打算面面俱到地覆盖所有应用而是聚焦一个核心命题如何把语言的深度表示学习应用到 NLP 问题上。基于预训练文本表示本章深入探索两个流行且具有代表性的下游任务任务分析对象代表应用情感分析Sentiment Analysis单条文本产品评论、博客评论、论坛讨论的情感极性判别自然语言推断Natural Language Inference文本对的关系信息检索、开放域问答中的文本蕴含判定从架构角度本章用MLP、CNN、RNN、Attention四类典型深度学习架构组合出若干代表性的“表示 × 架构”方案情感分析RNN 架构双向 LSTM GloVe与CNN 架构textCNN GloVe自然语言推断Attention MLP的可分解注意力模型通用方案微调预训练 BERT覆盖序列级单文本分类、文本对分类与 token 级文本标注、问答任务并以自然语言推断作为具体实战案例。为什么既要手工设计模型又要引入 BERT 微调因为 BERT 虽然只需极小的架构改动即可迁移到各种任务但代价是必须微调海量参数原始 BERT 两个版本分别有 1.1 亿与 3.4 亿参数。当空间或时间受限时基于 MLP、CNN、RNN、Attention 的轻量手工模型更为可行。这正是本章按“轻量模型 → BERT 微调”顺序编排的原因。情感分析任务定义与 IMDb 数据集为什么情感分析被建模为文本分类随着在线社交媒体与评论平台的普及大量带有观点的文本被记录下来对决策过程具有巨大的潜在价值。情感分析研究人们在文本产品评论、博客评论、论坛讨论中表达的情感广泛用于政治公众对政策的情绪、金融市场情绪、营销产品调研与品牌管理等领域。由于情感可以被归类为离散的极性或等级如“正面”和“负面”因此可以将情感分析视为文本分类任务把长度可变的文本序列变换为固定长度的文本类别。这是理解本章所有模型设计的关键前提。读取 IMDb 大电影评论数据集本章使用斯坦福大学发布的大规模电影评论数据集Large Movie Review Dataset进行情感分析。该数据集包含训练集和测试集各含 25000 条来自 IMDb 的电影评论两个集合中“正面”与“负面”标签各占一半代表不同的情感极性。在 sentiment-analysis-and-dataset.md 中数据读取分两步完成。首先通过 d2l 工具库注册数据源并下载解压到../data/aclImdb#tab all #save d2l.DATA_HUB[aclImdb] (d2l.DATA_URL aclImdb_v1.tar.gz, 01ada507287d82875905620988597833ad4e0903) data_dir d2l.download_extract(aclImdb, aclImdb)然后读取训练与测试数据每个样本是一条评论及其标签1 表示“正面”0 表示“负面”#tab all #save def read_imdb(data_dir, is_train): Read the IMDb review dataset text sequences and labels. ...对于原始实现d2l/torch.py 中的load_data_imdb(batch_size, num_steps500)完整展现了数据管线调用read_imdb读取文本与标签 → 用d2l.tokenize做分词 → 基于训练集以min_freq5构建词表Vocab→ 通过truncate_pad将所有评论填充/截断到固定长度num_steps500→ 用load_array封装成可批量迭代的训练/测试迭代器。注意num_steps默认值为 500这意味着超过 500 个 token 的评论会被截断短评论则用pad补齐这是后续 RNN/CNN 模型能批量化处理变长序列的基础。用双向 RNN 做情感分析GloVe BiLSTM在 sentiment-analysis-rnn.md 中作者选择与词相似度、类比任务一致的技术路线把预训练词向量用于情感分析。由于 IMDb 数据集规模不大使用大规模语料预训练的文本表示有助于缓解模型过拟合。BiRNN 模型预训练嵌入 双向 LSTM该方案用预训练 GloVe 表示每个 token将 token 表示送入多层双向 RNN 得到文本序列表示再接一个输出层得到情感分析结果。核心类BiRNN的实现逻辑如下PyTorch 版本与 MXNet 版本结构一致#tab pytorch class BiRNN(nn.Module): def __init__(self, vocab_size, embed_size, num_hiddens, num_layers, **kwargs): super(BiRNN, self).__init__(**kwargs) self.embedding nn.Embedding(vocab_size, embed_size) # Set bidirectional to True to get a bidirectional RNN self.encoder nn.LSTM(embed_size, num_hiddens, num_layersnum_layers, bidirectionalTrue) self.decoder nn.Linear(4 * num_hiddens, 2) def forward(self, inputs): # The shape of inputs is (batch size, no. of time steps). Because # LSTM requires its inputs first dimension to be the temporal # dimension, the input is transposed before obtaining token # representations. The output shape is (no. of time steps, batch size, # word vector dimension) embeddings self.embedding(inputs.T) self.encoder.flatten_parameters() # Returns hidden states of the last hidden layer at different time # steps. The shape of outputs is (no. of time steps, batch size, # 2 * no. of hidden units) outputs, _ self.encoder(embeddings) # Concatenate the hidden states at the initial and final time steps as # the input of the fully connected layer. Its shape is (batch size, # 4 * no. of hidden units) encoding torch.cat((outputs[0], outputs[-1]), dim1) outs self.decoder(encoding) return outs理解这个模型有三个关键点输入转置LSTM 要求第一个维度是时间维因此输入(batch size, no. of time steps)被转置为(no. of time steps, batch size, word vector dimension)序列表示取双向 LSTM最后一个隐藏层在初始时间步与最终时间步的隐藏状态拼接作为整个文本序列的表示双向结构使该表示同时蕴含前向与后向上下文信息。隐藏状态维度为2 * num_hiddens首尾拼接后得到4 * num_hiddens维向量输出层decoder是一个输出维度为 2 的全连接层对应“正面 / 负面”两个类别。实例化时采用两层隐藏层num_layers2嵌入维度与隐藏单元数均为 100并使用d2l.try_all_gpus()自动选择可用设备#tab all embed_size, num_hiddens, num_layers, devices 100, 100, 2, d2l.try_all_gpus() net BiRNN(len(vocab), embed_size, num_hiddens, num_layers)训练完成后可用 d2l/torch.py 中的predict_sentiment(net, vocab, sequence)对任意文本序列做推理将文本按词表映射为张量经网络前向计算后取argmax返回positive或negative。该函数对零样本泛化也有参考价值——即使没有见过的词也会被词表映射到未知 token。用 textCNN 做情感分析1D 卷积 GloVe在 sentiment-analysis-cnn.md 中作者引入一个与 BiRNN 方案架构不同、其余完全一致的对照模型——textCNNKim, 2014。其核心思想是把文本序列视为一维图像用一维 CNN 处理文本中的局部特征即 n-gram。相比图片章节的二维 CNN 处理相邻像素这里的“相邻”就是文本中相邻的 token。一维互相关运算的底层实现在进入模型之前章节先夯实一维卷积的基础——它本质上是基于互相关运算的二维卷积的特例。一维情况下卷积窗口在输入张量上从左向右滑动窗口内输入子张量与卷积核张量逐元素相乘后求和得到输出张量对应位置的标量。其最小实现如下#tab all def corr1d(X, K): w K.shape[0] Y d2l.zeros((X.shape[0] - w 1)) for i in range(Y.shape[0]): Y[i] (X[i: i w] * K).sum() return Y例如输入X [0, 1, 2, 3, 4, 5, 6]、核K [1, 2]时第一个输出元素为0×11×22。对于多输入通道的一维输入卷积核需要与输入具有相同数量的输入通道对每个通道分别做一维互相关再把各通道结果求和得到一维输出张量。实现为corr1d_multi_insum(corr1d(x, k) for x, k in zip(X, K))。一个值得注意的数学事实多输入通道的一维互相关等价于单输入通道的二维互相关——只需让二维卷积核的高度与输入张量相同即可。这一等价关系在 conv1d-2d.svg 对应插图 中有演示将文本局部特征提取与图像卷积统一了起来是理解 textCNN 结构设计的钥匙。textCNN 模型textCNN 与 BiRNN 的唯一区别在于架构选择用一维 CNN 替代双向 RNN 作为序列编码器嵌入层同样接入预训练 GloVe。textCNN 通常使用多个不同宽度对应不同 n-gram 窗口大小的一维卷积核对文本并行做特征提取再经池化汇总成固定长度表示最后接全连接输出层完成情感分类。该模型训练流程与 BiRNN 相同batch_size 64数据来自d2l.load_data_imdb(batch_size)。自然语言推断任务定义与 SNLI 数据集情感分析只解决“单文本序列分类”但当我们需要判断一个句子能否从另一个句子推断出来或通过识别语义等价句来消除冗余时单文本分类就不够用了——必须对文本对进行推理。这正是 natural-language-inference-and-dataset.md 引入的主题。NLI 的三类逻辑关系自然语言推断研究假设hypothesis能否从前提premise中推断出来其中两者都是文本序列它判定一对文本序列之间的逻辑关系通常归为三类蕴含Entailment假设可以从前提推断出来矛盾Contradiction可以从前提推断出假设的否定中立项Neutral其余所有情况。自然语言推断也被称为“文本蕴含识别”recognizing textual entailment。章节给出三个经典示例前提Two women are hugging each other.两个女人正在互相拥抱。 假设Two women are showing affection.两个女人正在表达爱意。 标签蕴含“拥抱”中可以推断出“表达爱意”。前提A man is running the coding example from Dive into Deep Learning.一个男人正在运行《动手学深度学习》的代码示例。 假设The man is sleeping.这个男人正在睡觉。 标签矛盾“运行代码”表示“没在睡觉”。前提The musicians are performing for us.音乐家们正在为我们表演。 假设The musicians are famous.音乐家们很有名。 标签中立从“为我们表演”既不能推断出“有名”也不能推断出“不出名”。NLI 一直是自然语言理解的核心课题应用广泛涵盖信息检索到开放域问答。SNLI 数据集与加载管线研究 NLI 的基准数据集是斯坦福自然语言推断语料库SNLI包含超过 50 万条带标签的英文句子对Bowman et al., 2015。数据集下载解压后存放在../data/snli_1.0#tab pytorch #save d2l.DATA_HUB[SNLI] ( https://nlp.stanford.edu/projects/snli/snli_1.0.zip, 9fcde07509c7e87ec61c640c1b2753d9041758e4) data_dir d2l.download_extract(SNLI)d2l/torch.py 中的load_data_snli(batch_size, num_steps50)给出了完整管线下载解压后read_snli读取前提、假设与标签entailment→0、contradiction→1、neutral→2并用正则去除括号信息、合并连续空白然后构建SNLIDataset把前提与假设分别填充/截断到num_steps50默认值训练集构建词表后测试集复用该词表最后用DataLoadershuffle、多进程num_workers返回训练/测试迭代器与词表。推理侧对应 d2l/torch.py 的predict_snli(net, vocab, premise, hypothesis)输入前提与假设张量输出entailment/contradiction/neutral之一。用注意力与 MLP 做自然语言推断可分解注意力模型在 natural-language-inference-attention.md 中作者实现 Parikh et al. (2016) 提出的可分解注意力模型decomposable attention model。该模型不含循环层与卷积层当时以远少得多的参数在 SNLI 上取得了最佳结果是对“复杂深层架构”的一种高效替代。三阶段流程Attending → Comparing → Aggregating与保留 token 顺序的做法相比更简单的思路是把一条文本序列中的 token 与另一条中的每个 token 对齐反过来也做一次然后比较并聚合这些信息来预测逻辑关系。与机器翻译中源/目标句的 token 对齐类似这里前提与假设的 token 对齐可以优雅地由注意力机制完成。整个模型由三个联合训练的阶段构成阶段一Attending软对齐。设前提 $\mathbf{A} (\mathbf{a}_1, \ldots, \mathbf{a}_m)$ 与假设 $\mathbf{B} (\mathbf{b}_1, \ldots, \mathbf{b}_n)$其中 $\mathbf{a}_i, \mathbf{b}_j \in \mathbb{R}^{d}$ 为 $d$ 维词向量。软对齐的注意力权重计算为$$e_{ij} f(\mathbf{a}_i)^\top f(\mathbf{b}_j),$$其中 $f$ 是一个 MLP输出维度由num_hiddens参数指定与直接把原始词向量做点积相比先用 MLP 变换能提升对齐的表示能力。举例来说前提 “i do need sleep”、假设 “i am tired”理想的软对齐会倾向于把假设中的 “i” 与前提中的 “i”、把 “tired” 与 “sleep” 关联起来——软对齐以加权平均的方式实现理想情况下大权重落在应被对齐的 token 上。MLP 的实现MXNet 版本如下#tab mxnet def mlp(num_hiddens, flatten): net nn.Sequential() net.add(nn.Dropout(0.2)) net.add(nn.Dense(num_hiddens, activationrelu, flattenflatten)) net.add(nn.Dropout(0.2)) net.add(nn.Dense(num_hiddens, activationrelu, flattenflatten)) return net阶段二Comparing比较。在获得对齐信息后将一条序列的每个 token 与另一条序列的对齐结果做逐元素比较同样经由 MLP 变换得到“比较后的”token 级向量。阶段三Aggregating聚合。对比较结果做求和或加权聚合得到整个文本对的定长向量再通过全连接层输出蕴含/矛盾/中立的分布。整个过程无需 RNN 或 CNN参数开销小、易于并行。该模型的关键启示是注意力不仅用于 Transformer 等大规模模型也可以作为轻量 NLI 建模的核心机制是“表示GloVe× 架构Attention MLP”组合的代表。微调 BERT序列级与 token 级应用手工为每个 NLP 任务定制模型在实践中不可行而 finetuning-bert.md 介绍的 BERT 只需极小的架构改动即可服务多种任务。BERT 提出时刷新了多个 NLP 任务的最优结果但代价是需要微调大量参数原始 BERT base 约 1.1 亿参数large 约 3.4 亿参数因此适用于计算资源充足的场景。微调时BERT 跨应用所需的“最小架构改动”是额外的全连接层下游任务的监督学习过程中额外层参数从头学习而预训练 BERT 的全部参数被微调。按输出粒度应用被划分为两类序列级单文本分类与文本对分类/回归单文本分类以单条文本序列为输入输出分类结果。除了本章的情感分析语言学可接受性语料CoLA也是典型数据集——判断句子在语法上是否可接受如 “I should study.” 可接受而 “I should studying.” 不可接受。BERT 的输入表示见 bert-one-seq.svg 插图能无歧义地表示单文本与文本对特殊分类 tokencls用于序列分类特殊 tokensep标记单文本的结束或分隔一对文本。在单文本分类中cls的 BERT 表示编码了整个输入文本序列的信息作为该文本的表示送入由全连接层构成的小型 MLP输出各离散标签值的分布。文本对分类以一对文本为输入并分类本章的自然语言推断即属此类。文本对回归则以一对文本为输入、输出连续值语义文本相似度Semantic Textual SimilaritySTS是典型任务STS Benchmark 中句子对的相似度分数是 0无意义重叠到 5意义等价的序数尺度。三个示例为“A plane is taking off.” vs “An air plane is taking off.” → 5.000“A woman is eating something.” vs “A woman is eating meat.” → 3.000“A woman is dancing.” vs “A man is talking.” → 0.000。与单文本分类相比见 bert-two-seqs.svg 插图文本对分类在输入表示上不同两段文本以sep分隔打包文本对回归只需把输出改为连续标签值并使用均方误差损失改动很小。token 级文本标注与问答文本标注text tagging为每个 token 分配一个标签典型任务是词性标注part-of-speech tagging。例如按 Penn Treebank II 标签集句子 “John Smith s car is new” 应标注为 “NNP专有名词单数NNP POS所有格结尾NN名词单数或集合VB动词原形JJ形容词”。与单文本分类唯一的区别见 bert-tagging.svg 插图文本标注中输入文本的每个 token 的 BERT 表示都被送入同一个额外的全连接层输出该 token 的标签。**问答question answering**是另一类 token 级应用反映阅读理解能力。斯坦福问答数据集SQuAD v1.1由阅读段落与问题构成每个问题的答案就是段落中的一个文本片段text span。例如段落 “Some experts report that a masks efficacy is inconclusive. However, mask makers insist that their products, such as N95 respirator masks, can guard against the virus.” 与问题 “Who say that N95 respirator masks can guard against the virus?”答案是片段 “mask makers”。SQuAD v1.1 的目标是给定问题-段落对预测段落中文本片段的起点与终点。微调方式见 bert-qa.svg 插图问题与段落分别作为 BERT 输入的第一、第二文本序列打包。预测起点时一个额外的全连接层把段落中位置 $i$ 的任意 token 的 BERT 表示变换为标量分数 $s_i$全部段落 token 的分数经 softmax 转为概率分布得到位置 $i$ 是片段起点的概率 $p_i$预测终点的方式相同但其额外全连接层的参数与起点预测相互独立得到分数 $e_i$。监督学习的训练目标很简单——最大化真实起点与终点位置的对数似然预测片段时对满足 $i \leq j$ 的合法片段计算分数 $s_i e_j$输出得分最高的片段。实战案例微调 BERT 做自然语言推断natural-language-inference-bert.md 把前文的注意力方案与 BERT 微调结合起来NLI 属于序列级文本对分类问题按 finetuning-bert.md 的结论微调 BERT 只需附加一个基于 MLP 的架构即可。本节下载一个预训练的小型 BERT然后在 SNLI 数据集上微调。加载预训练 BERT本书此前已在 WikiText-2 上讲解如何预训练 BERT见 bert-dataset.md 与 bert-pretraining.md注意原始 BERT 在更大的语料上预训练。由于原始 BERT 模型有上亿参数本书提供两个版本的预训练权重bert.base规模与原始 BERT base 相当微调需要较多计算资源bert.small小型版本便于演示。#tab mxnet d2l.DATA_HUB[bert.base] (d2l.DATA_URL bert.base.zip, 7b3820b35da691042e5d34c0971ac3edbd80d3f4)加载后为序列级文本对分类在 BERT 之上附加 MLP 输出层将cls表示映射到蕴含/矛盾/中立三类分布在 SNLI 训练集上微调 BERT 的全部参数与附加层参数并用predict_snli验证推理效果。该案例也示范了章节的核心方法论“预训练表示 最小化任务适配层”是资源充足场景下的通用解法与 RNN/CNN/Attention 手工模型形成互补。本章脉络与源码索引主题对应文档仓库中的关键实现章节总览index.md—IMDb 数据集读取sentiment-analysis-and-dataset.mdd2l/torch.py 中load_data_imdb、read_imdbRNN 情感分析sentiment-analysis-rnn.mdd2l/torch.py 中predict_sentimenttextCNN 情感分析sentiment-analysis-cnn.md一维互相关corr1d、多通道corr1d_multi_inSNLI 数据集natural-language-inference-and-dataset.mdd2l/torch.py 中load_data_snli、read_snli注意力 NLInatural-language-inference-attention.mdd2l/torch.py 中predict_snliBERT 序列/token 级微调finetuning-bert.mdBERT 输入表示与额外全连接层BERT 微调做 NLInatural-language-inference-bert.mdd2l.DATA_HUB[bert.base]/bert.small权重对多框架实现感兴趣的读者可在 d2l/torch.py、d2l/mxnet.pyload_data_imdb/load_data_snli位于各自文件约 L2484/L2565 处、d2l/tensorflow.py 与 d2l/jax.py 中对比同一功能在不同框架下的等价实现其中download_extract、try_all_gpus等工具函数也定义于这些模块中。小结与选型建议本章给出了下游 NLP 建模的完整决策框架数据侧IMDb单文本分类50000 条评论正负各半与 SNLI文本对三分类50 万 句子对是两类代表性基准d2l 库统一封装了下载、解压、分词、建词表、截断填充与批量迭代的全流程默认num_steps分别为 500 与 50架构侧同一任务可用不同架构达成——双向 RNN 通过首尾隐藏状态拼接编码全文textCNN 用一维卷积捕捉 n-gram 局部特征可分解注意力模型用“对齐-比较-聚合”三阶段处理文本对而 BERT 微调以附加全连接层适配序列级单文本/文本对分类回归与 token 级标注/问答任务资源权衡空间或时间受限时选轻量的手工模型GloVe RNN/CNN/Attention资源充足时优先 BERT 微调以获得更强的表示能力核心思想本章的主线并非枚举应用而是示范如何将预训练文本表示与不同深度学习架构组合、针对下游任务设计模型——这一“表示 × 架构 × 任务”的复用范式正是将预训练模型规模化落地到业务场景的通用方法论。赞分享文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载相关推荐d2l-en 实战基于 WikiText-2 预训练 BERT掩码语言建模 下一句预测d2l en 实战基于 WikiText 2 预训练 BERT掩码语言建模 下一句预测 本篇技术指南以《动手学深度学习》d2l en仓库中 ber文档教程人工智能深度学习NLP计算机视觉强化学习自然语言处理预训练d2l-en从 word2vec、GloVe 到 BERT 的完整实战指南自然语言处理预训练d2l en从 word2vec、GloVe 到 BERT 的完整实战指南 本文基于开源交互式深度学习教材 d2l en 的「Natur文档教程人工智能深度学习NLP计算机视觉强化学习基于注意力机制的自然语言推理模型解析d2l-ai/d2l-en项目基于注意力机制的自然语言推理模型解析d2l ai/d2l en项目 自然语言推理Natural Language Inference, NLI是自然语言文档教程人工智能深度学习NLP计算机视觉强化学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表