多头注意力机制基本概念

文章目录

基本概念

我们可以用独立学习得到的h组不同的 线性投影来变换查询、键和值。 然后,这h组变换后的查询、键和值将并行地送到注意力汇聚中。 最后,将这h个注意力汇聚的输出拼接在一起, 并且通过另一个可以学习的线性投影进行变换, 以产生最终输出。 这种设计被称为多头注意力。对于h个注意力汇聚输出,每一个注意力汇聚都被称作一个头(head)。
在这里插入图片描述

模型

每个注意力头 h i h_i hi的计算公式为
h i = f ( W i ( q ) q , W i ( k ) k , W i ( v ) v ) ∈ R p v , \mathbf{h}_i = f(\mathbf W_i^{(q)}\mathbf q, \mathbf W_i^{(k)}\mathbf k,\mathbf W_i^{(v)}\mathbf v) \in \mathbb R^{p_v}, hi=f(Wi(q)q,W

### Transformer中多头注意力机制的具体概念及作用 #### 1. 多头注意力机制的核心概念 多头注意力机制(Multi-Head Attention Mechanism)是Transformer模型的关键组成部分之一。它的基本思想是在同一层中运行多个平行的自注意力计算单元,每个单元独立工作并专注于不同的特征子空间[^2]。通过这种方式,模型可以从不同角度捕获输入数据中的信息,进而更全面地表示序列结构。 具体而言,在单个头部的自注意力操作基础上扩展而来:给定查询矩阵Q、键矩阵K和值矩阵V,经过线性变换后分别得到若干组新的Q', K' 和 V' ,再各自执行缩放点积注意力建模过程得出对应权重分布W_i 。最终将所有结果拼接起来并通过另一全连接层映射回原始维度完成整个流程描述如下: \[ \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1,...,\text{head}_h) W^O \] 其中, \[ \text{head}_i = \text{Attention}(QW_i^Q , KW_i^K , VW_i^V ) \] 这里的 \( h \) 表示头的数量;\( W^O \),以及每种类型的投影参数矩阵 \( W_i^Q,W_i^K,W_i^V \) 都是由训练阶段自动调整获得的最佳解集[^2]。 #### 2. 功能特点与优势体现 多头注意力机制相比单一形式具备明显优越之处主要表现在以下几个方面: - **充分挖掘潜在关联**:由于采用了多样化的视角审视同一个问题情境下的要素间联系状况,所以能有效发现那些仅靠简单方法难以察觉的重要线索; - **缓解过度集中现象**:当只依靠唯一路径传递消息时容易造成某些节点被过分强调或者忽略不计的局面出现,而此策略正好规避了这一风险因素影响整体稳定性; - **增强语义表达能力**:允许单词含义受到多种来源约束调节之后变得更加丰富多彩且贴近真实世界需求水平线上下波动幅度较小趋于平稳状态发展态势良好趋势明朗化程度较高[^2]。 总之,凭借以上特性加持使得基于该原理构建出来的系统无论是在理论层面还是实践环节都能够展现出卓越非凡的表现力! ```python import torch.nn as nn class MultiHeadedAttention(nn.Module): def __init__(self, num_heads, d_model, dropout=0.1): super(MultiHeadedAttention, self).__init__() assert d_model % num_heads == 0 self.d_k = d_model // num_heads self.num_heads = num_heads self.linears = clones(nn.Linear(d_model, d_model), 4) self.attn = None self.dropout = nn.Dropout(p=dropout) def forward(self, query, key, value, mask=None): if mask is not None: # Same mask applied to all heads. mask = mask.unsqueeze(1) nbatches = query.size(0) # Do all linear projections in batch from d_model => h x d_k query, key, value = \ [l(x).view(nbatches, -1, self.num_heads, self.d_k).transpose(1, 2) for l, x in zip(self.linears, (query, key, value))] # Apply attention on all the projected vectors in batch. x, self.attn = scaled_dot_product_attention(query, key, value, mask=mask, dropout=self.dropout) # Concatenate and apply final linear transformation. x = x.transpose(1, 2).contiguous().view(nbatches, -1, self.num_heads * self.d_k) return self.linears[-1](x) ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

快苏排序OAO

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

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

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

打赏作者

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

抵扣说明:

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

余额充值