BERT系列算法解读:(RoBERTa/ALBERT/DistilBERT/Transformer/Hugging Face/NLP/预训练模型/模型蒸馏)

news2024/11/26 15:01:12

BERT(Bidirectional Encoder Representations from Transformers,基于Transformers的双向编码器表示)系列算法在自然语言处理任务中是必不可少的经典模型,当初第一代GPT模型发布的时候,坐了冷板凳,罪魁祸首就是BERT。

有任何问题欢迎在下面留言

本篇文章配套的PPT资源已经上传

目录

1、如何训练BERT

1.1相关背景

1.2 方法1随机遮挡

1.3 方法2连接预测

2 ALBERT

2.1 什么是ALBERT

2.2 第一点大矩阵拆分

2.3 第二点跨层参数共享

2.4 实验中还告诉我们的故事

3 RoBERTa

3.1 如何训练RoBERTa

3.2RoBERTa-wwm

4 DistilBERT


1、如何训练BERT

在图像任务中,针对不同的任务需要设计不同的策略以及不同的网络设计,但是NLP任务真没有五花八门的操作,太多NLP的基础基本都是不需要的。基于2023的今天,大多数的NLP我觉得都比较啰嗦,后续也不可能用到,硕博学位论文那肯定还是会用到的。

1.1相关背景

语言模型,BERT只是其中的一种,后续本人会在CSDN上分析多个语言模型。

17年,Transformer提出来,给了NLP一个新的方法新的架构

18年,谷歌带头做出BERT,他说他有数据,他有算力,用Transformer训练一个大的语言模型出来即BERT模型

19年-20年,出现了很多对于BERT的改进(改进不是说把模型结构改变,把模型做的更大,是想办法把训练效率做的更高一些)

这么说吧,整个NLP领域都是基于Transformer去做的,只不过做的更大而已,这么多年过去了,还是用的17年这个结构,只不过做的更大。

打开Hugging Face的模型页面,按销量排:

(截止2023年7月13日)排前18的模型有10个都是BERT相关的,其中标红的第一个bert-base-uncased是原装的bert。

关于这方面已经不推荐大家去看“很多论文”了,因为论文很多告诉你的都是一个训练过程。

1.2 方法1随机遮挡

  • 方法1:句子中有15%的词汇被随机mask掉
  • 交给模型去预测被mask的家伙到底是什么
  • 词语的可能性太多了,中文一般是字
  • 如果BERT训练的向量好,那分类自然OK

比如我现在有很多文本数据,但是其实并没有一个实际要做的目的。语言模型并不是一个固定的任务,不是做什么分类和回归,也不是做什么NER。就是让模型理解人类的文字,理解人说话的逻辑,这才叫语言模型,并不是一个具体的任务。

现在需要的是培养模型的语言能力,所以需要标签吗?不需要标签,在互联网中有海量的数据,随便去取一个句子,这句话有四个词,我随机mask掉一个词,这是随机选择的,然后让模型去猜这个被mask的词是哪个。

 想一想英语考试,考试考的是什么?是你英文的一个学习能力,怎么考察呢?有一些完形填空的任务,有一些选择题,有一些阅读理解题,让你理解这些题在什么前提下?在你英语水平比较高的前提下,你就能做的比较好了

1.3 方法2连接预测

  • 方法2:预测两个句子是否应该连在一起
  • [seq]:两个句子之前的连接符
  • [cls]:表示要做分类的向量

第二种方法没有mask,将两句完整句子用[SEP]连接起来,判断两个句子有没有相关性,做一个二分类

 如果模型能够理解语言的含义,自然而然能够预测准,看第二张图:

这两句话就没有连接性,老师上召唤师峡谷给你点名吗?

两种方法都是为了让模型理解我们文字的含义,想想你在英语考试中什么前提能让你在考试中做的好,就是语言能力。

有了语言模型,有一个能理解语言含义的模型之后,就能做一下下游任务,比如:

  • 情感分类
  • NER(Named Entity Recognition,命名实体识别)
  • 关系抽取
  • 语法检查纠错

仅仅列出一小部分,这些都是一个下游任务,怎么把这些下游任务做好,归根到底就是模型的语言能力非常强,能够很好的理解上下文的含义,拼的就是一个把语言模型做好的前提。

你让一个清华的状元和一个街溜子去做同一件事,清华状元的学习能力强可能就能做得好。

2 ALBERT

2.1 什么是ALBERT

