社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

GitHub star量过千,HF榜单第二,第一个会自己改学习规则的视觉骨干开源了

机器之心 • 2 周前 • 329 次点击  

机器之心发布


人眼在观察陌生事物时,从来不是按一套死板的程序走到底的。


读一封字迹潦草的手写信,最难认的往往是开头几个字。看得多了,我们渐渐摸清写信人的笔画和连笔习惯,后面的字也就越认越顺。医生阅片、考古学者辨认拓片,也有类似的经验:前面识别出的线索,会影响后面如何观察和判断。


这看起来是一件很自然的事,但对视觉 AI 而言,要实现并不简单。


一张图片进入模型后,哪些区域需要重点关注、不同位置的特征怎样关联,模型已经能够根据眼前的画面作出调整。可在很多现有架构里,决定信息如何被学习、该更新多少、哪些旧信息应当保留的规则,仍主要由训练阶段确定。换一张图片,模型的计算结果会改变,背后的许多学习规则却不会跟着改变。


明略科技与中国科学院自动化研究所的研究团队,正试图推动这一步。双方联合提出 VisionHOPE—— 首个以自修改学习系统为核心构建的通用视觉骨干网络。


它让模型在一次前向计算中,一边读取和保存图像信息,一边根据已读到的内容更新自己的学习方式。前面看过的区域,能够参与决定后面的特征怎样建立关联、学习步长该有多大、已有记忆应保留多少。


这项研究并不只停留在机制设计上。在 ImageNet-1K 图像分类基准上,拥有 52.9M 参数的 VisionHOPE-S 取得 85.2% 的 Top-1 准确率,参数量不到 VMamba-B(89M)的六成,准确率高出 1.3 个百分点;VisionHOPE-B 的准确率达到 85.6%。同时,其自修改机制的核心计算量随 Token 数量线性增长。


论文发布后曾登上 Hugging Face 每日论文榜第 2 名,GitHub 开源仓库也在短时间内收获了近 1000 Stars。目前,研究团队已将全部代码、底层算子与预训练权重按 MIT 协议向社区开放。



  • 论文标题:VisionHOPE: Visual Backbones as Self-Modifying Learning Systems

  • Hugging Face 论文页:https://huggingface.co/papers/2609.33325

  • Hugging Face VisionHOPE 主页:https://huggingface.co/PSRben/VisionHOPE

  • GitHub 代码:https://github.com/PSRben/VisionHOPE


视觉模型越来越会 “看”,

但学习规则还可以更灵活


要理解 VisionHOPE 的新意,可以先看视觉骨干这些年的变化。


早期的卷积神经网络(CNN)擅长从局部捕捉边缘、纹理等信息。它使用训练好的卷积核提取特征,图像中距离较远的区域,需要经过多层计算才能建立联系。后来出现的视觉 Transformer(ViT),借助自注意力机制,让不同位置能够根据当前图像直接交互。模型看到了更大范围的内容,但生成注意力的投影参数依然固定,而且全局注意力的计算量会随着 Token 数量平方增长,图像尺寸越大,计算压力越明显。


再往后,Mamba 等状态空间模型通过沿序列传递状态,将计算复杂度降至线性。状态转移可以随当前输入变化,但负责从输入生成状态转移的映射,仍由训练阶段确定。TTT(测试时训练)又向前走了一步:它在网络内部设置小型学习器,允许学习器处理图像时更新自身参数。不过,生成学习表征,以及控制更新步长和记忆保留的规则,仍主要在训练时设定。


沿着这条路线看,研究者一直在扩展模型对 “当前这张图” 的适应范围:从局部特征,到全局交互、动态状态,再到内部学习器的参数更新。VisionHOPE 进一步把决定学习方式的参数也纳入了图像内部的更新过程。


图片 1|不同视觉架构对当前图像的适应方式:从局部特征、全局交互和状态转移,到内部学习器更新,再到自修改学习。箭头表示图像内适应范围逐步扩大。


这一设计建立在嵌套学习(Nested Learning,NL)及其 HOPE 架构的自指机制之上。简单说,模型处理图像时积累的内容,不只留待最后生成识别结果,还会反过来参与下一步学习规则的调整。


这件事之所以值得关注,也与视觉骨干本身的地位有关。无论是图像识别,还是需要结合图像与语言的多模态系统,视觉骨干都负责提供最基础的视觉表征。此前,MMVP 已揭示多模态模型在基础视觉辨别能力上的缺陷;Cambrian-1 的研究则表明,改善视觉表征能够进一步提升多模态能力。视觉底座怎样理解图像,关系到上层模型能够获得怎样的信息。


