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

立即解锁
发布时间: 2025-09-03 01:50:13 阅读量: 10 订阅数: 13 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文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

信息系统集成与测试实战

### 信息系统集成与测试实战 #### 信息系统缓存与集成 在实际的信息系统开发中,性能优化是至关重要的一环。通过使用 `:timer.tc` 函数,我们可以精确测量执行时间,从而直观地看到缓存机制带来的显著性能提升。例如: ```elixir iex> :timer.tc(InfoSys, :compute, ["how old is the universe?"]) {53, [ %InfoSys.Result{ backend: InfoSys.Wolfram, score: 95, text: "1.4×10^10 a (Julian years)\n(time elapsed s

Ansible高级技术与最佳实践

### Ansible高级技术与最佳实践 #### 1. Ansible回调插件的使用 Ansible提供了多个回调插件,可在响应事件时为Ansible添加新行为。其中,timer插件是最有用的回调插件之一,它能测量Ansible剧本中任务和角色的执行时间。我们可以通过在`ansible.cfg`文件中对这些插件进行白名单设置来启用此功能: - **Timer**:提供剧本执行时间的摘要。 - **Profile_tasks**:提供剧本中每个任务执行时间的摘要。 - **Profile_roles**:提供剧本中每个角色执行时间的摘要。 我们可以使用`--list-tasks`选项列出剧

开源安全工具:Vuls与CrowdSec的深入剖析

### 开源安全工具:Vuls与CrowdSec的深入剖析 #### 1. Vuls项目简介 Vuls是一个开源安全项目,具备漏洞扫描能力。通过查看代码并在本地机器上执行扫描操作,能深入了解其工作原理。在学习Vuls的过程中,还能接触到端口扫描、从Go执行外部命令行应用程序以及使用SQLite执行数据库操作等知识。 #### 2. CrowdSec项目概述 CrowdSec是一款开源安全工具(https://github.com/crowdsecurity/crowdsec ),值得研究的原因如下: - 利用众包数据收集全球IP信息,并与社区共享。 - 提供了值得学习的代码设计。 - Ge

轻量级HTTP服务器与容器化部署实践

### 轻量级 HTTP 服务器与容器化部署实践 #### 1. 小需求下的 HTTP 服务器选择 在某些场景中,我们不需要像 Apache 或 NGINX 这样的完整 Web 服务器,仅需一个小型 HTTP 服务器来测试功能,比如在工作站、容器或仅临时需要 Web 服务的服务器上。Python 和 PHP CLI 提供了便捷的选择。 ##### 1.1 Python 3 http.server 大多数现代 Linux 系统都预装了 Python 3,它自带 HTTP 服务。若未安装,可使用包管理器进行安装: ```bash $ sudo apt install python3 ``` 以

实时资源管理:Elixir中的CPU与内存优化

### 实时资源管理:Elixir 中的 CPU 与内存优化 在应用程序的运行过程中,CPU 和内存是两个至关重要的系统资源。合理管理这些资源,对于应用程序的性能和可扩展性至关重要。本文将深入探讨 Elixir 语言中如何管理实时资源,包括 CPU 调度和内存管理。 #### 1. Elixir 调度器的工作原理 在 Elixir 中,调度器负责将工作分配给 CPU 执行。理解调度器的工作原理,有助于我们更好地利用系统资源。 ##### 1.1 调度器设计 - **调度器(Scheduler)**:选择一个进程并执行该进程的代码。 - **运行队列(Run Queue)**:包含待执行工

PowerShell7在Linux、macOS和树莓派上的应用指南

### PowerShell 7 在 Linux、macOS 和树莓派上的应用指南 #### 1. PowerShell 7 在 Windows 上支持 OpenSSH 的配置 在 Windows 上使用非微软开源软件(如 OpenSSH)时,可能会遇到路径问题。OpenSSH 不识别包含空格的路径,即使路径被单引号或双引号括起来也不行,因此需要使用 8.3 格式(旧版微软操作系统使用的短文件名格式)。但有些 OpenSSH 版本也不支持这种格式,当在 `sshd_config` 文件中添加 PowerShell 子系统时,`sshd` 服务可能无法启动。 解决方法是将另一个 PowerS

容器部署与管理实战指南

# 容器部署与管理实战指南 ## 1. 容器部署指导练习 ### 1.1 练习目标 在本次练习中,我们将使用容器管理工具来构建镜像、运行容器并查询正在运行的容器环境。具体目标如下: - 配置容器镜像注册表,并从现有镜像创建容器。 - 使用容器文件创建容器。 - 将脚本从主机复制到容器中并运行脚本。 - 删除容器和镜像。 ### 1.2 准备工作 作为工作站机器上的学生用户,使用 `lab` 命令为本次练习准备系统: ```bash [student@workstation ~]$ lab start containers-deploy ``` 此命令将准备环境并确保所有所需资源可用。 #

基于属性测试的深入解析与策略探讨

### 基于属性测试的深入解析与策略探讨 #### 1. 基于属性测试中的收缩机制 在基于属性的测试中,当测试失败时,像 `stream_data` 这样的框架会执行收缩(Shrinking)操作。收缩的目的是简化导致测试失败的输入,同时确保简化后的输入仍然会使测试失败,这样能更方便地定位问题。 为了说明这一点,我们来看一个简单的排序函数测试示例。我们实现了一个糟糕的排序函数,实际上就是恒等函数,它只是原封不动地返回输入列表: ```elixir defmodule BadSortTest do use ExUnit.Case use ExUnitProperties pro

构建交互式番茄钟应用的界面与功能

### 构建交互式番茄钟应用的界面与功能 #### 界面布局组织 当我们拥有了界面所需的所有小部件后,就需要对它们进行逻辑组织和布局,以构建用户界面。在相关开发中,我们使用 `container.Container` 类型的容器来定义仪表盘布局,启动应用程序至少需要一个容器,也可以使用多个容器来分割屏幕和组织小部件。 创建容器有两种方式: - 使用 `container` 包分割容器,形成二叉树布局。 - 使用 `grid` 包定义行和列的网格。可在相关文档中找到更多关于 `Container API` 的信息。 对于本次开发的应用,我们将使用网格方法来组织布局,因为这样更易于编写代码以

RHEL9系统存储、交换空间管理与进程监控指南

# RHEL 9 系统存储、交换空间管理与进程监控指南 ## 1. LVM 存储管理 ### 1.1 查看物理卷信息 通过 `pvdisplay` 命令可以查看物理卷的详细信息,示例如下: ```bash # pvdisplay --- Physical volume --- PV Name /dev/sda2 VG Name rhel PV Size <297.09 GiB / not usable 4.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 76054 Free PE 0 Allocated PE 76054