一、自注意力层(Self-Attention Layer)并行处理目标序列
自注意力层的任务是计算输入序列中每个位置之间的关系,并生成每个位置的表示。这一过程可以并行处理,因为它并不依赖于前一个位置的计算结果。
自注意力机制的具体步骤
1.输入嵌入与位置编码
目标序列的前缀(如 "\<start> I am a")经过词嵌入层和位置编码,得到每个时间步的嵌入表示。
2. 生成查询、键、值向量
对于输入序列的每个时间步,通过线性变换生成查询(Query)、键(Key)、值(Value)向量。对于时间步 \( t \),表示为 \( Q_t, K_t, V_t \)。
3.计算注意力得分
并行计算所有时间步之间的注意力得分:
\[
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V
\]
这一步骤可以通过矩阵运算并行实现。假设有 \( n \) 个时间步,每个时间步有 \( d_{\text{model}} \) 维度的表示,那么 \( Q, K, V \) 矩阵的维度分别是 \( (n, d_{\text{model}}) \)
4.计算加权和
使用注意力得分对值向量 \( V \) 进行加权求和,生成每个时间步的输出。这个计算也是并行的,因为所有位置的值向量可以同时被处理。
5.掩码模块
解码器的自注意力机制区别与编码器的自注意力机制还加入了掩码模块,参考我之前的博客Transformer细节(一)——掩码机制-CSDN博客
二、编码器-解码器注意力层(Encoder-Decoder Attention Layer)并行处理目标序列
编码器-解码器注意力层的任务是利用编码器生成的表示来为解码器的每个位置提供上下文信息。这个过程也可以并行处理,因为解码器的每个位置的计算只依赖于编码器的输出和当前解码器输入。
编码器-解码器注意力机制的具体步骤
1. 输入编码器输出与解码器输入
编码器已经并行处理完源序列 \( X \),并生成每个时间步的表示 \( H_{\text{enc}} \)。
解码器输入目标序列前缀的嵌入表示 \( H_{\text{dec}} \)。
2.生成查询、键、值向量
从解码器输入 \( H_{\text{dec}} \) 生成查询向量 \( Q \)。
从编码器输出 \( H_{\text{enc}} \) 生成键向量 \( K \) 和值向量 \( V \)。
3. 计算注意力得分
并行计算每个解码器时间步的查询向量与所有编码器时间步的键向量之间的注意力得分:
\[
\text{Attention}(Q_{\text{dec}}, K_{\text{enc}}, V_{\text{enc}}) = \text{softmax}\left(\frac{Q_{\text{dec}} K_{\text{enc}}^T}{\sqrt{d_k}}\right) V_{\text{enc}}
\]
这个步骤通过矩阵运算并行实现。
4.计算加权和
使用注意力得分对编码器的值向量 \( V_{\text{enc}} \) 进行加权求和,生成每个解码器时间步的输出。这个计算也是并行的。
三、总结
在训练阶段,解码器的自注意力层和编码器-解码器注意力层可以并行处理目标序列的所有时间步,因为使用了教师强制技术,目标序列的前缀是已知的。具体来说,自注意力和编码器-解码器注意力的计算都可以通过矩阵运算在所有时间步上并行完成。这种并行处理使得Transformer模型在训练时效率非常高,能够快速处理长序列数据。
标签:编码器,enc,text,Transformer,解码器,注意力,向量 From: https://blog.csdn.net/weixin_47129891/article/details/139879549