表1|不同视觉架构对当前图像的适应方式


把 “怎么学” 交给记忆:

VisionHOPE 的三个关键设计


让模型修改自己的学习规则,可以拓展模型的表达能力,但也带来了理论和工程上的新问题。在以自指嵌套学习模块 SRNL 构建通用视觉骨干时,研究团队重点解决了三个问题:记忆如何组织与更新,自指反馈如何保持稳定,以及序列递推如何适配二维图像并高效计算。


五类记忆协同,让 “怎么学” 也随画面变化


VisionHOPE 的核心是一个名为 SRNL(自指嵌套学习)的模块。可以把它理解为一套会随着读图过程不断调整的记忆系统。普通的记忆机制着重保存模型已经看到了什么,SRNL 除了保存内容,还会维护影响下一步学习的规则。为此,研究团队设计了五类可更新的参数记忆。


其中,内容记忆保存图像信息,供后续读取和输出;Key 记忆负责生成写入索引,让新信息与已有记忆建立关联;Value 记忆参与生成内部学习目标,决定当前学习要朝什么方向修正;学习率记忆控制每次更新的幅度;保留率记忆则决定旧信息在更新时保留多少。


表 2|五类记忆的分工


五类记忆的分工不同,但参与的是同一条学习链路。每当一张新图像进入模型,它们会先从训练中学得的初始状态出发。随着新的图像特征逐个进入 SRNL,现有记忆先生成对应的 Key、Value、学习步长与保留率。随后,五类记忆分别依据自身状态构造学习目标,并将目标与当前响应比较,得到各自的学习信号,完成更新。更新后的状态接着参与下一个 Token 的计算。


回到手写信的例子:我们认出前几个字后,得到的不只是这几个字的内容,还包括对写信人笔迹的一点新认识。往后读时,哪些笔画需要格外留意、哪些相似写法可以快速归类,判断方式都可能发生变化。SRNL 希望在模型内部实现类似的连续调整,只不过它改变的是特征关联、学习步长与记忆保留等具体计算规则。


这样的更新还需要避免 “记得太多”。天空、草地或建筑物的重复纹理中,相邻区域往往包含高度相似的信息。如果每次都把新特征原样加入,重复内容就可能不断堆积。VisionHOPE 使用 Delta 梯度下降(DGD):写入前先检查当前记忆对 Key 的响应,再将需要修正的差值写进去,减少无效的重复累积。


关键在于,这些变化发生在同一张图片的处理过程中。模型读到后面的区域时,利用的是前面区域已经参与更新过的记忆,而不必等处理完图片、再重新训练一次模型。


学习规则能变,但也必须保持稳定


让记忆参与调整自己的后续更新,会带来一个直接风险:反馈可能被反复放大。假如某一步更新使记忆数值增大,下一步据此产生的学习信号也可能更强,继而推动记忆进一步增大。这种循环最终可能让训练失去稳定性。论文中的消融实验显示,移除相应约束后,训练在早期就发生了发散。


为此,团队设计了两层稳定性约束。


第一层是软注入上限,平滑地限制每次新反馈的注入强度。旧记忆的保留比例越高,允许注入的新反馈就越少,使两者之和保持在稳定范围内;


第二层是谱截断约束,限制已有记忆在传递过程中的放大幅度,只在候选步长超过稳定上限时生效。


这两层约束还有理论支撑。论文证明,在二者共同作用下,无论是逐 Token 递推还是分块递推,五类记忆的范数都不会沿扫描路径增长到超过初始状态。模型得以不断修正内部学习方式,同时将反馈放大约束在可证明的范围内。


一张图片有上下左右,计算也不能只沿一条路走


解决了 “怎么学” 与 “怎么稳”,另一个需要解决的问题是计算效率。SRNL 本身沿序列递推,但图像是二维的:仅依靠单一方向,难以充分利用上下、左右的空间关系;如果所有 Token 都严格依次更新,又会形成串行瓶颈。


VisionHOPE 因此采用四向扫描 :沿行、列分别正向和反向读取图像,形成四条独立路径。每个方向都有自己的五类记忆;扫描结束后,再把结果还原到二维空间,并按通道加权融合,让不同位置能够汇集来自四个方向的信息。


而在计算效率上,为了进一步提速,模型把一整行或一整列视为一个计算块。块内各位置以块起点的记忆状态为基础,并行生成更新需要的中间量;记忆更新再在块内按顺序累积,传递到下一行或下一列。这样既保留了连续更新的机制,也让一部分计算能够借助 GPU 并行完成。


