预训练语言模型及其在自然语言推理中的应用

立即解锁
发布时间: 2025-09-03 01:50:13 阅读量: 12 订阅数: 15 AIGC
PDF

实战自然语言处理精要

### 预训练语言模型及其在自然语言推理中的应用 在自然语言处理(NLP)领域,预训练语言模型(PLM)发挥着至关重要的作用。下面将介绍几种常见的预训练语言模型,并通过一个自然语言推理的案例来展示如何使用这些模型。 #### 其他预训练语言模型 ##### ELMo ELMo(Embeddings from Language Models)能够为广泛的NLP任务提供上下文相关的词嵌入,这些任务包括情感分析、命名实体识别和问答系统等。尽管Hugging Face的Transformers库中未实现ELMo,但可以借助AllenNLP较为轻松地使用它。不过,如今ELMo在研究和实际应用中已不常被使用,因为它早于BERT(以及Transformer架构的出现),并且现在有其他性能更优且广泛可用的PLM,如BERT。 ##### XLNet XLNet于2019年被提出,是BERT的重要继任者,常被视为目前最强大的PLM之一。它主要解决了BERT训练过程中的两个问题: 1. **训练 - 测试偏差问题**:BERT在预训练时采用掩码语言模型(MLM)目标,训练时需准确预测掩码标记,而预测时输入句子中并无掩码,这导致训练和测试阶段模型接触的信息存在差异,产生了训练 - 测试偏差。 2. **掩码独立性问题**:当输入中有多个[MASK]标记时,BERT会并行预测这些标记。虽然在某些情况下这种方法可行,但在一些复杂例子中,如 “The Statue of [MASK] in [MASK] [MASK]”,并行预测无法让模型学习到一些不合理的组合,因为这些预测是相互独立的。这涉及到自然语言的多模态性,即独立做出的最佳决策组合不一定能得到全局最优决策,这也是自然语言生成中的一大挑战。 为解决这些问题,XLNet采用随机顺序生成缺失标记的方式。例如,先生成 “New”,这能为后续的 “York” 和 “Liberty” 提供线索。而且,预测仍然基于之前生成的所有标记。XLNet已在Transformers库中实现,只需对代码进行少量修改即可使用。 ##### RoBERTa RoBERTa(Robustly Optimized BERT)是另一个在研究和工业界常用的重要PLM。它重新审视并修改了BERT的许多训练决策,使其在下游NLP任务中的表现与甚至超越了一些后BERT时代的PLM,如XLNet。截至2020年年中,RoBERTa是仅次于BERT被引用最多的PLM,在许多英文下游NLP任务中表现出强大的鲁棒性。 RoBERTa对BERT进行了多项改进: 1. **增加训练数据量**:RoBERTa的开发者收集了五个不同规模和领域的英文语料库,总文本量超过160GB,而BERT训练仅使用了16GB的数据。更多的训练数据使RoBERTa在微调后的下游任务中表现优于一些其他强大的PLM。 2. **去除下一句预测(NSP)目标**:RoBERTa的开发者发现NSP目标基本无用,因此去除了该目标,仅使用MLM目标进行训练,结果显示下游任务的性能保持不变或略有提升。 3. **调整其他训练参数**:还重新审视了批量大小和MLM的掩码方式。综合这些改进,RoBERTa在问答和阅读理解等下游任务中取得了最先进的成果。由于RoBERTa与BERT架构相同且都在Transformers库中实现,若应用已使用BERT,切换到RoBERTa非常容易。 类似地,跨语言语言模型XLM有其 “鲁棒优化” 版本XLM - R,它在100种语言上进行预训练,在许多跨语言NLP任务中表现出色。 ##### DistilBERT 虽然BERT和RoBERTa等预训练模型功能强大,但计算成本高昂,无论是预训练、微调还是预测阶段。例如,BERT - base有1.1亿个参数,BERT - large有3.4亿个参数,几乎每个输入都要经过庞大的网络进行预测。在一些计算资源有限的环境中,如移动设备上进行实时文本分析,BERT并非理想选择。 为降低现代大型神经网络的计算需求,常采用知识蒸馏技术。该技术以一个大的预训练模型(教师模型)为基础,训练一个较小的模型(学生模型)来模仿教师模型的行为。学生模型使用掩码语言模型(MLM)损失以及教师和学生之间的交叉熵损失进行训练,以使其对预测标记的概率分布尽可能接近教师模型。 Hugging Face的研究人员开发了BERT的蒸馏版本DistilBERT,它的参数比BERT小40%,速度快60%,同时保留了BERT 97%的任务性能。使用DistilBERT时,只需将传递给AutoModel.from_pretrained()的BERT模型名称(如 “bert - base - cased”)替换为蒸馏版本(如 “distilbert - base - cased”),其余代码保持不变。 ##### ALBERT ALBERT(A Lite BERT)是另一个解决BERT计算复杂度问题的预训练语言模型。它没有采用知识蒸馏,而是对模型和训练过程进行了一些改变: 1. **分解词嵌入查找**:在大多数深度NLP模型中,词嵌入通常存储在一个大的查找表中,每个词对应一个词嵌入向量。对于基于Transformer的模型如BERT,输入的维度通常与隐藏状态的维度相同,如768维,这使得查找表变得非常大,占用大量内存和计算资源。ALBERT将词嵌入查找分解为两个阶段,先将词嵌入向量的输出维度缩小(如128维),再通过线性层将其扩展到所需的输入维度(如768维)。这样,ALBERT只需存储两个较小的查找表(V × 128和128 × 768),而不是一个大的查找表(V × 768)。 2. **参数共享**:Transformer模型使用一系列自注意力层来转换输入向量,每层的转换方式通常不同,这意味着模型需要为每层保留所有必要的参数,成本较高。ALBERT的各层共享同一组参数,即对输入重复应用相同的转换。这些参数经过调整,使得即使转换相同,也能有效地预测目标。 3. **采用句子顺序预测(SOP)目标**:ALBERT在预训练时采用句子顺序预测(SOP)目标,而非BERT采用的下一句预测(NSP)目标。一些研究发现NSP目标基本无用,而SOP任务要求模型预测两个连续文本片段的顺序,这有助于模型学习到语篇级别的连贯性。通过这些改进,ALBERT能够扩大训练规模,以更少的参数超越了BERT - large的性能。与DistilBERT类似,ALBERT的模型架构与BERT几乎相同,只需在调用AutoModel.from_pretrained()时提供模型名称(如 “albert - base - v1”)即可使用。 #### 自然语言推理案例研究 ##### 什么是自然语言推理? 自然语言推理(NLI)是指确定一对句子之间逻辑关系的任务。给定一个前提句子和一个假设句子,需要判断假设是否能从前提中逻辑推导出来。以下是一些示例: | 前提 | 假设 | 标签 | | --- | --- | --
corwn 最低0.47元/天 解锁专栏
买1年送3月
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

