【YOLOv10改进 - 注意力机制】 MHSA:多头自注意力(Multi-Head Self-Attention)

YOLOv10目标检测创新改进与实战案例专栏

改进目录: YOLOv10有效改进系列及项目实战目录:卷积,主干 注意力,检测头等创新机制

专栏链接: YOLOv10 创新改进有效涨点

介绍

摘要

我们介绍了BoTNet,这是一个概念简单但功能强大的骨干架构,将自注意力引入多个计算机视觉任务,包括图像分类、物体检测和实例分割。通过仅在ResNet的最后三个瓶颈块中用全局自注意力替换空间卷积,而不进行其他更改,我们的方法在实例分割和物体检测任务上显著提升了基线性能,同时减少了参数,延迟方面的开销也极小。通过设计BoTNet,我们还指出了带自注意力的ResNet瓶颈块可以视为Transformer块。在不增添任何复杂元素的情况下,BoTNet在COCO实例分割基准上使用Mask R-CNN框架实现了44.4%的Mask AP和49.7%的Box AP,超过了以前在COCO验证集上评估的ResNeSt [67]单模型和单尺度结果的最佳水平。最后,我们展示了将BoTNet设计简单地适应图像分类的方法,结果显示模型在ImageNet基准上达到了84.7%的top-1准确率,而在TPU-v3硬件上的“计算”时间比流行的EfficientNet模型快高达1.64倍。我们希望我们简单而有效的方法能成为未来视觉自注意力模型研究的强有力基准。

文章链接

论文地址:论文地址

**代码地址:**代码地址

基本原理

多头自注意力(Multi-Head Self-Attention)是一种在神经网络,尤其是Transformer架构中常用的机制,它在自然语言处理、计算机视觉等领域取得了显著的效果。多头自注意力的核心思想是通过多个注意力头(attention heads)来捕捉输入数据中不同部分之间的关系,从而提升模型的表示能力。

自注意力机制(Self-Attention)

在解释多头自注意力之前,先了解自注意力机制。自注意力机制的主要步骤如下:

  1. 输入向量:假设输入是一组向量,表示为 X = [ x 1 , x 2 , . . . , x n ] \mathbf{X} = [x_1, x_2, ..., x_n] X=[

### 多头注意力机制Multi-Head Self-Attention Mechanism) 多头自注意力机制是一种用于处理序列数据的核心技术,广泛应用于自然语言处理领域以及计算机视觉中的模型架构中[^1]。它通过并行计算多个独立的注意力机制来捕获输入序列的不同子空间特征。 #### 工作原理 多头注意力机制基于标准的注意力机制扩展而来。其核心思想是将输入向量映射到不同的线性变换空间中,在这些空间中分别执行注意力操作后再拼接起来形成最终输出。具体来说: 1. 输入张量被分为三个部分:查询(Query)、键(Key)和值(Value)。这三个矩阵由原始输入经过不同权重矩阵相乘得到。 \[ Q = XW_Q,\ K = XW_K,\ V = XW_V \] 这里 \(X\) 是输入张量,\(W_Q\), \(W_K\), 和 \(W_V\) 则分别是对应的可学习参数矩阵。 2. 对于每一个头部 (head),单独计算注意力分数并通过 softmax 函数规范化得分: \[ Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V \] 其中 \(d_k\) 表示 Key 的维度大小,用来缩放点积防止梯度消失或爆炸问题。 3. 将所有头的结果连接在一起,并再次应用一个投影层以获得最后的输出表示形式。 以下是 Python 实现的一个简单例子: ```python import torch import torch.nn as nn class MultiHeadSelfAttention(nn.Module): def __init__(self, d_model, num_heads): super(MultiHeadSelfAttention, self).__init__() assert d_model % num_heads == 0 self.d_model = d_model self.num_heads = num_heads self.depth = d_model // num_heads self.wq = nn.Linear(d_model, d_model) self.wk = nn.Linear(d_model, d_model) self.wv = nn.Linear(d_model, d_model) self.dense = nn.Linear(d_model, d_model) def split_heads(self, x, batch_size): """Split the last dimension into (num_heads, depth).""" x = x.view(batch_size, -1, self.num_heads, self.depth) return x.permute(0, 2, 1, 3) # (batch_size, num_heads, seq_len, depth) def forward(self, v, k, q, mask=None): batch_size = q.size(0) q = self.wq(q) k = self.wk(k) v = self.wv(v) q = self.split_heads(q, batch_size) k = self.split_heads(k, batch_size) v = self.split_heads(v, batch_size) scaled_attention, attention_weights = self.scaled_dot_product_attention( q, k, v, mask=mask) scaled_attention = scaled_attention.permute(0, 2, 1, 3).contiguous() concat_attention = scaled_attention.view(batch_size, -1, self.d_model) output = self.dense(concat_attention) return output, attention_weights @staticmethod def scaled_dot_product_attention(q, k, v, mask=None): matmul_qk = torch.matmul(q, k.transpose(-2, -1)) dk = k.shape[-1] scaled_attention_logits = matmul_qk / torch.sqrt(torch.tensor(dk, dtype=torch.float32)) if mask is not None: scaled_attention_logits += (mask * -1e9) attention_weights = torch.softmax(scaled_attention_logits, dim=-1) outputs = torch.matmul(attention_weights, v) return outputs, attention_weights ``` 上述代码定义了一个 `MultiHeadSelfAttention` 类,其中包含了分割头的操作、点积注意力函数及其后续处理过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YOLO大师

你的打赏,我的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值