想象一下,你是一位新上任的班主任,要在一天之内判断自己带的这个班是不是“尖子班”。但你没有学生的成绩单,只有一张巨大的全班合影。这张照片分辨率高得惊人,任何电脑屏幕都只能显示其中一小块,你必须在照片上不断平移、放大、缩小,才能看清每一张脸。这就是病理医生和AI面对的日常困境——一张全切片病理图像(WSI)长达十万像素量级,细胞细节藏在亿级像素中。 多实例学习(MIL)提供了一套聪明的“带班思路”:先把合影裁成一张张学生单人照(实例,instance),把全班照片当作一个“班级包裹”(包,bag)。你不需要知道每个学生的具体成绩(实例级标签),只需要知道这个班级整体获得过什么荣誉(包级标签),就能训练一个模型来判断“这个班的好与坏”。更进一步,注意力池化(Attention Pooling)就像老师手里的“重点关注名单”,自动找出哪些学生是关键的“尖子生”或“问题学生”。这套机制让AI能用极廉价的整体标签训练出精准的诊断模型,正在深刻地改变癌症病理诊断的流程与效率。

岗位关联

掌握MIL框架,意味着你能在病理影像、卫星遥感、视频监控等“弱标注”场景中构建可落地的分类与预测模型,大幅降低标注成本——这是医学影像AI岗位上最具含金量的核心技能之一。

目录
  1. 可视化演示
  2. WSI影像特点
  3. MIL核心思想
  4. 图像切分处理
  5. 模型架构设计
  6. 注意力池化
  7. 临床任务应用
  8. 工程实践要点
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

WSI影像特点

班主任李老师收到的这张“全班合影”,其实是学校的数字病理切片扫描仪刚刚生成的:它把一张玻璃切片上的组织,用40倍物镜逐行扫过,拼成了一张像素过亿的数字图像。在医学上,这张图叫全切片图像(Whole Slide Image,简称WSI)。它有一个让人又爱又恨的特点——信息极其丰富,但也极其庞大。如果以像素为单位计算,一张标准的WSI宽度和高度都可以达到10万像素,总像素数轻松突破百亿。而常规深度学习模型习惯的输入图片只有224×224像素,两者相差约20万倍。

这种巨大的规模给AI带来了第一个困难:显存放不下。即使是最先进的GPU,其显存也往往只有几十GB,而一张未压缩的WSI动辄就需要几GB甚至几十GB的内存。如果像处理普通照片那样,把整个WSI直接缩放到224×224然后输入网络,那些决定良恶性的细胞核细节会彻底被抹平,就像把全班合影缩小到只有指甲盖大小,谁也看不清谁的脸。因此,几乎所有WSI分析任务的第一步,都不是“直接处理”,而是“先切块”。

回到李老师的场景,她不可能在电脑屏幕上一次性看完整个班级合影,必须滚动、缩放、逐块观察。同样的,AI模型处理WSI也需要一种“切块+逐步观察”的策略,而这正是多实例学习登场的起点。

Npix=WWSI×HWSI≈105×105=1010N_{\text{pix}} = W_{\text{WSI}} \times H_{\text{WSI}} \approx 10^{5} \times 10^{5} = 10^{10}
这个公式告诉你,一张WSI大约包含百亿像素,远超普通图像,必须切块才能进入模型。
  1. \( W_{\text{WSI}} \) 代表切片图像的宽度40倍物镜扫描时,一行往往就有10万个像素点。
    WWSI≈105 pixelsW_{\text{WSI}} \approx 10^{5} \text{ pixels}
  2. \( H_{\text{WSI}} \) 代表切片图像的高度与宽度类似,纵向也有约10万个像素点。
    HWSI≈105 pixelsH_{\text{WSI}} \approx 10^{5} \text{ pixels}
  3. 宽度×高度得到总像素数两个10万相乘,结果是约百亿像素。
    Npix=105×105=1010 pixelsN_{\text{pix}} = 10^{5} \times 10^{5} = 10^{10} \text{ pixels}

MIL核心思想

李老师手上没有学生成绩单,但她办公室的档案柜里有一摞“班级荣誉证书”——比如“市级优秀班集体”“文明班级”。这种信息粒度非常粗:它只能告诉她这个班级整体是好是坏,却无法告诉她哪个学生是学霸、哪个学生在拖后腿。多实例学习(Multiple Instance Learning,简称MIL)就是在这种“只知道整体、不知道个体”的条件下完成训练的学习范式。