张_伟_杰

人工智能专家
人工智能和大数据领域有超过10年的工作经验,拥有深厚的技术功底,曾先后就职于多家知名科技公司。职业生涯中,曾担任人工智能工程师和数据科学家,负责开发和优化各种人工智能和大数据应用。在人工智能算法和技术,包括机器学习、深度学习、自然语言处理等领域有一定的研究
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

时间序列、因果关系与文本挖掘:从理论到实践

# 时间序列、因果关系与文本挖掘:从理论到实践 ## 1. 时间序列与因果关系 时间在机器学习和分析领域至关重要。在分析时间序列时,我们需要注意常见的陷阱,并掌握相应的解决方法。以全球温度异常和人类二氧化碳排放为例,我们进行了单变量和双变量时间序列分析。同时,运用格兰杰因果检验来判断大气中二氧化碳水平是否会导致地表温度异常。结果发现,从二氧化碳到温度的格兰杰因果检验的 p 值大于 0.05 但小于 0.10,这表明格兰杰因果检验是研究机器学习问题中因果关系的有效工具。 此外,时间序列分析还有很多值得深入探索的领域,如变化点检测、时间序列分解、非线性预测等,这些方法虽不常被视为机器学习的常用

Vim与Source命令的高效使用指南

### Vim与Source命令的高效使用指南 #### 1. Vim代码片段管理 在Vim中,我们可以创建代码片段文件,以便在编辑时快速插入常用代码。以下是具体步骤: 1. **创建代码片段存储目录**: ```sh [me@linuxbox ~]$ mkdir ~/.vim/snippets [me@linuxbox ~]$ exit ``` 2. **复制文本并创建代码片段文件**: - 在可视模式下高亮并复制文本。 - 打开新缓冲区创建代码片段文件: ``` :e ~/.vim/snippets/gpl.

PHP编程基础与常用操作详解

### PHP编程基础与常用操作详解 #### 1. 变量运算与操作符 在PHP中,变量的运算和操作符的使用是基础且重要的部分。例如: ```php $i += 10; // $i is 110 $i = $i / 2; // $i is 55 $j = $i; // both $j and $i are 55 $i = $j % 11; // $i is 0 ``` 最后一行使用了取模运算符 `%`,它的作用是将左操作数除以右操作数并返回余数。这里 `$i` 为 55,55 除以 11 正好 5 次,没有余数,所以结果为 0。 字符串连接运算符是一个句点 `.`,它的作用是将字符串连接在

VisualStudioCode与Git的源代码控制

