代码文本来自:github讲解和内容介绍
一、文章主要组成结构
- 进一步理解position encoding , 结合注意力矩阵可视化位置编码;
- 语言模型的定义和BERT解读;
- BERT训练之前的准备工作, 语料预处理;
- BERT的预训练, 训练参数;
- 使用BERT预训练模型进行自然语言的情感分类;
- BERT代码解读。
二、位置编码position encoding
在上一节中,我们讲述了位置编码的基础理论[超链接]。位置编码由sin和cos函数组成,是一个周期函数,它将距离近的文本权值增强,距离远的文本弱化,来辅助transformer模型对位置的敏感性。
基于上图自注意力算法,为了更好地了解位置编码,如下图所示,我们通过自注意力机制,获得其可视化的权值图。
结合注意力矩阵的位置编码在上图中, 在注意力阶段,我们用位置编码矩阵乘以他本身的转置, 也就是, 我们求, 得出的维度是. 我们看到上图中, 矩阵的对角线隆起, 也就是值比较大, 是因为一个矩阵乘以他本身的转置之后, 形成的矩阵的对角线正是这个矩阵的每一行点乘这一行本身, 所以是值最大的区域(红色部分)。对于位置编码来说, 也就是当前位置与当前位置本身相关程度最高。再往对角线两边看, 发现以对角线(红色山峰)区域为中心, 两边属于缓慢下降趋势, 这就说明了随着离当前位置越远, 其位置编码的相关程度就越低. 由此可见, 位置编码建立在时间维度的关联关系.
语言模型和Bert
什么是语言模型, 其实用一个公式就可以表示, 假设我们有一句话, 是这句话里的个字, 而语言模型就是求的是这句话出现的概率是多少。
比如说在一个语音识别的场景, 机器听到一句话是"wo wang dai san le(我忘带伞了)", 然后机器解析出两个可能的句子, 一个是"我网袋散了", 另一个是"我忘带伞了"。根据先验知识,我们知道前者的概率大于后者。然后,语言模型目的是学习判断, 从而获得这句语音的正确解析结果是"我忘带伞了"。
BERT的全称是: Bidirectional Encoder Representations from Transformers, 如果翻译过来也就是双向transformer编码表达, 我们在上节课解读了transformer的编码器, 编码器输出的隐藏层就是自然语言序列的数学表达, 那么双向是什么意思呢? 我们来看一下下面这张图。
上图中是指的单个字或词, 指的是最终计算得出的隐藏层, 还记得我们在Transformer(一)中讲到的注意力矩阵和注意力加权, 经过这样的操作之后, 序列里面的每一个字, 都含有这个字前面的信息和后面的信息, 这就是双向的理解。 在这里, 一句话中每一个字, 经过注意力机制和加权之后, 当前这个字等于用这句话中其他所有字重新表达了一遍, 每个字含有了这句话中所有成分的信息。
在BERT中, 主要是以两种预训练的方式来建立语言模型:
BERT语言模型任务一: MASKED LM
在BERT中, Masked LM(Masked language Model,MLM)构建了语言模型, 这也是BERT的预训练中任务之一, 简单来说, 就是随机遮盖或替换一句话里面任意字或词, 然后让模型通过上下文的理解预测那一个被遮盖或替换的部分, 之后做的时候只计算被遮盖部分的。 实际操作方式如下:
- 随机把一句话中的替换成以下内容:
1). 这些有的几率被替换成;
2). 有的几率被替换成任意一个其他的;
3). 有的几率原封不动.
- 之后让模型预测和还原被遮盖掉或替换掉的部分, 模型最终输出的隐藏层的计算结果的维度是:
我们初始化一个映射层的权重:
我们用完成隐藏维度到字向量数量的映射, 只要求和的矩阵乘(点积):
之后把上面的计算结果在(最后一个)维度做归一化, 是每个字对应的的和为, 我们就可以通过里概率最大的字来得到模型的预测结果, 就可以和我们准备好的做损失()并反传梯度了.
注意做损失的时候, 只计算在第1步里当句中随机遮盖或替换的部分, 其余部分不做损失, 对于其他部分, 模型输出什么东西, 我们不在意。
BERT语言模型任务二: Next Sentence Prediction
- 首先我们拿到属于上下文的一对句子, 也就是两个句子, 之后我们要在这两段连续的句子里面加一些特殊:
上一句话,下一句话.
也就是在句子开头加一个, 在两句话之中和句末加, 具体地就像下图一样:
- 我们看到上图中两句话是 my dog is cute he likes playing , 我的狗很可爱他喜欢玩耍, 除此之外, 我们还要准备同样格式的两句话, 但他们不属于上下文关系的情况;
我的狗很可爱企鹅不擅长飞行, 可见这属于上下句不属于上下文关系的情况;
在实际的训练中, 我们让上面两种情况出现的比例为, 也就是一半的时间输出的文本属于上下文关系, 一半时间不是. - 我们进行完上述步骤之后, 还要随机初始化一个可训练的, 见上图中, 作用就是用的信息让模型分开上下句, 我们一把给上句全的, 下句啊全的, 让模型得以判断上下句的起止位置, 例如:
我的狗很可爱企鹅不擅长飞行
上面和就是. - 还记得我们上节课说过的, 注意力机制就是, 让每句话中的每一个字对应的那一条向量里, 都融入这句话所有字的信息, 那么我们在最终隐藏层的计算结果里, 只要取出所对应的一条向量, 里面就含有整个句子的信息, 因为我们期望这个句子里面所有信息都会往所对应的一条向量里汇总:
模型最终输出的隐藏层的计算结果的维度是:
我们
我们要取出所对应的一条向量, 对应着维度的第条:
之后我们再初始化一个权重, 完成从维度到的映射, 也就是逻辑回归, 之后用函数激活, 就得到了而分类问题的推断.
我们用来表示模型的输出的推断, 他的值介于之间:
至此的训练方法就讲完了, 是不是很简单, 下面我们来为的预训练准备数据.
未完,待续!
网友评论