A Lite BERT,轻量级的BERT

  • 从BERT开始NLP就一直强调一件事,要想效果好,模型就一定得大
  • 但是如果模型很大,权重参数就会非常多,训练是一个大问题(显存都装不下)
  • 训练速度也是一个事,现在大厂模型都要以月为单位,速度巨慢
  • 能不能简化下BERT,让他训练的更快更容易一些呢?(Transformer中Embedding占20%参数,Attetntion占80%)

之前训练CV任务的时候,都是以小时为单位的,可能训练三五个小时就出效果了,但是在自然语言处理任务中,三五个小时那可能还没训练完百分之一呢。

给大家举个例子,看这个模型BLOOM,176B(1760亿)个参数,开发人员和研究人员超过1000个,BLOOM能够以46种自然语言和13种编程语言生成文本。

他们每天都在推特发布训练进度:

每天只能训练1%,现在已经训练完成,那他是不是单CPU去训练的啊?要不然怎么会这么慢呢。到底是不是单卡,看看这台超级计算机的配置: 

这是来自70多个国家和250多个机构的1000多名研究人员一年工作的成果,最终在法国巴黎南部的Jean Zay超级计算机上训练了117天(3月11日至7月6日)的BLOOM模型,这要归功于法国国家科学研究中心(CNRS)和法国科学研究中心(CNRS)估计价值300万欧元的计算拨款。

训练硬件:

  • GPU: 384 张 NVIDIA A100 80GB GPU (48 个节点) + 32 张备用 GPU

  • 每个节点 8 张 GPU,4 条 NVLink 卡间互联,4 条 OmniPath 链路

  • CPU: AMD EPYC 7543 32 核处理器

  • CPU 内存: 每个节点 512GB

  • GPU 显存: 每个节点 640GB

Checkpoints:

  • 每个 checkpoint 含精度为 fp32 的优化器状态和精度为 bf16+fp32 的权重,占用存储空间为 2.3TB。如只保存 bf16 的权重,则仅占用 329GB 的存储空间。

数据集:

  • 1.5TB 经过大量去重和清洗的文本,包含 46 种语言,最终转换为 350B 个词元

  • 模型的词汇表含 250,680 个词元

176B BLOOM 模型的训练于 2022 年 3 月至 7 月期间,耗时约 3.5 个月完成 (约 100 万计算时)。

NLP的模型量级怎么增长的,是指数级增长啊,真的恐怖如斯

ALBERT从轻量级作为一个切入点,ALBERT的研究人员发现Transformer中Embedding占20%参数,Attetntion占80%

先熟悉几个变量:

  • E:词嵌入大小
  • H:隐藏层大小
  • V:语料库中词的个数

E就是第一层Embedding后得到向量的维度。比如“今天”这个词,经过词嵌入后映射成了一个768维的向量,这个E就等于768了。

H就是词经过词嵌入后,再经过self-Attention,还要经过一些全连接层,之后得到的向量维度,一般都会等于E。

V是语料库中词的个数,比如字典中一共有两万个词,在前面的mask任务中,求解mask就要从这个两万个词中选择,这个任务就是一个两万分类的任务了。

正常情况下,在embbeding层的参数量,需要把所有词都映射成向量,一共多少词呢?这里一定要理解,就是两万个词。每个词都映射成768维的向量,这中间需要构建的权重矩阵就是768*20000。这个矩阵很大,两万这个数字还只是一个保守的说法,在实际中可能要再翻个十倍。

那有没有办法给这个参数量降低一下呢?

2.2 第一点大矩阵拆分

  • 通过一个中介,将一层转换为两层,但是参数量可以大幅降低
  • 参数量:(V×H)降低到( V ×E + E ×H )
  • 此时如果H>>E,就达到了咱们的目的(E越小可能会效果越差)
  • 但是Embedding层只是第一步,Attention如何简化才是重头戏

我将768和10000二者之间引入一个中介,将这个768*20000的大矩阵拆分成两个小矩阵。所以ALBERT的做法就是,embbeding层做成两层。由768*20000变成768*100+100*20000,这个100是自己设计的,这样参数量就大大降低了。

不同E值会产生影响,E小一些影响结果,但是不大,这是一个E值的影响的表格:

ModelEParametersSQuAD1.1SQuAD2.0MNLISST-2RACEAvg

ALBERT

   base

not-hared

64

    87M

89.9/82.980.1/77.882.991.566.781.3

128

    89M

89.9/82.880.377.383.791.567.981.7

256

    93M

90.2/83.280.3/77.484.191.967.381.8
768    108M90.4/83.280.4/77.684.592.868.282.3

ALBERT

   base

all-hared

