读 LiON 的时候,我最先卡住的并不是网络有多少层,而是几个反复出现的词:特征解耦、交叉注意力、Query、实例匹配。

我目前做的是单期肝脏 CT 分割,网络输出背景、肝脏实质和肿瘤三类。LiON 则把病灶分割和患者诊断结合起来,还引入了多期相信息。它的目标比我当前的分割任务更广,所以理解时需要先把不同环节拆开。

这篇记录我对原论文及补充材料的理解。文中的例子用于帮助理解机制,不代表作者逐项采用的实现,也不是我已经完成的复现实验。

1. 先把整条流程连起来

LiON 的主要影像流程可以概括为:

同一患者的多期相 CT
    ↓
多期相特征提取与融合
    ↓
三维卷积主干 + 多尺度特征金字塔
    ├── 分割分支:预测对象类别和分割掩膜
    └── 分类分支:预测患者层面的诊断概率

主系统及前瞻性试验至少需要平扫、动脉期和静脉期,延迟期可选。论文也评估了仅静脉期的模型变体,因此不能把“主系统至少三期”扩展成“论文中的所有模型都只能三期输入”。同样,单期变体的存在也不表示可以对主模型任意删减输入通道。[1]

对我来说,这里首先要区分两件事:增加输入信息,以及改变网络怎样使用这些信息。

2. 多期相融合:共同信息与差异信息分开处理

LiON 把不同期相提取的特征拆成两部分:

特征部分可以怎样理解LiON 的处理方式
相似特征(Similar features)不同期相中共有的信息直接聚合
不相似特征(Dissimilar features)不同期相之间不同的表现通过交叉注意力迭代融合

可以把共同的形态信息、不同的强化表现当作直觉上的例子。不过,网络学到的特征并没有被逐一命名成“位置”“形态”或“强化”,不能把这些例子理解为人工指定的分工。

2.1 交叉注意力在做什么

先从一般机制理解:一组特征发起查询,从另一组特征中加权读取相关信息。

注意力里经常出现三个词:

  • Query(查询):当前用于查找相关信息的表示。
  • Key(键):用于计算匹配程度的表示。
  • Value(值):根据匹配权重实际读取的信息。

当 Query 与被查询的 Key、Value 来自不同特征来源时,就是交叉注意力。

举一个帮助理解的例子:动脉期某处有疑似病灶,但边界不清,模型可以利用与该处有关的表示,从其他期相特征中读取相关证据。这里描述的是跨来源读取信息的直觉,不是对 LiON 中具体 Q/K/V 排列的逐行代码还原。

LiON 的具体设计是在输入编码阶段迭代融合各期信息,将相似部分直接聚合,不相似部分交给交叉注意力处理。不能把一般解耦模型里“共享分支交流、独立分支只保留原样”的说法直接套到这篇论文上。

2.2 为什么还需要迭代

一次读取和融合以后,特征已经改变。后续步骤继续基于更新后的表示提取、融合信息,就构成迭代。

我目前的理解是:

多期相之间提供互补证据,网络通过逐步更新形成融合表示,而不是只把几套 CT 简单堆在一起。

注意力在特征层读取信息,不等于已经完成精确的空间配准。LiON 的实际技术流程还包括期相识别和配准,以平扫作为空间参考。[1]

3. 解耦损失:让两部分特征形成不同作用

只有“拆成两部分”这个结构,并不能保证两部分真的学到不同内容,还需要训练目标进行约束。

LiON 的解耦损失可以按不同期相的配对写成:

Ldis=∑i<j∥Si−Sj∥22∑i<j∥Di−Dj∥22 L_{\mathrm{dis}}= \frac{\sum_{i<j}\lVert S_i-S_j\rVert_2^2} {\sum_{i<j}\lVert D_i-D_j\rVert_2^2}

其中,SiS_i 是第 ii 期的相似特征,DiD_i 是该期的不相似特征。三期输入时,求和覆盖三对期相;加入延迟期以后,相应增加配对。[2,§2.2.1—2.2.3]

减小这个比值的优化倾向是:

  • 分子变小:不同期相的相似特征更接近。
  • 分母变大:不同期相的不相似特征更有区别。

但这是联合优化的倾向,不保证每一步更新都同时让分子减小、分母增大,也不保证这两部分已经成为严格独立、可直接解释的生物学因素。

