返回列表

9th Place Solution

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

开始: 2021-03-02 结束: 2021-06-03 药物研发 数据算法赛
第9名解决方案

第9名解决方案

作者: DrHB, tugstugi, ZFTurbo, Youhan Lee

首先,我要感谢主办方组织了如此激动人心的比赛。其次,我要感谢我的队友们。我们拥有一个很棒的工作环境,每个人都非常努力,在最后一周,我们甚至不得不熬夜到凌晨3点(当地时间)。下面我将尝试总结我们要表现最好的模型的主要思路。

图像预处理

这次比赛的挑战之一是化学结构差异很大,有些非常长,有些则非常短。这意味着图像在大小和形状上高度多样化(例如,在一个轴上超长或超小)。因此,正确预处理这些图像至关重要。经过初步讨论,我们决定尝试两种方法:

1) 简单缩放
优点 - 我们能获取所有信息(某种程度上)
缺点 - 图像特征会变形(在一个轴上极度收缩)

2) 保持纵横比缩放
优点 - 这种方法能保留特征
缺点 - 较大的图像在缩小时,特征会变得极其微小

这两种方法各有优劣,但我们认为最好的方式是让每个队员选择其中一种方法并坚持使用。我们还发现了一篇很棒的文章,指出大多数现代计算机视觉库使用的调整大小方法都存在很多漏洞(https://arxiv.org/pdf/2104.11222.pdf)。由于我们在缩小时处理大量的线条,保留大部分信息至关重要(简而言之:使用 PIL)。

图像增强

我们决定使用数据集中存在的自然图像增强。但为了增加一些多样性,我们决定每个人在稍微不同的增强集上进行训练。

集合 1:
RandomRotate90(随机旋转90度)

集合 2:

RandomBorderCropPixel (从图像边缘随机裁剪 5-20 像素)
RandomRotate90
RandomNoiseAugment (随机噪声增强)

集合 3:

RandomRotate90
RandomBorderCropPixel (从图像边缘随机裁剪 5-20 像素)
RandomNoiseAugment
RandomLineRemoval (随机线条移除)
RandomPiexlThreshold (一些化学线条有不同的黑色像素色调,所以我们执行以下操作)
thr = random.randint(200, 250)
img[img < thr] = 0
img[img >= thr] = 255

分词器

@yasufuminakama 的分词器很棒,但我们想知道是否有更好的分词方法。我们发现了很多关于使用 SMILES 进行不同分词策略的研究,但关于 InChI 的信息几乎为零。经过一番思考,我们决定尝试 huggingfaceBPE 分词。

vocab = 128 # 可以是任意值
tokenizer = Tokenizer(BPE(unk_token="[]", fuse_unk=False))
pre_tokenizer = pre_tokenizers.Sequence([Whitespace(), Digits()])
tokenizer.pre_tokenizer = pre_tokenizer
trainer = BpeTrainer(vocab = max_len, special_tokens=["[]", "[]", "[]", "[]"])

我们使用 resnet34 和几个不同 vocab 大小的 BPE 分词器 进行了一个简单的小规模实验。结果如下:

42 字符分词 - 9.7
64 BPE 分词 - 8.9
128 BPE 分词 - 8.01
246 BPE 分词 - 6.9  

这清楚地表明,更大的词汇量能带来更好的学习嵌入。像往常一样,最后我们决定使用三种不同的分词器来带来更多的多样性。
1) Y.nakama 分词器
2) BPE - 512
3) BPE - 1024

模型

我们决定训练几个不同的模型,结合上述所有内容,并在测试数据上进行渐进式伪标签(仅取有效的 InChI)。总共有以下模块:

1)effnetv2 -> encoder(6) -> decoder(8, 10, 12)
2)effnet3 -> encoder(3) -> decoder(3)
3)vit/cait/swin

对于视觉 Transformer,我们使用了 hengs 解码器。

同比赛其他方案