Self Attention 为什么 有效

引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,Multi-head Attention是多层次的self-attention,多头的注意力有助于网络捕捉到更丰富的特征/信息(类比 CNN 中同时使用多个卷积核)。

在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 为什么 有效
在这里插入图片描述

那么在Self-Attention中的做法是:

1、根据这个句子得到打野、上、他的embedding,在下图表示为e1,e2,e3。

2、将e通过不同的线性变换形成Q、K、V,他们都只是我们原本的序列e做了不同的线性变换之后的结果,都可以作为X的代表。

3、根据Q3分别与K1、K2做运算,计算相似程度即Attention值。得到

Self Attention 为什么 有效
Self Attention 为什么 有效

4、

Self Attention 为什么 有效
=(
Self Attention 为什么 有效
+
Self Attention 为什么 有效
+1)×
Self Attention 为什么 有效
,Attention
Self Attention 为什么 有效
向量中就包含了:他更可能指代上单,而不是打野。

下面是另一种理解:

下图是self-attention过程:若需要计算a2的注意力,首先将q2与所有k(包括自己的)相乘,然后得到权重α,权重算softmax后去乘以所有的v,加起来得到最终的b。

其实这图横过来看可以看成神经网络,而q与k相乘就是算权重,输入为a2,输出为b2。

Self Attention 为什么 有效
在这里插入图片描述

但是简单将单词编码成a的话,会缺失一个位置信息,导致每个a之间相当,于是便加入了positional encoding。

在4中我们说到,e通过不同的线性变换形成Q、K、V,一个注意力头就是说一套线性变换的矩阵(

Self Attention 为什么 有效
Self Attention 为什么 有效
Self Attention 为什么 有效
),多个注意力头就是多套线性变换(
Self Attention 为什么 有效
Self Attention 为什么 有效
Self Attention 为什么 有效
)、(
Self Attention 为什么 有效
Self Attention 为什么 有效
Self Attention 为什么 有效
)、(
Self Attention 为什么 有效
Self Attention 为什么 有效
Self Attention 为什么 有效
)…..了,多套之间线性变换的参数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又是另一个问题了。)


Self Attention 为什么 有效
有影响?

论文《Analyzing Multi-Head Self-Attention:
Specialized Heads Do the Heavy Lifting, the Rest Can Be Pruned》给出的结论是:只有一小部分头对翻译而言是重要的,其他的头都是次要的;重要的头有一种或多种专有的关注模式。

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?整体来看:

Multi-Head其实不是必须的,去掉一些头效果依然有不错的效果(而且效果下降可能是因为参数量下降),这是因为在头足够的情况下,这些头已经能够有关注位置信息、关注语法信息、关注罕见词的能力了,再多一些头,无非是一种enhance或noise而已。

self-attention 为什么它能发挥如此大的作用

  • self-attention 是一种自身和自身相关联的 attention 机制,这样能够得到一个更好的 representation 来表达自身;self-attention 可以捕获同一个句子中单词之间的一些句法特征(比如图 1 展示的有一定距离的短语结构)或者语义特征。
  • 引入 Self Attention 后会更容易捕获句子中长距离的相互依赖的特征,因为如果是 RNN 或者 LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。
  • Self Attention 对于增加计算的并行性也有直接帮助作用。

残差结构意义

防止梯度消失,帮助深层网络训练

具体理论推导可以看看残差网络解决了什么,为什么有效?

Transformer中的Mask矩阵已经有顺序了,能去掉position embedding吗?

Transformer中的Mask矩阵已经有顺序了,能去掉position embedding吗?
总结一下,需要根据具体任务看position embedding,如果是序列任务,可能最好还是保留,如果对位置不敏感,去掉也是可以的。

另外,也有论文证明去掉position embedding在语言建模上提升性能

为什么说 Transformer 可以代替 seq2seq?

出处: 关于Transformer,面试官们都怎么问
简单点说,一方面是想想seq2seq有什么缺点,另一方面是transformer有什么优点?

  • seq2seq缺少attention,不能关注重点。encoder的输出是所有信息都压缩到一个向量中,在序列比较长的时候,会损失encoder的一些信息,decoder不能够关注到其想要关注的信息。(后来有带attention+seq2seq的改进)
  • transformer表达能力更强,通过自身和自身的关联,增强自身的表达度
  • transformer有并行能力

这里用代替这个词略显不妥当,seq2seq 虽已老,但始终还是有其用武之地,seq2seq 最大的问题在于「将 Encoder 端的所有信息压缩到一个固定长度的向量中」,并将其作为 Decoder 端首个隐藏状态的输入,来预测 Decoder 端第一个单词(token)的隐藏状态。在输入序列比较长的时候,这样做显然会损失 Encoder 端的很多信息,而且这样一股脑的把该固定向量送入 Decoder 端,Decoder 端不能够关注到其想要关注的信息。

上述两点都是 seq2seq 模型的缺点,后续论文对这两点有所改进,如著名的Neural Machine Translation by Jointly Learning to Align and Translate,虽然确确实实对 seq2seq 模型有了实质性的改进,但是由于主体模型仍然为 RNN(LSTM)系列的模型,因此模型的并行能力还是受限,而 transformer 不但对 seq2seq 模型这两点缺点有了实质性的改进(多头交互式 attention 模块),而且还引入了 self-attention 模块,让源序列和目标序列首先“自关联”起来,这样的话,源序列和目标序列自身的 embedding 表示所蕴含的信息更加丰富,而且后续的 FFN 层也增强了模型的表达能力(ACL 2018 会议上有论文对 Self-Attention 和 FFN 等模块都有实验分析,见论文:How Much Attention Do You Need?A Granular Analysis of Neural Machine Translation Architectures),并且 Transformer 并行计算的能力是远远超过 seq2seq 系列的模型,因此我认为这是 transformer 优于 seq2seq 模型的地方。

自注意力机制是什么?

自注意力机制是注意力机制的变体,其减少了对外部信息的依赖,更擅长捕捉数据或特征的内部相关性。 自注意力机制在文本中的应用,主要通过计算单词间的互相影响,来解决长距离依赖问题。

Self

1、首先要除以一个数,防止输入softmax的值过大,导致偏导数趋近于0; 2、选择根号d_k是因为可以 使得q*k的结果满足期望为0,方差为1的分布,类似于归一化 。

Self attention是什么意思?

Self Attention顾名思义,指的不是Target和Source之间的Attention机制,而Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力计算机制。

多头注意力是什么?

多头注意力通过利用同一查询的多个不同版本并行实现多个注意力模块来工作。 其思想使用不同的权重矩阵对查询 进行线性变换得到多个查询。 每个新形成的查询本质上都需要不同类型的相关信息,从而允许注意模型在上下文向量计算中引入更多信息。 多头注意力的 个头部都有自己的多个查询向量、键矩阵和值矩阵: 和 , 。