667. NeurIPS - Open Polymer Prediction 2025 | neurips-open-polymer-prediction-2025
我的解决方案是 BERT、AutoGluon 和 Uni-Mol 模型的集成。我认为使我获胜的独特之处在于:
我还从训练外部标注数据集和一些表格特征工程技巧中获得了重大收益,但怀疑这些方面并不是特别独特。
下方包含了最终集成中每个模型的分数。这些是原始分数,未经过后处理技巧。最终集成中的所有模型都是特定属性的(非多任务),因此下面的每一行对应于 5 个相同类型的模型,分别为 5 个目标属性生成预测。
| 模型 | 公共榜单分数 | 私有榜单分数 |
|---|---|---|
| ModernBERT-base | 0.059 | 0.089 |
| CodeBERT | 0.058 | 0.090 |
| AutoGluon | 0.062 | 0.091 |
| Uni-Mol 2 84M | 0.062 | 0.091 |
集成模型分数:
| 是否使用后处理? | 公共榜单分数 | 私有榜单分数 |
|---|---|---|
| 否 | 0.058 | 0.089 |
| 是 | 0.054 | 0.075 |
简而言之 - 关键技巧是 submission_df["Tg"] += (submission_df["Tg"].std() * 0.5644)
详细版本:
我不相信 LB 测试数据在最后一次更新后完全固定,所以我做了一些探测,通过将每个属性的预测值调整 +/- 0.1 * (该属性预测值的标准差) 来检查分布偏移。这 reveals 了 Tg 存在一些问题,但我没有立即尝试调查或 aggressively 利用它,因为我认为这可能是随机噪声,如果真的有问题,其他人可能会抱怨。然后,在最后一周,我开始探测以找出最佳偏移量,这 reveals 了测试数据存在严重问题。下方的图表包含了这些结果。这部分基于我在比赛结束后通过晚期提交所做的一些补充探测,用于决定后处理如何工作的结果不太完整。
我所应用的集成模型的原始 Tg 预测不可能偏差这么大,即使是对于标签稀疏的公共 LB 数据也是如此,因此系数 <= 0.5 的不完整探测足以让我相信测试数据出了问题。问题太严重了,我甚至不认为低行数和潜在的稀疏标签足以让随机噪声成为合理的解释;我基于一些粗略假设计算出的 p 值 < 0.01,因此我将此视为统计证据,表明测试数据集的标签系统性地错误超过 99% 的概率,随机噪声不是合理的解释。
我在想,如果标签偏离了一个常数偏差项(由于宿主数据准备管道中的错误),那么“偏差系数”(简而言之中的 0.5644 魔法常数)与 LB 分数之间的关系可能可能是某种"V"形曲线,在某最佳点两侧具有线性函数,且斜率符号相反但大小相同。基于偏差系数 <= 0.5 或 == 1.0 的公共 LB 分数,可以拟合一个几乎完美符合数据的 V 形曲线,预测的最佳系数为 0.5644,这确实在公共 LB 上比我迄今为止尝试的任何东西得分都高。我还尝试了分段函数,在某些范围内对原始预测应用更高或更低的偏移,以及依赖于 Tg 预测的线性斜率,但无法 quickly 让任何这些方法得分优于对所有预测相同的简单常数偏差,所以这是我最终提交之一所采用的方法。另一个最终提交只是生成了原始 Tg 预测,以防私有 LB 数据中问题已修复(但并没有)。
现在私有 LB 分数已经 reveal,很明显导致训练与公共 LB 分布偏移的原因在私有 LB 数据中更严重,但我直到最后才看到这一点。因此,我选择的后处理有些次优,但我并没有像大多数其他竞争者那样被完全蒙蔽。
榜单的测试数据集并不是唯一拥有脏标签的,我训练的所有外部数据集也有自己独特的不良怪癖。通常是随机标签噪声、与真实值具有奇怪非线性关系的标签、偏离某些常数偏差因子的标签和/或分布外的异常样本的混合。我使用了以下概述的 5 种策略混合来处理。前 3 种策略的组合足以从大多数数据集中提取有用的东西,最后 2 种仅在少数情况下使用。
为了在调整外部数据配置时保持交叉验证结果一致,并防止不现实的测试样本影响我的 CV 分数,交叉验证分数仅使用来自原始宿主数据的样本进行计算。 broadly speaking,CV 策略是在 100% 选定的外部数据 + 80% 宿主数据上训练,然后在 20% 宿主数据上测试,然后重复该过程 5 次,每次保留不同的宿主数据。
我没有仔细跟踪上述第 1-4 项有多大帮助,但 Optuna 非常喜欢它们,足以以一些相当积极的配置启用它们,所以我认为它们在本地交叉验证测试中至少是有益的。
许多数据集包含彼此重复或近乎重复的聚合物。我使用了两种策略的混合来处理这个问题,为了避免训练集和测试集之间的泄露,比训练数据内的重复更积极地去重。
我的 BERT 模型分 2 个阶段训练,这是在 HuggingFace hub 上计算预训练权重 whatever 预训练之后。
数据增强:
Chem.MolToSmiles(..., canonical=False, doRandom=True, isomericSmiles=True) 为每个输入 SMILES 创建 10 个非规范 SMILES,以增加训练数据量约 10 倍。我还尝试了随机使用 Kukulized SMILES,去除立体化学,并使氢和键更明确,但这些增强没有beneficial。仅测试时增强就在一个早期实验中提供了约 0.01 的 LB 改进。我的笔记太碎片化了,无法在没有额外消融测试的情况下准确说明训练数据增强有多大帮助,但我印象非常深刻,并且 10 倍的训练数据增强因子在 +/- 30% 的范围内是最佳的(与测试时增强不同,越多越好)。
基础模型选择:
ChemBERTa 达到的最佳 CV wMAE 分数为 0.0634,使用 polyBERT 达到的最佳分数为 0.592,使用 ModernBERT-base 达到的最佳分数为 0.0584。所以,通用模型击败了任何特定化学或聚合物的模型。ModernBERT-large 得分为 0.0587,而 -base 得分为 0.0584。所以扩大规模使分数变差。DeBERTa-v3-large 的分数也很差,所以我不认为这种行为孤立于 ModernBERT 家族。DeBERTa-v3-large 大约和 ChemBERTa 一样差, substantially worse than ModernBERT-base 或 ModernBERT-large。在思考为什么会这样时,我回忆起 ModernBERT 家族在编程相关基准上也得分不成比例地好,并且在其预训练数据集中有相对大量的代码,所以这导致我想知道如果在代码与自然语言的比率上训练更高的模型是否会得分甚至更好,这导致我尝试了 CodeBERT。CodeBERT 最终成为我最佳单一模型的并列者。在交叉验证测试和公共榜单上略优于 ModernBERT-base,在私有榜单上略差,但通常足够接近误差范围,并且 substantially better than 任何纯粹 trained on 化学或英语数据的模型。特征工程: 特征从以下 broad categories 中选择。我使用 Optuna 调整了我尝试的每个属性和类型的表格模型使用的特征。它能够丢弃整个特征类别,调整指纹维度计数,并对分子描述符执行基于重要性的特征选择。特征重要性分数是为 XGBoost 和 LightGBM 模型的集成预计算的,跨目标属性平均,并在后续运行中共享。Optuna 能够调整保留每种类型的前 N 个特征的数量。
数据生成: 如上所述,我为 PI1M 中的 1,000 多个假设聚合物运行了分子动力学模拟,并使用它来训练模型,其预测用作其他表格模型的补充特征,这略微提高了我的 CV 分数(~0.0005 wMAE)。我采取了很多捷径来节省 CPU 时间,这设置起来非常复杂,而且我没有 prior MD 经验,所以结果有用简直是个小奇迹。我的数据生成管道中的主要步骤概述如下。
AutoGluon 与“传统方法”: AutoGluon 的"best"质量预设,每个属性 2 小时限制,能够击败我用 Optuna 调整和约 20 倍计算量调整的 XGBoost、LightGBM 和 TabM 模型的集成(不包括数据预处理调整,每个下游预测库我 paired it with 大约是 ~1 天,或者我在 settling on XGB + LGBM + TabM 用于相对手动集成之前尝试的所有其他模型)。它的 wMAE 分数比相对手动集成好约 2%,足够好,以至于制作 AutoGluon + 我更手动构建的集成的集成没有用。"best"质量 AutoGluon 运行非常慢,所以为了让数据调整在合理的时间框架内运行并具有 decent trial count,我将其与 5 分钟时间限制的"good"质量 AG 运行 paired。这是我第一次使用 AutoGluon,我发现它非常令人印象深刻。投入手动集成的努力水平可能只有我用来赢得 UM MCTS 比赛的三分之一,所以如果我真的全力以赴并且没有被非表格实验分心,我有可能击败它,但我绝对被 AutoGluon 的效率惊呆了。AG 1.4.0 中引入的"extreme"质量预设据说甚至更准确和高效,但当我尝试切换过去时没有观察到任何好处(可能是因为特征计数太高,无法使用其所有模型 - 我看到了一些关于此的错误),所以我最终集成中的表格预测器是使用"best"质量预设创建的。
这是所有准确到足以进入我最终集成的模型中最简单的。只不过是将合并、清理的数据集对于每个目标属性 toss into unimol_tools.MolTrain 并使用 Optuna 调整学习率、epoch count 和批量大小。它不需要任何特征工程或自定义训练循环。我甚至没有调整我的数据准备代码的设置;它们大致是我为各种类型的表格模型调整的一些配置的中位数。唯一的真正问题是 (1) 这比我尝试的任何其他模型都更 memory intensive,以至于如果训练数据包含任何具有超过 ~130 个原子的单体,24 GB GPU 上会发生 OOM 错误,(2) FFV 结果不是很好。OOM 问题对于 FFV 比任何其他目标更是一个问题(因为 FFV 训练数据集的单体比任何其他属性的单体更大),但即使在升级到可以运行训练且限制较少的 RTX 5090 并让 Optuna 花费几天时间进行超参数调整后,我仍然无法获得准确到足以有用的 FFV 结果。所以 Uni-Mol 2 只进入了 5 个目标中的 4 个的最终集成,AutoGluon 和 BERT 用于所有 5 个。