AI医疗器械注册审查实操手册(工程团队版)

第二章 算法设计:把炼丹变成可追溯的工程

2.1 算法选择与架构文档

监管要点清单

  • 算法名称、类型(有监督/无监督、基于模型/基于数据、白盒/黑盒)
  • 算法结构(层数、参数规模)
  • 输入输出数据类型
  • 算法流程图
  • 算法编程框架(名称、类型、型号规格、完整版本、制造商、运行环境)
  • 若基于云计算:明确名称、服务模式、部署模式、配置、云服务商名称/住所/服务资质
  • 运行环境:硬件配置、外部软件环境、网络条件
  • 若使用AI芯片:名称、型号规格、制造商、性能指标
  • 算法选用依据(理由和基本原则)
  • 若组合使用集成学习、迁移学习、强化学习等:提供基本信息和选用依据

审评员视角 你用的什么算法?从哪抄的?有没有能力维护?框架版本升级了怎么办?云计算是不是把数据送到国外了?

正经方案

  • 标准架构直接引用文献:用了ResNet-50?写"基于He et al. 2015提出的残差网络结构,层数50层,参数量25.6M,用于特征提取"。附上原始论文和torchvision实现链接。
  • 算法流程图画三个框:输入数据 → 特征提取模块(基于XXX预训练模型) → 分类/分割头 → 输出结果。箭头标上张量尺寸,比如[1, 3, 512, 512] → [1, 2048] → [1, 2]。
  • 框架信息列成表格:PyTorch 2.0.1 / 现成框架 / CUDA 11.8 / Python 3.10,制造商Meta(原Facebook)。附pip freeze输出作为证据。
  • 云计算若用阿里云/腾讯云/华为云:写明服务模式(IaaS/PaaS/SaaS)、部署模式(公有云/私有云/混合云)、服务器地域(必须在中国大陆境内)、云服务商的IDC/ISP资质编号。
  • AI芯片:NVIDIA A100 40GB PCIe / NVIDIA / 制造商信息直接抄官网。如果用的是国产芯片(华为昇腾、寒武纪),更需详细列明型号和软件栈版本。

交差版

  • 算法结构写"基于深度卷积神经网络",层数和参数规模用sum(p.numel() for p in model.parameters())算出来填上。
  • 流程图画一个输入框、一个黑框写"深度学习模型"、一个输出框,连上箭头完事。
  • 框架版本截图pip list里PyTorch那条。
  • 没用云计算就写"本产品不采用云计算技术,所有数据处理和算法运行均在本地服务器完成"。
  • 没用AI芯片就写"本产品采用通用GPU进行计算,未使用专用人工智能芯片"。

核心原则 审评员不是要看你卷积核怎么滑动的,是要确认你用的东西有名字、有版本、有出处,出了问题能找到根。流程图再简陋,也得有输入、处理、输出三个东西。


2.2 算法训练与评估指标

监管要点清单

  • 评估指标(辅助决策:敏感性、特异性;非辅助决策:图像质量、测量准确性)
  • 训练方式(留出法、交叉验证法;若用联邦学习需明确依据)
  • 训练目标(目标确定依据)
  • ROC曲线或其衍生曲线、混淆矩阵及其衍生参数
  • 调优方式(优化策略、实现方法)
  • 训练数据量-评估指标曲线(证实训练充分性和有效性;若无法提供需详述理由和替代证据)

审评员视角 你的模型真的训练够了吗?还是在训练集上死记硬背?选0.5当阈值有没有医学依据?调优是不是在测试集上偷偷调参?

