预训练-BERT
传统方法与预训练方法的比较
思想解读: 预训练的概念就和我们人读书和工作一样;先是通过基础教育到大学毕业,学习了通用的基础知识,这个做大多数工作,我们都能够快速学习和上手。模型预训练同样如此;避免了每一个下游任务都从零开始训练模型
由于语言模型不需要特别的标注数据,所以非常适合做预训练的目标。
预训练方式 --BERT
Mask Language Model (MLM)
训练任务
1.完型填空
Bidirectional Language Model
a.依照一定概率,用[mask]掩盖文本
中的某个字或词
b.通过遮住词两侧的内容
,去预测
被遮住的词
2.句子关系预测
Next Sentence Prediction
[CLS] 师徒四人历经艰险[SEP] 取得真经[SEP] -> True
[CLS] 师徒四人历经艰险[SEP] 火烧赤壁[SEP] -> False
释义: 通过上下两句话,去训练模型去判断是否为上下句子关系,即一个二分类任务。但是目前大家普遍不太使用该训练任务,因为这个规律模型比较容易学习到。
模型结构
BERT主要包含两个部分,第一部分是embedding层,以及在embedding层后面的网络结构。
与word2vec对比
区别:word2vec是静态的,而BERT是动态的
;在相同的文本输入后,word2vec输出的向量是固定的,BERT通过embedding后,还需进行后续网络层的计算,那么就能抓住输入的字与字、词与词;即token之间的关系。并能够进行计算输出。
BERT结构-Embedding
释义图:
释义:
BERT结构-Encoder
介绍: BERT的模型主体结构使用Google自己在17年提出的Transformer结构。
如下图:
详细释义:
BERT结构-self-attention
示意图:
其中Z的计算公式:
释义:
1.我们先来梳理矩阵计算
的情况
2.Q*K.T和softmax的理解
Q*K.T即:World_Length * World_Length
;这个World_Length就是我们输入的文本长度。
所以我们展开可有下面示意图:
注意: 矩阵中的数据,是不是就代表着,这个词与该句子中其他词的关系紧密程度
呢。所以这行数据,就是这个字对这句话的注意力。
softmax作用: 就是归一化操作,即将字与句子中其他词的关系程度之和,归一化到1的区间中来。
3.根号下dk的理解
我们在前面说,Q、K、V是通过输入x和对应的线下层相乘得到的;其形状为:World_Length* Vector_Size;
重点关注
1.在进行后续Q、K.T相乘 和乘V的步骤之间,是对Q K V进行拆分的;
2.比如:基础版本BERT的Vector_size为768;这里拆分成12部分,即多头数量为12,;那么每一个Q的形状:World_Length * 64
3.上面拆分后,V也会同样拆分
,分别进行计算,最后合并在一起得到:World_Length* Vector_Size
4.最后合并的矩阵再进行 除于根号dk;再归一化的操作:
示意图:
注意、总结: 在多个Q * K.T中,不管Q、K的Vector_Size 拆分成多少份,即有多少个多头计算;但是在这里计算的结果都是:World_Length * World_Length
;我们上面说了,就是词与句子中其他词的关系紧密程度。
注意
核心理解比喻: 这里的多头,造成有多个World_Length * World_Length
的结果,其实就是模型在不同维度,去找句子中词与词之间的关系。多头1找的是名称关系紧密程度、多头2找的是动词的关系紧密程度…
dk的值: 在基础版本的BERT中,dk是64,这个值是词向量维度:768与多头数量12的商。
dk作用: 因为softmax是将多个值的和归一化为1;根据softmax的函数特性,会出现在进行归一化的数中,有的比较大
,归一化后就接近1
;而小的数,就接近零
了;这样对于模型的计算不好,这种接近零的值要尽量避免
;所以先除于dk;使得值的差距被缩放
;再进行归一化。