442. Bristol-Myers Squibb – Molecular Translation | bms-molecular-translation
我们的基础模型与本次比赛中使用的通用建模方法类似:结合高端视觉模型与循环网络或Transformer来输出化学式。早期我们尝试了多种组合,但在最终的努力中,我们使用了以下三种主要组合:
在融合时,我们发现将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) 合成数据。由于最终几乎没有波动,我们的假设被证明是正确的。
edge = 25
image_raw = image_raw[edge:-edge, edge:-edge]
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
最终的融合结果由20多个预测结果创建而成。我们按本地CV对预测进行排序。对于一张图像,找到第一个有效结果,如果这20多个结果中没有有效预测,则设置CV预测最低的结果。