BERT 模型微调实战:使用Transformers微调BERT模型实现问答和文本分类任务

BERT模型—2.BERT模型预训练与微调 文章目录引言一、预训练语言模型1.为什么要进行预训练? 引言   本节将按照思维导图逐步了解BERT语言模型(基于transformer的网络结构)。 一、预训练语言模型   大规模的预训练语言模型的模型参数量呈几何倍数的增长趋势。下面我们了解BERT预训练的原理。 1.为什么要进行预训练?   基于词向量的预训练方式并不是在BERT中首次出现。 ... 阅读详情

一、BERT介绍

BERT(Bidirectional Encoder Representations from Transformers)是一种预训练的自然语言处理模型,由Google于2018年发布。BERT模型的核心是Transformer编码器,它可以在大规模语料库上进行无监督预训练,然后通过微调在各种NLP任务上进行微调。BERT模型是一种双向的深度学习模型,它可以同时考虑上下文中的所有单词,从而更好地理解句子的含义。BERT模型已被证明在多项NLP任务上取得了最佳结果,包括问答、文本分类、命名实体识别等。

  • BERT是一种基于深度神经网络的自然语言理解模型,它可以从大规模的无标注文本中学习语言的语义和结构。

  • BERT的创新之处在于它使用了双向的Transformer编码器,可以同时考虑左右两个方向的上下文信息,从而捕捉到更丰富的语言特征。

  • BERT的预训练任务包括MLM和NSP,分别用于学习词汇和句子级别的表示。MLM是一种完形填空任务,它随机地将输入文本中的一些词替换为特殊符号[MASK],然后让模型预测被遮盖的词。NSP是一种二分类任务,它给定两个句子,让模型判断它们是否是连续的。

  • BERT在多种自然语言处理任务上都取得了显著的提升,例如问答、情感分析、命名实体识别、文本分类等。BERT不仅提高了模型的性能,也简化了模型的微调过程,只需要在预训练模型的顶部添加少量的任务相关层,就可以适应不同的任务。

  • BERT还催生了许多基于它改进或扩展的模型,例如RoBERTa、ALBERT、XLNet、ELECTRA等。这些模型在不同方面对BERT进行了优化或创新,例如增加数据量、减少参数量、改变预训练任务等。

二、BERT的基本原理

2.1、微调 BERT

bert_finetuning.jpg

 BERT的预训练和微调过程。除了输出层,预训练和微调时使用的是相同的模型结构。同一个预训练模型的参数可以用来初始化不同的下游任务的模型。在微调时,所有的参数都会被微调。[CLS]是一个特殊的符号,它会被添加在每个输入样本的前面,[SEP]是一个特殊的分隔符,它可以用来分隔不同的句子(例如问题/答案)。

简单地说,图1展示了BERT如何从大量的无标注文本中学习语言知识,然后再根据不同的任务进行微调。BERT使用了多层的Transformer编码器作为模型结构,它可以同时考虑左右两个方向的上下文信息。BERT还使用了两个预训练任务,分别是Masked Language Model(MLM)和Next Sentence Prediction(NSP),用于学习词汇和句子级别的表示。

  • Masked Language Model(MLM)

MLM 是一种预训练任务,目的是让模型学习双向的语言表示。具体做法是,在一个句子中,随机地将一些词用 [MASK] 符号替换,然后让模型预测被替换的词是什么。这样,模型就需要利用上下文的信息来理解句子的含义。为了减少预训练和微调阶段的差异,MLM 还会有一定概率将被选中的词替换为一个随机词或 保持不变。

  • Next Sentence Prediction(NSP)

NSP 是另一种预训练任务,目的是让模型学习两个句子之间的关系。具体做法是,给模型输入两个句子,然后让模型判断这两个句子是否是连续的。这样,模型就需要理解句子之间的逻辑和语义关联。NSP 有助于提升一些需要处理多句输入的下游任务,例如问答和自然语言推理。

通过这两个任务,BERT可以学习到通用的语言知识,然后通过在预训练模型的顶部添加少量的任务相关层,就可以适应不同的下游任务,例如问答、情感分析、命名实体识别、文本分类等。

在 BERT 的论文里介绍,BERT 也是用到了 SQuAD 数据集作为一个微调的示例,原本 BERT 里面的分类头,第一个 classification 是输出了 Next Sentence Prediction 的结果,也就是说,它给我们带来的是句子A和句子B是不是关联的上下文,在每一个句子里,又做一些 MLM 的任务,但是SQuAD 跟它这个头就不一样了,我们需要聚焦的是一个找答案的任务,这里最关键的是,你要给我几个分类器,在答案这块标记出来。所谓的微调 BERT 实际上就是微调输出头里面的参数,让它能够对具体问题给出具体的答案。

