探索视觉嵌入

Hacker News Top 新闻

摘要

本文通过生成与特定嵌入方向对应的图像,利用梯度优化和增强策略来反转模型,探索了DINOv3视觉嵌入。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/06/08 06:14

# 玩转视觉嵌入 来源:https://prestonbjensen.com/posts/playing-with-vision-embeddings 玉米粒 玉米粒 \+ 凯旋门 凯旋门 = 玉米拱门 玉米拱门 嵌入,从某种意义上说,是神经网络的母语。网络可以通过一系列数字,编码出丰富多样的语义表示。然而,这些数字却令人沮丧地不透明。逐个阅读它们肯定无法理解其含义。在这篇文章中,我们尝试理解一个神经网络的嵌入。 ## 模型 DINOv3 将输入图像映射到 384 维嵌入空间中的一个单一方向。 本文要探讨的模型是 DINOv3 ViT-S(Siméoni et al., 2025)(https://arxiv.org/abs/2508.10104)。DINOv3 的有趣之处在于,它在几乎没有先验知识的情况下,学会了将原始像素映射到丰富的特征空间。它不懂语言,无法描述看到的东西,但仍然学会了理解图像。我们不打算详细讨论 DINOv3 的训练方式,但有两点对本文很重要:它将任何图像压缩成一个单一的嵌入(384 个数字的列表),并且它的训练方式使得同一张图像的不同裁剪和增强版本具有相似的嵌入。我们的目标是理解这 384 个数字中编码了哪些信息。 ## 从嵌入生成图像 反转模型:从嵌入空间中的一个目标方向开始,优化像素以产生一张其 DINOv3 嵌入与该方向匹配的图像。 为了在这个 384 维空间中开始探索,我们需要某种方法将这些数字翻译回人类能理解的东西。最自然的地方是使用人类和 DINOv3 都理解的语言:图像。更具体地说,我们希望能够在 384 维空间中取一个点,并生成一张图像,使得 DINOv3 判定该图像与该点一致。 为此,我们利用了两个思路。第一,DINOv3 是完全可微的——当你向模型输入一张图像时,你可以调整像素,使输出向量更接近某个目标。因此,我们可以最大化生成图像嵌入与某个目标嵌入之间的余弦相似度。人们用这种方法生成图像已经有一段时间了,例如 DeepDream(Mordvintsev et al., 2015)(https://research.google/blog/inceptionism-going-deeper-into-neural-networks/) 和 Olah 等人的特征可视化工作(Olah et al., 2017)(https://distill.pub/2017/feature-visualization/)。 第二,DINOv3 的训练方式使得同一张图像的不同裁剪和增强版本落在相同的嵌入空间中。在我们构建像素梯度时,可以模拟相同的裁剪和增强策略。这有两个好处:首先,它阻止优化器通过高频噪声作弊(Olah et al., 2017)(https://distill.pub/2017/feature-visualization/);其次,它针对模型自身的“相同”定义进行优化。 我们还使用了其他一些技巧来使图像看起来更美观:我们用一个未经训练的 transformer 骨干网络生成图像(思路类似于 Deep Image Prior,Ulyanov et al., 2017 (https://arxiv.org/abs/1711.10925)),并最小化一个辅助的全变分损失。 一旦这个流程建立起来,给定 384 维空间中的任意方向,我们就可以生成一张 DINOv3 认为指向该方向的图像。例如,下面我们拍一张高山风景照,计算其 DINOv3 嵌入,然后使用我们的生成技术制作一张指向相同方向的图像。 原始高山风景照片 原始 原始像素,无增强 原始像素,无增强 原始像素,有增强 原始像素,有增强 Transformer,有增强 Transformer,有增强 现在,生成的图像似乎捕捉到了原始图像的整体氛围。它清楚地显示了山脉、雪和湖泊。看看生成的图像集,可以更全面地感受一下生成的内容: 每张原始图像(山脉、金门大桥、红杉小径)旁边有四幅独立生成的图像,并标注了每幅生成图像与原始图像的余弦相似度。 你会看到每次生成之间有一些变化(毕竟,我们将一整张图像压缩到 384 个数字中,这本质上是一种多对一的操作)。但你也会注意到,它们与原始图像有一些共同的差异。它们饱和度更高,对比度更强,并且会错位/重复场景中的一些物体。这很可能很大程度上归因于图像生成流程。请记住这些生成图像的特征标志,以便在后续尝试在脑海中反转它们。 ## 寻找特征 在我们开始尝试剖析 384 维空间之前,首先需要理解的是,DINOv3 将远多于 384 个不同的视觉概念编码到了这 384 个数字中。怎么做到的?主要的假设是所谓的**叠加**:模型通过学习将每个特征指向近似正交的方向,从而将比嵌入维度多许多倍的特征塞进去(Elhage et al., 2022)(https://transformer-circuits.pub/2022/toy_model/index.html)。 为了演示这种现象,我们将展示一个小的玩具神经网络如何将 10 个 MNIST 数字类别通过一个 2 维瓶颈压缩。这里的每一帧对应优化器的一步,你可以看到模型学习表示所有 10 个类别。 10 个数字类别被压缩到 2 维中。每个类别都有自己的倾斜方向。 关键的观察是,神经网络倾向于将特征放在其隐藏空间的**方向**上。上图中的 10 个数字簇似乎各自从原点指向不同的方向(下图注释了方向)。在 2 维中,大约能容纳 10 个方向而不会互相干扰,但在 384 维中,可以容纳数千个。 叠加可视化为穿过类别簇的箭头 同一个 10 个簇,注释了每个簇指向的特征方向。 叠加是一把双刃剑。一方面,它允许模型学习比其维度多许多倍的特征。另一方面,这意味着 DINOv3 嵌入的任何一个单独维度都是对多个概念的混合,这使得直接理解变得困难。 为了将这些概念重新分解为独立的、可解释的方向,我们可以使用稀疏自编码器(SAE)。其核心思路是给模型的表示提供更多空间,并激励自编码器不要那么严重地混合表示。稀疏自编码器是为语言模型开发的,但同样的思路也适用于视觉 transformer——Fry(2024)(https://www.lesswrong.com/posts/bCtbuWraqYTDtuARg/towards-multimodal-interpretability-learning-sparse-2) 在 CLIP 上训练了一个。 我们不会详细讨论 SAE 的工作原理或确切的训练细节[\[1\]](https://prestonbjensen.com/posts/playing-with-vision-embeddings#fn-sae),但训练完成后,它为我们提供了在这个 384 维空间中的约 12,000 个独特方向,并且这些方向中的每一个通常对应空间中的一个独特、通常可解释的特征。 然后,我们可以通过我们的图像生成流程运行学到的特征,最大化生成图像嵌入与特征解码器方向之间的余弦相似度。这里展示了一些(或者你可以**在新标签页中浏览所有特征** → (https://prestonbjensen.com/posts/playing-with-vision-embeddings/features))。点击任意图像可放大。 快速验证检查——这些特征在 ImageNet 验证集中最激活的图像是什么?示例: 八个特征:生成的视觉化(左侧)与最激活该特征的四张 ImageNet 验证图像。 ## 分解 SAE 是一个强大的工具。用它最直接的事情是,将给定的嵌入分解为一组学到的稀疏特征,这有效地为我们提供了一个工具,可以看到模型在嵌入中编码了哪些类型的特征。 下面,我们输入一张红木森林小径的照片,获取其 DINOv3 嵌入,然后通过 SAE 运行。激活最强的特征显示在照片下方,按激活强度排序。每个图块下方的蓝色条表示该特征的激活强度。 红木森林小径 这张照片激活的特征都很清晰——树木、绿色植物、栅栏、小径。这是将图像分解为其组成特征。 我们可以对金门大桥的图像做同样的事情: 金门大桥 有趣的是,激活最强的特征似乎是一个专门针对**金门大桥本身**的特征 (https://www.anthropic.com/news/golden-gate-claude)。 ## 组合特征 SAE 训练的一个假设是,不同的特征可以相加,形成这些特征的合理混合。这里,我们将看看这看起来是什么样子。我们选择两个特征方向(由 SAE 的解码器方向决定),将它们相加得到一个新的方向,然后对该方向运行我们的生成技术,看看它产生什么。使用箭头选择要添加的不同特征: 你可以看到,求和确实似乎同时编码了两个特征。但你也可能会注意到,它们有时会以奇怪的方式这样做。我将特别强调两个有趣的例子,它们的生成图像以两种完全不同的方式组合了特征。当你将玉米粒与凯旋门相加时,你会得到两者的融合——一个由玉米粒制成的拱门。但是当你将玉米粒与螺丝相加时,你会得到两个特征并置——螺丝放在玉米上。 玉米粒 玉米粒 \+ 凯旋门 凯旋门 = 玉米拱门 玉米拱门 玉米粒 玉米粒 \+ 螺丝 螺丝 = 螺丝在玉米上 螺丝在玉米上 为了更好地理解为什么这些特征会以这样的方式相加,我们可以尝试在特征之间进行插值。每个特征具有单位范数,这意味着 SAE 隐含的特征空间是一个 384 维球面,因此我们将使用球面线性插值(slerp)在特征之间缓慢移动。注意,这些插值的中点的方向与简单相加两个方向的方向完全相同。我们从玉米/螺丝开始,使用滑块进行插值。 插值至 30% 玉米粒螺丝 70% 玉米粒 + 30% 螺丝 你会注意到,特征以迷人的方式混合在一起。在 70% 玉米 + 30% 螺丝时,你看到带有银色光泽和一点点螺丝螺旋图案的玉米。在 30% 玉米 + 70% 螺丝时,你看到普通的螺丝旁边是橙色像玉米一样的螺丝。 我们对玉米 + 拱门也做同样操作: 插值至 70% 玉米粒凯旋门 30% 玉米粒 + 70% 凯旋门 当你向玉米粒添加更多拱门时,你慢慢地开始看到拱门的形状形成。然后,当你超过 50% 时,你看到玉米开始消失并融入拱门本身。 ## 两个草莓 在浏览 SAE 特征时,我发现两个特征看起来都像是关于草莓的。在本节中,我们将深入探讨这两个草莓特征,并尝试具体确定它们各自实际编码了什么。 特征 1511(草莓) 特征 1511 特征 2314(草莓) 特征 2314 仅从外观上看,看起来第一个(特征 1511)编码的是单个草莓,第二个(特征 2314)是关于一堆草莓的。这实际上可能是 SAE 中常见的特征分裂的一个例子(Chanin et al., 2024)(https://arxiv.org/abs/2409.14507)。我们可以通过剥离它们共享的方向来放大它们的差异,从而更好地观察是什么区分了它们。这个过程称为 Gram-Schmidt 正交化,结果如下: 移除 2314 分量后的 1511 1511 ⊥ 2314 移除 1511 分量后的 2314 2314 ⊥ 1511 这确实加强了以下观点:1511 确实编码了一个完整的单个草莓,带有所有种子和顶部;2314 编码了多个草莓,即使它们是切开的。但是 1511 是关于单个草莓的?还是关于完整的草莓?而 2314 是关于多个草莓的?还是关于小草莓的? 为了尝试区分这一点,我们将一张不同大小的草莓图像输入到我们的 SAE 中,并在缩放时记录两个特征的强度。使用下面的滑块: 224px 大小的草莓 224×224px 0.000.150.300.450.60224px114px16px草莓大小特征 1511特征 2314 从上面的图表来看,故事很清楚。草莓越大,1511 激活得越强。草莓越小,2314 激活得越强(*直到*草莓大约为 30x30 像素,然后开始下降)。 现在,让我们尝试看看草莓数量是否也很重要。我们将草莓大小保持在 125x125 像素,这在之前的尺寸实验中明确属于 1511 的领地。 1 个草莓 1 个草莓 0.000.130.250.380.5011120草莓数量特征 1511特征 2314 因此,似乎草莓的数量也是区分 1511 和 2314 的一部分,而与草莓的大小无关。更多的草莓 → 更高的 2314 和更低的 1511。 现在,进行最后一项检查,看看我们是否完全理解了一切。作为基线,这是 1511 和 2314 对于一个大的、完整的单个草莓的激活情况: 单个完整无缺的草莓 一个大而完整的草莓 正如预期,特征 1511 占主导。现在,对于一个大的、*切开的*单个草莓,我们会看到什么? 切开的草莓特写 一个大的切开的草莓 1511 崩溃了!这意味着 1511 是一个专门针对单个、大的、完整的草莓的特征,而 2314 是关于多个小草莓的,无论完整还是切开。 希望这能让你了解每个特征是如此的复杂和细微。我们这里只深入看了两个,但我们的 SAE 生成了 12,000 个。解释所有特征非常困难,手动分析不可扩展。 ## 地图 作为最后一项有趣的事情,我们在一个大型图像语料库(ImageNet Val)上运行了 SAE,并记录了每张图像激活的特征集。这为我们提供了一个用于特征的大的共激活矩阵,我们可以使用 UMAP(McInnes et al., 2018)(https://arxiv.org/abs/1802.03426) 在保留局部邻域的情况下将大特征空间可视化为 2 维,因此经常一起激活的特征在地图上彼此靠近。这与 Carter 等人(2019)(https://distill.pub/2019/activation-atlas/) 的激活图谱思路类似。滚动并放大/缩小以查看 SAE 学到的不同特征和聚类: 拖拽平移 · 滚动或捏合缩放 · 在 120×120 网格上显示了 2500 个最强特征 ## 这意味着什么 我们从一个小模型开始,它将图像映射到 384 个数字。通过使用一些工具,如 SAE、特征可视化和一些数学知识,我们能够稍微理解这 384 个数字编码了什么,以及如何操作它们。然而,还有更多需要了解。这些嵌入是如何构建的?局部嵌入与全局嵌入有何不同?你能在视觉语言模型中进行类似的特征可视化吗? ---

相似文章