在MIL中,“班级荣誉证书”被称为包级标签(bag-level label),“全班合影”被切成的一张张学生单人照被称为实例(instance),而所有单人照合在一起就叫包(bag)。如果把一张WSI看作一个包,那么它被切分出的所有patch(图像块)就是包内的实例,整张切片的病理诊断结论(“是癌”或“不是癌”)就是包级标签。MIL学习的核心问题是:如何从包级标签出发,推断出每个实例的贡献?

为了回答这个问题,MIL通常采用一个“标准假设”:一个包被判定为阳性(正类),当且仅当这个包中至少存在一个阳性实例。用概率语言表达,就是下面的公式——它描述“至少一个”的逻辑,等价于“1 减去 全部为阴性的概率”。

在这个思路下,李老师终于有了一套可行的评估框架:不需要逐个学生的成绩单,只需要班级的整体荣誉记录,就能反向推断出“这个班里一定存在尖子生或问题学生”。但标准假设只是给出了一个理想化的判定逻辑,真正的挑战在于:如何实现这种推断?下一节我们将讨论如何把那张巨大的合影变成一张张可分析的单人照。

P(Y=1∣X)=1−∏i=1K(1−p(yi=1∣xi))P(Y=1 \mid X) = 1 - \prod_{i=1}^{K} \left(1 - p(y_i = 1 \mid x_i)\right)
公式的直觉是:只要班里有一个学生是“尖子生”,整个班就能被评为“优秀班”;只有当所有学生都是“普通生”时,班级才与“优秀”无缘。
  1. \( X \) 代表整个包即一张WSI切出的全部K个图像块构成的大集合。
    X={x1,x2,…,xK}X = \{x_1, x_2, \dots, x_K\}
  2. \( K \) 是包内实例的总数不同WSI的组织面积不同,K的取值可能从几百到几万不等。
    K=∣X∣K = |X|
  3. \( p(y_i = 1 \mid x_i) \) 是第i个实例为阳性的概率比如某个patch含有癌细胞的概率。
    p(yi=1∣xi)∈[0,1]p(y_i = 1 \mid x_i) \in [0, 1]
  4. 连乘符号 \( \prod \) 表示“所有实例都为阴性”的概率把每个实例为阴性的概率相乘。
    ∏i=1K(1−p(yi=1∣xi))\prod_{i=1}^{K} (1 - p(y_i = 1 \mid x_i))
  5. 用1减去“全部阴性”得到“至少有一个阳性实例”的概率,这就是包为阳性的判定依据。
    P(Y=1∣X)=1−∏i=1K(1−p(yi=1∣xi))P(Y=1 \mid X) = 1 - \prod_{i=1}^{K} (1 - p(y_i = 1 \mid x_i))

图像切分处理

李老师现在要做的第一件事,是把那张巨大的合影裁成单人照。但面对一张“十亿像素”的全班合影,如果盲目切割,一大半面积可能都是空白背景——就像照片里教室的地板和墙壁,根本不存在学生。因此,切分的第一步是组织定位:通过颜色阈值判断哪些区域真的有组织(染色后呈现紫红色),哪些区域是白色背景,只保留有组织覆盖的矩形范围。

在得到组织区域后,接下来是切片策略。工程中常用滑动窗口切割,patch尺寸常取256×256或512×512像素(在20倍物镜下),步长(stride)可以与patch尺寸相同,也可以设置重叠。切割后,还需要背景过滤——丢掉那些超过80%面积为背景的patch,以降低计算量和噪声。最后,把剩余的有效patch连同它们的空间坐标一起打包,组成一个实例集合,这就是一个“包”。

这样一来,李老师就拥有了一叠干净的学生单人照。她接下来要做的是:对每张单人照建立“档案卡”,再综合所有档案卡,对班级整体做出判断——这正是下一节模型架构要做的事。

Kbag=Wtissue×Htissues2×(1−rbg)K_{\text{bag}} = \frac{W_{\text{tissue}} \times H_{\text{tissue}}}{s^2} \times (1 - r_{\text{bg}})
公式的含义是:包内实例数量约等于组织区域的面积除以单个patch的面积,再乘以有效组织占比。
  1. \( W_{\text{tissue}} \) 和 \( H_{\text{tissue}} \) 表示组织包围盒的宽与高通过颜色阈值从整张WSI中提取出来的有效区域尺寸。
    Wtissue×HtissueW_{\text{tissue}} \times H_{\text{tissue}}
  2. \( s \) 代表patch边长(步长)若patch为256×256,则 \( s = 256 \)。
    s=patch side lengths = \text{patch side length}
  3. 总面积除以单块面积得到粗略切块数等价于 \( \frac{W}{s} \times \frac{H}{s} \)。
    Wtissue×Htissues2\frac{W_{\text{tissue}} \times H_{\text{tissue}}}{s^2}
  4. \( 1 - r_{\text{bg}} \) 是有效组织占比\( r_{\text{bg}} \) 是背景比例,过滤后只保留组织部分。
    Kbag=Wtissue×Htissues2×(1−rbg)K_{\text{bag}} = \frac{W_{\text{tissue}} \times H_{\text{tissue}}}{s^2} \times (1 - r_{\text{bg}})

