442. Bristol-Myers Squibb – Molecular Translation | bms-molecular-translation
首先,我要感谢主办方组织了如此激动人心的比赛。其次,我要感谢我的队友们。我们拥有一个很棒的工作环境,每个人都非常努力,在最后一周,我们甚至不得不熬夜到凌晨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 的信息几乎为零。经过一番思考,我们决定尝试 huggingface 的 BPE 分词。
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 解码器。