更多查看https://github.com/B-C-WANG/AI-Storage
4.2. 4.2从浅到深理解bert
4.2.1. 理解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)
4.2.2. 理解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相同
4.2.3. 理解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中,用以加入位置信息
4.2.4. 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二分类
4.2.5. Bert前向传播
- 输入一个序列的word,经过embeding后加上position embeding,传入encoders得到最后一层encoder的K和V输出,将KV输出复制和decoder数目相同的份数,每一个都作为decoder中的encoder-decoder self-attention的两个Xe,然后decoder输入Xd,传递到最后一层,通过Linear+Softmax得到预测的词的概率,最终是一次性输出所有的翻译结果的词的softmax,按照顺序取,取到<end>这个词结束
4.2.6. Bert的下游任务
分类任务
- bert最终针对一个句子输出sequence_length x bert_feature_dim 大小的矩阵,sequence_length是句子中词的数目,每个词有一个bert feature dim大小的向量,可以使用CNN等接上bert输出用于后续任务
- 使用bert输出的向量的第一个词(也就是<start>)的向量,去掉其他剩下所有词的向量,也可以用于分类(第一个词作为简单的一个句子的特征向量)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)