返回目录
公开知识笔记 · 不进入目录

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理解成两条信息通路:

  1. GAM(Graph Attention Module) 回答“药物内部原子如何连接、副作用之间如何关联”;
  2. CAM(Cross Attention Module) 回答“某些药物原子与某些副作用之间可能如何相互关注”;
  3. FAM(Feature Aggregation Module) 按固定权重融合两条通路;
  4. 融合后的药物向量与副作用向量做内积,得到完整频率矩阵。

因此,真正值得学习的不是“又用了一个Transformer”,而是作者把实体内部结构信息与实体之间交互信息拆开建模,再在统一空间中融合。

关联概念:图卷积网络GCN · 注意力机制

📚 零基础概念导读

下表按“先读任务,再读数据表示,然后读模型与评估”的顺序组织。每个链接都指向 导学/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种副作用之间的频率关系,共构成750×994=745,500750\times994=745{,}500个候选组合。任务背景见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

看图要点:

  1. 同一输入并行走 GAM 与 CAM 两条通路,最后才融合,不是串行;
  2. 109/243 维都是节点级初始特征,药物级向量在 max pooling 之后才出现;
  3. 副作用 GAT 输出不池化(994 个副作用各留一个 200 维向量);
  4. 代码层面:GAT 维度 109→1280→2000→200(副作用侧 243 起同构);CAM 实际是拼接 token 后的 self-attention(训练 batch=10 时存在跨药物注意);FAM 存在括号 bug,详见"代码复现审计"。

方法分析

  • 分析单位:药物—副作用配对;药物侧的更细粒度单位是分子中的原子。
  • 关键输入:
    • 药物SMILES经RDKit转换为分子图;每个原子编码为109维化学属性向量,边表示化学键;
    • 副作用节点使用MedDRA层级术语编码为243维向量;
    • 副作用之间依据训练频率轮廓相似性构建K=10K=10的KNN图;
    • 标签为SIDER五级发生频率矩阵。
  • 识别/推断逻辑:本文属于预测而非因果识别。模型利用已观测频率及结构特征学习配对得分,交叉验证检验对留出配对或留出药物的泛化能力,不能据此推断某个原子结构“导致”某种副作用。
  • 具体步骤:
    1. 将SIDER发生率区间编码为1(very rare)至5(very frequent),未知项记为0。
    2. 从SMILES构造750个药物分子图;从副作用频率轮廓构造994节点的KNN图,并载入MedDRA特征。
    3. 在药物图和副作用图上分别运行多头GAT,得到结构通路表示;药物原子表示通过global max pooling汇总为药物表示。
    4. 将药物原子特征与全部副作用特征映射到同一空间、拼接为token序列,经过6层、8头Transformer编码器获得交互通路表示;这属于拼接token后的自注意力实现。
    5. 用γd=γs=0.15\gamma_d=\gamma_s=0.15融合GAM与CAM表示,得到200维药物和副作用向量,详见特征聚合与多模态融合。
    6. 对药物矩阵与副作用矩阵做内积解码,产生750×994750\times994预测矩阵。
    7. 用加权平方损失同时拟合已知频率,并把未知位置约束到固定基线δ=0.5\delta=0.5;Adam学习率为10−410^{-4}。
    8. warm start随机留出已知药物—副作用频率;cold start按药物分组留出整行,均进行10折交叉验证。

核心公式

  • 交互注意力:在统一空间中计算药物原子token与副作用token的注意力。
Attention⁡(Q,K,V)=softmax⁡(QK⊤dk)V\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
  • 公式拆解:Q,K,VQ,K,V来自拼接后的药物原子和副作用特征;展开QK⊤VQK^\top V后既包含各自内部关系,也包含药物—副作用的交叉项。需要注意,论文将其称为cross attention,但实现形式更接近“拼接token后的self-attention”。

  • 双路特征聚合:用固定权重融合图结构通路和交互通路。

