第 11 名解决方案 - SSL 预训练、多模型、多表示与运气
作者: Đăng Nguyễn Hồng
排名: 第 11 名
发布时间: 2024-07-09
第 11 名解决方案 - SSL 预训练、多模型、多表示与运气
首先,我要感谢 Kaggle 和比赛主办方举办了另一个有趣的挑战,这让我头疼了很久 :D
感谢所有参与者,尤其是那些在论坛中积极讨论并提供许多良好见解/代码的人。像在 Kaggle 上一样,我学到了很多新东西,度过了一段美好的时光。
第一印象
- 我训练了一个仅基于构建块 ID 的 Embedding + MLP 模型,例如 [BB1, BB2, BB3] = [100, 200, 300]。是的,它只看 ID。这个模型在 StratifiedKFold(n_splits=20) 上得分 shared_AP=65.5,确实超过了我的一些不看每个构建块长什么样的 SMILES+CNN1d 模型。这强烈表明模型可以 memorize 目标结合,过拟合就在附近。
- 多次尝试但实际上我未能建立一个可信的交叉验证 (CV) 方案。在这种情况下,我决定盲目地关注“多样性”这个时髦的词:多个模型、多种输入表示和 SSL 预训练。我认为这个策略确实让我在这场洗牌比赛中幸存下来。
如何进行交叉验证?
如上所述,我不知道。
我每折的拆分策略:
1. [11k 样本] 保留一部分构建块用于验证:每个折中 17 个 BB1 + 36 个 BB2,并保持正样本比例感知平衡。
2. [78k 样本] 留下 20% 具有最规则骨架的分子(> 6116 分子/骨架)用于训练,然后在剩余 80% 分子上进行骨架拆分
3. [103k 样本] 对剩余部分进行分层随机拆分
总计:11k 非共享 + 181k 共享,模拟排行榜
此策略在共享部分上比纯随机拆分创建了一个稍“难”一点的环境。
困难的部分在于 11k 非共享数据。关于非共享交叉验证的一些观察:
- 交叉验证分数在不同折之间变化很大。我发现很难识别趋势/相关性,或者哪些有效/无效。
- 早停应该有帮助,但也很难回答“何时”?通常最佳分数出现在前 2 个 epoch,但也可能更长。

每列格式为:分数 (最佳 epoch)。所有结果属于单次拆分,非共享正样本率为 [0.571, 0.638, 0.714] %
- 合适的超参数在不同折之间也有很大差异。看起来在折 A 中最佳设置且得分最好的,在折 B 中可能得分最差 :(
- 对于某一个特定的折:分数也会因为超参数的微小变化(如随机种子、验证间隔等)而发生显著变化(13.5 -> 32.4,什么?)
- 在排行榜非共享相似构建块上过拟合模型可以提高非共享排行榜分数。
构建块 ECFP6 -> Tanimoto 相似度 -> 线性分配匹配 以选择最相似/最不相似的 170 BB1 + 360 BB2/3,然后在此子集上过拟合 1D-CNN。相似样本的排行榜分数=8.8,不相似=3.9。这表明我们可以通过更关注这些相似样本来提高排行榜分数。后来我选择了最相似的 17 个 BB1 + 36 个 BB2/3 作为验证集,并试图在此拆分上提高交叉验证分数,但提高的交叉验证分数导致非共享排行榜分数下降,这让我很困惑。
总之,越来越多的实验搞乱了我的思绪。变化太大,对我来说似乎是随机的。我放弃了,转而专注于 SSL 预训练,通过使用 多个模型 和 多种输入表示 来提高多样性,几乎所有模型都是 在没有交叉验证的情况下盲目地在所有比赛数据上训练,因为我不相信单一的交叉验证拆分,而在多个交叉验证拆分上训练似乎太耗时。
SSL 预训练
2 个预训练任务:
- MLM(掩码语言建模)采用标准设置:15% 掩码 token,80%-10%-10% 替换为
[MASK]/随机 token/保持不变。
- MTR(多任务回归):回归 189 个预计算的 RDKit 描述符。与文献中的 CDF 变换相比,这些目标值进行了 min-max 归一化。
联合 MTR + MLM 预训练 + SMILES 枚举 在 MolBERT 中提到取得了成功,这启发我也试一试。
使用所有数据(训练 + 测试)进行预训练,对测试数据集赋予更大的采样权重,以平衡每个构建块的频率,并“更熟悉”新域测试数据集。
我训练了 3 个模型用于比赛任务的微调:
- Squeezeformer +
MTR
- Squeezeformer +
联合 MTR + MLM
- Roberta +
联合 MTR + MLM
建模
所有模型同时预测 3 个目标。有些模型在最后一天没有收敛,必须终止训练以按时完成:
- 分子指纹 + MLP
- 指纹:ECFP6, Topological Torsion, MHFP
- MLP 隐藏层通道 [1024, 1024], dropout = 0.3
- 尝试了 KAN 但没有超过 MLP
- 独立特征匹配 (IFM) 没有提升
- 基于 SHAP 的特征选择也没有提升。很长一段时间我相信特征选择是减少共享 - 非共享差距和噪声信号引起的过拟合的关键,但对此没有成功。
- 基于字符串的 1D-CNN
- 输入表示:SMILES, Atom-In-Smiles (AIS), SELFIES, DeepSMILES
- 模型:改进自 优秀的公开 notebook,只添加了 MaskedBatchNorm, MaskedAttentionPooling 并放大到更大尺寸 (depth = 6, dim=128)
- 所有输入表示在共享部分都给出同样好的结果。SELFIES 在非共享部分结果稍差,且收敛速度慢于其他输入表示。
- 更深 -> 更好的泛化。
(depth=8, dim=64) 在非共享上 > (depth=3, dim=512),但在共享上 <。(depth=3, dim=512) 也能更好地记住训练集(更高的训练 AP),同时达到相似的共享 AP。这需要更多实验来确认。
- 基于字符串的混合 CNN-Transformer
- 输入表示:SMILES, Atom-In-Smiles
- 模型:Squeezeformer, depth = 6, dim=64/96/128
- 无位置编码,CNN 完成工作。ROPE 降低了交叉验证分数。
- 预训练:
无预训练 或 MTR 或 MLM+MTR
- 基于字符串的 Transformer
- 输入表示:SMILES
- 模型:Roberta, depth=6, dim=256, Absolute PE
- 预训练:
MLM+MTR
- 基于字符串的 MAMBA
- 输入表示:SMILES
- 模型:Mamba, depth=8, dim=128
- GNNs
- GIN depth=5, dim=300,从公开预训练的 Mole-BERT 微调(在 ZINC 上预训练)
- GCN/GraphSAGE depth=5, dim=128
- Catboost
- 12 折集成,覆盖所有训练数据集。每折包含所有正样本和 5.0 倍的负样本。
- Max_depth=10, lr=0.2, iterations=4000, bootstrap_type='No'
一些用于最终集成的建模结果。我认为需要分析共享/非共享/新库分数以进行进一步分析,我稍后会更新这些结果。
简单的加权集成,启发式权重分数 PB=27.8 和 LB=44.8。
确实有一些单模型具有更高的 PB 分数,但集成减少了方差并给出了更稳定/可信的结果。这个结果幸运地足以获得金牌。
代码
感谢您的关注!