编码器和解码器,编码器输入多个token,输出每个token的编码向量,解码器的输入是token的编码向量,输出是转换的向量,转换的维度不一定和编码器的输入token长度一样,引文如果是翻译,不同语言翻译后是不同的长度。
编码器是6个layer组成(这里一个layer其实是一个块,每个layer中有一个sublayer,编码器的sublayer就是多头自注意力,然后是一个MLP,论文中把mlp说成是简单的位置全连接网络),每个layer的输出是layerNorm(x+sublayer(x)),由于使用残差连接所以需要维度一样,所以这里维度都固定成512。
layernorm,是每个数据的特征做均值为零方差为1。
batchnorm是把batch中每个特征做均值为零方差为1,训练的时候可以去训练这个均值和方差,也可以是得到所有数据均值和方差,用在测试中。(feature一个维度,batch一个维度)
常常数据输入是三维的,一个维度是batch,一个维度是sequence,一个维度是feature。如下图黄色是layernorm,
当样本长度抖动比较大的时候,用batchnorm差别比较大。如果遇到一个比较长的测试序列,之前训练时候没有,那么之前训练用的batchnorm均值和方差不太好用。而对layernorm来讲,他是算每个样本的均值和方差也不需要用全局的均值和方差。所以不管样本长还是短对layernorm影响不大。
解码器是使用6个layer,每个层有三个子层。解码器有带掩码的注意力机制。是为了保证在t时间内不用看到t时间以后的输入。注意力函数是将一个query和一些
key _value对映射成个输出的一个函数
输出是value的加权和。输出和value的维度是一个样。对于每个value的权
重是由query和value 对应的key的相似度算来.不同的相似函数导致不同的注意力版本.
文中scaled dot product attention
Query和key是等长的,他门做内积作相似度,内积值越大相似度越高,内积值为0 两个相量垂直了没有相似度.Query和每个key作内积后的值除根号keys的维度.然后通过softmax函数得到权重0实际中用两次矩乘法实现
多头注意力是query、 key、 value经过线性变换,然后再计算相似度,可以看成每个头是不同的相似度函数。自注意力是qk v相同.一个句子算每个token和其他token的相似度,然后加权表示,这是编码 器输出 。解码器(第2个attention的输入)是编码器的输出作为key, value。 (解码器第1个attention的输出作为query. kV相当于有所有编码信息,q只需不断询问得到)
3,3
RNN中通过MLP后的向量再用作下一个的输入,但attention起到了用全局信息的作用。所以attention可以更好的并行.Transformer中MLP不需要之前的信息输入。
3.4 embedding and softmax
embedding是每个词编码成一个向量,这里是长度为512的向量。softmax层之前的线性层也是用同一个embedding,来转化解码器的输出到下一个token的概率。在embedding层中需要乘根号模型维度,因为学l2norm可能将向量的scale减小,这样后面加上position encoding的时候会不在一个数量级。
positional encoding,attention没有时序信息,权重是query和key的相似度,没有时序信息的话,同一个句子如果打乱顺序出来的值是一样的,只是位置不一样。但是实际上打乱顺序句子的意思是变了的。rnn本来就是上一个时间的输出作为下一个的输入,所以本身带有时序。attention在输入中加时序信息。用一个长为512的向量表示位置的数字,记录时序。这个值和512输入相加。
实验
使用的是英语到德语的翻译,使用的是词根提取的词典,一共37000个tokens
十万步,一台机器12个小时。8个p100.学习率不用调整
使用了dropout 0.1