编码器/解码器注意力的主要思想是允许解码器跟踪输入中的重要单词
以翻译为例,将英文”Let’s go“翻译成其他语言
图1
token:Token是对文本进行切分和组织的最小单位。可以将Token视为单词、短语或其他文本片段的抽象表示。在语言模型中,Token可以是字、词、子词或更大的语言单元
-
encoder
上图所示,
Word embedding:编码成向量
position:token位置
Self-attention:编码单词之间的联系
Residual connections:更好的并行运算
每个token的权重是相同的,权重可以通过反向传播(即训练 )来得到。图中每个token用两个值来表示
由于后续在预测时容易将token顺序弄混乱,所以加入token的位置。下图是position encoding的编码规则
使用不同频率的余弦函数来为每一个编码后的值添加位置信息。①将位置编码和词向量相加可以得到包含有位置和词信息的值,后经过两个权重得到两个Query值来表示token:“let‘s”,并用它计算与“go”的相似度;
②再创建两个值表示“let’s”和“go”,称为key,并用query和key计算二则和相似度(点积),值越大,其越相似
③经过softmax函数得到其概率值,也是query与key的相似度,
④再创建两个值表示“let‘s”,并按照1.0(概率值)的比例进行缩放,叫做Value;再创建两个值表示“go”,并按照0.0的比例进行缩放
⑤将缩放值相加,“let’s”和“go”的独立编码根据与“let‘s”的相似度的和,成为“let’s”的自注意力值。
注:query、key、value的各个权重的值都是一样的,可以同时计算各个token的权重,transformer可以并行计算
可以看到,计算出来的自注意力值同样是两个,那么为什么不使用加入位置编码的值来表示“let’s”?
每个词的新自注意力值包含其他所有词的输入,有助于为每个词提供上下文,建立输入中每个词之间的关系,方便扩展(每个自注意力单元QVK有独自的权重,捕捉词之间的关系,论文的多头注意力机制 )
加入残差模块的作用?
更容易训练复杂NN,使得自注意力层在建立输入词之间关系时,不必同时保留词嵌入和位置编码信息
- decoder
与encoder类似,都经历一个自注意力模块,得到两个值。
在进行相似度计算时,将encoder的输出key与decoder的query进行相似度比对。在决定第一个单词应该被翻译成什么时,计算每个输入单词的value,然后按softmax百分比缩放这些值,相加得到编码器/解码器的注意力值。
对比图1看decoder。encoder的输出QVK模块接入全连接层,输出预测的token
计算Q、V、K的encoder-decoder attention与self-attention的权重集合不同,但相应的权重集合对每个单词都是一致的,使得transformer在输入、输出长度上具有灵活性,可以向堆叠self-attention一样堆叠encoder-decoder attention以跟踪复杂短语中的单词