Transfermer中的Attention计算过程详解

本文深入解析了Attention机制在Transformer模型中的应用,从向量Query、Key、Value的创建,到Attention值及输出向量的计算过程,帮助读者理解Attention如何使模型更加关注输入序列中的关键部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  • Attention计算过程详解

    1、为编码器创建三个向量 Query , Key , Value

    过程如下:
    1)input的单词Thinking、Machines向量化之后变成向量 x 1 x_1 x1 x 2 x_2 x2(这里假设为4维)
    2) x 1 x_1 x1 x 2 x_2 x2分别乘以3个权重矩阵 W Q W^Q WQ W K W^K WK W V W^V WV (这里维度均为4*3)

    x 1 ∗ W Q = q 1 x_1*W^Q=q_1 x1WQ=q1 ( q 1 q_1 q1维度为3)
    x 2 ∗ W Q = q 2 x_2*W^Q=q_2 x2WQ=q2 ( q 2 q_2 q2维度为3)

    x 1 ∗ W K = k 1 x_1*W^K=k_1 x1WK=k1 ( k 1 k_1 k1维度为3)
    x 2 ∗ W K = k 2 x_2*W^K=k_2 x2WK=k2 ( k 2 k_2 k2维度为3)

    x 1 ∗ W V = v 1 x_1*W^V=v_1 x1WV=v1 ( v 1 v_1 v1维度为3)
    x 2 ∗ W V = v 2 x_2*W^V=v_2 x2WV=v2 ( v 2 v_2 v2维度为3)

    q 1 、 q 2 q_1、q_2 q1q2即为单词Thinking、Machines的向量 Query,
    k 1 、 k 2 k_1、k_2 k1k2即为单词Thinking、Machines的向量 Key,
    v 1 、 v 2 v_1、v_2 v1v2即为单词Thinking、Machines的向量 Value,

    详细过程如下图:
    在这里插入图片描述

    2、计算每个词的attention值及输出向量

    以计算 “Thinking” 的 attention为例,根据这个单词对输入句子的每个单词进行评分,这个分数决定了对其他单词放置多少关注度。

    计算步骤:
    1) q 1 q_1 q1乘以每个位置的 k i k_i ki,这里得到 s c o r e 1 , s c o r e 2 score_1, score_2 score1,score2
    2)将 s c o r e 1 , s c o r e 2 score_1, score_2 score1,score2都除以8 (因为论文中使用的 key 向量的维数是 64,8 是它的平方根,这样可以有更稳定的梯度),再输入到softmax得到概率,即为 “Thinking”对每个词的Attention值。
    3)将Attention值乘以每个 v i v_i vi,再加权求和,就得到 “Thinking” 的输出向量 z 1 z_1 z1
    4)重复上述过程即可计算出每个词的 z i z_i zi

    详细过程如图:
    在这里插入图片描述

### Transformer 模型中的位置编码 #### 位置编码的作用 在处理序列数据时,顺序信息至关重要。然而,自注意力机制本身并不具备理解输入序列中元素间相对或绝对位置的能力。为了使模型能够捕捉到这种顺序信息,在输入嵌入向量的基础上加入特定模式的位置信号成为必要。这些附加的信息帮助网络区分相同单词的不同排列组合,并增强其对上下文敏感性的感知。 具体而言,位置编码应当满足以下特性[^1]: - **唯一性**:不同时间步上的标记应具有不同的表示形式; - **平移不变性**:当整个句子移动一定偏移量后,各词项之间的相互关系保持一致; - **周期性**:允许模型通过简单的线性变换来获取任意两个词语间的相对距离; #### 绝对位置编码的实现方法 最初的 Transformer 论文中采用了一种基于正弦函数和余弦函数的方法来进行固定长度的位置编码。这种方法可以看作是对连续空间的一种离散化映射方案,其中偶数维度对应于 sin 函数的结果,奇数维度则由 cos 函数给出。公式如下所示: \[ PE_{(pos,2i)}=\sin \left(\frac{pos}{10000^{2 i / d}}\right), PE_{(pos,2i+1)}=\cos \left(\frac{pos}{10000^{2 i / d}}\right) \] 这 \( pos \) 表示位置索引,\(d\) 是特征维度大小。此表达式的优点在于它不仅提供了足够的自由度让模型学会如何利用这些额外的空间线索,而且还能保证即使对于未曾见过的较长序列也能合理外推相应的位置表征。 ```python import numpy as np def get_position_encoding(seq_len, embed_dim): position_enc = np.array([ [pos / np.power(10000, 2 * (j // 2) / embed_dim) for j in range(embed_dim)] if i != 0 else [0]*embed_dim for i in range(seq_len)]) position_enc[1:, 0::2] = np.sin(position_enc[1:, 0::2]) # apply sin to even indices in array; 2i position_enc[1:, 1::2] = np.cos(position_enc[1:, 1::2]) # apply cos to odd indices in array; 2i+1 return position_enc ``` #### 相对位置编码的发展趋势 尽管绝对位置编码已经在多种任务上取得了良好的效果,研究者们发现某些情况下使用相对位置编码可能带来更好的性能提升。相对于传统的静态位置编码策略,动态计算查询键值对之间差异的方式能更好地适应变化多端的实际应用场景需求。例如,Transformer-XL 和 T5 等改进版本均尝试引入了此类机制以加强模型捕获长期依赖性和局部结构特性的能力[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

szZack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值