BERT(Bidirectional Encoder Representations from Transformers,基于Transformers的双向编码器表示)系列算法在自然语言处理任务中是必不可少的经典模型,当初第一代GPT模型发布的时候,坐了冷板凳,罪魁祸首就是BERT。
有任何问题欢迎在下面留言
本篇文章配套的PPT资源已经上传
目录
1、如何训练BERT
1.1相关背景
1.2 方法1随机遮挡
1.3 方法2连接预测
2 ALBERT
在图像任务中,针对不同的任务需要设计不同的策略以及不同的网络设计,但是NLP任务真没有五花八门的操作,太多NLP的基础基本都是不需要的。基于2023的今天,大多数的NLP我觉得都比较啰嗦,后续也不可能用到,硕博学位论文那肯定还是会用到的。
语言模型,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。
关于这方面已经不推荐大家去看“很多论文”了,因为论文很多告诉你的都是一个训练过程。
比如我现在有很多文本数据,但是其实并没有一个实际要做的目的。语言模型并不是一个固定的任务,不是做什么分类和回归,也不是做什么NER。就是让模型理解人类的文字,理解人说话的逻辑,这才叫语言模型,并不是一个具体的任务。
现在需要的是培养模型的语言能力,所以需要标签吗?不需要标签,在互联网中有海量的数据,随便去取一个句子,这句话有四个词,我随机mask掉一个词,这是随机选择的,然后让模型去猜这个被mask的词是哪个。
想一想英语考试,考试考的是什么?是你英文的一个学习能力,怎么考察呢?有一些完形填空的任务,有一些选择题,有一些阅读理解题,让你理解这些题在什么前提下?在你英语水平比较高的前提下,你就能做的比较好了
第二种方法没有mask,将两句完整句子用[SEP]连接起来,判断两个句子有没有相关性,做一个二分类
如果模型能够理解语言的含义,自然而然能够预测准,看第二张图:
这两句话就没有连接性,老师上召唤师峡谷给你点名吗?
两种方法都是为了让模型理解我们文字的含义,想想你在英语考试中什么前提能让你在考试中做的好,就是语言能力。
有了语言模型,有一个能理解语言含义的模型之后,就能做一下下游任务,比如:
仅仅列出一小部分,这些都是一个下游任务,怎么把这些下游任务做好,归根到底就是模型的语言能力非常强,能够很好的理解上下文的含义,拼的就是一个把语言模型做好的前提。
你让一个清华的状元和一个街溜子去做同一件事,清华状元的学习能力强可能就能做得好。
ALBERT,A Lite BERT,轻量级的BERT
之前训练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就是第一层Embedding后得到向量的维度。比如“今天”这个词,经过词嵌入后映射成了一个768维的向量,这个E就等于768了。
H就是词经过词嵌入后,再经过self-Attention,还要经过一些全连接层,之后得到的向量维度,一般都会等于E。
V是语料库中词的个数,比如字典中一共有两万个词,在前面的mask任务中,求解mask就要从这个两万个词中选择,这个任务就是一个两万分类的任务了。
正常情况下,在embbeding层的参数量,需要把所有词都映射成向量,一共多少词呢?这里一定要理解,就是两万个词。每个词都映射成768维的向量,这中间需要构建的权重矩阵就是768*20000。这个矩阵很大,两万这个数字还只是一个保守的说法,在实际中可能要再翻个十倍。
那有没有办法给这个参数量降低一下呢?
我将768和10000二者之间引入一个中介,将这个768*20000的大矩阵拆分成两个小矩阵。所以ALBERT的做法就是,embbeding层做成两层。由768*20000变成768*100+100*20000,这个100是自己设计的,这样参数量就大大降低了。
不同E值会产生影响,E小一些影响结果,但是不大,这是一个E值的影响的表格:
Model | E | Parameters | SQuAD1.1 | SQuAD2.0 | MNLI | SST-2 | RACE | Avg |
ALBERT base not-hared |
64 |
87M |
89.9/82.9 | 80.1/77.8 | 82.9 | 91.5 | 66.7 | 81.3 |
128 |
89M |
89.9/82.8 | 80.377.3 | 83.7 | 91.5 | 67.9 | 81.7 | |
256 |
93M |
90.2/83.2 | 80.3/77.4 | 84.1 | 91.9 | 67.3 | 81.8 | |
768 | 108M | 90.4/83.2 | 80.4/77.6 | 84.5 | 92.8 | 68.2 | 82.3 | |
ALBERT base all-hared |
64 |
10M | 88.7/81.4 | 77.5/74.8 | 80.8 | 89.4 | 63.5 | 79.0 |
128 |
12M | 89.3/82.3 | 80.0/77.1 | 81.6 | 90.3 | 64.0 | 80.1 | |
256 | 16M | 88.8/81.5 | 79.1/76.3 | 81.5 | 90.3 | 63.4 | 79.6 | |
768 | 31M | 88.6/81.5 | 79.2/76.6 | 82.0 | 90.6 | 63.3 | 79.8 |
从表格中可以看出,虽然这个策略有一定效果,但是并没有一个本质上的效果的。