# Visual Studio Code与Git的源代码控制 ## 1. 软件开发中的协作与Visual Studio Code的支持 软件开发通常离不开协作,无论你是开发团队的一员、参与开源项目,还是与客户有交互的独立开发者,协作都是必不可少的。微软大力支持协作和开源,因此Visual Studio Code提供了一个基于Git的集成源代码控制系统,并且可以扩展到其他版本控制服务提供商。 这个系统不仅包含了Visual Studio Code中开箱即用的用于源代码协作的集成工具,还可以通过使用一些扩展来提升工作效率。这些扩展能帮助你更好地审查代码,并将工作成果推送到基于Git的服务,如A

x64指令集部分指令详解

# x64指令集部分指令详解 ## 1. ROL/ROR指令 ### 1.1 影响的标志位 |标志位|含义| | ---- | ---- | |O|溢出标志(OF)| |D|方向标志(DF)| |I|中断标志(IF)| |T|陷阱标志(TF)| |S|符号标志(SF)| |Z|零标志(ZF)| |A|辅助进位标志(AF)| |P|奇偶标志(PF)| |C|进位标志(CF)| 其中,ROL和ROR指令会影响OF和CF标志位,具体如下: - ROL:每次移位操作时,最左边的位会复制到CF。 - ROR:每次移位操作时,最右边的位会复制到CF。 - OF:只有按1位移位的形式会修改OF,按CL移

数据处理与非关系型数据库应用指南

### 数据处理与非关系型数据库应用指南 #### 1. 数据转换与处理 在数据处理过程中,有时需要将 CSV 文件转换为 XML 文档,且 XML 文档可能需符合 XML 模式,甚至要遵循用于商业报告的 XBRL 标准(https://en.wikipedia.org/wiki/XBRL )。 数据转换可以涉及两个或更多数据源,以创建一个新的数据源,其属性需符合所需格式。以下是仅涉及两个数据源 A 和 B 的四种数据转换场景,A、B 数据合并生成数据源 C,且 A、B、C 可以有不同的文件格式: - 包含 A 的所有属性和 B 的所有属性。 - 包含 A 的所有属性和 B 的部分属性。

深入理解块层I/O处理与调度及SCSI子系统

### 深入理解块层 I/O 处理与调度及 SCSI 子系统 #### 1. I/O 调度器概述 I/O 调度是块层的关键功能。当读写请求经过虚拟文件系统的各层后,最终会到达块层。块层有多种 I/O 调度器,不同调度器适用于不同场景。 #### 2. 常见 I/O 调度器及其适用场景 | 使用场景 | 推荐的 I/O 调度器 | | --- | --- | | 桌面 GUI、交互式应用和软实时应用(如音频和视频播放器) | BFQ,可保证对时间敏感应用的良好系统响应性和低延迟 | | 传统机械驱动器 | BFQ 或 MQ - deadline,两者都适合较慢的驱动器,Kyber/none

利用Terraform打造完美AWS基础设施

### 利用 Terraform 打造完美 AWS 基础设施 #### 1. 建立设计框架 在明确基础设施需求后,下一步是建立一个设计框架来指导开发过程。这包括定义用于构建基础设施的架构原则、标准和模式。使用诸如 Terraform 之类的基础设施即代码(IaC)工具,有助于建立一致的设计框架,并确保基础设施达到高标准。 建立设计框架时,有以下重要考虑因素: - 为应用程序或工作负载选择合适的架构风格,如微服务、无服务器或单体架构。 - 根据已定义的需求和设计原则,选择合适的 AWS 服务和组件来构建基础设施。 - 定义基础设施不同组件之间的关系和依赖,以确保它们能平稳高效地协同工作。 -

打造零食推送机器人:从代码实现到硬件采购指南

# 打造零食推送机器人:从代码实现到硬件采购指南 ## 1. 创建零食推送应用 在构建零食推送应用时,我们已经完成了部分代码编写,以下是相关代码: ```html {% for item in items %} <button formaction="{{ item['code'] }}"> {{ item['icon'] }}<br> {{ item['code'] }} </button> {% end %} </form> </body> </html> ``` 现在,应用的大部分功能已就绪,可以开始运行并测试其部分功能。操作步骤如下:

Linux终端实用工具与技巧

# Linux 终端实用工具与技巧 ## 1. gnuplot 绘图与导出 ### 1.1 绘制方程图形 任何方程都可以用特定方式绘制图形。例如,一个斜率为 5、y 轴截距为 3 的直线方程,可使用以下命令生成图形: ```bash plot 5*x + 3 ``` ### 1.2 导出图形为图像文件 虽然能在终端显示图表,但多数情况下,我们希望将图表导出为图像,用于报告或演示。可按以下步骤将 gnuplot 设置为导出图像文件: 1. 切换到 png 模式: ```bash set terminal png ``` 2. 指定图像文件的输出位置,否则屏幕将显示未处理的原始 png 数据: