442. Bristol-Myers Squibb – Molecular Translation | bms-molecular-translation
我使用了4096个字节对编码,这些编码是利用 sentencepiece 从纯 InChI 文本中创建的。
CNN -> 编码器 -> 解码器
CNN 是一个自定义模型,由以下结构的5层堆叠而成:
def forward(self, x_in):
x = self.bnl1(x_in)
x = self.bnl2(x) + self.bnl4(self.bnl3(x))
x = torch.cat((x, self.pool(x_in)), dim=1) if self.r else x
return x
其中 bnl[1234] 是卷积层,后接批归一化 和 ReLU 激活函数。
编码器和解码器均基于 Transformer 架构。
我移除了不含碳原子或 /i 后没有 /b 层的样本(因为此类样本太少)。
我根据以下因素为每个分子计算了一个权重:
x.count('-') + x.count('-') * x.count('(') + x.count('('){1/M, 1/(N-M)} 中的一个值。我将这些值取幂后通过合理的系数相加 -> 得到了每个分子的最终采样权重。
交叉熵损失;Adam 优化器;单周期学习率 调度;混合精度训练 + FP32 微调。
计划性的注意力丢弃 和 DropHead。我还使用了 sentencepiece 的 BPE-dropout。
我在不同的长宽比上训练了5个模型。然后,我还在另一个不同的长宽比上对每个模型进行了几个 epoch 的训练。
它们在我的验证集上的单独 LD(Levenshtein Distance,编辑距离)如下:
img_sizes = [(160,224), (192,192),
(256,544), (224,640), (320,480),
(288,512), (320,480), (480,320),
(288,512), (256,576), (320,448),
(384,384), (352,416), (192,768),]
raw_lds = [1.5233, 1.5275,
1.0955, 1.1850, 1.0699,
1.1706, 1.0629, 1.3790,
1.0664, 1.1234, 1.0832,
1.4073, 1.2095, 2.1064,]
norm_lds = [1.3661, 1.3879,
0.9438, 1.0244, 0.9248,
1.0205, 0.9280, 1.2254,
0.9415, 0.9923, 0.9400,
1.2318, 1.0646, 1.9285,]
我用所有模型分别预测了所有分子,并对所有预测结果进行了归一化处理。
然后我搜索了那些具有相同归一化形式的预测结果。
我用大小为16的集成集束搜索 预测了剩余的分子(约39万),并找出了那些无效的预测。这些(约1.6万)我用大小为64的集束搜索重新进行了预测。
综合所有这些预测,我只有大约5000个分子没有有效的预测结果。
我用一堆其他设置(不同的集束大小和集成权重)预测了那39万个分子,并尝试用不同的策略采样有效结果,但我就是无法突破 0.70 的大关。
非常有趣的是,我有很多提交结果之间有相当大的 LD 差异,但它们在 LB(Leaderboard