模型架构设计

拿到一叠学生单人照后,李老师不会直接把照片贴在报告里,而是先给每个学生提炼一份“核心档案”:姓名、特长、近期表现等。在MIL模型中,这个提炼动作由特征提取器完成——通常是一个预训练的CNN,如ResNet50。每个patch经过CNN后得到一个低维向量,称为实例嵌入(instance embedding)。这一步把“图像”变成了“特征向量”,大幅压缩了数据规模。

接下来,模型需要把这些实例嵌入汇总成一个“包级表征”(bag representation)。汇总方式有三种常见选择:最大池化(max pooling)、平均池化(mean pooling)和注意力池化(attention pooling)。后文的注意力池化可以根据任务自动调整每个实例的权重,是当前最主流的选择。最后,包级表征经过一个分类头(全连接层+softmax),输出这个包属于各个类别的概率。

这门“档案汇总”的技术本身就构成了一个可端到端训练的网络。李老师不再需要手工判断某个学生是否重要,只需要告诉模型“这个班最终是优秀班”,模型就能自己学会哪些学生应该被赋予更高的权重。而这个“权重学习”的精髓,正是下一节的主角——注意力池化。

z=∑i=1Kaihi,hi=fθ(xi)z = \sum_{i=1}^{K} a_i h_i, \qquad h_i = f_{\theta}(x_i)
y^=σ(Wz⊤z+bz)\hat{y} = \sigma\left(W_z^{\top} z + b_z\right)
第一个公式描述了“把实例特征加权求和得到包表征”,第二个公式描述“由包表征经过全连接层输出类别概率”。
  1. \( x_i \) 是第i个patch的像素矩阵一张256×256×3的图像块。
    xi∈R256×256×3x_i \in \mathbb{R}^{256 \times 256 \times 3}
  2. \( f_{\theta} \) 是共享的特征提取网络所有patch共用同一套参数θ,通常来自ImageNet预训练的CNN。
    hi=fθ(xi),hi∈Rdh_i = f_{\theta}(x_i), \quad h_i \in \mathbb{R}^{d}
  3. \( a_i \) 是第i个实例的聚合权重若采用平均池化则 \( a_i = 1/K \),若采用注意力池化则 \( a_i \) 由模型学习得到。
    ∑i=1Kai=1,ai≥0\sum_{i=1}^{K} a_i = 1, \quad a_i \ge 0
  4. \( z \) 是包级表征所有实例嵌入的加权和,是整张WSI的综合“档案”。
    z=∑i=1Kaihiz = \sum_{i=1}^{K} a_i h_i
  5. \( \hat{y} \) 是包级预测概率经全连接层和softmax(或sigmoid)后输出。
    y^=σ(Wz⊤z+bz)\hat{y} = \sigma(W_z^{\top} z + b_z)

注意力池化

李老师评估班级时,心里其实有一张“重点关注名单”:有的学生的表现能决定班级是否能评上优秀,有的学生则无关紧要。注意力池化(Attention Pooling)就是让模型自动学习这张“名单”的机制。它的核心是一个可学习的注意力网络:对每个实例的嵌入 \( h_i \),输出一个标量分数,再经过softmax归一化,得到权重 \( a_i \)。

一个广泛使用的实现是“门控注意力”(gated attention),它相比简单的线性打分多了 \( \tanh \) 门控,能够表达更复杂的模式。公式如下:

有了这套注意力机制,李老师的“重点关注名单”不再需要人工指定,而是从大量班级数据中自动学出来。更重要的是,注意力分数 \( a_i \) 天然具有可解释性——它可以被可视化为一幅热力图,指出模型在WSI的哪些区域投注了最多注意力。对于医生来说,这种“为什么得出这个结论”的能力,往往和结论本身一样重要。

