442. Bristol-Myers Squibb – Molecular Translation | bms-molecular-translation
恭喜所有的获奖者,也感谢比赛主办方举办了如此精彩的比赛。
特别感谢 @hengck23 分享了伟大的想法和代码。我认为他的帖子让这场比赛变得非常活跃。
对于像我这样的单人Kaggler来说,这场比赛非常艰难,我在LB(排行榜)上受到了其他单人Kaggler( @fergusoci, @AkiraSosa, @nofreewill)的很大启发。最终,我获得了单人金牌,并以牺牲健康和许多假期为代价成为了特级大师!
我选择了两个模型进行训练,一个是图像大小为384x384的 SwinTransformer,另一个是 patchwise TNT,我是参考 @hengck23 的代码实现的。
对于 TNT,我使用了超参数 embed_dim=768, in_dim=48,这比 TNT-B 还要大。
SwinTransformer 和 TNT 作为单模型都达到了 LB~0.8 的成绩,它们的 CV 分别为 LD=0.80/0.80, CELoss=0.0030/0.0020。
我使用 @stainsby 的 notebook,利用 extra_approved_InChIs.csv 中所有的 InChIs 生成了约 1000 万张图像。训练中总共使用了约 1300 万张图像。在训练初期,额外图像的损失很高,但在长时间训练后,额外图像的损失和验证分数都有所提高。我训练了 SwinTransformer 15 个 epoch 和 TNT 20 个 epoch。在 8 x V100 的配置下,SwinTransformer 每个 epoch 耗时 20 小时,TNT 每个 epoch 耗时 12 小时。
我在每个解码器步骤中集成了 8 个模型(predict_proba 的加权平均)。这些模型有的使用比赛数据+额外数据训练,有的在此基础上仅用比赛数据进行微调,或者是不同的折。将 SwinTransformer 和 TNT 的总权重设为相等似乎很重要。集成模型的 CV 分数为 LD=0.60,CELoss=0.0013,LB:0.63。
在比赛的最后一天,我参考 fairseq 代码 实现了束搜索。
通过执行束大小为 16 的束搜索,我达到了 LB:0.60。
在比赛后期,我发现不同模型对测试数据的预测差异仅约为 2 万张。因此,束搜索或集成推理仅在这 2 万张图像上进行。
我一直使用 @nofreewill 分享的 rdkit 验证后处理方法。
随着分数的提高,后处理带来的提升逐渐减少,但直到最后仍有一点点提升。