当前位置:   article > 正文

NLP中BERT模型详解_nlp bert

nlp bert

标题NLP中BERT模型详解

谷歌发表的论文为:
Attention Is ALL You Need
论文地址:[添加链接描述](https://arxiv.org/pdf/1706.03762.pdf)
  • 1
  • 2
  • 3
  • 1 BERT原理讲解简介
    BERT:双向Transformer的Encoder。英文解释为:Bidirectional Encoder Representation from Transformers。由此可见Transformer是组成BERT的核心模块,而Attention机制又是Transformer中最关键的部分,因此,Transformer和Attention是BERT关注的两个核心点。下面我们从Attention机制开始,介绍如何利用Attention机制构建Transformer模块,在此基础上,用多层Transformer组装BERT模型。
    1.1 Attention与selfattention机制
    Attention机制作用是为了让计算机有权重的关注自己感兴趣的特征,目的是为了关注不同的输入对输出的影响。Attention机制主要涉及到三个概念:Query、Key和Value。可以描述为将一个查询(query)和一组键值对(key-value)映射到一个输出(output),这里的query,keys,values和output都是向量。output是通过values的加权求和来计算的,这里的权重是通过一个query和对应的key的兼容函数来计算的。
    self-attention是BERT的重要思想,其与位置编码结合,解决了文本数据的时序相关性的问题,从而一举结束了依靠RNN、LSTM、GRU等之前一直用来解决时序问题的网络模型。self-attention通俗的说就是信息向前传播时动态的计算权重的一种方式,与CNN常见的MaxPooling、MeanPooling不同的是,attention模型是经过训练,当不同信息传入时,自动的调整权重的一种结构,模型如下图所示:
    在这里插入图片描述
    x1,x2,x3,x4 代表的是经过embedding的4条时序文本信息,首先将4条信息加上位置向量,得到a1,a2,a3,a4,这样做的目的上文已经说过,是为了获取文本的时序相关性。
    对每条信息分配三个权重WQ,WK,WV分别与a1,a2,a3,a4相乘后形成3个矩阵Q,K,V也就是上图的qi,ki,vi。
    Q=Linear(a1)=aiWQK=Linear(a1)=aiWKV=Linear(a1)=aiWV
    ​ 3) 将q1分别与k1,k2,…,ki点乘,得到α1,i,再有softmax的计算公式,计算得α^1,i。
    α1,i=q1∗kiα^1,i=exp(α1,i)/∑jexp(α1,j)
    ​ 4)最后按照softmax输出的权重对V进行加权,计算得b1。使用同样的方法计算得b2,b3,…,bi。将b1,b2,b3,…,bi进行合并,完成self-attention。
    b1=∑iα1,i∗vi
    1.2 BERT优点
    transformer舍弃了RNN的循环式网络结构,完全基于注意力机制来对一段文本进行建模。核心思想是去计算一句话中的每个词对于这句话中所有词的相互关系,然后认为这些词与词之间的相互关系在一定程度上反应了这句话中不同词之间的关联性以及重要程度。再利用词语之间相互关系的重要性(权重)获取每个词的表述。通过这种方式可以表达词语之间的相互联系:
    在这里插入图片描述
    Transformer通过对输入的文本不断进行这样的注意力机制层和普通的非线性层交叠来得到最终的文本表达。
    2 .模型框架
    BERT是一个无监督的NLP与训练模型,结构上是Transformer的编码部分,每个block主要由多头self-Attention、标准化(Norm)、残差连接、Feed Fordawrd组成。在项目中主要分为模型训练和微调参两个阶段。因模型是无监督学习,因此可以选取开源数据即可,同时微调重要参数有利于获得更好的训练和预测结果。其结构如下所示:
    在这里插入图片描述
    ​ 以上是BERT的整体结构,Input输入的是文本数据,经过Embedding加上位置向量Positional Encoding。Multi-Head Atention为多头的self-Attention,实际上就是将self-attention的Q、K、V均分成n份,分别进行计算。Add&Norm为残差计算和标准化;Feedward为全连接层,进行前向传播。其中Nx为基本单元的个数,是可以条调整的超参数。
    上图左侧为Transformer的编码部分,右侧为Transformer的解码部分。左侧的编码部分包括输入,添加位置编码,以self-Attention、Add&Norm、Feed Fordward的block。编码器将一个用符号(一般是向量)表示的输入序列(x1,…,xn)映射到一个连续的表征序列z=(z1,…,zn)。解码器拿到z后,生成一个符号表示的输出序列(y1,…,yn),这里是每个时间步生成一个yi,i表示从1到n任意一个数字。每一步,模型都自动消费前一步生成的符号,比如生成y2的时候会以y1作为额外的输入。
    1. 1 encoder编码其和decoder解码器
      编码器(encoder):
      编码器由6个相同的层堆叠而成。每一层包含2个子层。第一个子层是multi-head self-attention 机制(),第二个子层是一个简单的,位置分明的全连接前馈网络。我们在每个子层都使用了一个残差连接(residualconnection),并跟上一个归一化层(normalization layer)。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中的Sublayer(x)表示各子层自己实现的函数,比如self-attention层有自己的一套实现,而feed-forward层也有自己的实现。
      在这里插入图片描述
      2.2解码器(decoder):
      解码器也是由6个相同的层堆叠而成。每一层除了和编码器那样有两个子层外,解码器插入了第三个子层,用于在编码器最后的输出上执行multi-head attention。和编码器一样,我们也在解码器的各子层中引入了残差连接,并跟上一个归一化层。编码器的self-attention子层的注意力机制是关联到当前处理词和其他词的,因为输入的序列的所有词都是明确的,而解码器的self-attention子层只关联到当前处理词之前的词,因为当前处理词还没预测出来,之后的词当然更还没预测出来。所以解码器的self-attention子层的当前处理位置的后续位置都是用-inf来标识的,又称之为mask。
      整个网络表现模块流程图如下:
      在这里插入图片描述
      2.3 位置编码
      位置编码是用来捕获文本之间的时序关联性的。如果没有位置编码,文本字、词之间位置可以放置,从而造成语义关联不清,失去文本的实际意义。例如:”今日湖北随州发生特大暴雨,造成二十余人遇难“。其中湖北和随州关联最为紧密,如果没有位置编码,就无法表达这种关联性。NLP文本处理时,位置更近的文本一般相关性更大,所以将位置编码融入到数据中是很有必要的。需要要说明的是与Bert这种全部基于Attention不同的是,之前基于RNN的模型在模型结构上已经可以将这种时序信息考虑在内,但RNN如同串联方式,而bert好比并联方式,在处理大数据时,失效更高。
      在具体处理方式上,采用的是Embedding+Positional的方法,将数据之间的关联性融入到数据中。Embedding是嵌入到相应维度的文本数据,Positional在论文中使用了sine和cosine函数的线性变换来提供模型的位置信息,公式如下:
      PE(pos,2i)=sin(pos/100002i/dmodel)
      PE(pos,2i+1)=cos(pos/100002i/dmodel)(1)
      在self-attention的结构中,在对每维数据计算权重时,是采用点积的形式,本质上就是计算向量之间的相关性。而位置编码将临近的数据加上频率接近的位置编码,就是增加了相邻数据的相关性。下图是位置编码向量的热图,可以看出距离越近,频率就更加接近。
      在这里插入图片描述
    2. BERT预训练结构
      3.1 Maskeed LM
      BERT的作者提出了采用MaskLM的方式来训练语言模型。随机地将输入文本选一些要预测的词,然后用一个特殊的符号来代替它们。尽管模型最终还是会看到所有位置上的输入信息,但由于需要预测的词已经被特殊符号代替,所以模型无法事先知道这些位置上是什么词,这样就可以让模型根据所给的标签去学习这些地方该填的词了,好比初高中学习英语过程中的选词填空,如下所示。
      在这里插入图片描述
      这么做的好处在于后续微调任务中语句中并不会出现特殊符号标记,同时在预测一个词汇时,模型并不知道输入对应位置的词汇是否为正确的词汇,这就迫使模型更多地依赖于上下文信息去预测词汇,并且赋予了模型一定的纠错能力。
      3.2 NextSentence Prediction
      NextSentence Prediction意思是:给定一篇文章中的两句话,判断第二句话在文本中是否紧跟在第一句话之后,如下图所示,好比高考或这考研当中文章选后顺序排列,哪一家在前哪一句灾后,其模型结构如下:
      在这里插入图片描述
    3. BERT模型训练
      4.1 训练方法为:作者随机遮住15%的单词作为训练样本。
      (1)其中80%用masked token来代替。
      (2)10%用随机的一个词来替换。
      (3)10%保持这个词不变。
      作者在论文中提到这样做的好处是,编码器不知道哪些词需要预测的,哪些词是错误的,因此被迫需要学习每一个token的表示向量。另外作者表示,每个batchsize只有15%的词被遮盖的原因,是性能开销。双向编码器比单项编码器训练要慢。
      4.2 微调参数
      (1)256个句子作为一个batch,每个句子最多512个token。
      (2)迭代100万步。
      (3)总共训练样本超过33亿。
      (4)迭代40个epochs。
      (5)用adam学习率, 1 = 0.9, 2 = 0.999。
      (6)学习率头一万步保持固定值,之后线性衰减。
      (7)L2衰减,衰减参数为0.01。
      (8)drop out设置为0.1。
      (9)激活函数用GELU代替RELU。
      (10)Bert base版本用了16个TPU,Bert large版本用了64个TPU,训练时间4天完成。
      4.3 微调阶段根据不同任务使用不同网络模型。在微调阶段,大部分模型的超参数跟预训练时差不多,除了batchsize,学习率,epochs。
      训练参数:
      Batch size: 16, 32
      Learning rate (Adam): 5e-5, 3e-5, 2e-5
      Number of epochs: 3, 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/573167
推荐阅读
相关标签
  

闽ICP备14008679号