目录
为什么在进行softmax之前需要对attention进行scaled(为什么除以dk的平方根)
Transformer为何使用多头注意力机制?为什么不用一个头,或者说直接用一个矩阵?
一、什么是transformer
Transformer是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制(self-attention mechanism),这是一个关键的创新,使其在处理序列数据时表现出色。
以下是Transformer的一些重要组成部分和特点:
二、简述transformer
Transformer分为两个部分,一个是encoder端,一个是decoder端。
1.encoder端
对于encoder来说,它由n个完全相同的小编码单元堆叠而成。这个数量可以是6,12,超参数自己去定。对于小编码单元的最开始的输入部分,可以分为两个部分,一个是词向量,一个是位置编码;位置编码这里使用的是正余弦函数,其实这里使用随机初始化的也是可以的,原论文实验效果是这里没有太大的区别(面试题:为什么没用随机初始化学习的方式)
对于正余弦这里,是一种绝对位置信息,在句子中的每个位置上,都有一个512维度的向量表达。这种绝对位置信息中也包含了相对位置信息,通过三角函数,可以知道pe(pos+k)可以被pe(pos)线性表达对于每个小编码单元.
每个小编码单元可以划分为两个部分,一个是多头注意力层,一个是前馈神经网络层。进一步拆分,多头注意力层可以分为自注意力层和add&norma层;前馈神经网络层是一个linear层(liner层这里包含两层linear,一个是relu作为激活函数,一个没有激活函数)和add&norm层;
对于多头注意力层来说,首先注意的一点是我们会对一个batch数据中的pad位置部分进行mask(padding mask),所以我们会生成要给mask矩阵,把pad位置置为1,其余位置为0,在做softmax的时候告诉模型符号为1的是pad位置,然后把这里置为极小值,再做softmax。
它的核心在于三个参数矩阵wq,wk,wv;我们的输入向量,对于编码端是复制三份,然后经过wq,wk,wv矩阵,生成QKV,进一步拆分为多头之后的各自头对应的q/k/;这个过程中有一个分头的过程。
然后qk转置相乘,除以根号dk,做softmax,然后和v做加权求和,然后多头得到的结果拼接,接一个linear层,转到初始的相同维度(当时这里一般来说,就一定是初始的相同维度)。这是一个小编码单元,n个完全堆叠;最后编码的输出是K和V矩阵,给解码端用。
2.decoder端
Decoder部分,大体和encoder是一致的;不过加了一个交互层。也就是它是三部分,多头注意力层,交互注意力层以及前馈神经网络层。
对多头注意层,编码端会对pad符号有一个mask符号矩阵。因为decoder的时候,不能看到当前单词之后的信息,所以我们还会生成一个上三角mask符号矩阵(sequence mask),两者相加,在做多头注意力层的时候,用这些符号矩阵。
对于交互注意力层,Q矩阵来自解码端,KV矩阵来自编码端,这个交互是decoder的每一层和整个编码端的输出做交互,而不是编码端的每一层。
还有一个细节点,就是在做交互的时候的时候,我们的mask符号矩阵使用编码端的,不用使用解码端的因为没必要用解码端的符号矩阵,因为这里计算出来的结果,还会被下一个小解码单元的多头注意力层的mask覆盖.
三、transformer的架构
Nx = 6,Encoder block由6个encoder堆叠而成,图中的一个框代表的是一个encoder的内部结构,一个Encoder是由Multi-Head Attention和全连接神经网络Feed Forward Network构成。如下图所示:
Transformer的编码组件是由6个编码器叠加在一起组成的,解码器同样如此。所有的编码器在结构上是相同的,但是它们之间并没有共享参数。编码器的简略结构如下:
从编码器输入的句子首先会经过一个自注意力层,这一层帮助编码器在对每个单词编码的时候时刻关注句子的其它单词。解码器中的解码注意力层的作用是关注输入句子的相关部分,类似seq2seq的注意力。原结构中使用到的是多头注意力机制
四、自注意力机制
自注意力的作用:随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。在处理过程中,自注意力机制会将对所有相关单词的理解融入到我们正在处理的单词中。更具体的功能如下:
序列建模:自注意力可以用于序列数据(例如文本、时间序列、音频等)的建模。它可以捕捉序列中不同位置的依赖关系,从而更好地理解上下文。这对于机器翻译、文本生成、情感分析等任务非常有用。
并行计算:自注意力可以并行计算,这意味着可以有效地在现代硬件上进行加速。相比于RNN和CNN等序列模型,它更容易在GPU和TPU等硬件上进行高效的训练和推理。(因为在自注意力中可以并行的计算得分)
长距离依赖捕捉:传统的循环神经网络(RNN)在处理长序列时可能面临梯度消失或梯度爆炸的问题。自注意力可以更好地处理长距离依赖关系,因为它不需要按顺序处理输入序列。
从每个编码器的输入向量(每个单词的词向量,即Embedding,可以是任意形式的词向量,比如说word2vec,GloVe,one-hot编码)中生成三个向量,即查询向量、键向量和一个值向量。(这三个向量是通过词嵌入与三个权重矩阵即W Q , W K , W V , 相乘后创建出来的)新向量在维度上往往比词嵌入向量更低。(512->64)
五、位置编码
Transformer论文中,使用正余弦函数表示绝对位置,通过两者乘积得到相对位置。因为正余弦函数具有周期性,可以很好地表示序列中单词的相对位置。
BERT用了Transformer,但位置信息是训练出来的,没有用正弦余弦;正弦余弦是考虑到语言的语义和相对位置有关而与绝对位置关系不大,一句话放在文首还是文中还是文末,排除特殊情况后语义应该是差不多的。所以只要合理设计,用其他周期函数也可以。
六、Add&Normalize
在经过多头注意力机制得到矩阵Z之后,并没有直接传入全连接神经网络,而是经过了一步Add&Normalize。
为什么在进行softmax之前需要对attention进行scaled(为什么除以dk的平方根)
随着q,k的向量维度的增长,点积模型的值通常有比较大方差,即部分值很大部分值很小这样较为极端的情况,softmax本身对于值之间的相对大小有很强的放大作用。
可以看到经过softmax计算的结果很容易进入softmax的饱和区(类似于siqmoid,softmax也存在饱和区的问题,softmax的导数的范围在[0,1]之间)。
缩放点积模型可以较好地缓解这一问题关于这一点,在原始论文的注释里谈到,假设 Q 和K的均值为0,方差为1。它们的矩阵乘积将有均值为0,方差为dk。如果是dk的话,也就是增大了方差,就很容易出现极大值和极小值,siqmoid是softmax的一个特例,softmax也有饱和区,那么就很容易出现梯度消失问题。因此使用dk的平方根被用于缩放,这样可以获得更平缓的softmax。简单来说,当维度很大时,点积结果方差会变大,结果出现极值的概率增加,会导致softmax的梯度很小。为了减轻这个影响,对点积进行缩放,控制方差为1。
Transformer为何使用多头注意力机制?为什么不用一个头,或者说直接用一个矩阵?
从两个方面去回答:首先第一点多头可以使参数矩阵形成多个子空间,对模型进行多方面的学习。第二个是最后我们会把多头结果拼接,这个类似一种集成思想,进一步提升模型整体效果。