570. Google - American Sign Language Fingerspelling Recognition | asl-fingerspelling
以下内容是与@rafiko1、@group16以及我本人的团队共同努力的结果。
我们要感谢主办方组织了一场精彩的比赛,真的非常有趣,我们也很高兴能够进入金牌区!我们已经阅读了一些顶尖团队的解决方案——祝贺所有参与者。
我们使用了与@hoyso48在ASL-sign竞赛中类似的架构。我们的模型包含六个Conv1D/Transformer块,使用CTC损失函数训练了500多个epoch,并采用了大量数据增强。
这场比赛带来的挑战不仅仅是实现模型准确性。我们还必须满足模型限制(5小时提交时间和40MB模型大小)。同时需要确保所有代码都能很好地转换为tflite格式,这有时令人沮丧。这要求我们在模型大小和推理时间之间找到良好平衡,并尽量减少后处理。
我们以训练数据为基础数据集,但在微调期间也使用了补充数据和外部数据(ChicagoWild/Plus)。所有数据集的预处理方式相同:
大量数据增强帮助我们在长期训练中避免过拟合。
由于每个模型的训练都需要很长时间(在Colab TPU上运行数天),我们从最佳检查点恢复,以试验不同的数据增强方式、数据比例和学习率调度。很难完全追溯我们到达最终模型的步骤,但总体思路是:
在比赛最后一周,我们不同实验的验证分数提升示例如下:

直到比赛结束,我们仍能通过更多训练获得小幅分数提升。
最初,我尝试了类似signs竞赛第二名方案的efficientnet方法。后来,我转向了类似公共notebook的第一名架构。合并团队后,我们发现双方都有相似的架构,但@rafiko1做了一些改进,提升了在该任务上的性能:
我们还试验了使用DebertaV2代替transformer块,但最终模型未采用。
在比赛接近尾声时,意识到我们并没有很好的模型集成方法,我们希望在不重新训练的情况下获得尽可能大的模型。我们发现,与其从头重新训练,不如简单地增加Conv1D/Transformer块的数量——并从之前的最佳模型复制权重,重复最终层的权重。这使得模型能够快速收敛,并在5小时推理限制下挤出额外的准确率。
填充词:正如其他人指出的,数据集中有相当多样本的帧数很少。这些样本与目标相关的信号很低或没有。我们发现直接用一个填充词('+w1- ea-or')替换它们更好。我们还发现,最好将这些应用于帧数少于30帧且预测短语长度小于等于6个字符的样本。
模型权重平均:每次训练运行的最终epoch,对最后几个epoch的权重进行平均,这极大地帮助了CV和LB分数。在比赛后期,当我们的模型更强时,这种方法效果减弱。

我们跟踪了每次提交的执行时间和CV/LB相关性。这场比赛的验证集(一个parquet文件)与LB之间有很强的相关性。我们最好的private LB分数是0.788,但我们没有选择它,因为它在public LB上表现不佳。