雷锋网按:腾讯 AI Lab 高级研究员孙钟前日前对外分享了腾讯 AI Lab 在应用 AI 技术进行食道癌识别和辅助诊断方面的探索和心得,雷锋网对其分享做了不改变愿意的整理和编辑:
今天主要跟大家分享一下我们在 AI 医学方向上的探索和尝试。
今年早些时候,谷歌发表了两篇医学影像科技类的文章,其中一篇是关于皮肤癌的检测。AI 在皮肤癌检测上的敏感性和特异性上都超过了人类专家。这两篇文章继 AlphaGo 之后,再次引爆了 AI 热潮。现在各大公司也在积极布局医疗行业,AI 医疗市场百花齐放。在这样的背景下,我们也做了一些尝试,我们的尝试主要集中在以下几个方面:
在医学影像识别方面,我们主要做了食管癌的识别和辅助诊断。辅助诊断主要做两件事情,一是医学知识图谱构建,二是基于疾病的诊断。
经过半年的研发,我们取得了一些进展,这次我主要跟大家介绍一下我们在食道癌识别和辅助诊断方面做的一些工作。
食道癌识别
首先是食道癌。食道癌是世界五大恶性肿瘤之一,我国又是食道癌的高发地区。这个项目的目标是通过影像判别病人是否可能患有癌症。
项目的整体流程如下:内窥镜探头一般从鼻腔进入,然后经过咽和食管,最后到达胃。我们采集食管数据的时候,可能会引入大量非食管数据。因此,我们做的第一件事情就是对这些数据做区分,通过食管判别模型,只保留食管数据。然后将食管数据送到下一个模型,这个模型只做一件事情,就是把正常的食管和异常的食管区别开来。区分之后,再把病变的食管数据送到下一个环节,判断这个图像代表的是癌症还是炎症。整个流程大致可以分为这样三个阶段,接下来我会简单介绍每个阶段的难点。
食管判别模型
首先是食管判别模型。这个模型其实是一个比较典型的分类任务,但是我们遇到了一个难点——医疗图像的数据非常稀缺。与通常的图像分类任务动辄几十万、上百万,甚至上千万的数据量相比,它的数据量是非常少的。同时,由于设备参数、医生的拍照手法或拍摄角度、光照的明暗不同,食管的表观变化非常复杂。因此,我们面临着一个矛盾,即少量数据跟复杂表观的矛盾。
在这样的条件下,我们怎样才能得到一个鲁棒的模型?通常情况下,分类任务已经非常成熟,一般图像经过特定提取的网络,再经过分类模型,就完成了分类。但刚刚提到,医疗图像的数据非常少,这种情况下我们通常会对图像进行5-6 种变换,比如说旋转变换和颜色变换。但这个图片不管怎么变换,本质上还是这个图。举个不恰当的例子,这个人昨天穿的衣服和今天不一样,它的表观变化很大,但无论怎么变,这个人还是这个人。我如何把它最本质的特征提取出来呢?如果能提取到这个特征,那么无论你怎么变,我都可以把你识别出来。
我们的做法是让变换之后的图片经过一个网络,得到它的 Featruemap。两个图像相差有多大,主要是看 Featruemap 的差异有多大。我们希望原图和变换之后的图像间,差异尽可能的小。因此我们对模型做了一些改变,增加了一个约束。经过这样的处理,我们的模型大概完成了 95% 左右。
异常判别模型
拿到食管数据之后,下一步是判别这个食管属于正常食管还是病变食管。我们的目标是保留病变的食管数据,并输入到下一个环节。这个问题跟前面的问题比较类似,也是一个判别模型。它们的不同之处在哪呢?当我们判断一个食管是否异常食管时,只需要找到一个病变区域,就能够说明这个食管是异常的。但反过来,在正常图像中,并不能说找到一个正常特征,就说明这个食管是正常的。只能说在这张图像中我们没有找到异常特征,它可能是正常的。因此,在正常特征和异常特征之间,我们更倾向于提取病变特征,抑制正常特征。
我们是怎么做到呢?病变和正常的 case 都会经过神经网络,以得到特征向量。对于这个向量,我们希望尽可能凸显异常特征,让正常特征趋近于0。我们是如何把这种信息建模到模型中的呢?我们对模型进行了重新建模,最后准确率大概在 97% 左右。
癌症判别模型
前面的模型相对来说比较容易。第三个模型主要是区分炎症和癌症,它与前两个问题不大一样。一般情况下,病变的食管图像里都会伴随着一些炎症的特征。我们对癌症的判断往往是通过一个纹理特别小的区域得出的,因此需要提取出更加精细化的特征。比较好的做法就是让很多专家把病灶区非常严谨地标注出来,这样我们只需要对这个区域进行识别就好了。
这个标注量非常大,因此数据异常匮乏。我们没有癌症区域的标注数据,但又希望得到非常精细化的特征,如何解决这个矛盾呢?
幸运的是,我们虽然无法获取到非常精准的病变区域标注影像,却能够相对容易地知道一张图像是否包含癌症,因为只需要跟病例对应起来就好了。这样一来,我们可以更容易地得到图像全局的标签。如果一张图像包含了癌症,必然会有一个或几个区域包含了癌症的特征。也就是说,如果我们把图像切分成几个 patch,必然会有某个或某几个 patch 包含癌症特征。基于这样一种思路,我们采取了多序列的学习方式。这个方法的内在思想很简单,就是把图像切分成若干个 patch,然后对每个 patch 建模,判别这个 patch 发生癌症的概率。我们最后把所有 patch 里面癌症概率最高的那块,作为图像是否包含癌症的标签。
做的过程当中,我们会逐渐积累精准标注的数据,这些数据非常少,不足以虚拟一个模型。但图像中的特征都是最精准的,是经过人为校验和标注的。我们怎样才能把这种少量的、精准的数据强化到癌症识别中去呢?这是个非常有意思的问题,如果能解决这个问题,即使只有少量标准数据,我们也能不断提升。
这里主要采用了多任务学习的方法,这个方法需要完成两个任务:一是基于有病变区域标注的数据建立有监督的学习任务;二是对于没有病变区域标注的数据,建立前面提到的多序列学习任务。这两个模型共享特征提取网络,特征提取网络必须同时满足两大任务,这样才能把精准标注的特征强化到癌症识别中去。
以上是我们食道癌项目的简单介绍,下面再简单介绍一下我们在辅助诊断方面做的一些工作。
辅助诊断
辅助诊断的目的是什么呢?我们希望机器最终能够像临床医生一样具备诊断疾病的能力。在介绍辅助诊断项目之前,我们先来看看一个医生或者一个普通的学生是如何成长为一名专家的。一个学生从刚入学开始,学习了大量专业课程,阅读了大量专业医学文献后,就可以积累一定程度的医学知识。当医学知识达到一定程度之后,就可以去医院里面实习,由临床医生结合一些真实案例,指导他去学习诊断的技能。当我们具备了这些技能,就能够成为一名普通的医生,医生可以看到大量的病人,学习大量经验,经验足够丰富之后就成了专家。机器成长的过程与人类大致相似。
我们可以将其分为三个阶段:第一阶段是医学知识图谱的构建,也就是机器学习知识的过程;第二阶段相当于有了知识之后学习诊断的能力,也就是建立疾病判别的一些模型;最后阶段是让机器在与专家的博弈过程中,不断提升诊断水平,逐渐逼近甚至超过专家。
医疗知识图谱构建
医疗知识图谱的构建过程中,我们首先要对文本数据进行处理。文本数据分成两类,一类是半结构化数据,一类是非结构化数据。这里我列举一个例子,说明我们如何把非结构化的文本变成结构化文本,也就是计算机可以理解的形式。我们可以把病史分为几个部分:疾病的情况、入院的治疗经过、入院的依据等。把病史分为这样几部分信息后,再对每一类信息进行细化和提取。经过提取之后,非结构化的文本就变成了计算机能够理解的结构化文本。我们会把这些信息转化为医学知识图谱存在电脑里,于是计算机就把这个知识学会了。以上就是医学知识图谱的构建过程。
诊断模型
第二步我们会有一个诊断模型。诊断的过程是这样的,首先把一段人类语言描述的病情转化成计算机可以理解的结构化知识。有了结构化的知识以后,机器就能理解这个人的情况,把知识推送到疾病诊断模型当中,模型将给出一个疾病列表。诊断模型的流程大致就是这样。
下面我们来看一个病情理解的实例。通过技术对病人病情的理解可以得到一些基本信息,其中包含性别、年龄,这个人的主动描述、现病史和既往史等。主动描述里会提到症状以及持续的时间,甚至一些更复杂的信息,比如说唾沫是什么样子的,咳嗽是否带痰。这些信息都会详细刻画出来,按照前面提到的模式画出病历,完成对病情的理解。
理解病情以后,将其输入诊断模型当中。诊断的 demo 包含几个部分:第一部分是对病情的人类语言的描述,通过病情理解后得到结构化的病情表示,之后得出机器诊断的结果,按照概率从高到低给出 5 个结果。我们还给医生留了一个接口,医生可以对诊断结果评分,通过评分将结果反馈到模型当中。通过医生和机器之间的交互,可以将模型迭代得越来越好。我们在实验室数据里选择了大概 10 万个真实病例进行测试,TOP1 的结果与医生的一致率大概是 92%,TOP3 是 90%。但这种模型还需要更多临床病例做验证。