返回列表

6th Place Solution - General Overview

442. Bristol-Myers Squibb – Molecular Translation | bms-molecular-translation

开始: 2021-03-02 结束: 2021-06-03 药物研发 数据算法赛
第6名方案 - 总体概述

第6名方案 - 总体概述

作者:Bojan Tunguz (Grandmaster) 及团队成员
发布时间:2021-06-12

模型

我们的基础模型与本次比赛中使用的通用建模方法类似:结合高端视觉模型与循环网络或Transformer来输出化学式。早期我们尝试了多种组合,但在最终的努力中,我们使用了以下三种主要组合:

  • Efficientnetv1(b5,b7) + Transformer
  • Efficientnetv2(m,l) + Transformer
  • B7 + LSTM

在融合时,我们发现将LSTM与基于Transformer的模型融合效果特别好,通常能使CV/LB整体提升高达0.2。

在比赛初期,我们混合了概率值,但随后这种方法变得难以处理,我们始终未能将其完全应用于整个解决方案。

真正起作用的“融合”方式是基于公式的正确形式进行的。早期我们就注意到,预测的正确性与正确编码的公式数量成正比。

解决方案

训练计划

最初我们使用简单的余弦退火作为训练计划,但后来切换到了带有重启的修改版半手动平台训练计划。这是Bojan在之前的几场比赛(Bengali和Alaska)中使用过的方法,发现非常有效。这种训练的自动化版本仅涉及“普通”的平台计划,一旦训练停止就重新训练。对于重新训练,我们会重新加载最佳权重,并以最大的学习率再次开始训练过程。这是一个非常耗时的训练 regimen,因为在DGX-1/DGX-Station上一个epoch可能需要2到12小时,具体取决于模型架构和分辨率。

本地验证方案

我们最初设定了5折交叉验证(CV)的训练计划,但由于训练时间极长,我们从未能训练超过一折。因此,我们的大部分模型都基于训练数据的同一个80-20分割。在最后一周,我们在96%的数据上重新训练了模型,留出4%用于验证。起初效果不错,但由于我们使用的4%采样存在一些怪癖,验证分数在某个时刻开始变得低得离谱(0.23),从那时起就无法再使用本地验证了。

我们注意到本地的oof验证分数与LB分数非常接近(相差不到0.01),因此我们决定主要依靠LB分数进行验证。这在本次比赛中风险不大,因为它是 a) 图像比赛,b) 数据集庞大,c) 合成数据。由于最终几乎没有波动,我们的假设被证明是正确的。

  1. 训练旋转检测器。并修复测试集中的方向。这使得CV和LB的相关性非常好。
  2. 数据处理
    • 2.1 裁剪边缘:我们切掉边缘以获得更多有效像素,在训练集和测试集中,边缘宽度在26到41像素之间变化,因此我们决定在训练和推理中统一切掉25像素:
      edge = 25
      image_raw = image_raw[edge:-edge, edge:-edge]
    • 2.2 过采样:我们注意到大多数验证错误发生在长度超过150个字符的公式上,因此在训练中我们决定对这些数据点进行过采样。我们使用了不同的过采样率,例如针对 len(Inchi)>150, len(Inchi)>100, len(Inchi)>200, len(Inchi)>250 等。
    • 2.3 宽高比:对于大多数模型,我们保持了相同的h/w比例,但在比赛后期我们也包括了在方形图像上训练的模型。
    • 3.4 噪声处理:测试集比训练集噪声更多,属于椒盐噪声。
      def addSaltNoise(self,image,SNR=0.99):
        if SNR==1:
            return image
        h,w = image.shape
        noiseSize = int(h*w * (1 - SNR))
        for k in range(0, noiseSize):
            xi = int(random.uniform(0, image.shape[1]))
            xj = int(random.uniform(0, image.shape[0]))
            image[xj, xi] = 0
        return image
  3. 使用不同分辨率 (256x256, 256x384, 384x512, 512x512, 640x640)。
  4. 检查InChI有效性。并尝试获得尽可能多的有效InChI。

最终的融合结果由20多个预测结果创建而成。我们按本地CV对预测进行排序。对于一张图像,找到第一个有效结果,如果这20多个结果中没有有效预测,则设置CV预测最低的结果。