读 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 的解耦损失可以按不同期相的配对写成:
其中, 是第 期的相似特征, 是该期的不相似特征。三期输入时,求和覆盖三对期相;加入延迟期以后,相应增加配对。[2,§2.2.1—2.2.3]
减小这个比值的优化倾向是:
- 分子变小:不同期相的相似特征更接近。
- 分母变大:不同期相的不相似特征更有区别。
但这是联合优化的倾向,不保证每一步更新都同时让分子减小、分母增大,也不保证这两部分已经成为严格独立、可直接解释的生物学因素。
一般的解耦方法还可能使用相关性或正交约束;这篇论文给出的是上述距离比值,不能把别的方法写成 LiON 已采用的损失。
4. Query 到底是什么
第一次读这里时,我被 Query 绕了很久。后来发现,先把它想成一个可学习的对象槽位,会容易一些。
在分割分支中,每个槽位尝试形成一个候选对象的表示,并预测:
- 它属于什么类别;
- 哪些体素属于它。
在实现层面,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 1 | 1 | 2 |
| Query 2 | 2 | 9 |
| Query 3 | 8 | 8 |
如果先把 Query 1 分给 A,再让 Query 2 对应 B,成本就是 。
更好的整体分配是:
- 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 补充材料给出的总损失为:
各部分作用不同:
| 损失 | 主要作用 |
|---|---|
| 跨期解耦损失 | 约束相似与不相似特征的关系 |
| 实例分割损失 | 学习对象类别和分割掩膜 |
| 全局分类损失 | 学习输入中相应病灶类别是否存在 |
实例分割部分包含类别 Focal loss、掩膜 BCE 和 Dice,并使用多层解码监督;补充材料还列出可启用的实例判别项。全局分类采用 BCE。[2,§2.2]
训练配置记录为:
- 1,500 个 epoch;
- batch size 为 8;
- AdamW 优化器;
- 初始学习率为 ;
- 分割损失从训练开始启用,全局分类损失在前 200 个 epoch 之后加入。
所以,不能把它简单理解为“在 nnU-Net 后面加一个分类头,然后所有任务从第一轮一起训练”。这些数字也不是直接搬到当前任务就一定更好的参数。
7. 全局分类标签从哪里来
这一部分很容易误解成:除了分割,还必须为每个训练输入额外手写一张分类标签表。
按照补充材料 §2.2.5,LiON 会把细分病灶分割标签按预设映射合并,再统计对应类别的体素数,构造全局分类软标签:
其中, 是映射到类别 的病灶体素数量之和, 是补充材料给出的经验阈值。[2]
这里并非简单地“出现一个阳性体素就把标签设成 1”:体素数较少时,标签可以介于 0 和 1 之间。
这不表示少于 100 个体素的病灶会从分割真值中删除;该公式描述的是全局分类监督标签。训练标签的构造也需要与临床评估中的病理、专家复核和随访参考标准区分。
对我现有的背景/肝脏/肿瘤标签,可以另行设计“这个输入中是否存在肿瘤”的辅助任务。但它只能利用现有标签表达的信息,无法凭空生成良恶性或八种病灶亚型标签。这仍是可以研究的方向,不是已经验证有效的改进。
8. 推理时,各部分怎样合到一起
训练时有真实标签,用来匹配、计算损失和更新参数;推理时只输入新患者的 CT,使用固定参数预测,不把 GT 交给模型。
补充材料描述了几个需要区分的合并步骤:
- 重叠 patch 的分割结果: 使用高斯加权融合。
- 分类头跨 patch 的输出: 取最大值形成整体预测。
- 分割路径的患者亚型评分: 在肝脏区域内,对各类体素概率取最大值,即
liver-max。 - 五折模型集成: 对分割和全局分类两条路径的模型概率分别取平均,最终分割再按类别最大概率确定标签。
因此,它的推理流程和 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。