TR4 - Transformer中的多头注意力机制



前言

多头注意力机制可以说是Transformer中最主要的模块,没有之一。这次我们来仔细分析一下注意力机制与多头注意力机制。

自注意力机制

在Transformer模型中,输入的文本序列经过输入处理转换为一个向量的序列,然后就会被送到第1层的编码器,第一层的编码器的输出同样是一个向量的序列,再送到下一层编码器。
encoder向量流动
通过上图可以发现,向量在层间流动时,向量的数量和维度都是不变的。单层编码器接收到上一层的输入,然后进入自注意力层计算,然后再输入到前馈神经网络中,最后得到每个位置的新向量。

Self-Attention层的具体机制

例如想要翻译的句子为:“The animal didn’t cross the street because it was too tired”。

句子中的it是一个代词,想要知道它具体代指什么,对模型来说并不容易。通过引用Self-Attention机制,模型就会最终计算出it代指的是animal。同样的,当模型处理句子中其他词时,Self-Attention机制也可以让模型不仅仅关注当前位置的词,还关注句中其它位置相关的词,进而更好地理解当前位置的词。

通过一个简单的例子来解释自注意力机制的计算过程:假设一句话为"Thinking Machines"。

自注意力会计算:Thinking-Thinking、Thinking-Machines、Machines-Thinking、Machines-Machines共2的2次方种组合。

具体的计算过程如下:

  • 1 对输入编码器的词向量进行线性变换,得到Query、Key和Value向量。变换的过程是通过词向量分别和3个参数矩阵相乘,参数矩阵可以通过模型训练学习到。

向量计算

  • 2 计算 Attention Score (注意力分数 )。

假如我们现在计算Thinking的Attention Score,需要根据Thinking对应的词向量,对句子中的其他词向量都计算一个分数,这些分数决定了在编码Thinking这个词时,对句子中其它位置的词向量的权重。

Attention Score 是根据Thinking对应的Query向量和其他位置的每个词的Key向量进行点积得到的。Thinking的第一个Attention Score 就是q1和k1的点积,第二个分数是 q 1 q_1 q1 k 2 k_2 k2的点积。
Attention Score计算

  • 3 把得到的每个分数除以 d k \sqrt{d_k} dk d k d_k dk是Key向量的维度。这一步的目的是为了在反向传播时,求梯度时更加稳定。

s c o r e 11 = q 1 ⋅ k 1 d k score_{11} = \frac{q_1 \cdot k_1}{\sqrt{d_k}} score11=dk q1k1

s c o r e 12 = q 1 ⋅ k 2 d k score_{12} = \frac{q_1 \cdot k_2}{\sqrt{d_k}} score12=d

### Transformer-XL中的注意力机制Transformer-XL中,为了处理长期依赖并允许模型推广到更长的序列,引入了一种相对位置编码方案以及分段循环机制。具体来说,在计算自注意力时,不仅考虑当前片段内的token之间的关系,还会利用之前片段的信息。 对于标准的多头自注意力层,其核心公式如下: 给定查询向量 \( Q \),键向量 \( K \),值向量 \( V \),则第\( h \)个头部下的加权求和表示为: \[ \text{head}_h = \text{softmax}\left(\frac{{QW^{(Q)}_i{(K W^{(K)}_i)}^\top}}{\sqrt{d_k}}\right)VW^{(V)}_i \] 其中 \( d_k \) 是缩放因子,用于防止点积过大而使梯度消失或爆炸;\( W^{(Q)}, W^{(K)}, W^{(V)} \)分别是线性变换矩阵[^1]。 然而,在Transformer-XL里,为了让模型能够记住过去的内容,并且可以有效地捕捉长时间跨度上的模式,对上述公式进行了改进。特别地,加入了相对位置偏置项来增强距离感知能力。因此,最终版本的attention score变为: \[ b_{ij} = c + u_i^T v_j + w_r^Tr(i-j), i,j∈[0,T-1], r∈[-C,C] \] 这里, - \( T \) 表示时间步数; - \( C \) 定义了最大可访问的记忆范围; - \( u,v,w_r \) 都是由网络学习得到的参数向量; - \( r(x)=sign(x)\cdot min(|x|,C) \) 通过这种方式,即使输入序列超出训练期间遇到的最大长度,该方法仍然有效工作[^2]。 ```python import torch.nn.functional as F def relative_positional_encoding(query_len, key_len, embed_dim_per_head): """Generate sinusoidal positional encodings with relative positions.""" pos_enc = ... # Generate position encoding matrix return pos_enc class MultiHeadAttention(nn.Module): def __init__(self,...): ... def forward(self, query, key, value, rel_pos_emb=None): scores = torch.matmul(query, key.transpose(-2,-1)) / math.sqrt(d_k) if rel_pos_emb is not None: scores += self.relative_attn_bias(rel_pos_emb).unsqueeze(0) p_attn = F.softmax(scores,dim=-1) output = torch.matmul(p_attn,value) return output,p_attn ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值