Drug side effects prediction via cross attention learning and feature aggregation
公开知识笔记
Drug side effects prediction via cross attention learning and feature aggregation(精读)
基本信息
| 项目 | 内容 |
|---|---|
| 作者 | Zixiao Jin, Minhui Wang, Xiao Zheng, Jiajia Chen, Chang Tang |
| 年份 | 2024 |
| 来源 | Expert Systems with Applications, 248, 123346 |
| DOI | 10.1016/j.eswa.2024.123346 |
| Zotero | 选择条目 · 打开 PDF |
| 代码 | A-3Net-master |
一句话摘要
A3Net同时学习药物/副作用各自的图拓扑表示和二者之间的交互表示,再经加权融合预测五级副作用频率;它在SIDER的warm-start与new-drug cold-start实验中整体优于所比较模型,但提升幅度、评估不确定性和代码实现偏差需要谨慎对待。
阅读抓手
这篇论文不是简单回答“某药物有没有某副作用”,而是预测药物—副作用组合的发生频率等级。可以把A3Net理解成两条信息通路:
- GAM(Graph Attention Module) 回答“药物内部原子如何连接、副作用之间如何关联”;
- CAM(Cross Attention Module) 回答“某些药物原子与某些副作用之间可能如何相互关注”;
- FAM(Feature Aggregation Module) 按固定权重融合两条通路;
- 融合后的药物向量与副作用向量做内积,得到完整频率矩阵。
因此,真正值得学习的不是“又用了一个Transformer”,而是作者把实体内部结构信息与实体之间交互信息拆开建模,再在统一空间中融合。
📚 零基础概念导读
下表按“先读任务,再读数据表示,然后读模型与评估”的顺序组织。每个链接都指向
导学/note/中的独立概念笔记;概念笔记末尾也显式链接回本文,因此不仅能依赖 Obsidian 的自动反向链接,还能手动往返。
| 建议顺序 | 核心概念 | 先记住的一句话 |
|---|---|---|
| 1 | SIDER与药物副作用频率预测 | A3Net预测的不是简单“有/无副作用”,而是药物—副作用组合的五级发生频率。 |
| 2 | 分子图、SMILES与RDKit | SMILES是分子的文本写法,RDKit把它解析成由原子和化学键组成的图。 |
| 3 | KNN图构建 | 没有天然连边的副作用,也可以按频率轮廓相似度连接最近的K个邻居。 |
| 4 | 图注意力网络GAT | GAT让节点从不同邻居接收不同权重的信息,是A3Net的结构通路。 |
| 5 | 交叉注意力与自注意力 | 标准交叉注意力和“拼接后自注意力”并不相同,理解这一点才能看懂论文名与代码的差别。 |
| 6 | 特征聚合与多模态融合 | FAM把图结构表示与交互表示按固定比例合成最终向量。 |
| 7 | 矩阵内积解码与矩阵补全 | 药物向量和副作用向量做内积,就能为每一对实体生成预测分数。 |
| 8 | Warm Start、Cold Start与交叉验证 | 随机藏掉配对与整种新药藏掉,是难度不同的泛化测试。 |
| 9 | 预测模型评价指标 | AUC、mAP、NDCG衡量排序;RMSE、MAE、Spearman衡量频率数值。 |
| 10 | 正例-未标注学习PU Learning | SIDER里的0多半是“未记录”,不能不加辨别地当成可靠负例。 |
研究对象
- 研究对象:750种药物与994种副作用之间的频率关系,共构成个候选组合。任务背景见SIDER与药物副作用频率预测。
- 核心问题:既有方法常分别提取药物与副作用特征,缺少药物原子—副作用之间的显式交互建模,可能损失决定副作用频率的配对信息。
- 预测目标:将SIDER记录的副作用发生率离散为1—5级;矩阵中的0表示未记录/未知关系,而不等同于经验证的“无副作用”。
- 研究情境/范围:同时评估已知药物上补全未观测频率的warm start,以及整种新药从训练集中移除的cold start。
研究方法
方法概述
- 方法类型:计算实验、图表示学习与矩阵补全。
- 总体思路:药物分子图与副作用KNN图分别进入GAT;药物原子和副作用token共同进入Transformer编码器;两路表示经加权融合后通过矩阵内积预测频率。
- 为什么用这种方法:GAT擅长学习实体内部拓扑,但不能直接描述药物原子与副作用之间的跨图交互;CAM补充跨实体信息,FAM控制两类信息对最终预测的贡献。
模型结构总览
一句话:两条通路编码(GAM 看结构、CAM 看交互)→ 加权融合 → 内积解码。
flowchart TD
subgraph 输入["① 输入/数据准备"]
D["SMILES ×750"] --> DG["分子图<br/>原子=节点, 键=边<br/>每原子109维"]
SE["SIDER频率矩阵 750×994"] --> SEG["KNN图 K=10<br/>994副作用节点<br/>每节点243维MedDRA"]
end
subgraph GAM["② GAM 图结构通路"]
DG --> DGAT["GAT×3 (10头)"] --> DP["原子表示 → max pool"] --> DV["d_GAM (200维)"]
SEG --> SGAT["GAT×3 (10头)"] --> SV["s_GAM (994×200维)"]
end
subgraph CAM["② CAM 交互通路"]
DG --> DF1["fc_1 → 200维"]
SEG --> DF2["fc_2 → 200维"]
DF1 --> CONCAT["拼接 token 序列"]
DF2 --> CONCAT
CONCAT --> TR["Transformer ×6 (8头)"] --> SPLIT["拆回两段"]
SPLIT --> DC["药物侧 → max pool<br/>d_CAM (200维)"]
SPLIT --> SC["副作用侧<br/>s_CAM (994×200维)"]
end
subgraph FAM["③ 融合 + 解码"]
DV --> FX["x = 0.85·d_GAM + 0.15·d_CAM"]
DC --> FX
SV --> FY["y = 0.85·s_GAM + 0.15·s_CAM"]
SC --> FY
FX --> DEC["Ŝ = X·Yᵀ → 750×994"]
FY --> DEC
DEC --> LOSS["损失: 已知拟合1~5级<br/>未知拉向0.5 (α=0.03)"]
end
看图要点:
- 同一输入并行走 GAM 与 CAM 两条通路,最后才融合,不是串行;
- 109/243 维都是节点级初始特征,药物级向量在 max pooling 之后才出现;
- 副作用 GAT 输出不池化(994 个副作用各留一个 200 维向量);
- 代码层面:GAT 维度 109→1280→2000→200(副作用侧 243 起同构);CAM 实际是拼接 token 后的 self-attention(训练 batch=10 时存在跨药物注意);FAM 存在括号 bug,详见"代码复现审计"。
方法分析
- 分析单位:药物—副作用配对;药物侧的更细粒度单位是分子中的原子。
- 关键输入:
- 药物SMILES经RDKit转换为分子图;每个原子编码为109维化学属性向量,边表示化学键;
- 副作用节点使用MedDRA层级术语编码为243维向量;
- 副作用之间依据训练频率轮廓相似性构建的KNN图;
- 标签为SIDER五级发生频率矩阵。
- 识别/推断逻辑:本文属于预测而非因果识别。模型利用已观测频率及结构特征学习配对得分,交叉验证检验对留出配对或留出药物的泛化能力,不能据此推断某个原子结构“导致”某种副作用。
- 具体步骤:
- 将SIDER发生率区间编码为1(very rare)至5(very frequent),未知项记为0。
- 从SMILES构造750个药物分子图;从副作用频率轮廓构造994节点的KNN图,并载入MedDRA特征。
- 在药物图和副作用图上分别运行多头GAT,得到结构通路表示;药物原子表示通过global max pooling汇总为药物表示。
- 将药物原子特征与全部副作用特征映射到同一空间、拼接为token序列,经过6层、8头Transformer编码器获得交互通路表示;这属于拼接token后的自注意力实现。
- 用融合GAM与CAM表示,得到200维药物和副作用向量,详见特征聚合与多模态融合。
- 对药物矩阵与副作用矩阵做内积解码,产生预测矩阵。
- 用加权平方损失同时拟合已知频率,并把未知位置约束到固定基线;Adam学习率为。
- warm start随机留出已知药物—副作用频率;cold start按药物分组留出整行,均进行10折交叉验证。
核心公式
- 交互注意力:在统一空间中计算药物原子token与副作用token的注意力。
-
公式拆解:来自拼接后的药物原子和副作用特征;展开后既包含各自内部关系,也包含药物—副作用的交叉项。需要注意,论文将其称为cross attention,但实现形式更接近“拼接token后的self-attention”。
-
双路特征聚合:用固定权重融合图结构通路和交互通路。
-
公式拆解:和分别是药物与副作用最终表示;意味着论文设置中GAM结构信息占主导。
-
频率解码与稀疏损失:
- 公式拆解:和分别选择已知与未知位置;第一项拟合真实等级,第二项把未知位置拉向,降低未知项因数量过多而支配训练的风险。
方法优势
- 将“实体内部图结构”与“实体间配对交互”拆成两条通路,模型结构与研究问题对应清楚。
- 同时报告关联排序、频率误差以及warm/cold start结果,比只做随机边划分更接近新药预测需求。
- 数据、训练脚本、冷热启动划分和主要绘图代码均公开,具备进一步复核的基础。
方法局限
- 零值语义不纯:矩阵0表示未知而非可靠负样本;把全部未知项正则到0.5是一种建模假设,涉及PU学习问题,会影响AUC和推荐指标的解释。
- 提升幅度小且无不确定性报告:warm-start AUC仅比DSGAT高0.005,cold-start高0.007;论文未报告折间标准差、置信区间或显著性检验。
- 消融并非所有指标一致受益:去掉GAM后的AUC为0.929,高于完整模型0.927;去掉CAM后的recall@15为0.417,高于完整模型0.413。完整模型的优势主要体现在综合排序和频率误差,而不是每个指标都占优。
- 外部效度有限:只使用SIDER 4.1;没有跨数据库、时间外推或临床前瞻验证,也没有测试“新副作用”冷启动。
- 注意力不等于因果解释:原子注意力案例可用于提出假设,但没有实验或外部知识验证,不能把高注意力原子直接解释为副作用机制。
- 超参数选择流程不够透明:论文展示和注意力头数敏感性,但没有清楚区分调参集与最终测试集。
- 注意力推导只是示意:论文式(20)为展开交叉项而省略softmax与,并称二者只改变数值大小;但softmax是非线性归一化,会改变相对权重,因此该式不能视为与真实注意力严格等价的推导。
数据来源
- 数据类型:公开数据库中的药物—副作用发生频率、药物化学结构和医学术语层级。
- 样本来源:SIDER 4.1提供频率矩阵;DrugBank/PubChem提供SMILES;MedDRA提供副作用术语特征。
- 时间范围:使用数据库版本而非纵向时间样本,论文未开展时间外验证。
- 样本量/案例数:750种药物、994种副作用、37,071个有记录频率,占矩阵4.97%;其余95.03%为未知项。
- 频率分布:1—5级分别占0.16%、0.56%、1.34%、2.36%和0.55%,类别与观测状态均高度不均衡。
- 数据局限:SIDER频率来自药品标签等来源,等级离散化损失连续频率信息;未知项可能混合真正无关联与尚未观测关联。
数据分析:数据如何支撑模型
这篇论文真正使用的是三类彼此相连的数据:频率矩阵给出预测任务和副作用相似性,SMILES 给出每种药物的原子图,MedDRA 给出副作用节点的初始语义特征。不要把 矩阵中的 0 当作可靠的“无副作用”标签:作者将它定义为未知频率,并在损失函数中作为另一类位置处理。数据集与编码,原文 p.2 · 稀疏损失,原文 p.4–5
1. 先把一条数据看明白
- 分析单位(一行/一个样本代表什么):最终监督单位是一个“药物 — 副作用 ”配对及其发生频率等级 ;但模型输入不是一张普通的二维表,而是药物的变长原子图和共享的副作用图。一个药物会对应多个原子节点,一个副作用对应一个图节点。数据集,原文 p.2 · 图表示,原文 p.3
- 数据形状与粒度:频率标签矩阵 ;共 750 种药物、994 种副作用、745,500 个候选配对。其中只有 37,071 个配对(4.97%)有记录频率,其余 95.03% 为未知。药物图的节点数随分子而变,副作用图固定有 994 个节点。原文 p.2 · 原文 p.3
- 标签如何得到:SIDER 4.1 的临床频率区间被离散为 1–5 级:、–、–、–、;未记录项编码为 0。故它同时是“是否有已知关联”的排序任务和“已知关联频率等级”的数值预测任务。原文 p.2
- 类别不平衡:所有位置中,等级 1–5 分别只占 0.16%、0.56%、1.34%、2.36%、0.55%;这解释了为何只报准确率会误导,论文同时报告排序与频率误差指标。原文 p.2 · 指标定义,原文 p.5
2. 变量、特征与标签
| 在模型中的角色 | 原文名称/含义 | 如何测量或构造 | 最终如何使用 | 证据定位 |
|---|---|---|---|---|
| 结果变量 / 标签 | 药物—副作用频率 | SIDER 4.1 的五个频率区间编码为 1–5;未记录为 0 | 已知位置拟合真实等级;未知位置进入弱正则项而非作为真负例 | 原文 p.2 · 原文 p.4–5 |
| 药物侧输入特征 | 原子化学属性 | DrugBank/PubChem 的 SMILES 经 RDKit 解析为分子图;原子元素、度、价电子、形式电荷、杂化等 one-hot 拼接为 109 维 | 原子节点特征与化学键邻接矩阵分别进入 GAM;再映射到 CAM 的共同空间 | 原文 p.3 |
| 副作用侧输入特征 | MedDRA 术语层级 | 取 MedDRA 前两层层级做 multi-hot 编码,得到每个副作用 243 维特征 | 作为副作用图节点特征,进入 GAM 与 CAM | 原文 p.3 |
| 副作用侧图结构 | KNN 邻接矩阵 | 用频率矩阵中两个副作用的列向量余弦相似度,连接最近的 10 个副作用 | 给副作用 GAT 提供“哪些副作用可互相传递信息”的边 | 原文 p.3 |
3. 从原始数据到模型输入
| 环节 | 原文做了什么 | 这一步为何影响模型/结论 | 证据定位 |
|---|---|---|---|
| 获取与对齐 | 将 SIDER 频率、DrugBank/PubChem 的 SMILES、MedDRA 术语放到同一批药物和副作用实体上 | 三种来源必须以药物与副作用身份对齐;否则标签、分子结构和术语特征会错配。具体的实体映射/去重规则原文未报告 | 原文 p.2–3 |
| 标签编码 | 把连续区间离散成 1–5,未记录设为 0 | 模型学的是有序等级的矩阵补全;离散化让频率可统一训练,但丢失区间内部差异 | 原文 p.2 |
| 药物图构造 | SMILES → RDKit → 原子特征矩阵 与键邻接矩阵 | 让 GAT 可在化学键邻居间传递信息;每个药物的原子数不同,因此先在节点级计算、后用 global max pooling 变成一个药物向量 | 原文 p.3 · 原文 p.4 |
| 副作用图构造 | 用 的列向量计算余弦相似度,再以 建 KNN 图 | 将“频率模式相近”的副作用相连,使 GAT 能借邻居补充表示;这也意味着图结构包含标签矩阵信息 | 原文 p.3 |
| 统一表示与融合 | 109 维原子特征、243 维副作用特征先经全连接层映射到同一空间;GAM 与 CAM 各自产生 200 维表示,按 融合 | 不同原始维度不能直接做注意力;映射与融合让“结构通路”和“交互通路”能共同服务同一内积解码器 | 原文 p.3–5 |
| 进入模型与训练 | 融合后的药物矩阵 和副作用矩阵 内积得到 ;已知位置拟合 1–5,未知位置被拉向 ,权重 | 这不是只在 37,071 个正例上训练:大量未知位置也参与损失。 用于防止未知位置数量过大而主导优化,但 是关键建模假设 | 原文 p.4–5 |
4. 数据设计如何支撑模型搭建
- 模型为什么能使用这份数据:药物分子天然是图(原子—化学键),副作用虽没有天然边,却可由训练频率轮廓和 MedDRA 表示构成图;两类节点特征被投影到同一 200 维空间,因而可由注意力学习交互,最后以向量内积为每一药物—副作用对赋分。原文 p.3–5
- warm start 划分:原文说明采用 10 折交叉验证,但未在方法正文中精确说明每一折如何从“已记录频率”抽边、如何处理被留出的正例。现有代码复现审计显示:留出位置会被置为 0,随后仍以“未知位置”身份进入损失的 项;这不等于直接读取测试标签,却会使测试正例以弱负/未知形式影响训练,复现时应单独对比“完全不参与损失”的严格切分。 交叉验证,原文 p.6 · 见本文“代码复现审计”。
- cold start 划分:以“整种药物”为单位随机分成 10 份,整份药物及其所有副作用频率留作测试;这检验模型能否只凭新药的分子图预测副作用,而非依赖该药已知频率。论文未明确写出每折副作用 KNN 图只用训练矩阵构建;现有代码审计确认公开脚本按遮蔽后的训练频率构图,复现时必须保持这一顺序。 原文 p.7 · 见本文“代码复现审计”。
- 评价指标在衡量什么:mAP、AUC、NDCG@N、Precision/Recall@N 衡量“把有频率关联的配对排到前面”;Spearman、RMSE、MAE 衡量预测数值与频率等级的一致/误差。两类指标可能冲突,因此 A3Net 的排序优势不代表它在频率数值误差上也最优。原文 p.5 · warm-start 比较表,原文 p.6
5. 数据质量与理解边界
- 代表性/覆盖范围:仅覆盖 SIDER 4.1 中的 750 种药物和 994 种副作用;不是按时间追踪的新药上市或临床试验队列,论文未进行跨数据库或时间外测试。 原文 p.2 · 讨论与结论,原文 p.10
- 最大的不确定性是“0”:0 既可能是真正没有该副作用,也可能只是数据库未记录;作者将全部未知位置向 0.5 收缩。这一选择让模型能在稀疏矩阵中训练,但也把“缺失机制”写进了模型目标,不能把 AUC 中的 0 全都当作可信负例。 原文 p.2 · 原文 p.4–5
- 潜在信息泄漏点:副作用 KNN 图由频率标签矩阵 构造;若在某一折切分之前就用完整 建图,测试频率会进入训练图结构。论文正文未报告这一步的折内时序;公开脚本审计表明其在遮蔽后构图,但任何重写预处理的复现都必须重新核验。 KNN 定义,原文 p.3 · 见本文“代码复现审计”。
- 我还需要补看的数据问题:DrugBank/PubChem、SIDER、MedDRA 之间的实体标准化和缺失记录规则;每折各等级的样本分布;是否有重复/高度相似药物跨训练测试折;以及将未知项改为 PU-learning 或完全忽略后的敏感性结果。原文未报告这些检验。
研究结论
- 主要发现1:warm start中,A3Net在mAP、AUC、NDCG@10及多数Precision/Recall指标上最高;AUC为0.927、mAP为0.253、NDCG@10为0.508。数值频率拟合并非最佳:MGPred的Spearman为0.705、RMSE为0.665、MAE为0.508,均优于A3Net的0.557、1.024和0.752,但MGPred对未知关联的识别较弱。
- 原文引用1:
“The A3Net model has a significant advantage over other models.” 原文 p.6
- 主要发现2:cold start中,A3Net的mAP 0.386、AUC 0.882、NDCG@10 0.750、precision@1 0.613;除NDCG@10与MGPred并列外,关联排序整体最好,但RMSE/MAE仍非最佳。
- 原文引用2:
“A3Net model achieved superior performance across several metrics.” 原文 p.7 · 结果表 p.8
- 主要发现3:消融结果支持同时保留GAM和CAM有助于综合性能,但单个指标存在反例,因此更准确的结论是“双路融合改善总体权衡”,而不是“每个模块在所有指标上都贡献正增益”。
- 原文引用3:
“The complete A3Net model incorporating these modules” shows better overall performance. 原文 p.7 · 结果表 p.8
- 主要发现4:作者用Amphotericin B、Clarithromycin与Azithromycin展示原子—副作用注意力,认为结构和原子属性相似的药物可能呈现相似频率;这属于解释性案例,而非独立验证。
- 原文引用4:
“Drugs containing atoms with highly similar topological structures” may show similar side-effect frequencies. 原文 p.10
我的判断
- 最有启发的点:把GAM理解为“各自看自己”,把CAM理解为“放在一起看彼此”,再用FAM融合,是一个很容易迁移到药物—疾病、miRNA—疾病等异质配对预测任务的设计模式。
- 可借鉴的方法:
- 同时设计随机配对留出和实体级留出,避免只报告容易的warm start;
- 将结构通路与交互通路显式分离,便于做模块消融和表示诊断;
- 同时报告关联发现指标与频率回归指标,避免单一AUC掩盖频率误差。
- 复现时必须补的检验:每折重新用训练矩阵构建副作用KNN图;固定并记录所有随机种子;报告10折均值±标准差;将0值当“未标注”而非真负样本做敏感性分析;同时复现原始代码与修正实现。
- 可继续追问的问题:
- 若用严格的positive-unlabeled学习替代“未知值拉向0.5”,结果是否仍成立?
- 若将固定替换为样本自适应门控,是否能改善不同指标间的权衡?
- CAM学到的是稳定的药物—副作用交互,还是数据集中共同频率模式的统计捷径?
- 在跨数据库或时间切分下,原子注意力是否保持稳定?
- 与我的研究关联:适合作为“图神经网络 + 注意力 + 生物实体关联预测”的完整入门案例;论文模块不复杂、数据和代码公开,既能练习从公式到代码的映射,也能训练对划分策略、未标注样本和复现一致性的批判性审查。
代码复现审计
- 开源程度:仓库含模型、warm/cold start脚本、数据与依赖说明,可开展复现;但没有开源许可证,复用和再发布边界不明确。
- 论文—代码一致性:
- 论文方法部分称三层GAT输出256维,而实现细节与
Net.py使用200维;应以200维为论文主实验复现配置,并记录文内矛盾。 - 论文称副作用图使用,warm-start脚本默认也是10;但
cold-scence.py默认--knn 5。若直接运行默认冷启动脚本,就不能确认是在复现论文表4,必须显式传入--knn 10。 - CAM在代码中基于拼接token的Transformer self-attention实现,名称上的“cross attention”比标准的双流cross-attention更宽泛。
- 论文方法部分称三层GAT输出256维,而实现细节与
- 已确认的高风险实现偏差:
- 副作用融合公式疑似括号bug:论文式(22)应为
(1-alpha)*x_e + alpha*si_eff_emb0,但Net.py:417写成(1-alpha*x_e) + alpha*si_eff_emb0。后者会引入常数1,并不等价于论文公式。这是确定的公式—代码不一致;是否为作者实际实验所用仍需复跑或向作者确认。 - CAM混入跨药物注意力:
Net.py:393-395把一个训练batch内所有药物的原子与994个副作用拼成一条二维token序列,再送入未设置mask的Transformer。训练batch默认10、测试batch为1,因此训练时不同药物的原子会彼此注意,推理时又不存在这种跨药物上下文,形成训练—推理分布差异。若设计目标是每种药物独立与副作用交互,应按药物分组或加入attention mask。 - 随机性未完全控制:仓库附带固定mask文件,但训练脚本没有统一设置Python、NumPy、PyTorch及CUDA训练随机种子;仅在若干预测函数中调用
torch.cuda.manual_seed(42),不足以保证模型重复训练一致。
- 副作用融合公式疑似括号bug:论文式(22)应为
- 评估协议风险:warm start把留出的已知正例置为0后,这些位置仍被损失函数当作未知项拉向。这不是读取测试真实标签的直接泄漏,但等于让测试正例以“未知/弱负”身份参与训练。与此同时,AUC把所有原始0位置当负例,而SIDER的0只是未记录,存在positive-unlabeled假阴性风险。
- 已经排除的一项风险:公开脚本在每一折中用遮蔽后的训练频率矩阵构造副作用KNN图;因此从代码流程看,没有直接用该折测试频率构图。复现时仍应保持这一顺序,避免自己重写预处理时引入标签泄漏。
- 仓库运行障碍:原始
.mat/.csv/.txt通过Git LFS保存,普通浅克隆后可能只有指针文件,需先执行git lfs pull并核对文件大小;README没有说明这一点。若预生成cold-start mask缺失,cold-scence.py的重建清理路径还少了/,generateMat()会先报错。 - 推荐复现顺序:
- 用仓库原环境和固定数据文件跑通单折warm start;
- 对齐论文的200维、和损失参数;cold start分别测试与;
- 执行10折并补报均值±标准差;
- 分别修正副作用FAM括号和CAM按药物分组,用逐项消融定位结果变化;
- 最后再扩展到门控融合、PU学习或其他生物关联任务。
被以下札记引用
2026-W34