正经方案

  • 评估指标:分类任务至少报敏感性(Recall)、特异性(Specificity)、PPV(Precision)、NPV、AUC-ROC、AUC-PR。分割任务报Dice系数、IoU、Hausdorff距离。按亚组拆分(轻症/重症、不同年龄段、不同设备型号),别只给一个总数字。
  • 训练方式:留出法写明分层抽样的随机seed,确保可复现。5折交叉验证写明每折的划分策略和汇总方式(平均还是投票)。联邦学习需额外写参与方数量、各方数据分布、聚合策略(FedAvg/FedProx)、通信轮次。
  • 训练目标:医学依据写清楚。比如"肺结节辅助检测系统以敏感性≥90%为首要目标,参考国家肺癌筛查指南(2022版)对高危人群检出率的要求",然后 ROC 曲线上标出对应的工作点(Operating Point)。
  • ROC曲线与混淆矩阵:用测试集画ROC(不是训练集!),在图上标出选定阈值的坐标点。混淆矩阵按真实标签×预测标签画,附上敏感性/特异性计算公式。
  • 调优方式:写明优化器(AdamW,lr=1e-4,weight_decay=1e-5)、学习率调度(Cosine Annealing,T_max=100)、早停策略(验证集AUC连续10个epoch不提升则停)。超参数搜索若用了网格搜索或贝叶斯优化,记录搜索空间和最终选定值。
  • 训练数据量-评估指标曲线:从训练集抽20%、40%、60%、80%、100%五个子集,控制其他条件不变,分别训练并评估。横轴样本量,纵轴AUC或F1。若曲线在80%后趋于平缓,说明数据量足够;若还在明显上升,考虑补充数据或解释原因。

交差版

  • 指标只报Accuracy和AUC,表格贴上去。
  • 训练方式写"采用留出法,训练集:调优集:测试集=7:1:2"。
  • ROC曲线用matplotlib画一条线,上面随便标个点,写"选取敏感性90%作为工作点"。
  • 调优方式写"采用Adam优化器,学习率0.0001,训练100个epoch"。
  • 学习曲线跑3个点(25%、50%、100%),连一条平滑曲线,写"随着数据量增加,模型性能趋于稳定,表明训练数据量充分"。

核心原则 训练目标必须有医学依据,不能拍脑袋。ROC曲线上的工作点是你对"漏诊vs误诊"权衡的选择,这个选择需要被记录和辩护。学习曲线不是为了画得好看,是为了堵审评员"数据不够"的嘴。


2.3 算法性能评估

监管要点清单

  • 基于测试集评估(假阴性、假阳性)
  • 重复性与再现性
  • 鲁棒性/健壮性
  • 实时性(若适用)
  • 算法性能影响因素分析(采集设备、采集参数、疾病构成、病变特征等)
  • 基于分析结果明确产品使用限制和必要警示提示信息
  • 黑盒算法建议与现有医学知识建立关联以提升可解释性

审评员视角 模型在不同医院、不同机器、不同病种上表现一致吗?会不会在某些亚群上突然崩掉?出了问题医生能不能理解为什么?

正经方案

  • 假阴性/假阳性分析:按疾病亚型、病灶大小、病灶位置、图像质量等级拆分测试集,分别计算敏感性和特异性。找出模型表现最差的子群,分析原因(如"微小结节<3mm敏感性仅65%,因像素分辨率限制")。
  • 重复性与再现性:重复性指同一台机器同一个样本多次运行结果一致(计算ICC或变异系数)。再现性指不同操作者、不同设备、不同时间采集的样本上模型表现一致。可设计多中心测试,收集3家以上医院的数据跑通一套测试流程。
  • 鲁棒性:测试图像分辨率变化、噪声水平变化、对比度变化对结果的影响。比如原图降采样到75%、50%、25%,加高斯噪声(SNR=20, 10, 5),看AUC下降幅度。
  • 算法性能影响因素分析:用统计方法(如方差分析、随机森林特征重要性、SHAP值)分析采集设备型号、采集参数(CT层厚、重建算法)、疾病分期、病灶特征(大小、形状、密度)对模型输出的影响。结果写成表格或热力图。
  • 医学知识关联:对黑盒模型,用Grad-CAM、LIME或SHAP生成注意力图,与放射科医生的阅片经验对比。比如"模型在肺结节边缘区域赋予较高权重,与临床经验中’毛刺征为恶性指标’一致"。
  • 使用限制和警示:基于上述分析,明确写出"本产品不适用于<3mm的磨玻璃结节"、“本产品建议在层厚≤1.25mm的CT图像上使用”、“本产品输出结果仅供辅助参考,最终诊断需由执业医生结合临床信息确定”。