x=(1−γd)dGAM+γddCAM,y=(1−γs)sGAM+γssCAM\mathbf{x}=(1-\gamma_d)\mathbf{d}_{\mathrm{GAM}}+\gamma_d\mathbf{d}_{\mathrm{CAM}},\qquad \mathbf{y}=(1-\gamma_s)\mathbf{s}_{\mathrm{GAM}}+\gamma_s\mathbf{s}_{\mathrm{CAM}}
  • 公式拆解:x\mathbf{x}和y\mathbf{y}分别是药物与副作用最终表示;γd,γs=0.15\gamma_d,\gamma_s=0.15意味着论文设置中GAM结构信息占主导。

  • 频率解码与稀疏损失:

S^=XY⊤\hat{\mathbf S}=\mathbf X\mathbf Y^\top L=∥VΓ⊙(S^−S)∥F2+α∥VΛ⊙(S^−δE)∥F2\mathcal L= \left\|\mathbf V_{\Gamma}\odot(\hat{\mathbf S}-\mathbf S)\right\|_F^2 +\alpha\left\|\mathbf V_{\Lambda}\odot(\hat{\mathbf S}-\delta\mathbf E)\right\|_F^2
  • 公式拆解:VΓ\mathbf V_{\Gamma}和VΛ\mathbf V_{\Lambda}分别选择已知与未知位置;第一项拟合真实等级,第二项把未知位置拉向δ=0.5\delta=0.5,α=0.03\alpha=0.03降低未知项因数量过多而支配训练的风险。

方法优势

  • 将“实体内部图结构”与“实体间配对交互”拆成两条通路,模型结构与研究问题对应清楚。
  • 同时报告关联排序、频率误差以及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;没有跨数据库、时间外推或临床前瞻验证,也没有测试“新副作用”冷启动。
  • 注意力不等于因果解释:原子注意力案例可用于提出假设,但没有实验或外部知识验证,不能把高注意力原子直接解释为副作用机制。
  • 超参数选择流程不够透明:论文展示KK和注意力头数敏感性,但没有清楚区分调参集与最终测试集。
  • 注意力推导只是示意:论文式(20)为展开交叉项而省略softmax与1/dk1/\sqrt{d_k},并称二者只改变数值大小;但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 给出副作用节点的初始语义特征。不要把 750×994750\times994 矩阵中的 0 当作可靠的“无副作用”标签:作者将它定义为未知频率,并在损失函数中作为另一类位置处理。数据集与编码,原文 p.2 · 稀疏损失,原文 p.4–5

1. 先把一条数据看明白

  • 分析单位(一行/一个样本代表什么):最终监督单位是一个“药物 dd — 副作用 ss”配对及其发生频率等级 SdsS_{ds};但模型输入不是一张普通的二维表,而是药物的变长原子图和共享的副作用图。一个药物会对应多个原子节点,一个副作用对应一个图节点。数据集,原文 p.2 · 图表示,原文 p.3
  • 数据形状与粒度:频率标签矩阵 S∈R750×994S\in\mathbb R^{750\times994};共 750 种药物、994 种副作用、745,500 个候选配对。其中只有 37,071 个配对(4.97%)有记录频率,其余 95.03% 为未知。药物图的节点数随分子而变,副作用图固定有 994 个节点。原文 p.2 · 原文 p.3
  • 标签如何得到:SIDER 4.1 的临床频率区间被离散为 1–5 级:<0.01%<0.01\%、0.01%0.01\%–0.1%0.1\%、0.1%0.1\%–1%1\%、1%1\%–10%10\%、≥10%\ge10\%;未记录项编码为 0。故它同时是“是否有已知关联”的排序任务和“已知关联频率等级”的数值预测任务。原文 p.2
  • 类别不平衡:所有位置中,等级 1–5 分别只占 0.16%、0.56%、1.34%、2.36%、0.55%;这解释了为何只报准确率会误导,论文同时报告排序与频率误差指标。原文 p.2 · 指标定义,原文 p.5

2. 变量、特征与标签

