算法岗常见面试题(九):BERT
BERT模型参数量计算
(5)一文懂“NLP Bert-base” 模型参数量计算_embed_huang的博客-CSDN博客_bert-base
-
词向量参数计算
token embedding参数:30522(词汇量)* 768(隐藏层大小)
position embedding参数:512(文本输入最长大小)* 768(隐藏层大小)
segment embedding参数:2(0和1区分上下句)* 768(隐藏层大小)
故,词向量总参数量 = (30522 + 512 + 2)* 768 = 22.7 MB
-
多头注意力层参数计算
Q K V 权重矩阵尺寸:768 * 64(多头注意力机制下)
O 的权重矩阵:768 * 768
12头multi-head的参数为 768 * 64 * 3 * 12
故,12层multi-head的参数为 12 * (768 * 64 * 3 * 12)= 27MB
-
全连接层参数计算
主要由两个全连接层构成,连个全连接层的权重矩阵分别为
W1 768 * (768 * 4)
W2 (768 * 4)* 768
故,12层全连接层参数为:12 *( 2 * 768 * 3072 )= 54MB
-
LayNorm层参数计算
LN层用到了两参数g和b,维度为768
LN在模型中的三个地方用到:embedding后、multi-head后、fead forward后
故,LayNorm层参数为:768*2 + ( 768 * 2 ) * 12 + ( 768 * 2 ) * 12 = 37.5 KB
BERT和ELMo、GPT的区别
ELMo、GPT的损失函数基于标准语言模型,它的缺点是单向。
BERT 及其变体中,常用的mask方法及特点
-
原始 mask (BERT)
15% tokens: 80% [MASK], 10% random, 10% unchanged
-
mask策略的好处:
a)一定程度上缓解了初始做法导致的预训练模型和微调模型不一致的问题,减少了[MASK]的数量;
-
mask策略的缺点:
b)10%保留为原来的词,10%替换为该句子的其他部分,使得模型并不知道输入对应位置的词汇是否为正确的词汇,这迫使模型更多地依赖上下文预测词汇,并赋予了模型纠错的能力。
预处理阶段制作[MASK],给每个句子采样10种mask方式:
在预处理阶段制作[MASK],导致[MASK]单一稳定。
BERT处理这种缺点:预训练共迭代40次,在这期间训练数据被重复处理了10次,每次都更换不同的mask方式,故相同的mask会重复训练4个epoch。
-
-
whole word mask (WWM) (BERT-wwm)
Bert系列七:中英文的whole word masking以及sentencepiece
在BERT发布的新版本中被提出。
BERT一次mask一个单词相关的所有token,而不是随意mask WordPiece token
def create_masked_lm_predictions(tokens, masked_lm_prob, max_predictions_per_seq, vocab_words, rng): ''' google 官方WWM实现代码 ''' cand_indexs=[] for (i,token) in enumerate(tokens): if token == "[CLS]" or token == "[SEP]": continue if (FLAGS.do_whole_word_mask and len(cand_indexs) >= 1 and token.startswith("##"): cand_indexs[-1].append(i) else: cand_indexs.append([i])
-
dynamic mask (RoBERTa)
每个Epoch都会生成新的mask,实际上效果只提升了不到一个点。
-
phrase mask (Baidu ERNIE)
Baidu ERNIE 改进了两种masking策略,一种是phrase mask,一种是entity mask。
phrase指短语,如 a series of 一类。将由多个字组成的phrase当做一个统一的单元。
-
entity mask (Baidu ERNIE)
entity指实体,如 人名、位置、组织、产品等。将由多个字组成的entity当做一个统一的单元。
处理篇章级的长文本有哪些方案?(超参数二面)
-
截断法
head截断
tail截断
head+tail截断
缺点:丢失部分序列信息,不适用于很长的文本。
-
Pooling法
将一整段文本拆分为多个segment,每个segment长度小于510。
每个segment分别进入BERT,获得[CLS].
对所有segment的[CLS]进行Pooling,可以用Max-Pooling(更推荐,保留突出特征)和Mean-Pooling。
优点:考虑到了全局信息,对文本很长且截断敏感的任务有较好的效果。
缺点:需要多次Encode,速度慢;segment之间失去联系。
-
压缩法
对原文本进行过滤,降低有效文本的大小。过滤的方法因任务而定,没有统一的方法。(比如:正文的句子和标题做字符相似度,只取字符相似度最大的TOP-K句子来代表整个篇章)
如果压缩之后,大部分句子还是超过510,继续使用截断法或者Pooling。
BERT缺点(携程一面)
BERT - 1033020837 - 博客园 (cnblogs.com)
-
从MLM预训练任务分析
其中1、2两点都基于自编码的痛点。
-
预训练阶段会出现特殊的[MASK]字符,而在下游任务中不会出现,造成预训练和微调之间的不匹配。
解决方案:
- XLNet:使用自回归代替自编码。自回归是指使用前向语言模型或后向语言模型来预测当前位置的词,有单向的缺点;自编码是BERT所使用的MLM的训练方法,其能使用到双向信息但是会造成预训练与微调时的不一致。
-
基于不符合真实情况的假设:被mask掉的token是相互独立的。如“自然语言处理”,如果mask掉“语言”,显然“语“和”言“并不是相互独立的,即”语“后面预测”言“的概率要高于预测为其他字的概率。
解决方案:
- XLNet:使用自回归代替自编码。
-
BERT中词被切分为更细粒度的Token,在随机Mask的过程中会出现只Mask掉一个词的一部分的情况,这样会使得预测任务变得更简单,因为通过一个词的前后部分很容易预测出当前词。
解决方案:
- BERT-wwn:对全词mask,对于中文来说就是mask词语而不是字,对于英文来说就是mask单词而不是token
- ERNIE:百度的。基于实体和短语的mask
-
每个batch只有15%的token会被预测,所有收敛速度会比传统语言模型慢,因为传统语言模型会预测每个token
-
静态掩码。BERT在数据预处理期间执行一次掩码,得到静态掩码。
解决方案:
- RoBERTa:动态掩码。在每次模型输入一个序列时都会生成新的掩码模式。这样,在大量数据不断输入的过程中,模型会逐渐适应不同的掩码策略,学习不同的语言表征。
-
-
从NSP预训练任务分析
-
NSP任务的有效性被质疑,可能是由于NSP任务相比于MLM过于简单。
解决方案:
- RoBERTa:删除NSP预训练任务
- ALBERT:使用SOP任务代替NSP任务,即预测两个句子顺序是否正确。
-
-
模型结构分析
- 词向量维度和隐层维度相同,参数量大。
- ALBERT:在词表和隐层之间增加一个维度E(应该就是模型内部的计算维度吧);
- 缺乏生成能力
- 只能处理两个segment
- XLNet:Relative Segment Encoding。只判断两个token是否属于同一个segment,而不判断他们各自属于哪个segment。具体实现是在计算attention weight的时候,给query额外算出一个权重加到原来的权重上,类似于relative positional encoding。
- 长度限定512
- XLNet:沿用了Transformer-XL的思想,可处理更长文本。
- 词向量维度和隐层维度相同,参数量大。
BERT的预训练流程
(8条消息) 李沐动手学深度学习V2-bert预训练数据集和代码实现_cv_lhp的博客-CSDN博客_bert预训练数据集
#算法面经#