感谢大佬们写的文章
深度学习中的注意力机制(2017版)_注意力机制计算_张俊林博客的博客-CSDN博客
史上最小白之Attention详解上篇_attention讲解_Stink1995的博客-CSDN博客
史上最小白之Transformer详解下篇_Stink1995的博客-CSDN博客
Transform网络结构图
1、输入
在模型输入部分,需要将文字字段编码化,同时嵌入位置信息。以英文翻译成中文举例,将英文"Tom chase Jerry" 翻译成中文"汤姆追逐杰瑞" ,首先将Tom、Chase 和Jerry这三个单词embeddeding化,然后加上位置编码信息。
2、 Encode
(1)Attention机制的本质思想
将输入source的构成元素想象成是由一系列的<Key,Value>键值对构成,此时给定输出Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。
Attention计算公式
而self-Attention的思想类似,只是当Target=Source这种特殊情况下的注意力计算机制,计算过程是相同的,只是计算对象发生了变化。
(2)Transform中的Multi-Head Attention
Self-Attention计算公式
假如输入序列是"Thinking Machines",x1,x2就是对应地"Thinking"和"Machines"添加过位置编码之后的词向量,然后词向量通过三个权值矩阵转变成公式中的Q、K、V。
多头注意力机制
多头注意力允许模型共同关注来自不同位置的不同表示子空间的信息。对同一输入编码矩阵,采用多组权值矩阵W,计算得到不同的Attention矩阵,最后将得到的多个矩阵进行拼接。
多头注意力机制计算公式
3、Decode
输入目标字段,经过两个注意力模块后,输出结果。第一个自注意力模块中加入了掩码mask,将不需要的信息去掉,计算自注意力得分。第二个注意力模块计算输入字段和输出字段直接的权重得分,不是自注意力机制。
4、输出端
Output如图中所示,首先经过一次线性变换,然后Softmax得到输出的概率分布,然后通过词典,输出概率最大的对应的单词作为我们的预测输出。
Transform预测
推理过程中的数据流转如下:
第一步与训练过程相同:输入序列 (src_seq) 首先被转换为嵌入(带有位置编码),产生词嵌入表示(src_position_embed),之后送入第一个编码器。
第二步也与训练过程相同:由各编码器组成的编码器堆栈按照顺序对第一步中的输出进行处理,产生输入序列的编码表示(enc_outputs)。
从第三步开始一切变得不一样了:在第一个时间步,使用一个只有句首符号的空序列来代替训练过程中使用的目标序列。空序列转换为嵌入带有位置编码的嵌入(start_position_embed),并被送入解码器
由各解码器组成的解码器堆栈,将第三步的空序列嵌入表示(start_position_embed),与编码器堆栈的编码表示(enc_outputs)一起处理,产生目标序列第一个词的编码表示(step1_dec_outputs)。
输出层将其(step1_dec_outputs)转换为词概率和第一个目标单词(step1_tgt_seq)。
将这一步产生的目标单词填入解码器输入的序列中的第二个时间步位置。在第二个时间步,解码器输入序列包含句首符号产生的 token 和第一个时间步产生的目标单词。
回到第3个步骤,与之前一样,将新的解码器序列输入模型。然后取输出的第二个词并将其附加到解码器序列中。重复这个步骤,直到它预测出一个句末标记。
需要明确的是,由于编码器序列在每次迭代中都不会改变,我们不必每次都重复第1和第2步。