交差版

  • 假阴性/假阳性按简单/困难case分两组报个数。
  • 鲁棒性做两个测试:原图加高斯噪声、原图随机裁剪,各跑10张看结果。
  • 影响因素分析写一页定性描述:“经分析,模型性能主要受病灶大小和图像质量影响,对微小病灶和严重噪声图像的识别能力有所下降。”
  • 医学知识关联:挑5张典型case,用Grad-CAM画热力图,圈出高激活区域,写"模型关注区域与病灶位置一致"。
  • 使用限制抄一段行业通用话术:“本产品仅供辅助参考,不替代医生诊断。”

核心原则 性能评估不是秀AUC数字,是证明模型在真实世界各种幺蛾子情况下不会突然发疯。影响因素分析写得好,审评员才会相信你知道自己模型的边界在哪。


2.4 压力测试与对抗测试

监管要点清单

  • 压力测试:采用罕见或特殊真实数据样本,评估泛化极限
  • 对抗测试:基于真实数据利用数据扰动、GAN产生对抗样本,评估鲁棒性
  • 未开展或结果不佳:需限制适用范围并明确警示提示

审评员视角 你的模型在极端case上会不会翻车?面对故意捣乱的数据(比如噪声、伪影、异常扫描协议)还能不能稳住?

正经方案

  • 压力测试
    • 收集罕见病例:早期病变、不典型表现、多种疾病合并、儿童/老年特殊人群。
    • 收集特殊设备数据:不同品牌CT、老旧设备、低剂量扫描、不同重建算法(FBP vs IR)。
    • 报告这些子集上的性能指标,与主测试集对比。若显著下降,说明限制适用范围。
  • 对抗测试
    • 数据扰动:对测试集图像加高斯噪声、椒盐噪声、JPEG压缩伪影、运动模糊、改变窗宽窗位。
    • 对抗样本:用FGSM、PGD等经典方法生成对抗样本,测试模型在微小扰动下的输出稳定性。
    • GAN生成:用GAN生成接近真实但标签模糊的样本,测试模型边界。
    • 若模型在对抗样本上性能骤降,写明"本产品在图像质量严重受损或存在对抗扰动时性能可能下降"。

交差版

  • 压力测试:从测试集里挑出10张最难的case(比如小病灶、低对比度),单独跑一遍,写"极端情况下敏感性有所下降"。
  • 对抗测试:给10张测试图加随机噪声(np.random.normal(0, 0.05, img.shape)),看输出变化,写"经测试,模型对轻度噪声具有一定鲁棒性"。
  • 如果没做对抗测试:写"本产品当前版本未开展对抗测试,将在后续版本更新中补充,并在说明书中提示使用限制。"

核心原则 压力测试测的是真实世界的长尾,对抗测试测的是有人故意使坏的情况。两个都不做也行,但得在说明书里写清楚"我没做,所以这些场景你别用"。


2.5 黑盒算法的可解释性

监管要点清单

  • 开展算法性能影响因素分析
  • 建议与现有医学知识建立关联以提升可解释性

说明 见2.3算法性能评估。影响因素分析、SHAP/Grad-CAM可视化、医学知识关联等内容已在本节覆盖。


2.6 算法组合与特殊技术

2.6.1 集成学习

监管要点清单

  • 提供算法基本信息和选用依据

正经方案 写明集成策略(Bagging/Boosting/Stacking)、基学习器数量和类型、融合方式(投票/加权平均/学习器)。若用随机森林或XGBoost,说明特征工程和超参数。提供集成前后单模型与集成模型的性能对比表。

交差版 写"采用5个ResNet-50模型集成,输出取平均",附一张集成vs单模型的AUC对比。

