注6:使用ln而不是bn的原因是因为输入序列的长度问题,每一个序列的长度不同,虽然会经过padding处理,但是padding的0值其实是无用信息,实际上有用的信息还是序列信息,而不同序列的长度不同,所以这里不能使用bn一概而论。
注7:FFN是两层全连接:w * [delta(w * x + b)] + b,其中的delta是relu激活函数。这里使用FFN层的原因是:为了使用非线性函数来拟合数据。如果说只是为了非线性拟合的话,其实只用到第一层就可以了,但是这里为什么要用两层全连接呢,是因为第一层的全连接层计算后,其维度是(batch_size,seq_len,dff)(其中dff是超参数的一种,设置为2048),而使用第二层全连接层是为了进行维度变换,将dff转换为初始的d_model(512)维。
注8:decoder层中中间的多头自注意力机制的输入是两个参数——encoder层的输出和decoder层中第一层masked多头自注意力机制的输出,作用在本层时是:q=encoder的输出,k=v=decoder的输出。
注9:encoder的输入包含两个,是一个序列的token embedding + positional embedding,用正余弦函数对序列中的位置进行计算(偶数位置用正弦,技术位置用余弦)
Self-Attention[2]
self-Attention是Transformer用来找到并重点关注与当前单词相关的词语的一种方法。如下述例子:
The animal didn’t cross the street because it was too tired.
这里的it究竟是指animal还是street,对于算法来说是不容易判断的,但是self-attention是能够把it和animal联系起来的,达到消歧的目的。
这里描述self-attention的具体过程如下图所示:
从上图可以看出,attention机制中主要涉及三个向量Q(Query),K(Key),V(Value),这三个向量的计算过程如下图所示:
上图中,WQ,WV,WK是三个随机初始化的矩阵,每个特征词的向量计算公式如下所示:
Queries: q1 = x1 · WQ q2 = x2 · WQ
Keys: k1 = x1 · WK k2 = x2 · WK
Values: v1 = x1 · WV v2 = x2 · WV
Score: s1 = q1 · k1=112 s2 = q2 · k2 = 96