64

    10M88.7/81.4 77.5/74.880.889.463.579.0

128

   12M        89.3/82.380.0/77.181.690.364.080.1
256   16M88.8/81.579.1/76.381.590.363.479.6
768   31M88.6/81.579.2/76.682.090.663.379.8

 首先可以看E越大特征越多,后面6列都是不同对比实验也有不同评分标准。从表格中可以看出,虽然这个策略有一定效果,但是并没有一个本质上的改进。这个结果有一定了解就行了,因为你几乎不可能去复现这个结果的。(别人的数据是无限的,计算资源也很强,论文你看看得了,这种实验就是一个可远观不可亵玩焉)

2.3 第二点跨层参数共享

共享的方法有很多,ALBERT选择了全部共享,FFN和ATTENTION的都共享。

之前我们的文章有讲过卷积神经网络,卷积层和全连接对比一下。全连接非常费参数,因为全连接没有任何共享的地方。卷积呢?为什么能省参数,同一个卷积核,在图像中的各个位置的权重完全一样,所以它参数少,好训练,因为CNN的效果比FC强。

在Transformer的堆叠中,一层self-Attention接着一层FC,上一层self-Attention和下一层self-Attention的权重参数能共享吗?当时19年读这篇论文的时候,我就在想,啊?这还能共享啊?self-Attention一层一层的堆叠,参数还共享,那还是Transformer吗,这个Transformer不是没有意义了么?但是经过实验证明,还真能共享。 

来看一下结果:

先看这个E=768的,就是先不考虑E,all-shared全部共享参数有31M,结果是79.8,not-shared不共享,参数有108M,结果是82.3。确实把模型变小了很多,但是结果下降了,要是没有下降,那真是见鬼了。但是令人惊叹的是,有下降,但是下降的却很少。

然后看E=128,也就是说E也减少了,然后参数又进一步大大减小了,但是结果仍然是有下降,但是下降的不多。

在深度学习的很多结果,都是一个没有办法证明的事,只能是通过实验看到这样一个结论。

这就使得ALBERT在实际中被使用的更多,在我们的实际项目中,我们很少使用BERT这样一个模型,因为太庞大了。在训练与部署的过程中,需要考虑成本的,什么成本,时间成本。

你想想,用户给你一个反馈,点了鼠标,半天没有反应,人家气的肯定直接关了网页。

2.4 实验中还告诉我们的故事

层数是不是越多越好?

目前来看确实就是的。

隐层的特征是不是越多越好呢?

目前来看确实也是的,但是也不能一直大下去啊,一般来说隐层特征768就可以了。大到6144就开始下降了,实际上是因为数据跟不上了,虽然是NLP的数据是无限的,但是毕竟还是有限的。太大了也确实没意义。

看一下此时此刻,ALBERT在Hugging Face能排到第几名:

第16名,六百多万的下载量,也很不错了。

3 RoBERTa

RoBERTa,Robustly optimized BERT approach

我们的任务不应该仅仅是ALBERT,还有很多其他BERT的变形体。RoBERTa和ALBERT实际上是两条路,ALBERT实际上是对网络结构进行改变,RoBERTa是对训练过程进行优化。

这个排名也很高,第九名,接近一千万的下载量。

3.1 如何训练RoBERTa

  • 基本就是说训练过程可以再优化优化
  • 最核心的就是如何在语言模型中设计mask:
  • 动态mask光听感觉肯定都比静态的要强,也就是这篇论文的核心
  • 取消NSP任务(Next Sentence Prediction)后效果反而好

先想想BERT是怎么做的?

拿到一个数据集,有n条数据,BERT会将第1条一直到第n条数据,全部随机选中一个位置mask掉。但是哪个地方应该被mask掉,这个事情是一个确定的事情,后续无法改变的,这个是原始的BERT的方法。在深度学习中,一定会强调一个叫做epoch的东西,深度学习会将数据不断的进行迭代,迭代epochs次。在原始BERT中,对于n个句子中,在每一个epoch的迭代中,被mask的位置都是固定的。

比如:“珠穆朗玛峰是世界第一高峰”,第一次把“珠穆朗玛峰”给mask掉,让BERT猜谁是世界第一高峰,往后的第二次、第三次都是这么做。

但是我们能不能不做这么做呢?第一次我把“珠穆朗玛峰”给mask掉,第二次我把第一的一给mask掉可以吗?这样模型学到的东西是不是就更多了。

这这种做法,就是叫做动态的mask。