在模型中的角色 原文名称/含义 如何测量或构造 最终如何使用 证据定位
结果变量 / 标签 药物—副作用频率 SdsS_{ds} 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
副作用侧图结构 K=10K=10 KNN 邻接矩阵 用频率矩阵中两个副作用的列向量余弦相似度,连接最近的 10 个副作用 给副作用 GAT 提供“哪些副作用可互相传递信息”的边 原文 p.3

3. 从原始数据到模型输入

环节 原文做了什么 这一步为何影响模型/结论 证据定位
获取与对齐 将 SIDER 频率、DrugBank/PubChem 的 SMILES、MedDRA 术语放到同一批药物和副作用实体上 三种来源必须以药物与副作用身份对齐;否则标签、分子结构和术语特征会错配。具体的实体映射/去重规则原文未报告 原文 p.2–3
标签编码 把连续区间离散成 1–5,未记录设为 0 模型学的是有序等级的矩阵补全;离散化让频率可统一训练,但丢失区间内部差异 原文 p.2
药物图构造 SMILES → RDKit → 原子特征矩阵 FiF_i 与键邻接矩阵 AiA_i 让 GAT 可在化学键邻居间传递信息;每个药物的原子数不同,因此先在节点级计算、后用 global max pooling 变成一个药物向量 原文 p.3 · 原文 p.4
副作用图构造 用 SS 的列向量计算余弦相似度,再以 K=10K=10 建 KNN 图 将“频率模式相近”的副作用相连,使 GAT 能借邻居补充表示;这也意味着图结构包含标签矩阵信息 原文 p.3
统一表示与融合 109 维原子特征、243 维副作用特征先经全连接层映射到同一空间;GAM 与 CAM 各自产生 200 维表示,按 γd=γs=0.15\gamma_d=\gamma_s=0.15 融合 不同原始维度不能直接做注意力;映射与融合让“结构通路”和“交互通路”能共同服务同一内积解码器 原文 p.3–5
进入模型与训练 融合后的药物矩阵 XX 和副作用矩阵 YY 内积得到 S^=XY⊤\hat S=XY^\top;已知位置拟合 1–5,未知位置被拉向 δ=0.5\delta=0.5,权重 α=0.03\alpha=0.03 这不是只在 37,071 个正例上训练:大量未知位置也参与损失。α\alpha 用于防止未知位置数量过大而主导优化,但 δ=0.5\delta=0.5 是关键建模假设 原文 p.4–5

4. 数据设计如何支撑模型搭建

  • 模型为什么能使用这份数据:药物分子天然是图(原子—化学键),副作用虽没有天然边,却可由训练频率轮廓和 MedDRA 表示构成图;两类节点特征被投影到同一 200 维空间,因而可由注意力学习交互,最后以向量内积为每一药物—副作用对赋分。原文 p.3–5
  • warm start 划分:原文说明采用 10 折交叉验证,但未在方法正文中精确说明每一折如何从“已记录频率”抽边、如何处理被留出的正例。现有代码复现审计显示:留出位置会被置为 0,随后仍以“未知位置”身份进入损失的 δ=0.5\delta=0.5 项;这不等于直接读取测试标签,却会使测试正例以弱负/未知形式影响训练,复现时应单独对比“完全不参与损失”的严格切分。 交叉验证,原文 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 图由频率标签矩阵 SS 构造;若在某一折切分之前就用完整 SS 建图,测试频率会进入训练图结构。论文正文未报告这一步的折内时序;公开脚本审计表明其在遮蔽后构图,但任何重写预处理的复现都必须重新核验。 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—疾病等异质配对预测任务的设计模式。
  • 可借鉴的方法:
    1. 同时设计随机配对留出和实体级留出,避免只报告容易的warm start;
    2. 将结构通路与交互通路显式分离,便于做模块消融和表示诊断;
    3. 同时报告关联发现指标与频率回归指标,避免单一AUC掩盖频率误差。
  • 复现时必须补的检验:每折重新用训练矩阵构建副作用KNN图;固定并记录所有随机种子;报告10折均值±标准差;将0值当“未标注”而非真负样本做敏感性分析;同时复现原始代码与修正实现。
  • 可继续追问的问题:
    1. 若用严格的positive-unlabeled学习替代“未知值拉向0.5”,结果是否仍成立?
    2. 若将固定γ=0.15\gamma=0.15替换为样本自适应门控,是否能改善不同指标间的权衡?
    3. CAM学到的是稳定的药物—副作用交互,还是数据集中共同频率模式的统计捷径?
    4. 在跨数据库或时间切分下,原子注意力是否保持稳定?
  • 与我的研究关联:适合作为“图神经网络 + 注意力 + 生物实体关联预测”的完整入门案例;论文模块不复杂、数据和代码公开,既能练习从公式到代码的映射,也能训练对划分策略、未标注样本和复现一致性的批判性审查。

