这个想法在我脑子里放了一阵子。 我承认,它仍然有些牵强。 愿意把它写出来,只因为我觉得它很有意思,或许也能带来一点启发。 所以,且听我说。
要点
解剖嵌入有两个目标:
- 把“全局”的结构上下文传递给局部图像块(也传给 LLM?)
- 当 LLM 发起查询时,检索最相关的图像块(例如,“再看一眼左心室”)
这是用来做什么的?
在讨论它是什么之前,我想先说清楚:为什么我们需要另一种位置嵌入?传统的自学习位置嵌入或正弦位置嵌入,在自然图像上已经表现得相当不错。
这又回到了“数据空间大、样本量小”的问题。
常见做法是以 滑动窗口的方式 处理图像,尤其是在需要细致分析纹理的应用中(例如小病灶分析)。不过,也有研究表明,更大的上下文窗口通常会有帮助。1
当输入只有局部图像时,传统位置嵌入所编码的信息有限——可能只是图像块之间的相对排列关系。
实际上,还有更重要的上下文可以、也应该被带入局部图像块的分析:它相对于全身的位置,以及所在身体区域的大体形态变化与拓扑结构。
这就是我提出解剖嵌入的原因。
好的位置嵌入应具备什么
如果你没有关注过位置嵌入的演变,可以看看 designing-positional-encoding。
作者指出,对于一般序列,好的位置嵌入应当具备以下性质:
- 每个位置都有唯一的编码
- 两个已编码位置之间可以插值
- 能够泛化到更长的序列
- 对于给定输入,结果是确定的
- 能够扩展到多个维度
我发现,只要把 物理空间 中“位置”的含义,换成 人体 中的“解剖位置”,这些性质几乎都适用。 (第 3 条除外,因为人体之外的空间在这里没有意义。)
解剖嵌入与分割嵌入
紧接着的问题是:我们已经有大量关于身体区域语义分割的研究,那么它与解剖嵌入有什么区别,又有什么联系?
从对齐的角度看,这是在输入像素空间与“参数化”的结构空间之间做取舍。
具体来说,解剖嵌入更侧重整体表征,而分割更侧重逐像素的精确映射。这种区别相当微妙,在处理模糊区域时才格外明显:解剖嵌入从整体身体布局出发,进行自上而下的推断;分割则主要依据视觉线索,进行自下而上的推断。
(这个例子由 Gemini 提议,我觉得很贴切。)
想象 CT 扫描中一个边界模糊的区域,例如肝脏与右肾之间的边界。
如果两侧像素强度相近,分割模型(自下而上)可能难以判断,甚至把边界标错。
解剖嵌入(自上而下)则会提供这样的上下文:这个图像块位于肾脏上极通常与肝脏下表面相邻的位置。这种关于人体整体布局的“知识”,提供了可以消解局部歧义的强先验。
最后,要让它对语言模型有用,还需要额外考虑。这意味着,我们应该能够借助这样的嵌入,通过提示词得到恰当的文本信息(也许需要额外的投影层?)。
可能的实现方式
要实现它,可以使用擅长学习数据压缩表征的变分自编码器(VAE)。关键是用 三个不同的目标,或者说三种“监督”,来训练它,确保最终嵌入能够捕捉我们需要的全部上下文 :
-
像素级对齐:为了让嵌入理解局部组织,使用标准的重建损失。解码器必须能够从嵌入中重建出原始图像块。VAE 有很多选择,2我目前倾向于 beta-VAE,因为它简单,而且可以控制重建质量与解耦之间的取舍,这也可能适合解剖嵌入。
-
结构对齐:为了让嵌入知道自己在人体整体中的位置,可以借鉴掩码自编码器(MAE)。3模型需要仅凭少数局部图像块的嵌入,预测整体器官结构(例如全身掩膜)。这会迫使它学习全局解剖布局。
-
语言对齐:为了能够通过文本提示词(如“给我看看左心室”)检索嵌入,再增加第三个解码器。它负责连接图像嵌入与语言模型的嵌入空间,可能会使用类似 SigLIP 的对比损失。4
希望通过平衡这三项,就能得到一个好的嵌入,把解剖上下文传递给局部图像块和 LLM。
出处与延伸
参考资料
- Why is patch size important? Dealing with context variability in segmentation networks: https://openreview.net/forum?id=y6g0cu8q19#discussion ↩
- From Autoencoder to Beta-VAE: https://lilianweng.github.io/posts/2018-08-12-vae/ ↩
- Masked Autoencoders Are Scalable Vision Learners: https://arxiv.org/abs/2111.06377 ↩
- Sigmoid Loss for Language Image Pre-Training: https://arxiv.org/abs/2303.15343 ↩