实际测试显示,在单尺度模型 P-VisionHOPE-S 中,将 14 个 Token 设为一个块,推理速度达到逐 Token 版本的 2.86 倍;两者的 Top-1 准确率分别为 82.3% 和 82.4%,差距只有 0.1 个百分点。


图片 2 |VisionHOPE 结构。左侧为沿行列双向扫描的二维算子,各方向独立维护五类记忆,通过步长控制保持更新稳定,输出经空间还原后按通道加权融合;右侧为结合局部卷积、前馈网络与残差连接的完整 VisionHOPE Block。


让实验说话:

准确率、空间理解与计算效率


一种新的学习机制究竟有没有价值,最终还要回到图像识别任务本身。


研究团队先在 ImageNet-1K 上验证图像分类能力。在 224×224 输入分辨率下,VisionHOPE 提供 Tiny、Small、Base 三种规模。与 ConvNeXt、VMamba 的对比结果如下;论文也对 ViT 与 TTT 类骨干进行了完整比较。


表 3|VisionHOPE 与 ConvNeXt、VMamba 在 ImageNet-1K 上的分类结果


在较小规模上,VisionHOPE-T 比 VMamba-T 少 3.4M 参数,准确率仍高出 1.5 个百分点。VisionHOPE-S 的参数量不到 VMamba-B 的六成,准确率高出 1.3 个百分点。在论文对 CNN、ViT、SSM、TTT 四类视觉骨干的比较中,VisionHOPE 各规模的结果均为最优或并列最优。


当然,识别一张图片属于什么类别,只是视觉模型的基础能力。真实图像理解还要判断物体在哪里、轮廓如何划分、画面中的不同区域分别属于什么。为此,团队又将 VisionHOPE 接入下游任务:采用 Mask R-CNN 测试 COCO 目标检测与实例分割,采用 UPerNet 测试 ADE20K 语义分割。


表 4|VisionHOPE 在 COCO 检测分割与 ADE20K 语义分割上的表现


在 COCO 的 1× 训练设置和 ADE20K 的比较中,VisionHOPE 的三个规模均达到同规模最优或并列最优。性能提升由图像分类延续至需要空间定位、边界判断的任务,说明这套机制具有作为通用视觉骨干的潜力。


除了排行榜上的数字,研究团队还试着观察模型究竟怎样处理画面。


在第二个网络块的有效感受野对比中,ResNet-50 的响应主要集中在局部;DeiT-S 与基于 TTT 的 ViT³-S 更集中于中心附近;Vim-S 呈现明显的方向性。P-VisionHOPE-S 则覆盖了更大范围的二维区域,同时保持清晰的中心响应。这意味着它在较浅层就能够综合较大范围的图像信息。


图 3|不同视觉骨干在第二个网络块的有效感受野对比。输入为 512×512,颜色越深表示该区域对中心特征的相对影响越强。


另一组可视化展示了学习步长在图片中的空间分布:较大的学习步长往往与主体物体、显著结构重合,背景及相对平坦的区域则较小,直观呈现出它确实在根据图像内容调整内部的学习幅度。


图 4|图像内容与实际学习步长的空间分布。每组上行为输入图像,下行为学习步长;深色表示在该图像内采用了相对更大的步长。


步长较大的区域多与图中的主体物体和显著结构重合,背景和平坦区域的步长较小。这说明内部更新的强度会随图像内容在空间上变化,图像内容在被提取特征的同时,也参与决定了模型在各个位置如何更新记忆。需要说明的是,步长大小并不等同于参数的实际改变量,后者还取决于学习信号的大小。


代码已经开放,

既能直接使用,也能拆成模块


VisionHOPE 的研究成果已经以开源形式提供。团队开放了训练与评测流程、底层算子和预训练权重,开发者可以直接加载完整视觉骨干开展分类或下游任务,也可以只取其中的部分模块,尝试接入自己现有的网络。


具体而言,项目提供了四种调用层次:



这四种接口覆盖了从基础序列学习研究,到二维视觉算子、完整网络模块,再到预训练模型应用的不同需求。其中,SRNL、VisionHOPEOperator 和 VisionHOPEBlock 都保持输入与输出张量的形状不变,并支持 PyTorch 自动求导,便于集成进已有模型。


在部署方面,项目提供了适用于 Linux、NVIDIA GPU、CUDA 12.1 与 Python 3.10 的安装示例,底层 CUDA 算子会在首次调用时自动编译。预训练权重可以从 Hugging Face 下载,通过 `create_model` 加载。需要加速推理时,可以使用 `prepare_for_inference` 原位融合模型参数;如果还要继续训练,建议保留一份未融合的模型。文末附录保留了完整安装及调用示例。


从读懂一张图,

到积累更长的视觉经验