关于 BERT 的微调,存在两种可能性:

  • 第一种可能性它只微调分类输出头,就是保持 Pre-training BERT 大量的参数都不变,因为微调不需要重新去训练那么多参数的大模型,也没有那么多的计算资源,也没有那么多时间,BERT 内部很多参数不用去关注,只需要聚焦于分类输出头。

  • 另外一种可能性在微调的过程中把 BERT 整体的参数也进行微调,一般来讲不必这么做,因为对大多数的任务来说,微调分类输出已经够了。可是具体任务具体分析,有些情况下在任务比较复杂的时候,需要整体的去调整 BERT 本身,把原始 BERT 里的参数也进行调整,以适应我们新的需求。

具体怎么来选择,可以根据实际情况来进行尝试对比微调后的效果进行决策。

三、基于 Pytorch 微调 BERT 实现问答任务

在未经过任何训练之前的原始 BERT 理论上是无法来完成问答任务的,因为它只能完成两种任务,一种是 MLM,一种就是 NSP,它并没有经过问答任务的训练。如果要 BERT 支持问答任务,我们就要用SQuAD数据集去微调 BERT,然后再用微调后的 BERT 去完成一个问答任务。

3.1、Stanford QA Dataset

image.png

 SQuAD(Stanford Question Answering Dataset)数据集是斯坦福大学发布的一个常用于问答任务的标准数据集,它是从维基百科里面抽取出来很多的问题和很多的答案,它每一个问题之后都接一个文本段,例如:

  • 问题:What kind of animals are visible in Yellowstone?

  • 文本段 (Context):Yellowstone National Park is home to a variety of animals. Some of the park's larger mammals include the grizzly bear, black bear, gray wolf, bison, elk, moose, mule deer, and white-tailed deer.

  • 答案:grizzly bear, black bear, gray wolf, bison, elk, moose, mule deer, and white-tailed deer.

它的答案有一个特点,答案必须要包含在文本段里,所以它其实是一个抽取类型的任务,并不是让你重新组织问题的答案,而是你只要在这个文本段中找到答案词,就成功了。但是这个答案词呢,可能是一个词,也有可能是很多词的组合。简单来说,SQuAD数据集让你从一个大的文本里抽取出来几个相邻的文字来代表问题的答案。

3.2、数据集特征提取

将SQuAD 2.0数据集的训练示例转换为BERT模型的输入特征,并将这些特征保存到磁盘上,减少重复计算,后续直接加载数据集即可。

import pickle
from transformers.data.processors.squad import SquadV2Processor, squad_convert_examples_to_features
from transformers import BertTokenizer

# 初始化SQuAD Processor, 数据集, 和分词器
processor = SquadV2Processor()
train_examples = processor.get_train_examples('SQuAD')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# 将SQuAD 2.0示例转换为BERT输入特征
train_features = squad_convert_examples_to_features(
    examples=train_examples,
    tokenizer=tokenizer,
    max_seq_length=384,
    doc_stride=128,
    max_query_length=64,
    is_training=True,
    return_dataset=False,
    threads=1
)

# 将特征保存到磁盘上
with open('SQuAD/training_features.pkl', 'wb') as f:
    pick
基于BERT的新闻文本分类 2017年Transformer模型横空出世,encoder-decoder的创新效果显著,2018年Google又提出了BERT预训练模型,可谓是大大推动了NLP的进步,关于transformer和BERT的文章网上已经有很多大佬写了,对于transformer不熟悉的同学可以先自学一波,本文主要用BERT结合微调实现一个包含十五个类别的新闻文本分类任务,菜鸟一枚,各位大佬多多指教! ​ 准备工作 模型搭建5分钟,数据处理一小时。机器学习中数据处理的功夫是必不可少的,毕竟,数据决定模型的天花板嘛 ​ 我. 阅读详情

相关推荐

深度学习实战11(进阶版)-BERT模型的微调应用-文本分类案例

大家好,我是微学AI,今天给大家带来一个基于BERT模型做文本分类的实战案例,在BERT模型基础上做微调,训练自己的数据集,相信之前大家很多都是套用别人的模型直接训练,或者直接用于预训练模型进行预测,没有训练和微调过大模型,因为像BERT这种大模型一般人是训练不了的,我们只能在大模型的基础上进行微调,或者做下游任务改造。

微学AI的博客 5312

Bert基础(八)--Bert实战之理解Bert微调

