Transformer

213 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

arxiv.org/abs/1706.03…

对于自注意力代码在ViT中解释

早期RNN记忆长度有限,所以提出了LSTM,但是他们还有个缺点,无法并行化,所以出现了Transformer,理论上,如果不受硬件限制,Transformer记忆长度无限,且可以进行并行化。

整体流程

在编码器阶段,输入是一个特征序列,先经过Embedding层(其实就是一个线性层),得到三个新的序列,分别为,即query,key,value,然后加上位置编码(添加位置信息,具体后面解释),经过N个Transformer Block,得到一个新的序列(维度和经过Transformer Block前相同,因为其不改变特征大小)。

在解码器阶段,输入是翻译结果,经过嵌入层并加入位置编码后,再经过N个Transformer Block,最后经过线性层和Softmax得到最终结果。

注意力Attention

Q看做查询,就是要用来和其他词计算相关性的

K看做键,也就是被查询的词

V看做值,也就是每个词它的真实特征

输入序列经过嵌入层得到QKV后,利用QK分别计算每个词与其他词的相关性(注意力分数),然后将这个相关性再与V相乘,得到注意力权重,也就是加权后的一个特征序列。等于是先求出每个词和其他词的关系,这是一个概率,然后根据这个概率值把特征加起来,就像线性代数中用基向量的加权和表示任何向量一样。

下面根据这个图看一下注意力(Attention)是怎么计算的

是K的通道数,为了防止内积过大,所以叫做Scaled Attention。

多头注意力

其实就是在计算注意力时将QKV分别分成H份,分别计算,最后再Concat合并起来,这样结果更好一点。

自注意力Self-Attention

当QK和V来自不同的特征序列,那么就是交叉注意力Cross-Attention,也就是解码器第二个注意力,当QKV来自相同的特征序列,那么就是自注意力Self-Attention,也就是编码器中的注意力和解码器中的第一个注意力

掩码注意力Masked Attention

这个就是解码器的第一个注意力,之所以这样,是因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。否则要是提前知道后面的词就是作弊了。

前馈网络

就是一个普通的线性层

位置编码

从前面的注意力计算中,会发现改变句子顺序,得到的结果是不变的。因为 Transformer 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要。

位置嵌入Position Embedding 用 PE表示,PE 的维度与单词嵌入是一样的。PE 可以通过训练得到,也可以使用某种公式计算得到。在 Transformer 中采用了后者,计算公式如下:

其中,pos 表示单词在句子中的位置,d 表示 PE的维度 (与词 Embedding 一样),2i 表示偶数的维度,2i+1 表示奇数维度 (即 2i≤d, 2i+1≤d)。使用这种公式计算 PE 有以下的好处:

  • 使 PE 能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有 20 个单词,突然来了一个长度为 21 的句子,则使用公式计算的方法可以计算出第 21 位的 Embedding。
  • 可以让模型容易地计算出相对位置,对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。