一般的解耦方法还可能使用相关性或正交约束;这篇论文给出的是上述距离比值,不能把别的方法写成 LiON 已采用的损失。

4. Query 到底是什么

第一次读这里时,我被 Query 绕了很久。后来发现,先把它想成一个可学习的对象槽位,会容易一些。

在分割分支中,每个槽位尝试形成一个候选对象的表示,并预测:

  1. 它属于什么类别;
  2. 哪些体素属于它。

在实现层面,Query 是向量,不是医生输入的文字提示,也不是一个预先固定负责某个肝段的框。

4.1 Query 怎样从影像里读取信息

得到 CT 特征图以后,Query 在 Transformer 解码器中反复更新,主要进行两种交流:

机制信息在哪里交流作用
自注意力Query 与 Query 之间建模候选对象之间的关系
交叉注意力Query 与多尺度影像特征之间从影像特征中读取对象相关的信息

经过更新,某个槽位可能逐步形成对病灶 A 的表示,另一个槽位形成对病灶 B 的表示。这些身份不是一开始就指定好的。

4.2 从向量怎样得到掩膜

类别由更新后的 Query 表示预测。掩膜则通过 Query 与高分辨率像素特征结合生成。

把三维空间展平成体素序列,只看概念上的维度关系:

一个 Query:             M 维向量
每个体素的像素特征:      M 维向量
二者逐位置做点积:        每个体素得到一个掩膜分数

这样,一个向量就能对应整块三维空间中的一个候选掩膜。它不需要预先存下一张固定形状的病灶模板。

原文还指出,推理时会将各 Query 的类别预测与掩膜合成为体素类别图。因此,按实例训练和最终输出语义分割结果可以同时存在。[1,Methods:Instance-level segmentator]

关于数量的一处疑点: 补充材料 §2.1 写分割 Query 为 64 个、分类 Query 为 128 个,而扩展图3中标注的是 50 个和 192 个。图文并不一致,所以这里不把某组数量当成已经核实的最终配置。理解机制也不必依赖这个具体数字。

5. 匈牙利匹配:哪个预测应该接受哪个对象的监督

Query 没有预先指定身份,计算误差之前就需要回答:

哪个预测,应该和哪个真实对象比较?

匈牙利匹配在训练中寻找总配对成本最低的一对一分配。它不是让每个候选各自抢一个最像的真实对象,而是考虑整体分配。

5.1 一个简化例子

假设一个训练 patch 有两个真实病灶 A、B,模型产生三个候选预测。配对成本如下,数值越小表示越匹配:

候选预测真实病灶 A真实病灶 B
Query 112
Query 229
Query 388

如果先把 Query 1 分给 A,再让 Query 2 对应 B,成本就是 1+9=101+9=10。

更好的整体分配是:

  • Query 2 → A:成本 2;
  • Query 1 → B:成本 2;
  • Query 3:没有匹配到真实对象。

两个真实对象的配对总成本是 4。这张表只演示配对机制,数字是人为构造的,没有把真实训练中所有成本项都列出来。

5.2 配对以后怎样计算误差

补充材料 §2.2.4 明确说明,未匹配的 Query 分配为 no-object(无对象)。[2]

预测状态接受的主要监督
匹配到真实对象对象类别,以及预测掩膜与真实掩膜之间的 BCE、Dice
未匹配到真实对象“无对象”类别监督

上述类别和掩膜损失还作用于多个解码层,形成深监督。

这也有助于减少重复预测:多个 Query 即使都圈住同一个病灶,也只有一个能匹配它;其余没有匹配到其他真实对象的 Query 接受“无对象”监督。但匹配机制本身不会凭空补出输入中缺乏证据的病灶。

6. 训练损失与训练日程

我当前的基线使用 Dice + CE,并带深监督。CE2 实验主要把 CE 类别权重改为背景 1、肝脏 1、肿瘤 2。

LiON 补充材料给出的总损失为:

Loverall=0.2Ldis+Lseg+Lcls-global L_{\mathrm{overall}} =0.2L_{\mathrm{dis}}+L_{\mathrm{seg}}+L_{\mathrm{cls\text{-}global}}

各部分作用不同:

损失主要作用
跨期解耦损失约束相似与不相似特征的关系
实例分割损失学习对象类别和分割掩膜
全局分类损失学习输入中相应病灶类别是否存在

