546. Google - Isolated Sign Language Recognition | asl-signs
感谢Kaggle、Kagglers、PopSign以及各位合作伙伴举办这场有趣的竞赛!本次竞赛中的公开笔记本非常强大!主办方表示需要达到 LB >= 0.6 才算有所帮助,而最佳公开笔记本的得分达到了 LB = 0.73!Kagglers们做得非常出色!
我在一周前加入了这场比赛,因此没有太多时间构建自己的模型。相反,我阅读了讨论区和公开笔记本,并尝试改进最佳公开笔记本。我将最佳公开笔记本的公开榜得分从 LB = 0.73 提升到了 LB = 0.77,并获得了第44名的银牌。
我对分享的公开笔记本深感敬佩:
在阅读最佳公开笔记本后,我进行了以下11项更改,将CV和公开榜分数提升了 +0.03,从 LB = 0.73 提升到 LB = 0.76:
我将代码发布在这里,供那些想了解如何将最佳公开笔记本从 LB = 0.73 提升到 LB = 0.76 的人学习。
大多数Kagglers可能都很好奇我为何以及如何发现这些改进方法的。让我来分享我的思路。首先,提升神经网络CV和公开榜分数最简单的方法是将多个相同的神经网络(使用不同的随机种子训练)进行集成。因此,提升公开笔记本CV和公开榜分数最简单的方法是让模型变得更小、更快(因为这场比赛有模型大小和时间限制)。这样我们就可以在推理时集成多个神经网络副本,并且每个神经网络都会使用100%的训练数据进行训练。
我首先做的是减小 LANDMARK_UNITS、UNITS 和 MLP_RATIO 来缩减模型大小。我逐步减小这些参数,观察在不降低CV分数的前提下能将模型压缩到多小。将模型参数减少到500万(即5M)以下非常重要,因为这样在使用FP16量化时,我们可以在40MB的大小限制下推理4个模型副本。在40MB大小限制下,使用FP16推理时最多可包含2000万参数。我还尝试过将参数减少到400万以下和330万以下,这样在使用FP16量化时分别可以包含5个和6个副本。
其次,我通过增加Transformer块使Transformer更深。我将块数从2增加到3,使CV和公开榜分数提升了约 +0.01 或 +0.02。将 MLP_RATIO 从4降低到3显著减少了模型参数数量,同时不影响CV和公开榜分数,这为我提供了额外的参数空间来增加Transformer块。
接着,我减小了 INPUT_SIZE 以加快模型的推理(和训练)速度。参数 INPUT_SIZE 是Transformer的序列长度。这场比赛除了40MB大小限制外,还有1小时的推理时间限制。减小 INPUT_SIZE 会减少推理时间(且不影响模型大小)。当序列长度为12时,我们可以在1小时内轻松推理5个以上的模型。
此时,我感到非常幸运。减小 INPUT_SIZE 实际上使CV和公开榜分数提升了约 +0.01 或 +0.02。此后,我调整了学习率、批量大小和学习率调度,发现 N_EPOCHS = 120 和 BATCH_ALL_SIGNS_N = 1 效果最佳。许多Kagglers忽略了批量大小对模型的影响。我们应该总是尝试0.25倍、0.5倍、2倍、4倍的批量大小,并相应地将学习率调整为0.25倍、0.5倍、2倍、4倍。实验表明,批量大小=256 比原来的 批量大小=1024 更好。这帮助提升了约 +0.0005。
最后,神经网络总是能从更多数据和数据增强中受益。我尝试了外部数据和多种不同的数据增强方法。使用外部数据并没有帮助我。在增强方法方面,我只从 帧丢弃 和 时间缩放增强 中受益。这帮助提升了约 +0.0005。我也尝试了旋转、缩放和平移,但这些没有帮助。翻转是不必要的,因为预处理将所有视频都归一化为左手手势。