KI-DDI:知识图谱 + 大模型 + 图注意力,医学诊断
- 具体到点精细分析
- 对话处理 SapBERT
- 医学知识处理 - 图注意力网络(GAT)
- 信息融合 - 对话嵌入 - 知识图谱嵌入
- 知识图谱的权重
- KI-DDI 图
- 分析性关联图
- 知识图谱 + 大模型 VS KI-DDI
- 更强的个性化
论文:Towards Knowledge-Infused Automated Disease Diagnosis Assistant
代码:https://github.com/NLP-RL/KI-DDI
具体到点精细分析
目的:建立一个知识注入的、话语感知的疾病诊断助手(KI-DDI)
问题:现有的自动诊断系统缺乏医学知识的有效利用和对患者-医生对话的深入理解
解法:开发一个两通道的、知识注入的、话语感知的疾病诊断模型(KI-DDI)
子解法1(因为需要理解患者-医生对话):使用transformer编码器处理患者-医生对话
- 之所以用transformer编码器,是因为它能有效捕捉长序列文本中的上下文信息。
- 例如:对于"我感觉胃里像有蝴蝶在飞"这样的描述,transformer可以理解这是一种比喻,而不是字面意思。
子解法2(因为需要利用医学知识):使用图注意力网络(GAT)创建症状-疾病嵌入
- 之所以用GAT,是因为它能动态调整不同症状和疾病之间的重要性权重。
- 例如:对于"头痛"这个症状,GAT可以根据其他症状的存在来调整它与不同疾病的关联强度。
子解法3(因为需要结合对话理解和医学知识):融合对话嵌入和知识图谱嵌入
- 之所以需要融合,是因为这样可以综合考虑患者描述和医学知识。
- 例如:将"我经常感到疲劳"这个描述与知识图谱中的多种可能疾病关联起来。
子解法4(因为需要最终给出诊断结果):使用深度神经网络进行疾病识别
- 之所以用深度神经网络,是因为它能处理复杂的非线性关系,适合多因素的疾病诊断。
- 例如:综合考虑多个症状、患者描述和医学知识,得出最可能的诊断结果。
这些子解法的逻辑链是一个决策树网络:
KI-DDI
├── 对话处理
│ └── Transformer编码器(SapBERT)
├── 医学知识处理
│ └── 图注意力网络(GAT)
├── 信息融合
│ ├── 对话嵌入
│ └── 知识图谱嵌入
└── 诊断生成
└── 深度神经网络
构建了一个症状-疾病知识图谱(S-S-D),其中症状和疾病作为节点,它们之间的边表示共现关系。
采用了受tf-idf方法启发的症状频率-逆疾病频率(sf-idf)方法来确定边的权重,这个权重反映了症状和疾病之间的关联程度。
在KI-DDI模型中,首先将整个对话输入语言模型以提取嵌入表示。
然后,从对话中提取症状,并从知识图谱中检索相关的子图。
通过将对话节点与子图连接,我们形成了一个联合图。
最后,通过平均池化获得图嵌入,并使用注意力机制计算对话节点和自我报告的加权和,将图嵌入与对话嵌入融合,用于疾病分类。
对话处理 SapBERT
这个图展示了KI-DDI模型中的对话处理系统,它的核心是一个叫做SapBERT的强大工具。
-
信息输入:
系统接收两种主要信息:患者的自我报告和整个医患对话。
这些信息被转换成"输入向量",也就是计算机可以理解的数字序列。 -
SapBERT的作用:
SapBERT就像一个超级翻译官。它能够:- 理解患者自我报告的内容
- 捕捉整个对话的细节
- 抓住患者和医生话语中的深层含义
-
特殊标记的使用:
系统使用一些特殊标记来区分不同部分:- "自我报告开始标记"和"自我报告结束标记"标示出患者自述的范围
- "患者标记"和"医生标记"分别指出患者和医生发言的开始
-
生成编码表示:
SapBERT处理这些信息后,会生成两种重要的编码表示:- S:代表患者自我报告的编码
- C:代表整个对话的编码
这两种编码包含了原始信息的精华,但以更加结构化的形式呈现。
-
编码过程:
- 对于S,系统输入自我报告的开始标记、内容和结束标记
- 对于C,系统输入患者标记、患者话语序列、医生标记和医生话语序列
SapBERT(在图中也称为"语言模型")处理这些输入,生成最终的编码
-
话语处理:
系统能够单独处理每一句话,无论是来自患者还是医生,保证不遗漏任何重要信息。
这个过程的巧妙之处在于,它能够将复杂的医患对话转化为计算机可以进一步分析的形式,同时保留了原始对话中的重要语义信息。
这使得KI-DDI模型能够更加准确地理解患者的症状描述和医生的诊断过程,从而为后续的疾病诊断提供强有力的支持。
医学知识处理 - 图注意力网络(GAT)
-
基本原理:
研究者们发现,处理结构化数据可以帮助我们更好地总结信息并确定行动路径。
这种思路被应用到了人工智能模型中,特别是在处理大量数据时,图基础模型变得越来越受欢迎。
-
GAT的引入:
为了提高效率,研究者们构建了图注意力网络(GAT)。GAT建立在知识图谱(S-D)的基础上,并结合上下文信息,用于疾病诊断。
-
GAT的内部结构:
-
GAT由多层组成,每层包含多个顶点。
-
每个顶点的状态由一个数学方程(方程8)描述。
-
顶点之间的关系通过"第一跳邻居"来定义。
-
网络中有可训练的参数(如Wh和a),这使得模型可以从数据中学习。
-
注意力机制(通过方程9计算)用于确定不同信息的重要性。
-
-
图嵌入过程:
-
GAT处理后的信息被转换为"顶点嵌入"。
-
通过平均池化操作,将所有顶点的嵌入合并成一个"图嵌入"。
-
这个过程考虑了节点特征在不同维度上的分布。
-
-
联合图的概念:
-
联合图是将对话信息(对话节点)添加到医学知识子图中形成的。
-
这种结合允许模型同时考虑一般医学知识和具体病例信息。
-
-
最终输出:
图嵌入作为GAT的最终输出,它浓缩了原始知识图谱和对话信息的精华,为后续的疾病诊断提供了强有力的支持。
这个过程的创新之处在于,它能够将复杂的医学知识和具体的患者对话信息融合在一起,通过图结构和注意力机制,提取出最相关的信息。
这使得KI-DDI模型能够更准确地理解患者的情况,并在此基础上进行疾病诊断。
信息融合 - 对话嵌入 - 知识图谱嵌入
-
信息来源:
模型考虑了两个主要的信息来源:患者自己报告的数据和医生提取的症状。
这两种信息在不同情况下对理解疾病都很重要。
-
注意力机制:
模型使用了一种叫做"加法注意力"的技术来计算注意力。
这允许模型根据具体情况关注最相关的信息。
-
核心组件:
-
GAT输出:来自图注意力网络,作为查询
-
自我报告编码:患者自述的编码表示
-
对话编码:整个医患对话的编码表示
这三个组件分别代表了不同角度的信息。
-
-
信息融合过程:
a. 首先,对自我报告编码和对话编码进行加权平均。
b. 然后,将这个加权平均结果与GAT输出拼接在一起。
c. 拼接后的结果通过一个线性层,最终用于疾病分类。
-
可学习参数:
模型包含多个可学习参数(W1, W2, v),这使得模型能够通过训练来优化其性能。
-
注意力计算:
-
方程(12)用于计算注意力值α
-
方程(13)用于确定最终的上下文表示
-
-
最终步骤:
得到的"关注后的上下文"被传递给疾病诊断网络,该网络最终用于疾病预测。
这个过程的创新之处在于它综合考虑了多个信息源(患者报告、医患对话、医学知识图),并使用注意力机制来动态调整不同信息的重要性。
通过这种方式,模型能够模仿医生的诊断过程,同时考虑到每个病例的独特性。
这种方法不仅提高了诊断的准确性,还增强了模型的可解释性,因为我们可以通过注意力权重来理解模型在做出诊断时关注了哪些信息。
知识图谱的权重
我的知识图谱只有【症状-疾病】,KI-DDI 还有权重。
症状频率-逆疾病频率(sf-idf)方法是受到文本分析中广泛使用的tf-idf(词频-逆文档频率)方法启发而来的。
这种方法用于确定症状和疾病之间关联的强度。
- 症状频率 (SF):
SF(s,d) = n(s,d) / N(d)
其中:
- s 是症状,d 是疾病
- n(s,d) 是症状 s 在疾病 d 中出现的次数
- N(d) 是疾病 d 的所有症状出现的总次数
- 逆疾病频率 (IDF):
IDF(s) = log(D / D(s))
其中:
- D 是数据集中总的疾病数量
- D(s) 是包含症状 s 的疾病数量
- SF-IDF 计算:
SF-IDF(s,d) = SF(s,d) * IDF(s)
-
具体实施步骤:
a. 数据准备:
- 收集包含症状-疾病对的大量医疗记录。
- 统计每种疾病的症状列表及其出现频率。
b. 计算 SF:
- 对于每个疾病,计算每个症状的频率。
- 例如,如果"发热"在"感冒"中出现100次,而"感冒"总共有500个症状记录,则 SF(“发热”, “感冒”) = 100/500 = 0.2。
c. 计算 IDF:
- 统计每个症状在多少种疾病中出现。
- 例如,如果"发热"在50种疾病中出现,而总共有1000种疾病,则 IDF(“发热”) = log(1000/50) ≈ 3。
d. 计算 SF-IDF:
- 将 SF 和 IDF 相乘。
- 继续上面的例子,SF-IDF(“发热”, “感冒”) = 0.2 * 3 = 0.6。
e. 归一化(可选):
- 可以对结果进行归一化,使所有权重在0到1之间。
- 可以使用最大-最小归一化或其他适当的方法。
-
解释结果:
- 高 SF-IDF 值表示该症状对该疾病来说既常见(高SF)又具有区分性(高IDF)。
- 低 SF-IDF 值可能表示症状在该疾病中不常见,或者是一个在多种疾病中都常见的症状。
-
注意事项:
- 数据质量:确保使用大量高质量的医疗记录来计算这些值。
- 稀有疾病:对于罕见疾病,可能需要特殊处理,因为它们的样本量可能很小。
- 动态更新:随着新数据的加入,定期更新这些权重。
- 临床验证:结果应该由医学专家审核,确保它们与临床经验一致。
-
实现示例(Python):
import math
from collections import defaultdict
def calculate_sf_idf(symptom_disease_data):
# 统计数据
disease_symptom_count = defaultdict(lambda: defaultdict(int))
disease_total_symptoms = defaultdict(int)
symptom_in_diseases = defaultdict(set)
total_diseases = set()
for disease, symptoms in symptom_disease_data.items():
total_diseases.add(disease)
for symptom in symptoms:
disease_symptom_count[disease][symptom] += 1
disease_total_symptoms[disease] += 1
symptom_in_diseases[symptom].add(disease)
# 计算 SF-IDF
sf_idf = {}
total_disease_count = len(total_diseases)
for disease, symptoms in disease_symptom_count.items():
sf_idf[disease] = {}
for symptom, count in symptoms.items():
sf = count / disease_total_symptoms[disease]
idf = math.log(total_disease_count / len(symptom_in_diseases[symptom]))
sf_idf[disease][symptom] = sf * idf
return sf_idf
# 示例使用
symptom_disease_data = {
"感冒": ["发热", "咳嗽", "流鼻涕"],
"流感": ["发热", "肌肉疼痛", "疲劳"],
"肺炎": ["发热", "咳嗽", "呼吸困难"]
}
result = calculate_sf_idf(symptom_disease_data)
print(result)
这种方法提供了一个量化症状-疾病关联强度的客观方式,可以用作知识图谱中边的权重,从而为GNN或DUCG模型提供有价值的输入。
KI-DDI 图
-
第一阶段(STAGE-1):
- 使用编码器处理患者的自我报告和整个对话。
- 同时从知识图谱中提取相关的子图(KG SubGraph)。
-
第二阶段(STAGE-2):
- 使用注意力机制处理编码后的信息。
- 应用图注意力网络(GAT)处理症状(蓝色节点)和疾病(红色节点)之间的关系。
- 最后通过平均池化(Mean Pool)得到最终表示。
分析性关联图
-
患者-医生互动输入:
您: “我最近牙疼,特别是吃冷热食物时。”
医生: “您能具体描述一下疼痛的位置和性质吗?”
您: “是左下方的一颗牙,感觉像针刺一样疼。” -
自我报告处理:
系统首先分析您的初始描述"牙疼,特别是吃冷热食物时"。这被视为自我报告的核心内容。 -
症状调查:
系统通过SapBERT模型分析对话,提取关键症状:- 牙疼
- 对冷热敏感
- 左下方牙齿
- 针刺样疼痛
-
自然语言理解:
- 意图分类: 系统识别出您的意图是寻求牙痛的诊断和治疗。
- 症状标注: 系统标注出上述提到的症状。
-
知识图谱激活:
系统访问其医学知识图谱,找出与这些症状相关的可能疾病,如:- 龋齿(蛀牙)
- 牙本质过敏
- 牙髓炎
- 牙周炎
-
图注意力网络(GAT)分析:
GAT分析症状和可能疾病之间的关系:- 它可能会特别关注"对冷热敏感"这一症状,因为这在区分上述疾病时非常关键。
- "针刺样疼痛"可能会增加牙髓炎的可能性权重。
-
医学知识注入:
系统结合专业医学知识,如:- 龋齿早期通常对冷热敏感
- 牙髓炎往往伴有剧烈、持续的疼痛
-
SapBERT深入语义分析:
SapBERT模型进一步分析您的描述,可能会注意到:- "针刺一样疼"这种描述在医学上常与神经性疼痛相关
- "左下方的一颗牙"可能暗示问题局限于特定牙齿,而非全面的牙周问题
-
疾病诊断:
综合以上所有信息,KI-DDI系统可能会得出如下诊断:
主要可能: 早期到中期的龋齿(蛀牙)
次要可能: 早期牙髓炎系统还可能建议:
“建议进行口腔检查和X光检查以确认诊断。如果是龋齿,可能需要补牙治疗。” -
疾病分类准确率评估:
系统会记录这次诊断,未来当得知实际诊断结果后,会用于评估和提高系统的准确率。
KI-DDI如何综合利用多种技术和信息源,模拟人类医生的思维过程,从简单的牙疼描述推导出可能的诊断结果。
这种方法不仅考虑了症状本身,还考虑了症状的表达方式和潜在的关联,从而提供更准确的初步诊断。
知识图谱 + 大模型 VS KI-DDI
症状权重:
- 医学大模型+知识图谱可能对所有头痛症状赋予相似的权重。
- KI-DDI根据每位患者的具体描述调整症状的重要性,如患者A的压力相关性和患者B的单侧性。
治疗建议:
- 医学大模型+知识图谱提供了通用的进一步检查建议。
- KI-DDI为每位患者提供了更具针对性的治疗和管理建议。
考虑个人因素:
- 医学大模型+知识图谱的回应对两位患者几乎相同。
- KI-DDI考虑了患者A的工作压力和患者B的特定症状模式。
后续跟进:
- 医学大模型+知识图谱建议进行全面检查。
- KI-DDI提供了更具体的后续步骤,如患者A的压力管理和患者B的头痛日记。
更强的个性化
KI-DDI 个性化方面更强,医疗一定是个性化的:
假设有两位患者,都抱怨头痛,但具体情况略有不同:
患者A:
“我最近经常头痛,感觉像是整个头部被箍住了,特别是在工作压力大的时候更严重。有时候还会伴随轻微的恶心感。”
患者B:
“我有时会突然感到剧烈的头痛,通常集中在一侧,疼起来像是被人用锤子敲打一样。疼痛时还会对光线特别敏感。”
- 医学大模型+知识图谱的处理:
对于患者A和B,系统可能会给出类似的标准化诊断列表:
"基于您描述的头痛症状,可能的诊断包括:
- 紧张性头痛
- 偏头痛
- 丛集性头痛
- 鼻窦炎引起的头痛
- 颅内压增高
建议您进行进一步的神经系统检查和头部影像学检查。"
这个诊断列表对两位患者基本相同,因为它们都符合"头痛"这一广泛类别。
- KI-DDI 的处理:
KI-DDI可能会为每位患者提供更个性化的分析:
对患者A:
"根据您的描述,您的头痛症状更符合紧张性头痛的特征:
- 头痛感觉像是被箍住,这是紧张性头痛的典型表现。
- 症状与工作压力相关,这进一步支持紧张性头痛的诊断。
- 伴随的轻微恶心感可能是由于长期疼痛引起的。
建议:
- 考虑进行压力管理和放松训练
- 可以尝试温和的止痛药,如布洛芬
- 如果症状持续,建议进行颈部和头皮肌肉检查
- 保持良好的作息习惯可能会有帮助"
对患者B:
"您描述的症状高度符合偏头痛的特征:
- 头痛剧烈且集中在一侧,这是偏头痛的典型表现。
- 疼痛的搏动性质(像锤子敲打)也符合偏头痛特征。
- 对光线敏感(称为畏光)是偏头痛的常见伴随症状。
建议:
- 建议您记录头痛日记,包括发作频率、持续时间和可能的触发因素
- 考虑进行偏头痛特异性药物治疗,如曲普坦类药物
- 避免已知的偏头痛触发因素,如某些食物或压力
- 建议进行神经系统检查,以排除其他可能的原因"
对比分析:
-
诊断精确度:
- 医学大模型+知识图谱给出了覆盖面广的标准诊断列表。
- KI-DDI针对每位患者的具体症状提供了更精确的诊断倾向。
-
症状权重:
- 医学大模型+知识图谱可能对所有头痛症状赋予相似的权重。
- KI-DDI根据每位患者的具体描述调整症状的重要性,如患者A的压力相关性和患者B的单侧性。
-
治疗建议:
- 医学大模型+知识图谱提供了通用的进一步检查建议。
- KI-DDI为每位患者提供了更具针对性的治疗和管理建议。
-
考虑个人因素:
- 医学大模型+知识图谱的回应对两位患者几乎相同。
- KI-DDI考虑了患者A的工作压力和患者B的特定症状模式。
-
后续跟进:
- 医学大模型+知识图谱建议进行全面检查。
- KI-DDI提供了更具体的后续步骤,如患者A的压力管理和患者B的头痛日记。
KI-DDI如何通过考虑每位患者的独特症状描述和生活因素来提供更个性化的诊断和建议,而医学大模型+知识图谱则提供了更标准化但不太具体的诊断方法。