实例分割部分包含类别 Focal loss、掩膜 BCE 和 Dice,并使用多层解码监督;补充材料还列出可启用的实例判别项。全局分类采用 BCE。[2,§2.2]

训练配置记录为:

  • 1,500 个 epoch;
  • batch size 为 8;
  • AdamW 优化器;
  • 初始学习率为 10−510^{-5};
  • 分割损失从训练开始启用,全局分类损失在前 200 个 epoch 之后加入。

所以,不能把它简单理解为“在 nnU-Net 后面加一个分类头,然后所有任务从第一轮一起训练”。这些数字也不是直接搬到当前任务就一定更好的参数。

7. 全局分类标签从哪里来

这一部分很容易误解成:除了分割,还必须为每个训练输入额外手写一张分类标签表。

按照补充材料 §2.2.5,LiON 会把细分病灶分割标签按预设映射合并,再统计对应类别的体素数,构造全局分类软标签:

Yglobal,c=min⁡(1,ScT),T=100 Y_{\mathrm{global},c}=\min\left(1,\frac{S_c}{T}\right), \qquad T=100

其中,ScS_c 是映射到类别 cc 的病灶体素数量之和,TT 是补充材料给出的经验阈值。[2]

这里并非简单地“出现一个阳性体素就把标签设成 1”:体素数较少时,标签可以介于 0 和 1 之间。

这不表示少于 100 个体素的病灶会从分割真值中删除;该公式描述的是全局分类监督标签。训练标签的构造也需要与临床评估中的病理、专家复核和随访参考标准区分。

对我现有的背景/肝脏/肿瘤标签,可以另行设计“这个输入中是否存在肿瘤”的辅助任务。但它只能利用现有标签表达的信息,无法凭空生成良恶性或八种病灶亚型标签。这仍是可以研究的方向,不是已经验证有效的改进。

8. 推理时,各部分怎样合到一起

训练时有真实标签,用来匹配、计算损失和更新参数;推理时只输入新患者的 CT,使用固定参数预测,不把 GT 交给模型。

补充材料描述了几个需要区分的合并步骤:

  1. 重叠 patch 的分割结果: 使用高斯加权融合。
  2. 分类头跨 patch 的输出: 取最大值形成整体预测。
  3. 分割路径的患者亚型评分: 在肝脏区域内,对各类体素概率取最大值,即 liver-max。
  4. 五折模型集成: 对分割和全局分类两条路径的模型概率分别取平均,最终分割再按类别最大概率确定标签。

因此,它的推理流程和 nnU-Net 仍有共同点,也增加了实例建模、全局分类和多模型集成。患者层面判断正确,并不代表患者身上的每个小病灶都已被完整圈出。

另外,临床信息并不是必须塞进影像网络的输入。论文使用后续的两阶段逻辑回归做评分融合;前瞻性实际部署采用纯影像模型,临床信息融合是在事后分析中评估的。[1–2]

9. 放回我自己的任务里

把这些环节串起来以后,我对它与当前实验的区别更清楚了一些:

做法主要改变什么
Mix50 采样训练时更容易看到哪些目标
CE2 类别加权哪类体素错误受到更大的相对惩罚
Query 与实例匹配哪个候选接受哪个真实对象的监督
多期相融合模型能利用哪些互补影像信息
五折集成多个模型的预测怎样合并

这几项不是互相替代的操作,也不能把整体效果全部归因于某一个模块。

对我现有的单期数据,实例建模或肿瘤存在辅助分类是可以继续研究的方向;跨期融合需要配套多期数据,细分诊断需要对应的诊断标签。

这次阅读最有帮助的地方,是把之前混在一起的几个问题分开:输入能提供什么、模型怎样表示对象、训练怎样分配监督,以及推理怎样合并结果。 至于它们能不能改善当前的小病灶漏检,还需要在相同数据划分和评价标准下验证。

参考资料

[1] Zhang X, Li C, Han X, et al. Large-scale AI-guided liver malignancy diagnosis: multicenter study and a single-arm trial. Nature Medicine, 2026, 32: 3717–3729. 论文与 Methods。重点参考正文图1、Methods 的 LiON algorithm 及扩展图3。

[2] 同文 Supplementary Information。重点参考 §2.1 Implementation、§2.2 Training、§2.3 Inference,以及 §6 Real-world deployment。