文章目录

  • 引言
  • 一、Bert模型总览
  • 二、注意力机制
    • 1.Seq2seq中的注意力操作
    • 2.注意力的一般形式(三步曲)
    • 3. transformer中的自注意力机制—Self.Attention
    • 4. transformer的多头注意力机制
    • 5. scaling
    • 6. 模型优化技巧:残差连接
  • 三、BERT其他结构特性
    • 1.BERT模型中的位置编码
    • 2. BERT中的全连接层与非线性激活函数
    • 3. 层归一化—LayerNormalization

引言

  本节将按照思维导图逐步了解BERT模型。

  2018年谷歌在Github上开源了Bert模型之后,后续人们开发Bert模型变体以及对Bert模型进行优化,各种NLP比赛榜单都是Bert及其变体占据,开启了NLP的新时代!这个时代有两个特性:

  • 模型的架构是趋同的,所有的模型基本上是基于transformer的
  • 所有的模型基本上都是基于预训练的

一、Bert模型总览

  BERT网络结构是多层transformer Encoder叠加。

  Transformer block的具体架构为:

Transformer层的网络核心要素如下:

  • Multi-head attention (多头注意力)
  • FFN(全连接层)
  • LayerNorm(层归一化)
  • 残差连接

二、注意力机制

  人类在接收到所有信号时,并不会将注意力平分到每一个信号中,而是会重点观察某些部分,战略性忽略某些部分。

NLP中核心的注意力机制与人类的注意力机制在直观上是一致的。

1.Seq2seq中的注意力操作

  我们现在从attention的起源来了解attention的功能。在没有attention机制以前,机器翻译模型通常是使用序列到序列的架构(Seq2seq)。

左边的编码器(Encoder)将原文直接表示成向量,这个向量用于目标语言句子的预测中,在解码器(Decoder)生成目标语言句子。这个模型架构逻辑上是非常合理的,但是会涉及到信息瓶颈的问题—即输入的句子不管有多丰富,但是面对解码器,最终只会生成一个向量。在预测目标语言句子的不同字时,所拥有的输入信息(原句输入信息)是相同的(输入句子全部局限于向量表示中)。不过,我们在预测目标语言句子的不同字时,需要关注输入的不同部分。

例如:翻译句子的前面几个字,大概率是基于句子靠前部分来翻译;翻译句子的后面几个字,大概率是基于句子靠后部分来翻译的。


  为了解决“信息瓶颈”的问题,引入了attention机制,打开了NLP架构的新格局。
  在预测目标语言句子的下一个词时,利用attention接受到更多的信息。

  • 首先,利用 s 1 s_1 s1向量与原句的每一个字的向量表示进行点积,相当于得到了一些打分。

    Attention store:
  • 我们将上一步得到的打分通过求softmax形成一个分布。经过变换后,这些打分总和为1,而且,其全部非负,可以看成概率分布。

    Attention distribution:
  • 我们将原句的注意力向量表示用注意力打分进行加权平均就得到注意力输出向量Attention output。

    注意力打分加权平均表征:
  • 最后,Attention output能够帮助我们更好的预测下一个词,即将注意力输出与 s t s_t st拼接经过解码得到下一个字。

    注意力输出与 s t s_t st拼接帮助解码:

2.注意力的一般形式(三步曲)

  注意力的一般定义:给定一组向量(key, value)键值对,以及一个向量query,注意力机制就是一种根据query与keys来计算values的加权平均的模块。

  上面介绍的机器翻译模型中的attention机制打分是基于点积的。下面介绍attention机制的其他写法。常用的注意力打分方法有3种:

  • 点积注意力(dot-product attention) :
  • 乘法注意力(multiplicative attention):

    引入可学习的 W W W元素,使得attention机制更加匹配下游任务。
  • 加法注意力(additive attention):

    把query与key都引入到全连接层,通过引入一个额外的向量进行点积,最后形成一个attention打分。

3. transformer中的自注意力机制—Self.Attention

  下面我们考虑一个问题:注意力机制是否可以得到一个句子的向量表征?这里就引出自注意力机制,通过自己注意自己,来更新句子每个词的向量表征。
  自注意力机制建模句子表征的过程为:从单个字角度:e.g:it_的向量表征与句子中的所有词之间计算注意力,由此更新其向量表征。过程如下:

  • 首先对Query、key与value均乘以一个参数矩阵
    q i = h i W Q k i = h i W K v i = h i W V q_i=h_iW_Q\\k_i=h_iW_K\\v_i=h_iW_V qi=hiWQki=hiWKvi=hiWV
  • 假设it_在句子的第 i i i个位置,那么它在第 j j j个位置的注意力打分为:
    e i , j = q i T k j e_{i,j}=q_i^Tk_j ei,j=qiTkj
  • 通过softmax归一化成概率分布
    α i = s o f t m a x ( [ e i , 1 , . . . , e i , T ] ) \alpha_i=softmax([e_{i,1},...,e_{i,T}]) αi=softmax([ei,1,...,ei,T])
  • 通过注意力打分的分布,我们对value进行加权平均,然后再经过一个线性层输出 h i ′ h_i^{'} hih i ′ h_i^{'} hi正是更新后的it_向量表征
    h i ′ = ( ∑ α i , j v j ) W O h_i^{'}=(\sum{\alpha_{i,j}v_j})W_O hi=(αi,jvj)WO

it_为Query,句子中的其他词为key与value

  注意力机制通过操作实现了句子中词语两两间的交互。当然,在实现的过程中,不可能对句子中的每一个字都重复进行上面运算,这个非常低效。实际实现的过程中,需要通过矩阵的计算来使得整个句子直接完成两两之间的注意力的计算。整个句子的一次self-attention的过程如下: