一、Bert是什么?
是当前深度学习中最常用的预训练模型
bert全称:Bidirectional Encoder Representation from Transformer
解释一下:
1. 是由Transformer模型的子模块为基础构建的,bert的结构是来自Transformers模型的Encoder。Transformer的内部结构由self-Attention Layer和Layer Normalization的堆叠而产生。
Self-Attention Layer的出现原因:为了解决RNN、LSTM等常用于处理序列化数据的网络结构无法在GPU中并行加速计算的问题
2.Representation: 表征
传统的表征模型有: Word2Vec 得到的语义单一,在不同语境得到的语义很容易出错;
ELMO(contextualized word embedding)
而bert的表征语义,运用的是多语义结合;例如:bank = = 银行+河堤+库
3.Bidirecrtional Encoder: 双向编码器
摒弃了Seq2Seq结构,因为encoder能够做到前后向的表征,decoder只有前向关系,能够融合上 下文信息的深层双向语言表征。
encoder输入变化,在Token embedding 和 position embedding 之间加入了 segment embedding层。
token embedding 是对 单字进行编码, segment embedding是对 两个句子分隔编码, position embedding 是对单字位置编码
CLS分类上下文是否具有关联,SEP 是 分隔开两句话 的间隔符 也可以在结尾作为结束
如果是英文单词作为输入,进入模型前需要使用bert源码Tokenization进行对每一个单词进行分词,变为原型加上##分词结构
英文词汇表通过词根与词缀的组合来新增单词语义。分词就可以减少整体的词汇表长度;中文字符就不需要分词,仅需要空格隔开即可
position Embeddings :我们的网络结构没有RRN或者LSTM,因此我们无法得到序列位置信息,我们需要将构建一个position Embeddings。
self—Attention Layer 的内部运算逻辑:
query查询序列,key待查序列,value自身含义编码序列
1.将Q*K矩阵乘积并scale 为了防止结果过大,除以他们维度的均方根
2.将其带入到 softmax函数 得到概率分布,最后在和V矩阵相乘,得到 self-attention的输出
3.(Q,K,V,)输入X,他们是X分别乘上WQ,WK,WV初始化权值矩阵得到的,在之后, 这三个权值矩阵会在训练中确定下来。
Layer Normalization :
为什么self-Attention Layer 的output流经的是Layer normalization 而不是Batch Normalization?
BN 和LN 本质都是防止过拟合现象的发生,我的理解是 : BN是以单词纵向划分 LN是以句子横向划分,然而横向的话更能够提取语义。也有观点说的是:batch normalization 实验证明效果差所以使用的少。
预训练:
1.预训练过程就是是生成BERT模型的过程
2.输入X:利用字典将每一个字或者单词用数字表示,并装换成token embedding+segment embedding+position embedding 序列的长度为512或者1024,不足的用padding补充。
3.训练语料的总量:330亿语料
4.MLM(Mask Language Model) 掩码语义模型:有一个mask机制 保证训练的时候不要“抄答案”,而是预测计算,才能得到好的模型参数。在NSP 任务中,模型在输入时,会同时输入两个句子,并在前一个输入句子的最左边加上[CLS]的标签,[CLS]标签用来判断两个句子是否是上下文关系,输入的两个句子用[SEP](Separator)标签区分。
问题:会产生对mask敏感,对embedding的表征目的相矛盾,运用了这个mask模型可能会导致数据格式不匹配,提出了对数据8:1:1方法
将self-Attention Layer的输入随机mask15%的单词,在这15%中的单词被分为三组,一组是10%替换为其他词,第二组10%不改变,第三组80%替换mask (mask的意思是遮住,盖住,马赛克)
for index in mask indices:
# 80% of the time,replace with [MASK]
if random.random() < 0.8:masked token = “[MASK]"
else:
# 10% of the time, keep original
if random.random() < 0.5:
masked token = tokens[index]
# 10% of the time,replace with random word
else:
masked token = random.choice(vocab list)
5.NSP(next sentence prediction)下一句预测:
模型通过判断两个句子间是否互为上下句,学习句子间的关联关系。
6.预训练模型采用的是无监督学习,不需要人为的打标签,也就是不需要答案。需要的是大量的数据。
7.Bert模型的权重:经过大量的语料学习,得到的bert预训练模型,自带字典vocab.txt的每一个字或者单词都是768维的embedding表示。
8.预训练模型良好的迁移能力和特征提取能力,预训练的单身是为了解决,本来这个模型a,训练a的数据少,将数据输入训练容易过拟合,精度低下,但是呢,有一个训练好的模型b,通过了足够量的数据进行训练,已经训练好了,这是就可以用模型b中的参数初始化进行训练模型a,进而在运用数据a对模型a的训练。相当于站在巨人的肩膀上。
微调 fine-tune:
不选择使用:就是简单的把它当作文本特征提取器使用。
使用:在训练中微调bert权重,以达到适应我们任务的参数。
减小学习率、减少训练次数、固定底层参数(对底层进行保留,对接近应用层慢慢变化)