返回列表

[3rd place solution with code] 17 layers squeezeformer with timerduce and ROPE

570. Google - American Sign Language Fingerspelling Recognition | asl-fingerspelling

开始: 2023-05-10 结束: 2023-08-24 计算机视觉 数据算法赛

第三名解决方案:带代码的17层Squeezeformer结合Timerduce和ROPE

这是一个有趣的游戏,我从以下链接学到了很多:
https://www.kaggle.com/code/hoyso48/1st-place-solution-training
https://www.kaggle.com/code/irohith/aslfr-ctc-based-on-prev-comp-1st-place
https://www.kaggle.com/code/markwijkhuizen/aslfr-transformer-training-inference

预处理

  1. 不要丢弃没有手出现的帧!
  2. 尽可能使用更多的信息(手、嘴唇、眼睛、鼻子、姿势),使用(x,y,z)坐标
  3. 使用更多帧,将模型训练的帧数调整为320帧
  4. 我使用了原始数据 + 归一化数据 + 绝对位置(/1000.)作为输入特征(总共384×2+1=769维)
    归一化特征有助于更快收敛,但发现原始特征也有帮助

数据增强

我参考了上一届比赛的第一名解决方案,发现最重要的数据增强方法是:

  1. 时间缩放(interp1d)
  2. 时间维度掩码
    这里使用了重度掩码,会掩盖部分时间序列,并且随机掩盖50%的帧
  3. 仿射变换
    参考上一届第一名解决方案,以0.75的概率进行仿射变换,仅以0.25的概率进行左右翻转

训练

  1. 我使用了训练数据 + 补充数据联合训练,补充数据的权重设为0.1,共训练400个epoch
  2. 批大小128,最大学习率2e-3,使用线性衰减的学习率调度器,预热0.1个epoch,Adam优化器
  3. Awp训练从第15%的epoch开始,对抗学习率0.2,对抗扰动0
  4. 仅使用训练数据进行微调10个epoch,最大学习率1e-4,Awp从第2个epoch开始

后处理

我使用了空白索引(0)的规则

模型

  1. Squeezeformer效果最好,比Conformer稍快。(代码来自NEMO)
  2. 为了使网络更深,我使用了1个下采样层将帧数从320减少到160
    这有助于添加更多编码器层,并允许使用更复杂的编码器结构
  3. 相对位置编码对性能影响很大,发现ROPE(由Jianlin Su提出)效果最好且速度极快
  4. Dropout非常重要,我仅在最后使用cls_drop=0.1,其他层不使用Dropout
  5. 从第一名解决方案中学习到随机路径对于避免深层网络过拟合非常重要


    整体模型结构如下:

其他

  1. 对于我的4090显卡,PyTorch比TensorFlow快3-4倍
  2. 我最初使用TensorFlow,最后一个月切换到PyTorch,大大加快了实验速度
    速度只是其中一个因素,另一个重要原因是能够轻松尝试开源的ASR代码库如NEMO或espnet
  3. 我使用nobuco将PyTorch模型转换为Keras,效果非常好
  4. 我仍然使用TensorFlow进行预处理/增强和后处理,并使用TFRecord作为输入格式,编写了一个包装TFRecord读取器的PyTorch可迭代数据集

待办事项

由于时间限制,最后几天无法完成更多实验,但一些可能的改进方向包括:

  1. 模型可以更深,达到20层
    20层模型比17层表现更好,但我只训练了300个epoch,效果不如17层+400个epoch
  2. 更多的训练轮次,可能500或600?
    对于17层模型,从300到400个epoch使LB提高了4分,PB提高了2分,因此可能仍有提升空间
  3. 从其他解决方案中,似乎遗漏了一些重点:
    • CutMix
      这很遗憾,我本计划一开始就尝试,但由于发现重度帧掩码(50%+)效果很好,没有意识到CutMix可能更有帮助
      简单拼接两个实例
      按0.7和0.3的比例拼接
      使用CTC分割进行拼接
    • 序列到序列方法和CTC+注意力解码方法
      我在竞赛初期使用TensorFlow尝试过序列到序列方法,但效果不好,切换为PyTorch后应该用Squeezeformer编码器再次尝试
    • 输入长度掩码以加速推理
    • 尝试更多最大输入帧数,从320增加到384或512(配合输入长度掩码推理)

代码

所有代码开源在这里:
https://www.kaggle.com/code/goldenlock/3rd-place-step1-gen-tfrecords-for-train
https://www.kaggle.com/code/goldenlock/3rd-place-step2-gen-tfrecords-for-supplement
https://www.kaggle.com/code/goldenlock/3rd-place-step-3-gen-mean-and-std
https://www.kaggle.com/code/goldenlock/3rd-place-step-4-train-squeezeformer
https://www.kaggle.com/code/goldenlock/3rd-place-step-5-torch2keras-using-nobuco
https://www.kaggle.com/code/goldenlock/3rd-place-step-6-inference
注意:我未在Kaggle笔记本中复现最终结果,如需复现或查看原始代码,请访问:
https://github.com/chenghuige/Google-American_Sign_Language_Fingerspelling_Recognition

同比赛其他方案