引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,Multi-head Attention是多层次的self-attention,多头的注意力有助于网络捕捉到更丰富的特征/信息(类比 CNN 中同时使用多个卷积核)。 Show 在self-attention中,Q=K=V,序列中的每个单词(token)和该序列中其余单词(token)进行attention计算。self-attention的特点在于无视词(token)之间的距离直接计算依赖关系,从而能够学习到序列的内部结构,实现起来也比较简单 Query,Key,Value的概念取自于信息检索系统,Q表示的就是与我这个单词相匹配的单词的属性,K就表示我这个单词的本身的属性,V表示的是我这个单词的包含的信息本身。 Attention机制中的Q,K,V即是,我们对当前的Query和所有的Key计算相似度,将这个相似度值通过Softmax层进行得到一组权重,根据这组权重与对应Value的乘积求和得到Attention下的Value值。 实验发现self-attention使用Q、K、V,这样三个参数独立,模型的表达能力和灵活性很好。 V是表示输入特征的向量,Q、K是计算Attention权重的特征向量。它们都是由输入特征得到的。Attention(Q,K,V)是根据关注程度对V乘以相应权重 你有一个问题Q,然后去搜索引擎里面搜,搜索引擎里面有好多文章,每个文章V有一个能代表其正文内容的标题K,然后搜索引擎用你的问题Q和那些文章V的标题K进行一个匹配,看看相关度(QK --->attention值),然后你想用这些检索到的不同相关度的文章V来表示你的问题,就用这些相关度将检索的文章V做一个加权和,那么你就得到了一个新的Q',这个Q'融合了相关性强的文章V更多信息,而融合了相关性弱的文章V较少的信息。这就是注意力机制,注意力度不同,重点关注(权值大)与你想要的东西相关性强的部分,稍微关注(权值小)相关性弱的部分。 Q、K、V都源于输入特征本身,是根据输入特征产生的向量。 举个例子:当我们打游戏出现打野来上被他反杀这种现象时,我们的第一反应是:在self-attention中,我们能否通过语言理解去做到,这个他指的是上单还是打野? 在这里插入图片描述那么在Self-Attention中的做法是: 1、根据这个句子得到打野、上、他的embedding,在下图表示为e1,e2,e3。 2、将e通过不同的线性变换形成Q、K、V,他们都只是我们原本的序列e做了不同的线性变换之后的结果,都可以作为X的代表。 3、根据Q3分别与K1、K2做运算,计算相似程度即Attention值。得到 、4、 =(++1)×,Attention向量中就包含了:他更可能指代上单,而不是打野。下面是另一种理解: 下图是self-attention过程:若需要计算a2的注意力,首先将q2与所有k(包括自己的)相乘,然后得到权重α,权重算softmax后去乘以所有的v,加起来得到最终的b。 其实这图横过来看可以看成神经网络,而q与k相乘就是算权重,输入为a2,输出为b2。 在这里插入图片描述但是简单将单词编码成a的话,会缺失一个位置信息,导致每个a之间相当,于是便加入了positional encoding。 在4中我们说到,e通过不同的线性变换形成Q、K、V,一个注意力头就是说一套线性变换的矩阵( 、、),多个注意力头就是多套线性变换( 、、)、( 、、)、( 、、)…..了,多套之间线性变换的参数W是不一样的,对于输入矩阵X,每一套Q、K、V都可以得到一个输出矩阵Z,最后将他们拼接起来就好了。多头类似于CNN的多个卷积核。通过三个线性层的映射,不同头中的Q、K、V是不一样的,而这三个线性层的权重是先初始化后续通过学习得到的。不同的权重可以捕捉到序列中不同的相关性。 多头自注意力层的作用是将原始文本序列信息做整合,转换后的文本序列中每个字符都与整个文本序列的信息相关(这也是Transformer中最创新的思想,尽管根据最新的综述研究表明,Transformer的效果非常好其实多头自注意力层并不占据绝大贡献)。 个人理解Transformer在训练时就是不断的在优化自己的多头注意力层,不断调整输入与输出之间的隐层特征,调整Q、K、V的权重矩阵,使其能够学习到两种语言(如德语到英语,也不仅限于NLP)的复杂映射关系。 当 √dk 特别小的时候,其实除不除无所谓。无论编码器还是解码器Q、K矩阵其实本质是一个相同的矩阵。Q、K相乘其实相等于Q乘以Q的转置,这样造成结果会很大或者很小。小了还好说,大的话会使得后续做softmax继续被放大造成梯度消失,不利于梯度反向传播。 Transformer之所以能支持Decoder部分并行化训练,是基于以下两个关键点: ①、teacher force 对于teacher force,是指在每一轮预测时,不使用上一轮预测的输出,而强制使用正确的单词,过这样的方法可以有效的避免因中间预测错误而对后续序列的预测,从而加快训练速度,而Transformer采用这个方法,为并行化训练提供了可能,因为每个时刻的输入不再依赖上一时刻的输出,而是依赖正确的样本,而正确的样本在训练集中已经全量提供了。值得注意的一点是:Decoder的并行化仅在训练阶段,在测试阶段,因为我们没有正确的目标语句,t时刻的输入必然依赖t-1时刻的输出,这时跟之前的seq2seq就没什么区别了。 ②、masked self attention 我们在5里说到,多头注意力意味着多组KQV进行self-attention运算,不同于LSTM中的一步步的按部就班的运算,而是KQV的运算可以是同时计算的(这是因为每QKV的线性变换不同,计算互不影响) 有大量的paper表明,Transformer,或Bert的特定层是有独特的功能的,底层更偏向于关注语法,顶层更偏向于关注语义。那么我们假定:在同一层Transformer关注的方面是相同的,那么对该方面而言,不同的头关注点应该也是一样的。不过,在下图中也表明:同一层中,总有那么一两个头独一无二,和其他头的关注pattern不同。(从某个角度看,至少一个头的效果不如多几个头好,至于具体是几个head又是另一个问题了。) 有影响? 论文《Analyzing Multi-Head Self-Attention: Transformer原论文中的结果,我们主要看base那一行和(A)组。对于PPL和BLEU,确是8个头/16个头最好,1个头最差,4个和32个头稍微差一点,但是差的不多。从这里来看,head也不是越多越好或者越少越好。 ?能否通过控制初始化去控制? 论文《Improving Deep Transformer with Depth-Scaled Initialization and Merged Attention》讨论了初始化对Transformer各层方差的影响,最终缓解梯度消失的问题。从这个角度讲,Transformer底层的头方差大是因为Transformer存在的梯度消失问题,也就是说,并不是模型自己觉得底层的方差大是好的,而是自己没有办法让它变好。所以,合理的初始化应该可以减少底层头的方差,提高效果。 从 为什么Transformer 需要进行 Multi-head Attention?整体来看:
self-attention 为什么它能发挥如此大的作用
残差结构意义防止梯度消失,帮助深层网络训练 具体理论推导可以看看残差网络解决了什么,为什么有效? Transformer中的Mask矩阵已经有顺序了,能去掉position embedding吗?Transformer中的Mask矩阵已经有顺序了,能去掉position embedding吗? 另外,也有论文证明去掉position embedding在语言建模上提升性能 为什么说 Transformer 可以代替 seq2seq?出处: 关于Transformer,面试官们都怎么问
|