BERT 模型(1)
BERT的创新在于Transformer Decoder(包含Masked Multi-Head Attention)作为提取器,并使用与之配套的掩码训练方法。虽然使用了双编码使得BERT不具有文本生成能力,但BERT在对输入文本的编码过程中,利用了每个词的所有上下文信息,与只能使用前序信息提取语义的单向编码器相比,BERT的语义信息提取能力更强。
下面距离说明单向编码与双向编码在语义理解上的差异
今天天气很差,我们不得不取消户外运动。
将句子中的某个字或者词“挖”走,句子变为
今天天气很{},我们不得不取消户外运动。
分别从单向编码(如GPT)和双向编码(如BERT )的角度来考虑“{}”中应该填什么词。单向编码只会使用“今天天气很”这5个字的信息来推断“{}”的字或词,以人类的经验与智慧,使用概率最大的词应该是:“好”“不错”“差”“糟糕”,而这些词可以被划分为截然不同的两类。
通过这个例子我们可以直观地感觉到,不考虑模型的复杂度和训练数据量,双向编码与单向编码相比,可以利用更多的上下文信息来辅助当前的语义判断。在语义理解能力上,采用双向编码的方式是最科学的,而BERT的成功很大程度上有此决定。
————————————————
原文链接:https://blog.csdn.net/weixin_42486623/article/details/119485297
BERT的结构
参数
L :Transformer blocks;
H :hidden size;
A:self-attention heads;
————————————————
原文链接:https://blog.csdn.net/weixin_42486623/article/details/119485297
BERT模型中使用的是WordPiece embeddings,最后一层隐藏层的向量会作为每个token的表示。另外,有3个特殊字符如下:
- [CLS]:用于分类任务中每个序列的第一个token
- [SEP]:作为句子对(A,B)的分割符,句子首尾都有,具体可看输入输出表示部分。
-
[MASK]:用于masked ML中word的替换
还需要说明的是,BERT模型中sentence并不是语义层面的句子,可以是连续的文本。sequence指的是token 序列,可以是单个sentence也可以是合在一起的 two sentences。
部分小疑问
- 输入不管有几个sentence,总和的maxlength是固定的,与其他训练任务一样
- segment可以有多种(可以大于2,只是比较少见),如果只有一种那么Segment embedding只有一个
链接:https://www.jianshu.com/p/91cb3546da89
通过源码能看到:
- MLM和NSP任务的输入都是一样的,即输入中都会有masked token
- 在masked LM任务中只会预测masked token,其他token不做预测。
- 由于是多任务学习,最终的
无监督预训练深度双向语言模型
(1) Token Embeddings 是词向量,第一个单词是CLS标志,可以用于之后的分类任务
(2) Segment Embeddings用来区别两种句子,因为预训练不光做LM 还要做以两个句子为输入的分类任务
(3) Position Embeddings和之前文章中的Transformer不一样,不是三角函数而是学习出来的
预训练任务
Task1: Masked LM
为了构建一个深层的真双向语言模型,但是标准的语言模型是使用了马尔可夫链进行的单向编码,即使使用 LTR 与 RTL,但也是假的双向编码,性能会受到极大的影响。使用完形填空机制可以避免标准的语言模型的编码瓶颈。
完形填空策略:随机的 mask 掉 15% 的单词,然后使用编码器最后的 hidden state 过一层 softmax 进行完形填空预测。
但是这种策略会有两个缺点,以下是内容和解决方案:
Downside 1: mismatch
这样做构造了一种 mismatch:因为 [MASK] 永运不会出现在 fine-tuning 阶段,所以 pre-training 与 fine-tuning 出现了 mismatch。
缓解方案:对于随机选择的 15% 待 mask 单词,不是直接将它替换为 [MASK],而是再做一次随机:
80%:将该词替换为 [MASK]
10%:将该词替换为一个随机的词语
10%:不替换
原因:Transformer Encoder 不知道哪个单词被要求做预测,哪个单词被随机替换掉了,所以对于每个输入的单词,它都必须保持上下文嵌入;而且,现在这种策略下随机替换掉的单词只有 1.5%,几乎不会影响模型的语言建模能力。
Downside 2: slower
现在使用的 MLM 模型,每个 batch 只有 15% 的单词被预测,所以收敛速度确实慢了。但是效果带来的提升却很大。
Task2: Next Sentence Prediction
NLP 中有很多句子关系性的任务,这部分的能力不能通过 Task1 的 MLM 来俘获到,所以加入了一个二分类任务进行多任务学习。
策略:50% 的句子对,将第二句替换为随机的句子来构建负样本。
其他细节
(1) 训练语料:BooksCorpus 800𝑀 words + English Wikipedia 2,500𝑀𝑤𝑜𝑟𝑑𝑠
(2) batch size:256
(3) Adam: γ=1e−4, β1=0.9, β2=−.999,warmup
(4) dropout:0.1
(5) GELU
(6) loss:两个任务的 loss 和
下游监督任务微调
(1) 单句/句子对分类任务:直接使用 [CLS] 的 hidden state 过一层 softmax 进行预测;
(2) QA 任务:将问题和答案所在的段拼接起来,使用最后的答案段的 hidden state 向量来计算某个单词是答案开始单词和结束单词的概率,进而进行预测。
(3) 其中,S 和 E 是需要下游 fine-tuning 阶段训练的开始向量和结束向量。在推断阶段,会强行限制结束的位置必须在开始的位置之后。
(4) 序列标注任务:直接将序列所有 token 的最后一层 hidden state 喂进一个分类层(没有使用自回归、CRF)
————————————————
版权声明:本文为CSDN博主「发呆的比目鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42486623/article/details/119485297
————————————————
版权声明:本文为CSDN博主「发呆的比目鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42486623/article/details/119485297
BERT的视频讲解:
https://www.bilibili.com/video/BV1Ey4y1874y/?spm_id_from=333.337.search-card.all.click
position最长512,在下游任务中,有长于512的句子怎么办呢
BERT优点
Transformer Encoder因为有Self-attention机制,因此BERT自带双向功能
因为双向功能以及多层Self-attention机制的影响,使得BERT必须使用Cloze版的语言模型Masked-LM来完成token级别的预训练
为了获取比词更高级别的句子级别的语义表征,BERT加入了Next Sentence Prediction来和Masked-LM一起做联合训练
为了适配多任务下的迁移学习,BERT设计了更通用的输入层和输出层
微调成本小
BERT缺点
task1的随机遮挡策略略显粗犷,推荐阅读《Data Nosing As Smoothing In Neural Network Language Models》
[MASK]标记在实际预测中不会出现,训练时用过多[MASK]影响模型表现;
每个batch只有15%的token被预测,所以BERT收敛得比left-to-right模型要慢(它们会预测每个token)
BERT对硬件资源的消耗巨大(大模型需要16个tpu,历时四天;更大的模型需要64个tpu,历时四天。
————————————————
版权声明:本文为CSDN博主「废柴当自强」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jiaowoshouzi/article/details/89073944
谷歌用1024块TPUv3将训练时间缩短到76分钟,英伟达又用1472个V100 GPU将训练时间进一步减少到53分钟。
在最新的MLPerf中,英伟达只花了49秒就完成了BERT的训练,他们用了一台包含2048个A100 GPU的超级计算机SuperPOD。
经过探索,我们发现使用谷歌的TPU是一种可行的解决方案。通过实验室的研究和实践,相比GPU,TPU能显著提高BERT模型运算的效率,且大幅度降低所需要的成本。
关于TPU的简单介绍
TPU 即谷歌推出的 Tensor ProcessingUnit,一个只专注于神经网络计算的处理器。TPU的主要功能是矩阵运算,是一个单线程芯片,不需要考虑缓存、分支预测、多道处理等问题的处理器,其可以在单个时钟周期内处理数十万次矩阵运算,而GPU在单个时钟周期内只可以处理数百到数千的计算。
此外,GPU作为“图像处理器”,其基本的硬件架构仍然要能够支持图像相关运算中所存在的各种需求,这意味着GPU多少受到其固有架构的桎梏,这些机制的存在使得预测GPU的处理性能和利用率变得比较困难,故在现实使用中,使GPU达到理论计算峰值是比较困难的。
而相比于GPU,TPU的实际运算表现要比GPU更加稳定,除此之外,TPU对于数据的读取也进行了大量的优化,所以当所涉及的运算包含大量的矩阵计算时,TPU在训练的优势就显现出来了。
因为BERT模型是multi-head dot-product attention,所以从数学上而言,BERT不论是前向传播还以后向传播计算都包含了大量矩阵运算,这使得TPU天生就非常适合计算BERT等神经网络。
当然任何理论分析都是没有Benchmark有说服力的。那么TPU效果究竟如何呢?下面我们来展现一下百分点认知智能实验室对TPU的测评结果。
租用TPU V2八核心为例,系统的说明一下创建虚拟机实例和TPU实例的方法。进入到谷歌云的首页
BERT是谷歌去年推出的NLP模型,一经推出就在各项测试中碾压竞争对手,而且BERT是开源的。只可惜训练BERT的价格实在太高,让人望而却步。
之前需要用64个TPU训练4天才能完成,后来谷歌用并行计算优化了到只需一个多小时,但是需要的TPU数量陡增,达到了惊人的1024个。
那么总共要多少钱呢?谷歌云TPU的使用价格是每个每小时6.5美元,训练完成训练完整个模型需要近4万美元,简直就是天价。
现在,有个羊毛告诉你,在培养基上有人找到了薅谷歌羊毛的办法,只需1美元就能训练BERT,模型还能留存在你的谷歌云盘中,留作以后使用。
GPU就行,目前大部分还是直接使用pretrained的bert模型,很少需scratch。资源比较紧张的话也可以考虑bert-mini的版本进行实验,分实际使用情况了。
自己训练模型的可行性?
用已有的预训练模型,是否可以做自己的文本分类?
https://www.jianshu.com/p/91cb3546da89