1. tif图像数据在RGB通道之外包含红外通道,按理来说多使用上这个信息应该会提高效果,然而恰恰相反,讨论区的人说用了之后反而变差了,这可能是因为有些图片的红外通道跟RGB通道是错开的。 所以到比赛结束我们也只是稍微尝试了一下去利用tif的红外通道,并没有在上面浪费太多时间。 2. 其他队伍有可能使用了哪些预训练模型,每个模型的大体性能如何,这给我们提供了很有用的参考,比如我们在尝试了一些比较小规模的模型(如ResNet18、ResNet34)之后,以为这些模型已经够了,再大再复杂的模型可能会过拟合。 但是从讨论区我们看到,大模型还是有明显优势的,这就促使我们敢于花大量时间去跑那些笨重的ResNet152、DenseNet161等预训练模型。 3. 从其他类似比赛的讨论区我们看到,高分队伍一般不会使用特别复杂的Ensemble方法,甚至会仅仅使用简单的bagging和stacking(下面会讲),所以我们就把更多的精力花在单模型的调优。 事实证明,即便到了比赛后期,还不断有一些更好的单模型新鲜出炉,使我们Ensemble后的效果猛地一窜,窜到了Public Learderboard前三乃至第一。 3. 探险开始:解决方案的规划和选择 以上准备可能会花上你一到两天的时间,开奖,但磨刀不误砍柴工,我们也差不多可以开始我们的征程了。 3.1 BCE Loss训练 和 F2-Score阈值调优 上面提到,这次比赛问题是Multi-Label(多标签)分类问题,评价指标是F2 Score,但F2 Score并不是可以直接优化的值,所以我们采取的方法是: 1. 每个输出接Sigmoid层,分别预测每个类的概率,使用Binary Cross Entropy Loss优化。这其实是多标签分类问题的常见套路,本质是独立地对每个类做二分类学习。虽说不同类之间可能存在相互依赖,但我们假设这些依赖可以通过共享底层参数来间接实现。 2. 在训练上述二分类任务时,由于正负样本数目不均衡,我们并不能直接拿p = 0.5作为二分类的阈值进行预测,而需要为每个类搜索一个合适的阈值,使得整体的F2-Score最大。具体来说,我们采取了讨论区放出的一个方案,贪婪地对每个类的阈值进行暴力搜索,逻辑如下: 这肯定不是最优的方案,但却已经足够好。虽然后期我们优化了讨论区的代码使用GPU加速计算,并尝试了诸如随机初始值、随机优化顺序然后多次随机取最好,步长大小调优,进化计算搜索等方法,但都因为提交次数限制没来得及测试。 不过要注意的是,虽然我们以BCE Loss为训练目标,但实际上BCE Loss变低,F2-Score却未必变高,可以想象一下,如果模型把一些本来就能被分对的样本的预测概率变得更搞,BCE Loss是会降低,但F2-Score还是一样。 为什么要强调这点呢?因为有队友在探索Ensemble方法的时候,看着BCE Loss不好就放弃了;再往后另一个队友重新实现了一样的Ensemble方法,看的是F2-Score,却发现效果拔群! 所以说,如果只看Loss,不看最终评价指标,很容易做出误判,错过有用的方案,这对于其他问题来说也是成立的。 另外讨论区也有人提到一种直接对F2 Score进行优化的方法,我们因为时间有限还没来得及进行尝试。 3.2 划分训练集和验证集 一开始将官方的训练数据(Train Data)划分训练集(Train Set)和验证集(Validation Set),或者均匀划分成K个部分,用于做K折交叉验证(K-Fold Cross Validation)。关键的是,随机划分结果要队伍内和方案间共享。 不然的话,这个模型训练用的K折划分和那个模型训练用的K折划分不同,还怎么严格比较它们之间的优劣呢?而且这也是为后面数据分析和模型的Ensemble(集成)做准备。 这一次我们将数据平均划分了五折(编号0-4),使用一折作为验证集,使用其他四个折作为训练集,可以有五种组合。然后探索初期方案期间,只使用其中一种组合,例如将第0折作为验证集,1-4折作为训练集。 在模型确定后,如果想用上全部数据作为训练,我们可以使用五种组合,每种组合用四折训练一个模型(对应下图中4个灰色大块),在剩下的一个折作为验证集预测(对应下图中5个蓝色小块),遍历五种组合后我们可以获得每一个折的验证集预测结果(还是对应下图中5个蓝色小块)。 因为这些验证结果都是从没有在它们上面训练过的模型预测出来的,我们把这个五个验证折拼在一起的结果称为out-of-fold,包含整个训练集的验证结果(对应下图中的蓝色长块)。 (责任编辑:本港台直播) |