个人学习总结,如有问题,欢迎大家指出,将不胜感谢。
进行词汇位置迁入(按照词汇id迁入对应的词向量),并将原始句子规整成同一长度。
embedding各参数含义:
input data_range: [0,num_embeddings)
weight其实是一个单词查找表,根据id查询对应的"词向量"
首先说结论:Transformer 模型本身不具备位置信息的感知能力。
原因:
一般来说,我们会认为nn.Embedding
?层将词汇索引映射为词嵌入向量,看似保持了词汇在句子中的顺序,即经过embedding后的输出是按照句子中词汇的顺序排列的。但是我们要结合self-attention的原理。在自注意力机制中,输入序列中的每个元素都会与其他元素进行关联,并且为每对元素分配一个注意力权重,用于指导模型在编码和解码阶段的处理。这使得 Transformer 能够同时考虑到整个序列中的相关信息,而不仅仅是邻近元素之间的关系。
通俗点讲,如果打乱输入序列的顺序进行训练,也不会直接影响最终的训练结果。因为self-attention是基于元素之间的关联性而非顺序性,这个关联性是通过有监督学习方式训练出来的,即给定一组输入序列和相应的目标输出。模型会根据当前输入序列生成预测结果,并与目标输出进行比较。通过计算预测结果与目标之间的差距(通常使用损失函数),模型会使用反向传播算法来调整自己的参数,从而逐步优化预测结果。最终,模型只能学习到元素间的关联性,而不具备感知元素位置信息的能力。
? ? ?
图1 single-head?
? ?
图2? ?2-head attention? ? ? ? ?
?
?图3 8-head attention
如上图
总的来说,设输入为 x,经过某个网络层后得到的输出为 H(x),那么残差连接会将输入 x 与输出 H(x) 相加,得到最终的输出 F(x)。数学表达式如下:F(x) = H(x) + x
这样,就算中间层H(x)出现了信号衰弱(如weight接近0,计算得到H(x)接近0),由于残差网络的存在,原始输入x能够直接穿过H(x)层并于衰减后的信号相加,保留了原始输入的信息,起到了保护和传递梯度的作用。
FeedForward做了两次线性线性变换,先将数据映射到高纬度的空间再映射到低纬度的空间(至少做两次Linear,增加了模型的非线性能力),帮助提取输入序列更深层次的特征和信息。
如:FFN(x)= linear(Relu(linear))? = max(0, input * weight1+bias1)? * weight2 + bias2
Encoder和Decoder都有 multi-head Attention 和FFN,不同的是:
1.?Decoder还有一个带掩码的多头注意力层(masked multi-head Attention block)
掩码操作是为了避免未来信息的泄漏。
在序列生成任务中,Decoder 的每个位置需要根据之前已经生成的部分和来自 Encoder 的输入信息来决定下一个输出。
然而,为了保持模型的自回归性质,也就是确保生成时只依赖于已生成的部分和当前位置之前的输入,需要限制模型只能关注当前位置之前的信息。这就是掩码的作用。
具体来说,掩码操作会将未来位置的相关性分数设置为负无穷大(或一个极小的值),这样在计算注意力权重时,未来位置的权重值就会趋近于零。这样,Decoder 在生成当前位置的输出时就不会受到未来位置的影响。
后面步骤跟multi-head Attention一样,掩码可以使不相关词向量的分数被忽略。
2. QKV的来源不同
在 Transformer 模型中,Encoder 和 Decoder 是相互独立的神经网络模块,它们在处理输入序列和输出序列时具有不同的作用。
3. 最后有一个 Softmax 层计算下一个翻译单词的概率
Softmax 层会把attention计算出的所有分数转换为概率(把所有的分数转换为正数,并且加起来等于 1)。然后选择最高概率的那个数字对应的词,就是这个时间步的输出单词。