ai=exp⁡(w⊤tanh⁡(Vhi⊤))∑j=1Kexp⁡(w⊤tanh⁡(Vhj⊤))a_i = \frac{\exp\left(w^{\top} \tanh(V h_i^{\top})\right)}{\sum_{j=1}^{K} \exp\left(w^{\top} \tanh(V h_j^{\top})\right)}
这个公式可以理解为:每个学生先经过一套“综合测评问卷”(V和w),得到一个关注度分数,全班再对这些分数做归一化,使权重之和为1。
  1. \( h_i \) 是第i个实例的嵌入向量特征提取器输出的低维表示。
    hi∈R1×dh_i \in \mathbb{R}^{1 \times d}
  2. \( V \) 是一个可学习矩阵,把实例嵌入映射到隐空间相当于一组“测评维度”。
    Vhi⊤∈RLV h_i^{\top} \in \mathbb{R}^{L}
  3. \( \tanh \) 门控激活函数引入非线性,让注意力能捕捉实例间更复杂的依赖关系。
    tanh⁡(Vhi⊤)∈(−1,1)L\tanh(V h_i^{\top}) \in (-1, 1)^{L}
  4. \( w \) 是注意力网络的输出向量把隐空间分数压缩成单个标量,即该实例的“关注得分”。
    w⊤tanh⁡(Vhi⊤)∈Rw^{\top} \tanh(V h_i^{\top}) \in \mathbb{R}
  5. softmax对不同实例得分做归一化保证所有权重非负且和为1,便于加权求和。
    ai=exp⁡(ei)∑j=1Kexp⁡(ej)a_i = \frac{\exp(e_i)}{\sum_{j=1}^{K} \exp(e_j)}
  6. 最终聚合用 \( a_i \) 对实例嵌入加权求和,得到包级表征。
    z=∑i=1Kaihiz = \sum_{i=1}^{K} a_i h_i

临床任务应用

李老师的方法论很快被搬进了医院。病理AI中,MIL最常见的临床任务之一是癌症分级。以前列腺癌Gleason分级为例:病理医生需要根据腺体结构的异型程度给出1~5级评分。过去,医生需要逐视野观察整个切片,耗时费力。而MIL模型把每个病人的WSI当作一个包,把病理报告中的Gleason总分当作包级标签,训练后的模型能自动聚焦到最关键的腺体区域,并给出分级建议。

另一个重要任务是预后预测。模型不再是简单地输出“癌/非癌”,而是预测患者的生存风险。这时,MIL与经典的Cox比例风险模型结合:将注意力池化得到的包级表征 \( z \) 输入一个小型全连接网络,输出一个风险分数 \( r \),再通过Cox部分似然损失进行优化。当模型认为某个患者的风险分数显著更高时,意味着其预后更差。

回到李老师的例子,她不再只是判断“这个班是不是优秀班”,而是进一步预测“这个班未来升学率如何”。MIL加上生存分析,让病理AI从“看图说话”升级为“看片算命”——当然,这个“算命”是有严格统计依据的。同时,MIL还被用于治疗响应预测和分子分型推断,在肿瘤精准医疗中发挥着越来越重要的作用。

LCox(θ)=−∑i:δi=1(ri−log⁡∑j∈R(ti)exp⁡(rj))L_{\text{Cox}}(\theta) = -\sum_{i: \delta_i = 1} \left( r_i - \log \sum_{j \in R(t_i)} \exp(r_j) \right)
这个公式计算的是“一致性”:对于每个发生事件(如死亡)的患者,模型应当给出比仍然生存的患者更高的风险分数。
  1. \( r_i \) 是模型输出的患者i的风险分数由包级表征经过全连接映射得到。
    ri=wr⊤zi+brr_i = w_r^{\top} z_i + b_r
  2. \( \delta_i = 1 \) 表示患者i在随访期内发生了终点事件如死亡或复发。
    δi∈{0,1}\delta_i \in \{0, 1\}
  3. \( R(t_i) \) 是时刻 \( t_i \) 仍处于风险集中的患者集合即事件发生前未失访、未发生事件的患者。
    R(ti)={j:tj≥ti}R(t_i) = \{j : t_j \ge t_i\}
  4. 对“事件患者”求和,再减去其风险对数迫使事件患者的风险分数高于其他仍在随访的患者。
    LCox(θ)=−∑i:δi=1(ri−log⁡∑j∈R(ti)exp⁡(rj))L_{\text{Cox}}(\theta) = -\sum_{i: \delta_i=1} \left( r_i - \log \sum_{j \in R(t_i)} \exp(r_j) \right)

