背景 & 挑战(Background & Challenge)
随着人工智能和医疗行业的蓬勃发展,各种医疗知识库与医疗知识图谱的构建已成为精准医学领域的研究热点。大数据时代,随着医疗系统的信息化发展,医疗领域已经积累了海量的数据。医疗知识图谱所具有的数据集成能力和知识推理能力能够将大量的医疗数据进行有序整合并应用到各类医疗场景中。
目前在医疗领域,国外已经构建了一些知识库,比如医学主题词表MeSH、医学系统命名法-临床术语(SNOMED-CT)以及一体化医学语言系统(UMLS)等医疗体系标准。但是这些已有知识库或是针对特定医学子领域,或是缺乏灵活性和能力不足等限制,无法满足人们对于医疗知识图谱的需求。为此,阿里健康技术部医疗AI团队联合阿里健康医疗知识图谱编辑团队旨在构建一个完善、专业且具有业内权威的中文医疗知识图谱(CCT),为后续医疗知识问答系统和决策支持系统等智能化医疗应用场景提供支持。
图谱构建涉及实体词挖掘、实体对齐、实体关系挖掘等多个环节,本篇将重点介绍实体上下位关系挖掘。实体上下位关系是知识图谱本体构建过程中的重要一环,它是语义层级结构构建的核心。传统的文本关系挖掘,通常被定义为“关系判断”,即判断两个实体词之间是否存在关系或存在哪种关系,可被映射为一个二分类/多分类任务,评估时通常选择分类任务的精准率和召回率作为性能指标。但是,这种问题定义方式与评估方式与实际医疗知识图谱构建场景存在较大的差异:在真实应用场景中,我们需要在2w+的候选词库中为一个下位词(孩子节点)寻找最优上位词(父亲节点),并且该最优结果需要经过医学编辑老师们的审核确认。因此,采用分类的思路进行上下位关系挖掘是行不通的。为此,我们将该任务定义为“上位词推荐”并用排序指标(hit@N)作为模型的评估标准。
上位词推荐示意图
我们所面临的挑战在于:1. 任务定义为上位词推荐,技术方案选择召回+精排两阶段方式,但是基于bert双塔模型的向量召回存在严重的表示坍塌现象。 2. 召回阶段需要构造的负样本数量级较大,模型训练成本较高,无法满足图谱构建初期模型每日更新迭代的需求。 3. 医疗领域中的上下位关系存在“纯知识”的情况(例如,感冒药-阿莫西林),仅利用上下位词的字面特征难以判断。
综上,面对以上挑战,我们选择基于有监督对比学习的向量召回方法进行上位词召回,然后构建一个基于交互式注意力机制的精排模型对top100召回结果进一步排序。基于有监督对比学习的向量召回方法可以有效避免bert双塔的模式坍塌现象,同时负样本天然存在于batch内部,无需提前构造,大大减少了模型的训练成本。此外,为了进一步扩充上下位词的字面特征,我们利用候选上位词已存在的孩子节点来丰富其特征表示。
对比学习(Related Work)
深度学习的本质就是在做两件事:表示学习(Representation Learning)和归纳偏好学习(Inductive Bias Learning)。归纳偏好学习往往是任务相关的,需要结合具体的领域数据精心设计模型结构,而表示学习往往是任务无关的,更侧重学习通用、可迁移的表示能力,例如,近几年大火的预训练语言模型 BERT 就是利用大规模的语料和自监督学习任务训练得到更好的文本表示。
对比学习属于表示学习的范畴,最初对比学习的提出也是基于自监督学习的范式,其旨在学习一种表示方法,使得相似样本在语义空间中分布比较接近,不相似样本在语义空间中分布较远,即学习一个映射函数将样本编码为,并且使得满足下面这个式子:
其中,就是和相似的样本,就是和不相似的样本,是度量样本表示之间相似度的函数。如果用向量内积来计算两个样本的相似度,则对比学习的损失函数可以表示成:
在对比学习的相关文献中把这一损失函数称作 InfoNCE 损失,可以发现,这个形式类似于交叉熵损失函数,学习的目标就是让的特征和正样本的特征更相似,同时和N-1个负样本的特征更不相似。由此可见,如何合理且有效的构建正负样本是对比学习需要研究的重要课题。
传统双塔的弊端
基于 Transformer BERT 的传统双塔模型在句子表示上往往存在“模式坍塌”的问题,即 BERT 对所有的句子都倾向于编码到一个较小的空间区域内,导致即使两个语义无关的句子在向量空间中的表示也非常接近,难以体现其本身的语义。导致这一现象的主要原因是基于自注意力机制计算得到的句子表示会将注意力权重放在一些“高频词”表示上,使得高频词主导了整个句子在向量空间中的表示。为了证实这一观点,我们在上下位关系数据集上对比了基于传统双塔模型和基于有监督对比学习微调后的 BERT 句子编码表示,下面是下位词与各个候选上位词之间的 cosine 相似度分布:
(a) 基于传统双塔微调后的bert上下位词编码 cosine 相似度分布 (b)基于有监督对比学习微调后的bert上下位词编码 cosine 相似度分布
从上图分布可以发现,基于 Transformer BERT 的传统双塔模型得到的上下位词编码 cosine 相似度普遍较高——即使两个词并不相关,其通过随机采样构建负样本(比例1:30)进行0/1二分类任务,并不能直接显示地区分样本之间的差异性,从而导致表示坍缩。
对比学习的 Alignment 和 Uniformity 示意图( 图片出自参考文献[3] )
而有监督对比学习可以有效缓解表示坍缩问题,这是因为对比学习的损失函数可以保证模型同时具备两个属性:Alignment和Uniformity。所谓“Alignment”,指的是正例在向量空间中应该有接近的表示,这一点由损失函数的分子部分保证;所谓“Uniformity”,指的是模型应该倾向在特征里保留尽可能多的信息,使得不相似的样本能够保留各自独有的信息,这一点可以由损失函数的分母部分保证。
自监督对比学习
以上的讨论均属于自监督对比学习的范畴,其核心是如何生成正负样本。在NLP领域相关的对比学习方法中,SimCSE[1] 将同一个句子编码两次,利用不同的dropout mask获得相同句子不同的embedding表示,以此构建正样本;与此同时,In-batch内部除自己以外的其他样本作为负样本。ConSERT[2] 提出利用对抗攻击(Adversarial Attack),打乱词序(Token Shuffling),裁剪(Cutoff),Dropout等方法构建正样本,In-batch内部除自己以外的其他样本作为负样本。无论选择哪种数据增强方式,自监督对比学习总体的框架是一致的:数据增强、共享编码器、对比学习损失函数。
自监督对比学习框架( 图片出自参考文献[2] )
然而,在推荐场景下自监督对比学习大多都只能够作为辅助任务出现,因为它只关心“样本与其自身变体”之间的相关性,而对于推荐、检索类的任务,我们需要模型学习多来源样本之间的相关性(例如User与Item之间的相关性、上位词与下位词之间的相关性、Query与Document之间的相关性等)。所以,目前大多数基于对比学习的向量召回方法均是把对比学习当作辅助任务与主任务(例如:0/1二分类)结合,作为缓解模式坍塌和提高模型泛化能力的Trick而存在。
但是,主任务(分类) + 辅任务(自监督对比学习) 的模型范式依然需要提前构建大量负样本,理论上负样本越丰富模型学习的效果越好,但是在实际应用场景中,负样本的构建往往受到两方面约束:1. 负样本的构建会导致训练样本成倍数级增长,尤其当基础数据量很大时,大量负样本的构建会导致模型训练成本非常巨大。 2. 当主任务是分类损失时,需要考虑正负样本比例失衡的问题,如何在“负样本足够丰富”与“正负样本比例可接受”之间找到最优的平衡点是值得思考并且需要进行大量实验来验证的。
有监督对比学习
有监督对比学习可以将监督信号直接融入到对比学习损失中,帮助模型更好地学习“Alignment”。SimSCE[1] 在带标注的NLI数据集上进行有监督对比学习实验,并将标签为 entailment 的句子对标记互为正样本、In-batch内部除自己以外的样本标记为负样本、标签为 contradiction 的句子对标记互为强负样本,该方法在有监督数据集上取得了不错的性能提升。
与自监督对比学习比较,看似只是利用了监督信号作为构建正负样本的依据, 但这是在推荐、检索场景下,将对比学习由原来的辅助任务变为主力任务的关键。仔细观察可以发现,在带标注的NLI数据集中,正样本的构建不在局限于数据增强后的“变体”,也可以是两个被打标为 entailment 关系的句子,并且这里不要求句子的内容必须高度一致。因此,我们很容易将有监督对比学习迁移到推荐、检索等场景中——只需要一定量的正样本(例如:下位词-上位词、Query-Document),就可以利用 In-batch 内部天然存在的负样本进行对比学习的训练。该方法利用监督信号,打破了自监督对比学习只关心“样本与其自身变体”之间相关性的限制,并且可以直接取代分类任务在不提前构建负样本的情况下完成相关性召回的任务。
有监督对比学习框架
我们将自监督对比学习应用到上位词召回场景中,避免了显式构建负样本带来的训练开销,既加快了模型的训练速度,满足高度强的模型更新需求,同时也避免了传统双塔存在的模式坍塌问题,取得了较为明显的性能优势。下面我们将详细介绍上下位关系预测模型。
上下位关系预测模型(Our Method)
基于上述想法,我们提出了一种召回+精排两阶段的上下位关系预测模型,具体来说,在召回阶段实现了基于有监督对比学习的向量召回模型,并基于召回top@100的结果训练一个基于交互式注意力机制的精排模型,由精排模型最终提供top@1结果供医学编辑老师审核。
除了在召回阶段引入有监督对比学习,为了更好地提升召回模型与精排模型的hit@N指标,我们还进行了如下的改进:
-
观察数据发现,图谱中的上下位词存在字面完全无关的情况,当这种情况出现在推理阶段,模型仅利用上下位词的字面特征很难找出正确答案。因此为了进一步扩充特征表示,我们引入了候选上位词的所有孩子节点作为特征补充(若果当前上位词没有孩子节点,引入自身)。
-
观察数据发现,图谱中也存在较多上下位词字面较为相似的情况,这会导致模型学到 字面相似度的强归纳偏置,即只要两个词的字面很接近,大概率就会被判断为上下位关系,但从专业医疗知识角度来说,并不是字面相似就一定是上下位关系。因此,我们利用多任务学习来缓解模型因某种强归纳偏置导致的判断模式单一的问题,增强模型的泛化能力。
召回模块
召回阶段,我们利用CCT图谱中人工构建的2w+上下位关系作为模型的训练语料,以已有的上下位关系作为正样本、相同batch内除自己以外的样本作为负样本(由于实际图谱中存在一子多父、一父多子的情况,因此构建batch时需要进行严格限制,防止矛盾)并基于对比学习构建模型的损失函数。
具体来说,假设任意一个上下位词对为,其中s表示下位词,t表示上位词,由共享编码器编码得到各自表示、,我们利用平均池化操作消除序列长度的维度,分别得到上下位词的向量表示、,之后我们利用矩阵乘法计算相关性得分,公式如下:
其中,W为可训练参数,目的是防止下位词表示、与上位词表示在向量空间中分布较远(即上下位词字面差异较大)时直接内积会受到cosine相似度的影响,中间加入线性变换可以视为对下位词空间进行一次空间映射(将下位词表示空间映射为上位词表示空间),消除相似度的影响。最后,我们选择 InfoNCE loss 作为模型的训练目标。
基于有监督对比学习 & 多任务学习的召回模型框架
上图为引入对比学习和多任务学习的召回模型框架,我们将 Info NCE loss S&T 和 Info NCE loss S&B 进行加权求和作为模型整体的优化目标进行优化,权重分配为0.5。在预测阶段,我们把归一化后的相关性得分作为排序指标,进行top@100结果的召回。
精排模块
基于召回模型提供的top@100结果,训练一个精排模型提供最终top@1,精排模型基于召回阶段输出的结果进行训练和预测,对召回结果做进一步的精排。具体来说,训练阶段基于召回模型对训练集的top@100召回结果构建正负样本,预测阶段直接对召回模型提供的top@100进行排序,选择最优结果输出。
不同于召回阶段分别建模上位词和下位词,精排模型中我们将上下位词直接拼接建模(符合排序鼓励交叉,召回要求解耦的原则),同时为了更好地利用兄弟特征,我们利用双向交互注意力机制实现 word-level attention。具体来说,给定任意三元组其中s表示下位词(source),t表示上位词(target),b表示兄弟词(brother)。我们将上下位词拼接(pair)送入编码器得到特征表示,将兄弟词送入编码器得到特征表示,然后进行双向交互注意力的计算:
-
Pair2Brother Attention: 我们对进行行运算计算上下位词对兄弟词的注意力表示
-
Brother2Pair Attention: 我们对进行列运算计算兄弟词对上下位词的注意力表示
其中,和均为可训练参数,然后将上下位词表示和兄弟词表示送入平均池化层得到对应的向量表示并分别和上面的注意力表示拼接构建多任务损失函数,这里我们选择交叉熵。
基于交互式注意力机制 & 多任务学习的精排模型框架
当然,我们也尝试过直接将兄弟节点与上下位词拼接,但效果并不好。普遍的观念认为,将多序列输入直接拼接送入Transformer-based 编码器中经过多层自注意力机制可以更好地建模序列表示,但是,当其中一个序列存在较多的噪声词时,提前拼接建模反而会干扰最终表示的质量(比如,这里的兄弟词中包含很多噪声词,因为有些兄弟词对于上下位关系预测任务来说完全没有参考意义)。因此,这里我们选择通过孪生网络分别编码各自的表示,在上层利用双向交互注意力机制计算 word-level attention,选择性地补充对上下位关系预测任务有意义的特征。
FAQ 为何选择两阶段
-
召回模型能力不足:召回模型面临的候选集是CCT图谱中全量的节点(2w+),预测阶段要求模型从2w+候选节点中精准推荐top@1难度很大。
-
精排模型难以工程化:精排模型从结构上来说鼓励特征交叉,理论上比召回模型有着更强的排序能力。但是,特征交叉意味着无法提前编码所有候选词,这将导致预测阶段对于任意一个下位词,都需要与所有候选词组合2w+次,推理时间开销无法接受。
-
两阶段实现知识传递:召回+精排的两阶段排序方法,首先由召回模型从全量候选词集中选择top@100,然后由精排模型对这100个候选词进行重排序,既减少了推理时间开销同时又能充分利用精排模型的排序能力。此外,召回阶段的输出可以看作是基于召回模型所学的知识给出的top100结果,精排模型基于召回的输出进行训练和推理可以实现pipline式的知识传递。
实验(Experiments)
召回模块
召回模型的评估指标为hit@N:即推荐的top@N结果中是否存在正确答案。我们选择医疗领域预训练模型sm_bert 作为编码器,训练初始 learning_rate 为5e-5,batch_size 大小为128,epoch为10。
【1】和【2】对比,由于传统双塔式模型存在较为明显的坍塌现象——上下位词组合的得分都很高,导致性能与有监督对比学习存在较大差距。
【2】和【3】对比,加入兄弟特征后可以在一定程度上补充上下位字面特征不足的情况,进一步提升了召回准确率
【3】和【4】对比,表明多任务学习可以用来缓解模型因某种强归纳偏置导致的判断模式单一的问题,提高模型的泛化能力
召回模型 Method |
hit@1 |
hit@3 |
hit@5 |
hit@30 |
hit@50 |
hit@100 |
【1】SentenceBERT |
9.1 |
17.67 |
23.9 |
46.2 |
51.97 |
59.87 |
【2】有监督对比学习 |
23.45 |
43.88 |
55.51 |
82.76 |
87.97 |
92.18 |
【3】有监督对比学习 + 兄弟特征 |
26.65 |
55.91 |
66.33 |
88.78 |
93.19 |
96.19 |
【4】有监督对比学习 + 兄弟特征 + 多任务 |
29.46 |
55.71 |
66.13 |
90.18 |
93.39 |
95.59 |
【5】有监督对比学习 + task_bert |
30.66 |
52.51 |
60.72 |
86.77 |
90.98 |
94.59 |
【6】有监督对比学习 + task_bert + 兄弟特征 |
30.46 |
57.31 |
70.14 |
91.78 |
94.79 |
96.99 |
【7】有监督对比学习 + task_bert + 兄弟特征+ 多任务 |
32.26 |
58.72 |
71.34 |
92.38 |
94.99 |
96.99 |
Trick——面向任务的继续预训练
召回模型中的Encoder我们选择的是sm_bert,它是一个6层的医疗领域预训练模型。但是预训练模型往往与下游任务存在较大的差异[4],这种差异主要体现于两点:领域差异和任务差异。消除预训练模型与下游任务的差异可以不同程度地提高模型的最终性能。这里,我们所用的就是医疗领域bert,所以更关注任务差异。
具体来说,我们将CCT中具有上下位关系和兄弟关系的术语词拼接组合成词汇对,送入sm_bert进行continue-train,continue-train任务分别是MLM和上下位、兄弟关系判断,提前将与任务相关的先验知识融入sm_bert ,减少与下游任务的差异。
根据实验结果,【2】和【5】对比,基于面向任务的继续预训练在hit@N指标上全面优于原始的sm_bert,证明了面向任务的继续预训练可以花很小的代价取得下游任务的提升。【7】融合了以上提出的所有优化方案,并取得了最优的性能。
精排模块
精排模型的评估指标为hit@1:即精排结果top@1是否为正确答案。我们选择医疗领域预训练模型sm_bert 作为编码器,初始 learning_rate = 5e-5,batch_size=128,epoch=3。
1) 方法不基于召回模型的输出,直接基于已有数据构建正负样本(比例1:100,负样本随机采样)。在模型结构上,精排baseline直接将上下位词拼接作为编码器输入。
2) 方法基于召回模型的输出进行训练和预测(训练时使用召回top@100的结果),hit@1指标比 a 方法提升7.6%,这验证了两阶段排序的有效性。
3) 与4) 对比,引入了多任务学习——同时寻找当前词的上位词和兄弟词,hit@1指标提升了1.4%,再次证明了多任务学习的有效性。
5) 与6) 对比,将兄弟特征单独编码,并在上层引入双向交互注意力机制和多任务学习,性能提升了2.2%,这也证实了上文的观点:当输入序列中存在大量噪声词,直接拼接建模并不一定能带来提升。
精排模型 Method |
hit@1 |
1) 无召回 + 精排baseline |
39.6% |
2) 召回【1】+ 精排baseline |
47.2% |
3) 召回【1】+ 精排baseline + 兄弟特征(直接拼接) |
54.0% |
4) 召回【1】+ 精排baseline + 兄弟特征(直接拼接)+ multitask |
55.4% |
5) 召回【6】+ 精排baseline + 兄弟特征(直接拼接)+multitask |
55.6% |
6) 召回【6】+ 双向交互注意力 + 兄弟特征 + multitask |
57.8% |
后续工作
后续工作我们将尝试向CCT图谱中加入其他属性关系,丰富图谱中术语词之间的关系,然后利用图嵌入算法对图谱中的术语词和关系进行编码,将得到的图嵌入表示作为特征加入精排模型中。图嵌入可以保留图中的属性关系信息(图结构信息),当上位词和下位词拥有共同的属性关系时,这些特征可以作为补充当作模型决策的依据之一,这在一定程度上可以缓解特征不足的问题,同时也能更好地提升模型的泛化能力。
敬请期待!!
致谢
感谢阿里健康技术部医疗AI团队:落意、翰清、梵乐
感谢阿里健康医学知识图谱团队:李泰、雅井
感谢各位Sponsor支持:涅凡、李泰、落意
参考文献
[1] SimCSE: Simple Contrastive Learning of Sentence Embeddings
[2] ConSERT: A Contrastive Framework for Self-Supervised Sentence Representation Transfer
[3] 张俊林:对比学习(Contrastive Learning): 研究进展精要(https://zhuanlan.zhihu.com/p/367290573)
[4] Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks
[5] Understanding the Behaviour of Contrastive Loss
[6] A Survey on Contrastive Self-Supervised Learning
[7] 基于模式和投影学习的领域概念上下位关系自动识别研究
[8] 基于词法匹配与词嵌入的医疗知识实体上下位关系抽取
[9] 少数派报告:谈推荐场景下的对比学习 (https://jishuin.proginn.com/p/763bfbd6efda)
[10] 万变不离其宗:用统一框架理解向量化召回 (https://zhuanlan.zhihu.com/p/345378441)
[11] 自监督对比学习在新媒体营销作品表征上的探索与实践 ()