词embedding:
将句子编码,升维(512)。将位置信息编码,升维,相加。维度需要合适,太大了过拟合。过少,模型可能无法充分捕捉数据中的复杂模式或语义关系。
例如,输入句子 "I like apples",它可以表示为三个单词的索引序列:
输入:
[103,459,892]
输出:
[0.23,−0.67,0.45,...,0.12,0.98] : I
[0.13,−0.12,0.35,...,0.42,0.08] : like
[0.32,−0.42,0.45,...,0.88,0.12] : apples
位置embedding:
一般使用sincos或者RoPE
x = 词embedding + 位置embedding
权重矩阵 WQ、WK、WV 是在模型训练过程中通过反向传播算法学习得到的。
对于输入序列中的每个词,我们首先生成它的 Query 向量、Key 向量和 Value 向量。
多头self-attention: 训练时生成多组Wq,Wk,Wv,生成不同的QKV
Concat: n* (h*dk)
Linear变换: (h*dk) * 512
Z : n*512 与 输入x维度相同
LayerNorm( X + MultiHeadNorm(X) ) 由两部分组成,add和norm
Add为残差连接
Norm能加速收敛
FFN(FeedForward)
每个编码器或解码器层中的Feedforward部分是一个两层的全连接神经网络,具有如下形式:
第一次变换:
线性变换 + 非线性激活函数(通常使用ReLU激活函数)升维
x 是输入向量(如从多头注意力得到的输出)。
W1 是第一层的权重矩阵。
b1 是第一层的偏置项。
第一层的权重矩阵 W1 和偏置项 b1 都是通过模型训练过程学到的。
Feedforward网络中间层的维度,通常比 dmodel 更大,增加了模型的容量。
第二次线性变换:
W2 是第二层的权重矩阵。
b2 是第二层的偏置项。
这两步线性变换将输入从原始维度 dmodel 转换为一个更高维度的表示,然后再将其还原到原始维度 dmodel,提取了更高层次的特征。
线型变换的学习能力是不如非线性变换的,通过激活函数relu(),强化表达能力。
与 Seq2Seq 模型的不同之处
在每个时间步,我们输入直到当前时间步所产生的整个输出序列,而不是只输入上一个时间步产生的词(类似输入序列长度可变的自回归模型)。
这非常重要,把原文粘过来:The difference from the Seq2Seq model is that, at each timestep, we re-feed the entire output sequence generated thus far, rather than just the last word.
除以$'sqrt(dk) '$的功能 避免梯度消失,要降低方差,雅各比不为0