在回答深度学习训练方面的问题的时候,我经常回答把batch_size改成1试试。为什么呢,因为普遍大家的机器都没有几个说很舍得买3090,4090的,毕竟花一两万就买个显卡,确实还是没那么舍得。

所以batch_size肯定是越大越好,因为这样能够更快训练完一个数据集,更好的拟合到数据的概率分布。

所以提出RoBERTa的论文实际上就做了一个动态mask,然后做了一些实验。

看一看RoBERTa优化的那些地方:

  • BatchSize基本也是大家公认的:
  • 用了更多的数据集,训练了更久,提升了一点效果
  • 分词方式做了一点改进,让英文拆的更细致(与中文无关)

看看人家的batch_size吧,我们自己玩不了这个东西。后面再看看gpt大模型,何止是以k为单位,简直是以w和m为单位。 

3.2RoBERTa-wwm

wwm就是 word whole mask,全词掩码,这里用中文版本的介绍一下( 就是哈工大和科大讯飞的中文分词模型)

比如这句话:我喜欢吃哈X滨正宗烤冷面,最早来说就是把中文的一个字给mask掉,但是这个时候模型学的是什么哈什么滨,跟正宗烤冷面是没有关系的,不仅跟烤冷面没关系,跟其他任务都没有关系,因为哈什么滨中国就一个哈尔滨。

所以说以前用字来mask带了一些问题,全词掩码,那就应该把这一整个词全遮挡住让BERT来猜:

我喜欢吃XXX正宗烤冷面

所以这个时候,模型思考的时候,正宗烤冷面在全国哪里最多呢?然后分析得出了哈尔滨。

这就是中文版的RoBERTa-wwm分词方式

4 DistilBERT

 就叫它老四吧,老四觉得BERT模型太大了,在训练的时候不去改BERT的网络结构,但是训练完了之后,能不能给它拆了,让它变得更小呢?这件事情就叫做蒸馏。

什么叫做蒸馏?模型实现效果会有一些核心支撑点,但是模型会在核心支撑额外加一些东西,这些额外的东西在训练的时候需要,在部署和测试的时候可能并不需要。所以蒸馏就是在一个大模型的基础上进行拆分,把一些不重要没必要的东西拆除的过程,就是蒸馏。

为什么一定要做这个?NLP的参数是呈指数上升的趋势,是很恐怖的,CV就没有这么恐怖。因为NLP效果提升都不是在改网络结构,是把模型做的更大。因为都是基于Transformer去做的。所以学术上就一点,大力出奇迹。

但是工程上怎么办?还是得面向实际落地啊!所以还是需要想办法做的小一些。

DistilBERT的实验中去掉了40%的参数,但是效果依然能保持在97% :

  distil蒸馏,在Hugging Face上很多模型都出现了蒸馏版本:

到今天为止的NLP任务中,主流的模型就是BERT和GPT两个方向。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/764620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】-list的具体使用

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

漏洞复现畅捷通CRM SQL注入

免责声明 术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用…

.NET SqlSuger初次使用

文章目录 前言SqlSuger测试DB Fisrt和CodeFirst 前言 我之前在B站上面发视频说如何使用EF框架去生成实体类。我当时做了Mysql,Sql server,Sqlite的适配。但是下面评论区说SqlSuger很好用,而且很多公司都用SqlSuger。 B站视频:C#如何快速开发数据库业务…

VsCode连不上Server,但SSH可以

造成的原因可能是因为Client处Vscode更新与Server端"~/.vscode-server"文件夹内的版本不匹配,通常来说直接删除该文件夹即可。 但是有时该文夹内有几个问价被占用:“resource busy”,且该文件处于内核态, 通过:“lsof…

Nginx学习之一撸到底

一、Nginx环境搭建 ❶首先创建Nginx的目录并进入: [rootlocalhost]# mkdir /soft && mkdir /soft/nginx/ [rootlocalhost]# cd /soft/nginx/ ❷下载Nginx的安装包,可以通过FTP工具上传离线环境包,也可通过wget命令在线获取安装包…

Python与matlab 实现图像加密--扩散加密

1、图像加密 使用扩散加密 图像加密中,扩散处理是在不改变像素点位置的条件下,将任一明文像素点的信息隐藏在尽可能多的密文像素点中。 基于异或运算的扩散处理 正向(i从1到MN)的算法与其逆算法: 逆向(i从MN到1)的算法与其逆算法: C和S是密码向量,P是明文图像 Python…

本地拉取github上的项目失败,解决办法?

