BC.Wang Welcome

从浅到深理解Bert

2019-08-02
BCWang

阅读:

NLP

  • https://github.com/B-C-WANG/AI-Storage

    理解Attention

  • 参考https://www.cnblogs.com/robert-dlut/p/8638283.html
  • Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射
  • 在计算attention时主要分为三步,第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;然后第二步一般是使用一个softmax函数对这些权重进行归一化;最后将权重和相应的键值value进行加权求和得到最后的attention。目前在NLP研究中,key和value常常都是同一个,即key=value
  • 相似度的计算方法:点积-Q转置乘以K或Q转置乘以W乘以K,拼接:将QK拼接乘以W,感知机:tanh(WQ+UK)

    理解self-attention

  • VKQ分别是指上一节中的Value,Key和Query
  • Scaled Dot-Product Attention(简写SDPA):QK的点积过后除以了维度的sqrt,避免内积过大,然后softmax过后乘以V,得到输出,输出维度和V相同
  • Multi-head Attention(简写MHA,包括了SDPA):输出V,K,Q,经过线性变换后输入上面的SDPA中,不过注意此时V K Q之后的线性层和SDPA都有多个,也就是多头的体现,得到多个softmax概率乘以V的结果,然后拼接起来
  • 因此,MHA有三个输入,分别是VKQ。Encoder-dencoder attention中,VKQ分别是Xe,Xe和Xd(Xe为encoder输入,Xd为decoder输入)。encoder中的Self-attention中,VKQ均为Xe,而decoder的Self-attention,VKQ均为Xd
  • 为何需要完全相同的VKQ?这样的话里面的每个词都要和该句子中的所有词进行attention计算。目的是学习句子内部的词依赖关系,捕获句子的内部结构
  • 关于时间复杂度,文中提到Self-Attention为n^2 x d,RNN为n x d^2,CNN为k x n x d^2,其中RNN不能并行,还需要计算n次,其他均计算1次。n为输入序列大小,d为embedding维度。由此,在使用RNN的场合都应当考虑使用self-attention替代
  • Self-Attention对于长距离依赖非常好,因此可以捕获长距离依赖关系
  • **Self-Attention可以看成和RNN,CNN,Dense等等同的角色,作为构建NN模型需要考虑到的一环,Self-Attention在形式上和ResNet中的残差块相似,输入矩阵或向量的X,经过QWK向量求得Softmax,然后再将概率乘回X,输入和输出shape相同**

    理解Transformer

  • 参考https://baijiahao.baidu.com/s?id=1622064575970777188&wfr=spider&for=pc
  • 一个典型的Transformer由6个Encoders和6个Decoders组成,每个Encoder或decoder串联,具有相同结构不同权重
  • encoder均为先通过一个encoder Self-Attention(encoder self-attention即VKQ都是Xe),然后通过一个Dense输出
  • decoder则是先通过decoder self-attention(VKQ都是Xd),然后经过一个encoder-decoder attention(VK是Xe,Q是Xd),需要注意,每个decoder不仅仅从上一个串联的decoder中输入Xd,还从最后一个encoder的结果的KV中输入分别的Xe
  • 和CNN相同,这样的方式没有考虑到序列信息,因此Transformer使用了Position Embeding的方法,将和word embeding相同大小的position embeding加入word embeding中,用以加入位置信息

Bert及其预训练

  • bert包含3个embedding,词的embedding,句子的embedding和position embedding,为了训练这些embedding需要特定的非监督任务
  • 训练word embeding-Masked ML:将一些词随机用Mask替换,训练怎样预测这些词,输入是替换后的词语,网络结构只用到Transformer Encoder,最终输出使用softmax直接接完整的词的onehot作损失
  • 训练句子的embeding-Next Sentence Prediction:判断两个句子是否是上下文,输入整个序列,使用[cls]标签切分两句话,变成2x1的向量,然后最终softmax二分类

Bert前向传播

  • 输入一个序列的word,经过embeding后加上position embeding,传入encoders得到最后一层encoder的K和V输出,将KV输出复制和decoder数目相同的份数,每一个都作为decoder中的encoder-decoder self-attention的两个Xe,然后decoder输入Xd,传递到最后一层,通过Linear+Softmax得到预测的词的概率,最终是一次性输出所有的翻译结果的词的softmax,按照顺序取,取到<end>这个词结束

Bert的下游任务

分类任务

  • bert最终针对一个句子输出sequence_length x bert_feature_dim 大小的矩阵,sequence_length是句子中词的数目,每个词有一个bert feature dim大小的向量,可以使用CNN等接上bert输出用于后续任务
  • 使用bert输出的向量的第一个词(也就是<start>)的向量,去掉其他剩下所有词的向量,也可以用于分类(第一个词作为简单的一个句子的特征向量)

Similar Posts

Comments

0