到目前为止,我们已经介绍了如何使用预训练的BERT模型。现在,我们将学习如何针对下游任务微调预训练的BERT模型。需要注意的是,微调并非需要我们从头开始训练BERT模型,而是使用预训练的BERT模型,并根据任务需要更新模型的权重。在本节中,我们将学习如何为以下任务微调预训练的BERT模型。

Andy_shenzl的博客 2621

Transformer实战(20)——微调Transformer语言模型进行问答任务

问答 (Question Answering, QA) 是一种自然语言处理 (Natural Language Processing, NPL) 任务,其目标是在给定上下文文本的前提下,自动定位并生成对用户提问的准确回答。与视觉问答 (Visual Question Answering, VQA) 需要结合图像信息不同,纯文本 QA 完全依赖于文本上下文。本文将使用 SQuAD v2 数据集,详细讲解如何使用 DistilBERT 完成从数据预处理、模型微调,到模型保存的完整流程。

盼小辉丶的博客 6838

DataWorks PyODPS第三方包全攻略:从打包到加载的完整流程

本文详细介绍了在DataWorks的PyODPS节点中使用第三方Python包的完整流程,包括环境限制、打包工具pyodps-pack的使用、资源上传与加载实战,以及特殊场景处理技巧。通过本文,开发者可以掌握在MaxCompute受限环境中灵活使用自定义依赖的方法,提升数据处理效率。

dd012的博客 990

手把手教你搞定MT6701磁编码器的SSI通信与CRC-6校验(附避坑代码)

本文详细介绍了MT6701磁编码器的SSI通信与CRC-6校验的实现方法,包括硬件连接、时序配置、数据读取和专用CRC-6算法。通过提供避坑代码和常见问题解决方案,帮助开发者快速掌握磁编芯片的调试技巧,确保通信稳定可靠。

weixin_30872337的博客 220

Windows 10下Gpg4win 4.3.1安装与配置全攻略:从下载到邮件加密实战

本文详细介绍了在Windows 10系统下安装和配置Gpg4win 4.3.1的全过程,包括下载、验证、自定义安装以及密钥管理。特别重点讲解了如何通过Kleopatra证书管理器进行密钥创建和管理,以及在Outlook中实现邮件加密的实战操作,帮助用户全面提升数据安全防护能力。

weixin_29271263的博客 302

AFSim 2.9中文手册实战指南:从安装到高级功能详解(附B站视频链接)

本文详细介绍了AFSim 2.9的安装配置、基础功能操作和高级功能应用,帮助用户快速掌握这款强大的仿真平台。从系统要求检查到多体动力学仿真,再到性能优化技巧,全面解析AFSim 2.9的使用方法,适合初学者和进阶用户参考。

weixin_30892037的博客 568

嵌入式软件面试常见问题及答案

干了多年的嵌入式,被面试过,也面过不少新人,下面这些是面试中很常见的一些问题及答案,答案可以根据自己的经验自己思考下。--持续补充并更新

weixin_37553721的博客 6025

西红柿成熟度检测数据集总结

成熟度类别标注数量semiripe(半成熟)10275rotten(腐烂)13470fullyripe(完全成熟)35031unripe(未成熟)26212。

crz1336768325的博客 2125

MTK(camera篇)Camera整体点亮

本文介绍了在MTK平台上添加新Camera Sensor的驱动开发流程。主要内容包括:1)MTK Camera采用HAL3架构,驱动层主要负责sensor电源控制和寄存器操作;2)详细说明了添加新sensor需要在多个文件中进行的修改,包括设备树配置、内核头文件、驱动列表、电源序列等;3)特别指出需要配置I2C地址表,并导入tuning文件和metadata文件以完善ISP处理流程。文章提供了完整的文件修改清单,涵盖了从内核层到HAL层的完整开发过程,为MTK平台Camera Sensor驱动开发提供了具体

weixin_49303682的博客 361

Claude Code 错误解决方案 使用策略拒绝 Usage Policy refusal

摘要:本文分析了Claude Code API请求被拒绝的问题,当违反Usage Policy时会显示错误提示。根因包括请求内容违规、模型敏感度差异或历史消息影响。解决方案包括修改请求措辞、切换至Sonnet 4.5模型或开启新会话。文章详细追踪了错误链路,提供了核心代码分析,并给出验证方法和最佳实践建议,帮助用户避免触发API拒绝机制。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 984

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: Cohere 正式发布企业知识库助手 Coral
下一篇: Llama 2:新一代开源LLM,可用于研究和商业用途
技术狂潮AI
博客等级 码龄3年 1282粉丝 137原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术狂潮AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值