知识点:做机器翻译的,Self-attention, query-key-value, Multi-headed, FFN,position-embedding, 拟合残差,归一化是Layer Normalization,解码器增加了一层和编码器Attention,beam-search;
BERT Mask 过程中会把 15% 的字遮挡起来,然后让模型预测被遮挡的字。
所有的编码器在结构上都是相同的,但它们没有共享参数(每个编码器的网络参数都是不同的)。
解码器多了一个把编码考虑进来的attention层。
在自注意力层中,这些输入词之间存在依赖关系。而前馈层(FFN)没有这些依赖关系。
Self-attention层:每个单词的向量,分别和3个矩阵相乘,得到3个向量:一个查询向量、一个键向量和一个值向量;A词的查询向量,点乘每个词的键向量,得到每个词的权重(除以8,过softmax),得到每个词的归一化权重,每个归一化权重乘以每个值向量,加和到一起,得到A词的z向量;z向量就作为FeedForward层的输入;
除以根号维度,目的是防止softmax输入的值过大,导致梯度过小(梯度是s(1-s))
一个句子所有的词,可以每行一个词向量合成一个矩阵;矩阵运算效率更高;
“multi-headed” attention:用8组矩阵(每组3个),来对Query向量、Key向量、Value向量进行转换,得到8组向量,每组3个,然后每组得到1个不同的z向量;这8个z向量收尾相连,乘以一个变换矩阵,得到最终z向量;这里和这里的解释和paper上不一样。
解码器的编码-解码注意力层:Q向量来自自己解码器上一层,K向量和V向量来自编码器的输出,目的是让原始句子的所有词都可以参与目标句子当前词的生成;
全连接层(FFN):一个句子的所有词,都复用同一组参数;上下不同层,是不同组的参数;
位置向量:sin-cos; 将位置向量添加到词嵌入中使得它们在接下来的运算中,能够更好地表达的词与词之间的距离。??不懂;和学习到位置向量的方式,效果一样;能应对比训练样本句子更长的预测句子,所以用这个sin-cos;
残差网络:借鉴ResNet,输入直接加和到输出上去;编码器的2层和解码器的3层,都搞;
注意:归一化,用的是Layer Normalization
解码器:
顶端编码器的输出之后会变转化为一个包含向量K(键向量)和V(值向量)的注意力向量集 。这些向量将被每个解码器用于自身的“编码-解码注意力层”,而这些层可以帮助解码器关注输入序列哪些位置合适。
解码器每次输入上次的输出,直到输出一个特殊的终止符号EOS。也会使用位置编码。
在解码器中,自注意力层只处理输出序列中更靠前的那些位置(只加和前面的词的归一化权重*值向量)
(这个“编码-解码注意力层”工作方式基本就像多头自注意力层一样,只不过它是通过在它下面的层来创造查询矩阵,并且从编码器的输出中取得键/值矩阵)
解码器最末层,先把向量线性变化转成Vocabulary-size维的向量,再过softmax,得概率向量;训练的时候用交叉熵损失函数即可;预测的时候直接取向量最大值,不用过softmax了(因为softmax满足单调性);
Self-Attention的好处:1. 计算量小;2.可并行计算;3.原句子任意词到目标句子任意词的"距离"小;
Multi-headed的好处:每一个不同的 head 使用不同的线性变换,学习不同的 relationship。
Transformer好处:可以做的更深(BERT做了24层);可以更multi-head; 可并行计算;整个句子所有词平等对待,无视方向和距离
Beam Search:
因为这个模型一次只产生一个输出,不妨假设这个模型只选择概率最高的单词,并把剩下的词抛弃。这是其中一种方法(叫贪心解码)。
另一个方法是留住概率最靠高的两个单词(例如I和a),那么在下一步里,跑模型两次:其中一次假设第一个位置输出是单词“I”,而另一次假设第一个位置输出是单词“me”,并且无论哪个版本产生更少的误差,都保留概率最高的两个翻译结果。然后我们为第二和第三个位置重复这一步骤。这个方法被称作集束搜索(beam search)。(这里Beam宽度是2)