Transformer 架构凭借注意力机制在多领域表现卓越,但传统自注意力机制计算所有输入 token 对之间的相似性,导致计算和内存复杂度随输入 token 数量呈二次方增长,对计算资源要求高。为解决该问题,已有多种优化技术被提出,如分块计算、滑动窗口注意力、低秩投影和 Nystrom 扩展等,但本文另辟蹊径,从全新角度提出高效注意力算子。本文提出一种计算复杂度与 token 数量呈线性关系的新型注意力算子,通过 “白盒” 架构设计推导网络架构,基于最大编码率降低目标的变分形式,构建新注意力模块,挑战传统成对相似性注意力机制的关键地位。
上面是原模型,下面是改进模型

1. 令牌统计自注意力TSSA介绍
基于最大编码率降低(MCR2 )和白盒架构设计理论,推导新型注意力机制。
表示学习与最大编码率降低(MCR2 ):现实数据常具高维概率分布下的低维结构,Transformer 通过找到合适的表示映射,将数据转换为适合任务的特征。MCR2 目标旨在通过寻找不同组 token 特征的压缩与扩展平衡,挖掘数据潜在低维结构。其目标函数由扩展项和压缩项组成,分别衡量所有特征的扩展程度和各分组特征的压缩程度 。
白盒深度网络与算法展开:白盒架构设计通过算法展开构建网络,将网络层操作解释为优化目标函数的增量更新步骤。基于对 MCR2 目标的优化,可近似得到标准 Transformer 的结构,如通过对压缩项的梯度步近似多头自注意力算子,但该方法仍存在计算复杂度高的问题。
新型注意力机制的推导:提出 MCR2 目标中压缩项的变分形式,基于定理 1 可通过计算矩阵乘积对角线的标量函数来上界大矩阵的函数。通过对变分目标进行梯度下降,得到 Token Statistics Self-Attention(TSSA)算子,该算子通过对输入 token 特征的经验二阶矩统计进行数据相关的低秩投影,避免计算 token 之间的成对相似性。
从提供的图片来看,TSSA模块主要包含以下几个部分:
Token Statistics Self-Attention(TSSA)是 Token Statistics Transformer(TOST)的核心组件,与传统注意力机制结构差异明显。
整体架构:TOST 架构中的 TSSA 模块通过对输入 token 特征进行一系列操作实现注意力计算,其结构主要包含对 token 特征的投影、基于二阶矩统计的计算以及加权平均等操作,最终输出更新后的 token 特征。
核心组件:计算 Dk 是 TSSA 注意力层的核心,它基于 Uk⊤Z 的二阶矩估计,通过非线性激活函数 ∇f 调整权重。注意力头先将 token 特征投影到 Uk 基上,经 Dk 加权后再投影回标准基,最后通过残差连接与原 token 特征结合 。
实现细节:实际实现中,为降低计算复杂度,不强制 U 矩阵正交,通过寻找低维正交基来近似。采用简单模型估计 token 的组隶属关系矩阵 Π ,根据输入特征 z 计算 Π ,进而计算 TSSA 算子。此外,对模型进行了一些改进,如过参数化、吸收常数系数和对投影 token 进行 ℓ2 归一化等操作 。
2. YOLOv11与令牌统计自注意力TSSA的结合
TSSA有效捕捉特征,通过对令牌特征二阶矩统计分析,精准聚焦目标区域,提高检测精度。
3. 令牌统计自注意力TSSA代码部分
视频讲解:
YOLOv8_improve/YOLOv11.md at master · tgf123/YOLOv8_improve · GitHub
用一篇论文教您如何使用YOLOv11改进模块写一篇1、2区论文_哔哩哔哩_bilibili
YOLOv11模型改进讲解,教您如何修改YOLOv11_哔哩哔哩_bilibili
YOLOv11全部代码,现有几十种改进机制。
4. 令牌统计自注意力TSSA引入到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。
第二:在task.py中导入包
第三:在YOLOv11\ultralytics\nn\tasks.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行成功
from sympy import false
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
if __name__=="__main__":
# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
model = YOLO(r"E:\Part_time_job_orders\YOLO\YOLOv11\ultralytics\cfg\models\11\yolo11_TSSA.yamy")\
.load(r'E:\Part_time_job_orders\YOLO\YOLOv11\yolo11n.pt') # build from YAML and transfer weights
results = model.train(data=r'E:\Part_time_job_orders\YOLO\YOLOv11\ultralytics\cfg\datasets\VOC_my.yaml',
epochs=300,
imgsz=640,
batch=64,
# cache = False,
# single_cls = False, # 是否是单类别检测
# workers = 0,
# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
amp = True
)