Bristol-Myers Squibb – Molecular Translation,分子结构图像转文字比赛总结
链接:https://www.kaggle.com/c/bms-molecular-translation/
目标和数据:比赛举办方提供了400w张分子结构的图像和标注
比如:
对应标注:InChI=1S/C13H20OS/c1-9(2)8-15-13-6-5-10(3)7-12(13)11(4)14/h5-7,9,11,14H,8H2,1-4H3
这个inchi标注似乎是某种类似分子式的东西,目标就是训练出一个神经网络,自动总结规律,输入是图像,输出是这个分子式
思路1:用CNN 获取输入的embedding,然后用RNN解码(cnn + lstm , cnn + attention lstm, cnn + transformer decoder, vision transformer等)
思路2:用OCR识别局部分子结构, 再根据局部结构的排列方式得到整体结构的结果
思路3:在比赛早期选手们就发现比赛分子结构似乎是用一个叫rdkit软件生成再加入噪声产生的,噪声包括燥点,删除原子标注等,因此用rdkit生成更多的分子图形来增大数据集,或者利用rdkit本身的“在理想状况”下可以识别分子图形的能力来实现这个功能
一开始我就定了一个方向,从头搭建一个baseline
尝试1: 模仿青蛙哥hengk的 transformer in transformer
1. 预处理:https://www.kaggle.com/drzhuzhe/bms-preprocess-data-parallel
2. transformer in transformer 模型:https://www.kaggle.com/drzhuzhe/training-on-gpu-bms
尝试2: cnn + transformer decoder
代码:https://www.kaggle.com/c/bms-molecular-translation/discussion/241557
尝试3: 自己搭建vision transformer 并且 train from scratch
代码1: https://www.kaggle.com/drzhuzhe/bms-vision-transformer
代码2: https://www.kaggle.com/drzhuzhe/fine-tune-of-bms-vision-transformer
我尝试按keras教程从头搭建了vit16 用卷积层换掉了dense层做输入,参数完全按照vit 16
用warmup竟然能train的动,但是梯度过了几个epoch就爆了,我加了个梯度裁剪,训练是能训练,不过10个周期内 acc一直卡在88%左右不下去
loss 不降这个问题我试了 noam学习率训练8个周期, 再用cycle learning rate 或者手动 decay 学习率来 finetune,效果都不明显
除了训练更慢了,这个版本更让我崩溃的是infer更慢了,训练4个epoch动则10小时以上
acc 很低的原因可能是因为没有上游任务
vit这种超级大模型确实非常难调试, 搞到最后我都没有一个拿得出手的cv结果去提交
如开头所说,top solution 有 lstm/ocr+nn/rdkit+nn 三个大方向,再依次有各种小的idea,有好几十种baseline
https://github.com/mrzhuzhe/pepper/blob/master/kaggle-beginner/compete/MolecularTranslation.md
回头还是要有一个实验计划,早日脱离盲目实验的阶段