1.Step1:可以复制github上的仓库地址; 比如: https://github.com/FISCO-BCOS/fisco-package-build-tool.git2.Step2:打开自己的码云,并登录进去,没有的可以注册一个,按照下面步骤操作&#xff…

二分模板简单记忆

时间复杂度 O ( l o g n ) O(logn) O(logn) 三个模板 整数二分&#xff08;两个&#xff09; int 答案右区间(int l, int r) {while (l < r){int mid l r >> 1;if (在答案区间(mid)) r mid;else l mid 1;}return l; }// ####################################…

Unity游戏源码分享-射击游戏Low Poly FPS Pack 3.2

Unity游戏源码分享-射击游戏Low Poly FPS Pack 3.2 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88057717

ES系列--打分机制

一、文档打分机制 当你通过关键字搜索相关文档时&#xff0c;可能会出现多个文档&#xff0c;这些文档的顺序是通过一个max_score属性的大小从高到低顺序展现出来的&#xff0c;max_score属性就是我们所说的评分。而这个评分是通过一个文档打分机制计算出来的。 二、打分原理 …

和鲸社区数据分析每周挑战【第九十八期:企业贷款审批分析】

和鲸社区数据分析每周挑战【第九十八期&#xff1a;企业贷款审批分析】 文章目录 和鲸社区数据分析每周挑战【第九十八期&#xff1a;企业贷款审批分析】一、背景描述二、数据说明三、问题描述四、数据加载五、数据清洗和预处理六、数据探索与分析1、贷款金额分布2、各州的贷款…

Vue渲染系统模块

我们想要实现一个简洁版的Mini-Vue框架&#xff0c;应该包含三个模块&#xff1a;分别是&#xff1a;渲染系统模块、可响应式系统模块、应用程序入库模块。 这篇就来写一下渲染系统模块。剩下两个模块后面有时间再更新。 vue渲染系统实现&#xff0c;应该包含三个功能&#x…

linux之Ubuntu系列(二)远程管理指令

shutdown shutdown 选项 时间 关机或重启 选项&#xff1a; -r 重新启动 提示 不指定选项和参数&#xff0c;默认表示1分钟之后 关闭电脑用SSH远程维护服务器时&#xff0c;最好不要关闭系统&#xff0c;而应该重新启动系统 -r shutdown常用示例 # 1分钟后关机 shutdown …

【C语言初阶(17)】初阶指针

文章目录 Ⅰ指针的概念Ⅱ 指针和指针类型⒈指针 - 整数⒉指针的解引用 Ⅲ 野指针⒈野指针成因⒉规避野指针 Ⅳ 指针运算⒈指针 - 整数⒉指针 - 指针⒊指针的关系运算 Ⅴ 指针和数组Ⅵ 二级指针Ⅶ 指针数组 Ⅰ指针的概念 指针的两个要点 指针是内存中一个最小单元的编号&#…

使用 torch.stft 进行短时傅里叶变换

python 常规的 stft 都是在 cpu 上进行计算&#xff0c;如果网络训练是在 GPU 上进行&#xff0c;那么就涉及到数据传输的问题&#xff0c;降低计算效率&#xff1b;而 torch 自带的 stft 可以直接在 GPU 上进行计算&#xff0c;因此可以节省计算时间。 import torch import t…

简单版本视频播放服务器V3-前端优化-播放器在左,列表在右侧【推荐】【完成】

做个家用版本的家庭影院&#xff0c;通过这个服务器可以给电脑&#xff0c;平板&#xff0c;手机等设备提供直接播放电影的作用&#xff0c;通过离线下载电影放入目录里就是就可以给全家提供电影播放了&#xff0c;通过浏览器就是可以访问电脑里面的视频&#xff0c;实现简单的…

Html基础知识学习——圣杯布局、margin负值、等高布局

文章目录 圣杯布局margin负值等高布局 圣杯布局 两边页面固定中间页面宽度随着浏览器大小自适应 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

代码随想录算法训练营day6 | 242. 有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

目录 242. 有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 242. 有效的字母异位词 242. 有效的字母异位词 难度&#xff1a;easy 类型&#xff1a;哈希表 思路&#xff1a; 代码&#xff1a; class Solution {public boolean isAnagram(String s, St…

计算机网络 day9 DNAT实验

目录 DNAT DNAT策略的典型应用环境 DNAT策略的原理 在网关中使用DNAT策略发布内网服务器 DNAT实验&#xff1a; 实验环境&#xff1a; DNAT网络规划拓扑图&#xff1a; 步骤&#xff1a; 1、创建linux客户端Web网站&#xff08;go语言&#xff09;&#xff0c;实现Web服…