工程实践要点

李老师的方法再有效,要推广到全校、全市,还得解决一系列工程问题。第一个问题是弱标注利用:MIL只需要每张WSI的整体诊断结论(如“浸润性癌”),而这在医院的病理报告中天然存在,不需要医生额外花时间逐像素勾画。这极大降低了数据构建成本——但也意味着标签噪声更高,需要更稳健的训练策略。

第二个问题是计算优化:一张WSI可能切出数千个patch,对每个patch做前向推理的代价很大。工程上常用多尺度金字塔采样,先在低倍率下筛选可疑区域,再在高倍率下精查;也可以用“过滤掉空白patch”来大幅减少有效patch数量。第三个问题是多中心泛化:不同医院的切片染色条件、扫描仪型号差异很大。颜色归一化(如Macenko方法)、数据增强和领域自适应,是提高模型跨中心泛化能力的关键手段。第四个问题是评估体系:病理AI不能只看准确率,常用AUC和FROC曲线评估。

李老师最终把她的“班级评估法”写成了一套标准流程:从照片切块、档案提炼、重点名单学习,到班级评级、升学预测,每一步都有清晰的方法论和评估手段。MIL框架也因此成为医学影像AI中“低标注成本、高临床价值”的代表性工具,在实际工程项目中处处可见它的身影。