2.6.2 迁移学习

监管要点清单

  • 明确预训练模型的数据集构建、算法测试等资料

正经方案 写明预训练数据来源(ImageNet、CheXpert、MIMIC-CXR等)、预训练任务、预训练数据量。提供预训练模型在源任务上的性能指标。若做微调,写明微调策略(冻结层数、学习率差异、微调epoch数)。特别注意:预训练数据若涉及公开数据库,按1.4要求重新评估质量。

交差版 写"采用基于ImageNet预训练的ResNet-50权重,在自有数据集上微调10个epoch",附预训练模型来源链接。

2.6.3 联邦学习

监管要点清单

  • 明确算法选用依据
  • 提供算法基本信息

正经方案 写明参与节点数量、各方数据量分布、聚合策略(FedAvg/FedProx/SCAFFOLD)、通信轮次、差分隐私参数(若有)、安全聚合协议(若有)。提供联邦学习全局模型与中心化训练模型的性能对比。

交差版 写"本产品未采用联邦学习技术。"(如果确实没用,这是最简单的。)

2.6.4 强化学习

监管要点清单

  • 提供算法基本信息和选用依据

正经方案 写明状态空间、动作空间、奖励函数设计、策略网络结构、训练环境。医疗场景下强化学习较少见,若用于治疗计划推荐(如放疗剂量优化),需额外说明安全约束和回滚机制。

交差版 写"本产品未采用强化学习技术。"

2.6.5 持续学习/自适应学习

监管要点清单

  • 自学习功能在当前法律法规体系下应关闭或虽开放但不得投入使用

正经方案 写明产品中已关闭所有在线学习和模型自适应更新功能。模型权重在注册时冻结,上市后不会根据用户数据自动更新。若未来计划启用,需按重大软件更新走变更注册。

交差版 写"本产品未启用自适应学习功能,模型权重固定不变。"


2.7 算法更新与版本控制

监管要点清单

  • 算法驱动型更新 vs 数据驱动型更新
  • 重大更新 vs 轻微更新判定
  • 软件版本命名规则需涵盖两类更新
  • 算法框架更新:效率型 vs 非效率型
  • 算法更新、软件更新均需考虑引入回滚机制

审评员视角 你模型更新了怎么告诉我?新版本和老版本性能有变化吗?更新出bug了能回退吗?

正经方案

  • 版本命名规则:采用语义化版本号(Semantic Versioning),但需区分算法驱动和数据驱动。比如MAJOR.MINOR.PATCH-ALG.DATA,其中ALG字段记录算法版本,DATA字段记录训练数据版本。重大更新升MAJOR,轻微更新升MINOR,bug修复升PATCH。
  • 重大/轻微判定
    • 算法结构、流程、输入输出类型改变 → 重大
    • 仅训练数据量增加,性能无显著变化 → 轻微(需提供统计检验,如McNemar检验p>0.05)
    • 框架效率型更新(如PyTorch 2.0的torch.compile加速,输出数值不变)→ 轻微
    • 框架非效率型更新(如API变化、算子实现改变导致数值漂移)→ 重大
  • 回滚机制
    • 模型权重:每次训练保存checkpoint,至少保留最近3个稳定版本。
    • 数据版本:数据预处理pipeline进git,数据子集打tag。
    • 环境版本:训练环境用Docker镜像固化,镜像ID记录在版本日志里。
    • 回滚流程:写明从哪个备份恢复到生产环境需要多长时间,谁有权限执行。

交差版

  • 版本号写"V1.0"、“V1.1”、“V2.0”,重大更新升第一位,轻微更新升第二位。
  • 重大/轻微判定写"算法结构改变属于重大更新,仅数据量增加且性能无显著变化属于轻微更新"。
  • 回滚写"保留最近3个模型版本,支持一键回退到上一版本"。

核心原则 版本控制不是为了好看,是为了在出问题时能在10分钟内恢复到上一个稳定状态。审评员要看到的是你有这个能力,而不是你打算怎么画版本号。