VisionHOPE 现在能够做到的,是让模型在处理同一张图像时,既更新内容记忆,也更新影响后续学习的规则。五类记忆的协同、自修改过程中的稳定性约束,以及四向扫描与分块计算,共同让这件事具有可训练、可计算、可验证的实现路径。


它也留下了新的研究空间。


例如,在医学影像、遥感解译和工业检测中,细微病灶与罕见缺陷常常埋在大量视觉信息中。让模型根据图像内容调整特征关联和学习步长,或许有助于捕捉这些细节,但实际效果还需要对应任务的验证。


更长远的方向,是把这种图像内部的适应能力扩展到连续观察。长视频理解、自动驾驶、具身智能都涉及前后画面的联系,研究者可以尝试让五类耦合记忆跨越连续帧,使过去看到的信息参与后续处理。不过,当前 VisionHOPE 每处理一张新图像,记忆仍会重置到训练得到的初始状态,尚未实现跨帧持续学习。要让记忆真正沿时间积累,还需要解决场景切换时何时重置、错误信息怎样避免持续传播等问题。


另外,SRNL 作为具有稳定性保证的序列自修改模块,也为语言模型长上下文记忆,以及让图像与文本共同参与更新的跨模态记忆,提供了可以继续研究的技术入口。


那封字迹潦草的手写信,之所以越往后越容易读,是因为读者一边识别内容,一边形成对笔迹的认识。VisionHOPE 在视觉骨干中实现了与之相近的一步:让已经看过的内容,真正参与决定接下来怎样学习。


从单张图像内的自修改,到能够跨画面保留经验的视觉系统,中间还有许多技术问题需要回答。但现在,研究者已经能够从开源的模型、算子和代码入手,继续检验这条路线可以走多远。


附录|安装与调用示例


在配备 NVIDIA GPU、CUDA 12.1 工具链和 Python 3.10 的 Linux 环境中,可按以下命令完成安装,底层 CUDA 算子会在首次调用时自动编译:


conda create -n visionhope-demo python=3.10 -yconda activate visionhope-demogit clone https://github.com/PSRben/VisionHOPE.gitcd VisionHOPEpython -m pip install torch==2.1.0 torchvision==0.16.0 \  --index-url https://download.pytorch.org/whl/cu121python -m pip install -r requirements/classification.txtpython -m pip install --no-deps -e .


如需直接使用预训练模型,可从 Hugging Face 下载权重,再用 create_model 加载。仓库还提供 prepare_for_inference 函数,可在加载后原位融合模型参数以加速推理;如需继续训练,应保留一份未融合的模型:


python -m pip install --upgrade huggingface_hubhf download PSRben/VisionHOPE visionhope_tiny.pth --local-dir weights


import torchfrom visionhope.models import create_modelfrom visionhope.inference.prepare import prepare_for_inferencemodel = create_model(    "visionhope_tiny",    checkpoint_path="weights/visionhope_tiny.pth",).cuda().eval()prepare_for_inference(model)with torch.inference_mode(), torch.autocast("cuda", dtype=torch.bfloat16):    images = torch.randn(1, 3, 224, 224, device="cuda")    logits = model(images)print(logits.shape)  # torch.Size([1, 1000])


如果关注架构探索,SRNL、VisionHOPEOperator 和 VisionHOPEBlock 都保持输入输出张量形状不变,并支持 PyTorch 自动求导,可以像标准网络层一样嵌入现有模型:


import torchfrom torch import nnfrom visionhope.models import SRNL, VisionHOPEOperator, VisionHOPEBlock
# 1. 调用独立序列模块处理 [B, N, D] 特征序列srnl = SRNL(dim=128, head_dim=16, chunk_size=64).cuda()x = torch.randn(2, 257, 128, device="cuda", requires_grad=True)y = srnl(x)y.square().mean().backward()
# 2. 调用二维算子直接处理 [B, C, H, W] 矩形特征图operator = VisionHOPEOperator(dim=64, head_dim=16).cuda()features = torch.randn(2, 64, 14, 20, device="cuda")out = operator(features)
# 3. 用完整 VisionHOPEBlock 组合出一个轻量级分类网络net = nn.Sequential(    nn.Conv2d(3, 64, kernel_size=4, stride=4),    VisionHOPEBlock(dim=64, mixer_dim=32, head_dim=16),    VisionHOPEBlock(dim=64, mixer_dim=32, head_dim=16),    nn.AdaptiveAvgPool2d(1),    nn.Flatten(),    nn.Linear(64, 10),).cuda()


© THE END

转载请联系本公众号获得授权

投稿或寻求报道:liyazhou@jiqizhixin.com


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/202341