AUC=1n+n−∑i∈P∑j∈NI[si>sj]\text{AUC} = \frac{1}{n_{+} n_{-}} \sum_{i \in P} \sum_{j \in N} \mathbb{I}\left[ s_i > s_j \right]
AUC表示正样本得分高于负样本得分的概率,是一种排除了阈值影响的标准评估指标。
  1. \( P \) 和 \( N \) 分别代表正样本与负样本集合在病理任务中,如恶性肿瘤和良性病变。
    P={正类样本},N={负类样本}P = \{正类样本\}, \quad N = \{负类样本\}
  2. \( n_{+} \) 与 \( n_{-} \) 是两类样本的数量用于归一化。
    n+=∣P∣,n−=∣N∣n_{+} = |P|, \quad n_{-} = |N|
  3. \( \mathbb{I}[s_i > s_j] \) 是指示函数当正样本得分大于负样本得分时取1,否则取0。
    I[si>sj]={1,si>sj0,otherwise\mathbb{I}[s_i > s_j] = \begin{cases} 1, & s_i > s_j \\ 0, & \text{otherwise} \end{cases}
  4. 对所有正负样本对取平均得到随机抽取一对正负样本,正样本得分更高的概率。
    AUC=1n+n−∑i∈P∑j∈NI[si>sj]\text{AUC} = \frac{1}{n_{+} n_{-}} \sum_{i \in P} \sum_{j \in N} \mathbb{I}[s_i > s_j]

AI 应用场景

前列腺癌Gleason分级

阶段:模型训练与推断

解决的问题:前列腺癌的Gleason分级要求病理医生逐视野评估腺体结构异型程度,耗时长且主观差异大。传统方法严重依赖资深医生的人工经验,基层医院难以复制。MIL框架将整个活检组织的WSI切分为patches,用病理报告中的总体Gleason评分作为包级标签训练注意力MIL,模型自动锁定关键腺体区域并输出分级建议,大幅提升了诊断效率和一致性。

具体案例:某三甲医院积累了5000例前列腺穿刺WSI,使用ResNet50提取patch特征,注意力MIL输出Gleason分级,AUC达0.92,注意力热力图辅助医生快速复核重点区域,将报告出具时间缩短40%。

乳腺癌前哨淋巴结转移检测

阶段:模型推理与临床决策辅助

解决的问题:前哨淋巴结是否有微小转移灶,直接决定乳腺癌患者是否需要腋窝清扫。传统镜下检查费时且容易漏检微小转移。MIL模型以整张淋巴结WSI为包,输出“有转移/无转移”的二元判定,同时借助注意力图引导医生快速定位可疑微转移区域,既降低漏检率又减轻医生负担。

具体案例:在CAMELYON16公开数据集上,基于MIL的WSI级别转移检测模型的FROC显著超过人工初筛基准,单张WSI推理时间从数小时缩短到分钟级,多项研究表明其漏检率低于住院医师初筛。

非小细胞肺癌预后预测

阶段:特征建模与联合生存分析

解决的问题:常规预后预测依赖TNM分期、年龄等临床指标,忽略了组织形态中蕴含的微观信息。MIL从WSI中提取组织学表征,再接入Cox比例风险模型预测患者总生存期,能区分出传统指标无法识别的高危亚组,为辅助治疗决策提供新的量化依据。

具体案例:在TCGA-LUAD队列中,研究者用注意力MIL提取WSI特征,与临床指标拼接后训练Cox模型,将患者划分为高低风险两组,log-rank检验p<0.001,高风险组中位生存期显著缩短约14个月。

Python 演示

python95 行
import random import torchimport torch.nn as nnimport torch.nn.functional as F  class AttentionMIL(nn.Module):    """基于注意力池化的多实例学习模型。     包内每个实例先变换为嵌入向量,再通过注意力网络得到权重,    最后加权求和得到包级表征并分类。    """    def __init__(self, in_dim=256, hidden_dim=128, n_classes=2):        super().__init__()        self.embedder = nn.Sequential(            nn.Linear(in_dim, hidden_dim),            nn.ReLU(),            nn.Linear(hidden_dim, hidden_dim),        )        self.att_net = nn.Sequential(            nn.Linear(hidden_dim, hidden_dim),            nn.Tanh(),            nn.Linear(hidden_dim, 1),        )        self.classifier = nn.Linear(hidden_dim, n_classes)     def forward(self, instances):        # instances: [B, K, in_dim],K 为包内实例数        h = self.embedder(instances)                # [B, K, hidden_dim]        scores = self.att_net(h).squeeze(-1)        # [B, K]        att = F.softmax(scores, dim=-1)             # [B, K]        att = att.unsqueeze(-1)                     # [B, K, 1]        bag = (h * att).sum(dim=1)                  # [B, hidden_dim]        logits = self.classifier(bag)               # [B, n_classes]        return logits, att.squeeze(-1)  def make_bag_data(n_bags=40, n_instances=12, in_dim=256, seed=0):    """生成模拟的包级弱标注数据。     每个包包含若干实例;若包为正,则保证至少 30% 的实例    是"关键实例"(正样本特征),否则全部实例为负。    """    rng = random.Random(seed)    g = torch.Generator()    g.manual_seed(seed)    bags = []    labels = []    for _ in range(n_bags):        label = rng.randint(0, 1)        k = max(1, int(n_instances * (0.3 if label else 0.0)))        instances = []        for j in range(n_instances):            if label and j < k:                vec = torch.randn(in_dim, generator=g) + 4.0            else:                vec = torch.randn(in_dim, generator=g)            instances.append(vec)        bags.append(torch.stack(instances))        labels.append(label)    return torch.stack(bags), torch.tensor(labels)  def main():    torch.manual_seed(42)    model = AttentionMIL(in_dim=256, hidden_dim=128, n_classes=2)    opt = torch.optim.Adam(model.parameters(), lr=3e-4)    loss_fn = nn.CrossEntropyLoss()     train_x, train_y = make_bag_data(n_bags=60, seed=0)    test_x, test_y = make_bag_data(n_bags=20, seed=1)     for epoch in range(60):        model.train()        opt.zero_grad()        logits, att = model(train_x)        loss = loss_fn(logits, train_y)        loss.backward()        opt.step()        if epoch % 10 == 0:            with torch.no_grad():                model.eval()                t_logits, _ = model(test_x)                acc = (t_logits.argmax(1) == test_y).float().mean().item()            print(f"epoch {epoch:02d}  loss={loss.item():.4f}  test_acc={acc:.2f}")     model.eval()    with torch.no_grad():        logits, att = model(test_x[:2])        print("推理完成,注意力权重形状:", att.shape)  if __name__ == "__main__":    main()
目的:演示一个端到端的注意力MIL模型,从包级弱标签学习实例权重并完成分类任务。
  1. self.embedder = nn.Sequential(...)每个patch先经共享MLP映射为低维嵌入,相当于给每个学生建档案卡。
  2. self.att_net = nn.Sequential(nn.Tanh(), ...)门控注意力网络,输出每个实例的原始关注分数。
  3. att = F.softmax(scores, dim=-1)对分数做softmax归一化,使注意力权重之和为1,类似全班关注度排名归一化。
  4. bag = (h * att).sum(dim=1)对嵌入向量按注意力权重加权求和,得到包级表征,即“班级总档案”。
  5. make_bag_data(...)生成模拟数据:正包至少30%实例为阳性特征,负包全为阴性,模拟真实弱监督MIL场景。
  6. loss_fn = nn.CrossEntropyLoss()只使用包级标签计算损失,全程不需要实例级标注。
  7. if epoch % 10 == 0:每10个epoch打印测试准确率,监控模型是否从弱标签中学到了判别信息。

常见误区

误区听说了MIL是“弱监督”学习,以为不再需要任何人工标注,拿一堆没有标签的WSI就能训练出病理诊断模型。

正解MIL确实不需要实例级(patch级)标注,但它仍然需要包级标签——也就是“这个病例是癌/不是癌”的整体诊断结论。标注成本降低的本质是“标注粒度变粗”,而不是“取消标注”。如果连包级标签都没有,模型就失去了学习的方向,本质上变成了无监督聚类,无法保证输出临床所需的分类语义。

为何常见:因为“弱监督”这个术语容易被望文生义地理解为“没有监督”或“弱化监督”,实际上它指的是“监督信息粒度较粗”,而非“监督信息缺失”。

误区既然每个patch都来自同一张WSI,把它们对应的特征向量做个平均,不也能代表整张切片吗?反而更简单稳定。

正解在一张WSI中,真正与诊断相关的肿瘤区域往往只占很小比例,可能不到5%。如果使用简单的平均池化,关键的肿瘤信号会被大量正常组织、炎症区域的特征淹没,模型很难做出准确判断。注意力池化的核心价值,正是让模型自动把权重集中在少数关键实例上——就像班主任只重点观察几个决定班级命运的学生,而不是对全班每人平均打分。

为何常见:人们对“平均”有一种天然的直观信赖感,但忽略了医学图像中病灶天然稀疏、分布极不均衡的特点。

误区模型输出的注意力权重高,就说明该patch一定是肿瘤区域,可以直接把高权重patch拼成一张病灶热力图用于诊断定位。

正解注意力权重表示的是“该实例对当前包级预测的贡献程度”,它并不等同于病理学意义上的“病灶显著性”。模型可能学到某些与标签相关的捷径特征,比如染色伪影、切片折叠、扫描仪的固定噪声,这些都会让注意力分数产生假阳性。只有在经过大规模数据验证和病理专家主观评估后,注意力热力图才能作为辅助参考,而不能直接替代病理诊断。

为何常见:因为注意力机制提供了一个“看似可解释”的可视化结果,让人很容易把“模型关注了什么”直接等同于“什么在医学上重要”。

误区既然CNN能处理图像,那把整张WSI缩小到224×224,当作普通图片输入ResNet不就行了?省去所有切块和MIL的麻烦。

正解这种操作会把细胞核的异型性、腺体结构排列等关键诊断信息全部抹平。一张十亿像素的WSI缩小到5万像素,信息压缩了20万倍,相当于把全班合影缩小到看不清任何人的五官,只剩下一团模糊的色块。模型在这种分辨率下几乎无法学习到任何有价值的病理特征,准确率会大幅下降。这也是MIL必须切块处理、保留高倍细节的根本原因。

为何常见:对自然图像的习惯性操作让初学者以为“缩放”只是改变了尺寸,而没有意识到病理诊断对细胞级细节的极端依赖。

误区看到MIL常常和WSI联系在一起,便以为它是病理影像专用的方法,别的领域用不上。

正解MIL是一种通用的弱监督学习框架,凡是“整体标签易得、实例标签难求”的场景都可以应用。视频异常检测中,一个视频片段是一个包,帧是实例,视频级标签是包级标签;卫星遥感目标检测中,一张大图是一个包,切块是实例;甚至文本分类中,一篇文档是包,段落是实例。医学影像只是MIL应用最成熟、案例最丰富的领域之一,而非唯一领域。

为何常见:因为主流教材和竞赛案例几乎都以病理图像为切入点,容易让人产生领域绑定错觉。

面试题

Q1. 一张标准WSI在40倍物镜下的像素规模通常约为多少?

单选题 · easy

  • A.10万×10万像素,总像素约百亿量级← 正确答案
  • B.224×224像素,与常规自然图像一致
  • C.1000×1000像素,约百万像素量级
  • D.2048×2048像素,约四百万像素量级

答案:A。WSI的宽度和高度通常都在10万像素量级,相乘得到约10^10即百亿像素;224×224是常规CNN输入,1000或2048都远低于真实WSI规模。

Q2. 多实例学习中“包”和“实例”的对应关系是?

单选题 · mid

  • A.包是整张WSI,实例是切分出的patch← 正确答案
  • B.包是单个patch,实例是像素
  • C.包和实例本质是同一个概念
  • D.包是训练集划分,实例是模型参数

答案:A。MIL中包(bag)是样本的集合,一张WSI切出的所有patch构成一个包;实例(instance)是包内的单个patch,对应“班级”和“学生”的关系。

Q3. 关于MIL标准假设,下列说法正确的有哪些?

多选题 · mid

  • A.包为阳性当且仅当包内至少一个实例为阳性← 正确答案
  • B.阳性实例数量必须超过包内实例总数一半
  • C.每个实例必须都有独立标签才能正常训练
  • D.包为阴性时其所有实例均为阴性← 正确答案

答案:AD。标准MIL假设的核心是“正包=至少一个正实例”,因此包为阴性时意味着不存在正实例,即全部为阴性。B错在“超过一半”并非必要条件;C错在MIL恰恰不需要实例级标签。

Q4. 处理WSI时,预处理的第一步通常是做什么?

单选题 · easy

  • A.把整张图像直接缩小到224×224
  • B.组织区域检测,并过滤掉大片空白背景← 正确答案
  • C.对每个像素都执行三线性插值
  • D.直接随机裁剪若干固定位置的小块

答案:B。WSI中超过一半面积常常是空白背景,直接切片会产生大量无意义patch。先用颜色阈值定位组织区域、过滤背景,可以大幅降低计算量并提升数据有效性。

Q5. 注意力池化中的实例权重是如何得到的?

单选题 · mid

  • A.固定取1/K,即每个实例权重完全相等
  • B.通过可学习的注意力网络打分并softmax归一化← 正确答案
  • C.由病理医生根据经验手工指定
  • D.随机初始化后在整个训练中保持不变

答案:B。注意力池化的关键就是让网络自动学习每个实例对包级预测的重要程度:先经MLP打出标量分数,再用softmax归一化到[0,1]且和为1。A是平均池化,C、D显然不满足端到端学习。

Q6. 门控注意力中tanh激活函数的主要作用是什么?

单选题 · hard

  • A.把实例特征维度直接压缩到一维
  • B.引入非线性,让注意力表达更复杂的模式← 正确答案
  • C.把注意力分数强行归一化到0到1区间
  • D.消除特征中的正值以加速计算

答案:B。tanh在注意力打分之前引入非线性变换,使网络能学到实例间非线性的复杂依赖关系;如果不加tanh,打分退化为简单的线性组合,表达能力受限。

Q7. 以下哪些临床任务适合用MIL处理WSI?

多选题 · mid

  • A.癌症分级,如Gleason评分← 正确答案
  • B.生存预后分析与风险分层← 正确答案
  • C.组织内红细胞精确计数
  • D.分子分型与基因突变预测← 正确答案

答案:ABD。癌分级、预后风险预测、分子分型都可以用包级标签训练MIL模型完成;红细胞计数通常需要实例级精确标注,不适合包级弱监督设定。

Q8. 不同WSI包内实例数K差异很大,注意力MIL如何应对?

单选题 · easy

  • A.把所有包强制填充到预设最大长度
  • B.注意力池化天然支持任意数量实例的加权求和← 正确答案
  • C.直接删除多余实例,只保留固定数量
  • D.必须重新采集数据保证每包实例数一致

答案:B。注意力池化通过softmax对任意数量的实例打分归一化后加权求和,K可以变化而不影响前向传播。填充、删除或重新采集都是不必要且有害的做法。

Q9. 关于MIL工程实践,下列说法正确的有哪些?

多选题 · hard

  • A.组织区域检测能够减少计算量和干扰← 正确答案
  • B.多中心数据通常需要做颜色归一化← 正确答案
  • C.几十张WSI训练就能达到临床可用精度
  • D.AUC和FROC常用于病理AI评估← 正确答案

答案:ABD。组织检测过滤背景、颜色归一化处理扫描仪差异、AUC/FROC评估模型性能都是工程中标准做法。C错在病理任务数据需求量大,几十张远不够支撑临床级泛化。

Q10. 在Cox风险模型用于MIL预后预测时,模型输出的风险分数r每增加1个单位,对应的死亡风险变化是?

单选题 · extreme

  • A.死亡风险变为原来的e倍(指数关系)← 正确答案
  • B.死亡风险线性增加1个百分点
  • C.死亡风险保持不变
  • D.死亡风险变为原来的e分之一

答案:A。Cox模型假设风险函数满足比例风险假设,风险比通过 \( \exp(r) \) 表示。因此风险分数增加1个单位,意味着风险乘以 \( e \approx 2.718 \),是指数关系而非线性关系。