# Transformer

# Embedding

# 对input进行表示

普通的表示为one-hot coding

# word embedding

one-hot表达结果稀疏,不能表达word与word之间的特征,因此对词进行embedding,用短向量表达word的属性

# Positional embedding

对每个word进行embedding作为input表达,但是这其中不包含句子中单词的位置信息。RNN可以在任何地方对同一个word使用一个相同的向量,是因为RNN是按顺序对句子进行处理,一次一个word,但是在transformer中,输入句子的word是同时处理的,没有考虑词的排序和位置信息

对此,加入了Positional embedding,position encoding和word embedding相加就可以得到embedding with position

有两种方式:

  1. 通过训练学习position encoding向量

2.通过公式计算position encoding向量,实验中效果与第一种近似,因此用第二种方法,优点不需要训练参数

计算公式为

PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i) = sin(pos/10000^{2i/d_{model}})

PE(pos,2i+1)=cos(pos/100002i/dmodel)PE(pos,2i+1) = cos(pos/10000^{2i/d_{model}})

相当于每个embedding的维度上,不同的位置都是周期变化的,然后随着embedding维度的增加,这个变化是越来越慢(每个维度都对应一个正弦曲线,这样可以让模型会更轻松的通过位置来学习)

# Encoder

encoder由6个相乘的Layer叠成,每个layer包含两个sub-layer,第一层是multi-head self-attention mechanism,第二个是simple、position wise fully connected feed-forward netwok

# Self-attention

一句话有5个单词,每个单词,用一个向量表示,比如512维

(啊:1x512),将其计算为三个256维的向量key、query、value

将每个字的query与所有字的key之间计算点积,因此获得了5个注意力得分,将其通过一个softmax归一化,然后将其分别乘以value,得到每个字最终的score,将其相加得到第一个字最终的输出

将一个字的embedding进行分割成h份,对每份用不同的W_q、W_k、W_v对得到多个key、query、value,其实就是多头的,multi-head self-attention

这里QKTQ*K^{T},Q和K的转置求点积,点积的几何意义是距离(两个模乘以夹角的余弦),当两个词向量越相似说明这个值越大(夹角越小),是一种距离的度量,最终得到的称为注意力矩阵。(实际上求点积之后,除以headsize的平方根,是因为防止headsize增大的时候,点积过大,因此进行缩放)

Tips:实际进行时,是用几个句子一起作为一个batch输入的,因此句子的长短是不一样的,所以需要按照最大长度的句子,为短句子补充padding,但是这样的话在进行softmax的时候,就会出现,注意力矩阵会有很多0

但是做完softmax,这些值都成为1了,因为exp0=1exp0=1,因此要给这些无效的区域加一个很大的偏置(很负的数),进行softmax后就变成了0

# Add and norm

Add是残差链接,norm是layer_normalization,这就是一个attention-block

每次输出是Attention(Q,K,V)+XembeddingAttention(Q, K, V) + X_{embedding},之后的运算里,没经过一个模块的运算,都进行残差链接,从而梯度反向传播的时候可以走捷径。LayerNorm就是Batchnorm,

最后加上α\alphaβ\beta,是为了弥补归一化的损失

# Feed-forward network

FFN(x)=max(0,xW1+b1)W2+b2FFN(x) = max(0, xW_1+b_1)W_2+b_2

就是2个全连接层

# 架构图