代码复现审计

  • 开源程度:仓库含模型、warm/cold start脚本、数据与依赖说明,可开展复现;但没有开源许可证,复用和再发布边界不明确。
  • 论文—代码一致性:
    • 论文方法部分称三层GAT输出256维,而实现细节与Net.py使用200维;应以200维为论文主实验复现配置,并记录文内矛盾。
    • 论文称副作用图使用K=10K=10,warm-start脚本默认也是10;但cold-scence.py默认--knn 5。若直接运行默认冷启动脚本,就不能确认是在复现论文表4,必须显式传入--knn 10。
    • CAM在代码中基于拼接token的Transformer self-attention实现,名称上的“cross attention”比标准的双流cross-attention更宽泛。
  • 已确认的高风险实现偏差:
    1. 副作用融合公式疑似括号bug:论文式(22)应为(1-alpha)*x_e + alpha*si_eff_emb0,但Net.py:417写成(1-alpha*x_e) + alpha*si_eff_emb0。后者会引入常数1,并不等价于论文公式。这是确定的公式—代码不一致;是否为作者实际实验所用仍需复跑或向作者确认。
    2. CAM混入跨药物注意力:Net.py:393-395把一个训练batch内所有药物的原子与994个副作用拼成一条二维token序列,再送入未设置mask的Transformer。训练batch默认10、测试batch为1,因此训练时不同药物的原子会彼此注意,推理时又不存在这种跨药物上下文,形成训练—推理分布差异。若设计目标是每种药物独立与副作用交互,应按药物分组或加入attention mask。
    3. 随机性未完全控制:仓库附带固定mask文件,但训练脚本没有统一设置Python、NumPy、PyTorch及CUDA训练随机种子;仅在若干预测函数中调用torch.cuda.manual_seed(42),不足以保证模型重复训练一致。
  • 评估协议风险:warm start把留出的已知正例置为0后,这些位置仍被损失函数当作未知项拉向δ=0.5\delta=0.5。这不是读取测试真实标签的直接泄漏,但等于让测试正例以“未知/弱负”身份参与训练。与此同时,AUC把所有原始0位置当负例,而SIDER的0只是未记录,存在positive-unlabeled假阴性风险。
  • 已经排除的一项风险:公开脚本在每一折中用遮蔽后的训练频率矩阵构造副作用KNN图;因此从代码流程看,没有直接用该折测试频率构图。复现时仍应保持这一顺序,避免自己重写预处理时引入标签泄漏。
  • 仓库运行障碍:原始.mat/.csv/.txt通过Git LFS保存,普通浅克隆后可能只有指针文件,需先执行git lfs pull并核对文件大小;README没有说明这一点。若预生成cold-start mask缺失,cold-scence.py的重建清理路径还少了/,generateMat()会先报错。
  • 推荐复现顺序:
    1. 用仓库原环境和固定数据文件跑通单折warm start;
    2. 对齐论文的200维、γ=0.15\gamma=0.15和损失参数;cold start分别测试K=5K=5与K=10K=10;
    3. 执行10折并补报均值±标准差;
    4. 分别修正副作用FAM括号和CAM按药物分组,用逐项消融定位结果变化;
    5. 最后再扩展到门控融合、PU学习或其他生物关联任务。