邮件空等,代码狂奔

俗务缠身意兴阑,闲中心有机缘探。邮件空等愁白日,代码狂奔慰夜阑。

杏林问病分良恶,巧借双途解万般。一朝成名惊四座,从此生涯路更宽。


在DFCI的那段日子,工作本身确实如同一潭波澜不惊的静水,日常充斥着与医生们的会议、邮件往来以及无尽的等待。发出邮件后等待回复,收不到回复就再发一封跟进邮件,周而复始。这种工作节奏的好处显而易见:几乎从不需要加班。朝九晚五,界限分明。但坏处同样突出:对于渴望挑战和成长的我来说,这份工作显得异常枯燥和缺乏成就感。

然而,塞翁失马,焉知非福。正是这份工作的清闲,反而给了我大段可以自由支配的时间。内心深处对技术探索的热情并未因工作的乏味而熄灭,反而像是在寻找一个出口。幸运的是,在此之前,凭着一股对深度学习的好奇和冲动,我已经自己动手组装了一台配备了GPU的深度学习服务器。这台静静躺在家里的机器,成了我排遣工作无聊、磨练技能的秘密武器。

有了时间和工具,我开始主动寻找可以练手的项目。我开始利用Kaggle这个神奇的平台。Kaggle就像一个面向全球数据科学爱好者和机器学习工程师的线上竞技场和大学堂。上面汇集了各种各样的数据科学竞赛,很多还设有不菲的奖金。更重要的是,这些竞赛通常会提供一个定义清晰明确的问题,比如要预测什么,用什么指标来衡量模型的优劣等等,一切都安排得明明白白。平台还会提供经过初步清理和整理的数据集,省去了初学者在数据获取和预处理上耗费的大量精力。这对于当时的我来说,简直是完美的练兵场。

Kaggle的魅力远不止于此。它还是一个活跃的社区。在每个竞赛页面下,都有大量的讨论帖,参赛者们会分享自己的思路、遇到的困难以及解决方案。许多高手甚至会无私地公开他们获奖模型的完整代码和详细解释。在这里,你可以看到各种奇思妙想,学习到最前沿的技术应用,遇到问题也可以随时发帖求助。对于渴望学习和提升的初学者来说,Kaggle提供了一个极其友好和宝贵的生态环境。

于是,我像找到新玩具的孩子一样,一头扎进了Kaggle的世界。利用家里那台深度学习服务器的算力,我开始积极地参加各种比赛,尝试复现别人的方案,学习他们的代码,然后自己动手修改、优化、训练模型。虽然一开始成绩平平,但每一次提交,每一次排名提升,都带给我巨大的满足感和学习的动力。

众多比赛中,一个名为ISIC挑战赛的项目引起了我的特别关注。这是一个专注于皮肤癌图像分析的年度竞赛,由国际皮肤成像协作组织(ISIC)举办,在医疗影像AI领域颇具影响力。皮肤癌是常见的恶性肿瘤,早期诊断和精准分割病灶对于治疗至关重要,因此这个比赛具有很强的临床意义。

当年我参加的那届ISIC挑战赛,主要包含几个核心任务:首先,模型需要根据皮肤镜图像,准确判断病灶是恶性皮肤癌还是普通的良性痣(图像分类任务);其次,如果判断为皮肤癌,模型还需要精确地勾画出病灶的边界(图像分割任务)。这实际上是一个典型的医疗图像分析问题,也是深度学习技术大显身手的领域。

我投入了大量时间和精力来研究这个问题。在使用当时流行的图像分割模型(如U-Net及其变种)进行尝试时,我敏锐地发现了一个普遍存在却容易被忽视的问题。很多模型在分割任务上表现尚可,能大致勾画出病灶轮廓,但它们往往忽略了第一步分类的准确性。也就是说,即便输入的是一张完全正常的良性痣的图片,这些分割模型也可能会煞有其事地输出一个分割结果,仿佛那里真的存在一个需要被勾画出来的癌变区域。

