主要是学习illustrated-transformer和李宏毅老师的transformer讲解。

Attention Is All You Need中提出了Transformer。

以往以RNN为基础的seq2seq模型不利于并行计算,而CNN可以并行,但同时又不能很好的捕捉整个输入序列的信息(高层的filter才能能考虑到更长的序列),而Transformer实质上是一堆矩阵运算很容易进行并行运算并且可以捕捉整个句子的信息。

word embedding

Encoder

主要有两个部件组成:self-attention和feed forward。

self-attention

self-attenion的作用是将对于其他单词的理解融入到我们当前处理的单词中。

在这里插入图片描述
拿一个单词来举例:
step 1:如图所示,将embedding后的每个输入单词(大小为1x512)同乘以三个矩阵(大小为512x64)分别变为三个新的向量(大小为1x64)。

query : 用于匹配其他单词的key
key : 被其他单词的query匹配
value : 包含每个单词被提取的信息

step2 :计算每个单词的score,这个分数代表了当encode当前单词的位置时,应当将多少注意力分散给输入句子的其他单词上。该分数由当前单词的query和其他单词key做点乘(矩阵乘法)所得到的。

step3 :除以向量维度的平方根(也就是8,64的平方根),因为上一步点乘的数值会随着维度的增加而增加,这样可以得到更稳定的梯度。这一步也称为scaled dot-product attention

step4 :对当前单词的分数(维度应该是单词embedding的个数)进行softmax。

step5 :将softmax的结果和对应单词的value相乘(相当于加权),然后相加。这里依然是1x64的向量。

矩阵可视化如下图所示,X的每一行代表一个单词的embedding:
在这里插入图片描述
在这里插入图片描述

multi-head self-attention

在这里插入图片描述
上图是两个heads,原论文有8个heads(每个heads大小为 单词数x64),将最终的8个heads进行concat后(单词数x512)再乘上一个矩阵得到最终的向量,输送到FFNN。

这个结构的好处:

  1. 不太容易被当前位置的得分所主导,因为在计算step2的分数时,当前位置的分数肯定是最大的。
  2. 更多的“表示子空间”。感觉可以表达出与其他单词更多的关联关系。

Positional Encoding

这个部件是用来表示单词在输入序列的位置。是由一个“specific pattern”产生的向量(如下图所示,相当于权重矩阵),用来和单词的embedding相加作为最终的输入向量。这个向量不是从数据中学的,其实本质上是给单词的embedding上加了一个转换后的one-hot向量(转换的过程是这个one-hot向量再乘上权重矩阵)。
在这里插入图片描述

Decoder

和encoder不同,在softmax之前对未来的序列的值置为-inf。
在这里插入图片描述
encode-decoder attention实质上是multihead attention,输入的query是decoder前一个模块的输出tgt和decoder部分输入序列的position encoding(需要学习)相加,输入的key是encoder的输出向量和输入序列的position encoding相加,value是encoder的输出向量。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