KI-DDI:知识图谱 + 大模型 + 图注意力,医学诊断
- 具体到点精细分析
- 知识图谱的权重
- 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模型中,首先将整个对话输入语言模型以提取嵌入表示。
然后,从对话中提取症状,并从知识图谱中检索相关的子图。
通过将对话节点与子图连接,我们形成了一个联合图。
最后,通过平均池化获得图嵌入,并使用注意力机制计算对话节点和自我报告的加权和,将图嵌入与对话嵌入融合,用于疾病分类。
知识图谱的权重
我的知识图谱只有【症状-疾病】,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 defaultdictdef 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] += 1disease_total_symptoms[disease] += 1symptom_in_diseases[symptom].add(disease)# 计算 SF-IDFsf_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 * idfreturn 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如何通过考虑每位患者的独特症状描述和生活因素来提供更个性化的诊断和建议,而医学大模型+知识图谱则提供了更标准化但不太具体的诊断方法。