这个现象让我意识到,单纯优化分割精度可能走入了误区。一个理想的模型,应该首先具备准确的判断力,能够区分良性与恶性,然后再对确认为恶性的病灶进行精准分割。如果连第一步"是不是"的问题都搞错了,那第二步"在哪里"画得再准,也没有意义,甚至可能误导医生。换句话说,模型在尝试分割之前,应该先对分类结果有足够的信心。

基于这个观察,一个想法在我脑中逐渐成形:为什么不让模型同时学习并执行这两个关联的任务呢?也就是设计一个多任务学习(Multitask Learning)的模型。这个模型需要有两个输出分支:一个分支负责预测输入的皮肤镜图像是良性还是恶性的概率(分类任务);另一个分支负责生成病灶的分割图(分割任务)。

关键在于如何将这两个任务联系起来,让分类结果指导分割结果。我的解决方案其实非常直观:利用分类分支预测出的"恶性概率"来调整分割分支的输出。具体来说,如果模型判断一张图片是恶性皮肤癌的概率很高,那么分割分支的输出就正常显示;但如果模型判断这张图片是良性痣的概率很高(即恶性概率很低),那么即使分割分支生成了某些轮廓,也应该将其抑制掉,或者直接置零,不输出任何分割结果。这样一来,模型就学会了"三思而后行",只有在确信是癌症的情况下,才去勾画它的边界。

多任务学习在当时还是一个相对较新的概念,相关的研究和应用并不像现在这样普遍。我受到这个理念的启发,结合我对具体问题的理解,设计并实现了这个简单的想法。我利用我的服务器,不断地调整模型结构,优化训练策略。

令我惊喜的是,这个看似简单的改进,效果却出奇地好。在最终的ISIC竞赛排名中,我的模型取得了第四名的优异成绩。虽然与前三名失之交臂,但作为一个独立参赛者,能在一众来自顶尖大学和研究机构的团队中取得这样的名次,已经让我倍感兴奋。

更让我意外的是,比赛结束后不久,我收到了竞赛组织者的邮件,邀请我在当年的国际医学图像计算与计算机辅助介入会议(MICCAI)的一个相关研讨会(Workshop)上,做一个口头报告,分享我的模型和方法。MICCAI是医学图像处理领域的顶级会议之一,能在这样的场合展示自己的工作,对我来说是莫大的荣幸和认可。

有了竞赛的成果和会议报告的经历,我趁热打铁,将这项工作整理成一篇完整的学术论文,详细阐述了我的模型设计思路、实验结果和分析,然后投稿到了另一个知名的医疗图像会议IEEE国际生物医学成像研讨会(ISBI)。经过同行评审,论文最终被顺利接收。

从发现Kaggle平台,到参加ISIC竞赛发现问题,再到独立思考提出解决方案,动手实现模型,取得不错的竞赛名次,受邀在顶级会议的研讨会上做报告,最后将成果撰写成论文并被接收。这整个过程,完全由我一个人主导完成,没有任何导师的指导,也没有团队的支持,全凭着兴趣驱动和业余时间的投入。这段经历带给我的成长是巨大的。它不仅极大地提升了我在深度学习和医学图像分析方面的专业技能,更重要的是,它全方位地锻炼了我独立发现问题、分析问题、解决问题、并最终将成果展示出来的能力。

这段无心插柳柳成荫的经历,这段在DFCI围城内利用业余时间进行的修行,不仅让我重拾了对技术探索的热情,证明了自己的学习能力和研究潜力,也为我日后离开DFCI、寻找新的职业发展机会,奠定了非常重要的基础。那篇最终发表的ISBI论文,成为了我简历上一个闪亮的加分项,也让我在后来的求职面试中,有了可以自信展示的、从零到一独立完成的成果。回想起来,那段看似枯燥沉闷的日子,却因为有了Kaggle和这台服务器的陪伴,变得充实而富有意义。

Last updated