返回列表

6th Place Solution - Transformer Tweaking Madness

546. Google - Isolated Sign Language Recognition | asl-signs

开始: 2023-02-23 结束: 2023-05-01 音视频处理 数据算法赛
第6名解决方案 - Transformer 疯狂调优

第6名解决方案 - Transformer 疯狂调优

作者:Theo Viel & @christofhenkel

竞赛排名:第6名

发布时间:2023-05-02

投票数:50票

感谢竞赛组织者提供了一个既有趣又富有挑战性的问题,也感谢所有其他参赛者——每一位为微小进步而努力的人都值得称赞。

虽然我是这个帖子的发布者,但这是团队共同努力的结果,特别感谢 @christofhenkel

简要总结

我们的解决方案是由两个模型组成的集成,模型架构为 MLP-Encoder-Frame-Transformer。我们将 Transformer 模型推向极限,并应用了大量技巧,最终攀升至第6名。我在四月有1403小时的实验监控时间(相当于每天48小时:)))。

更新:代码已发布在 https://github.com/TheoViel/kaggle_islr

详细总结

预处理与模型架构

预处理

  • 移除没有手指的帧
  • 对序列进行下采样(每隔n帧取1帧),使得序列长度 <= max_len。在最终集成中我们使用了 max_len=25max_len=80
  • 对整个序列进行归一化,使其均值为0、标准差为1。在特定MLP之前我们进行了额外的中心化处理。NaN值设为0

嵌入层

  • 2层1D卷积(k=5)用于平滑位置信息
  • 嵌入地标ID和类型(如嘴唇、右手等),embed_dim=dense_dim=16

特征提取器

  • 一个MLP整合所有特征,另外4个MLP处理特定地标类型(2只手、面部、嘴唇)
  • 对双手采用最大聚合,以考虑手语者可能使用单手的情况
  • dim=192dropout=0.25

Transformer

  • Deberta 比 Bert 表现更好,但我们必须重写注意力层以提高效率
  • 为减少参数量,我们使用了更小的第一层Transformer,并修改输出层以实现特征的上/下采样。这对集成两个模型至关重要
  • d_in=512δ=256(当 max_len=25),δ=64(当 max_len=80),num_heads=16,第一层 dropout=0.05,其余两层 dropout=0.1
  • 遗憾的是,我们未能成功使用 Deberta 的预训练版本,例如导入部分预训练权重

训练策略

数据增强

  • 水平翻转(p=0.5
  • (0, 0, 0) 旋转 -60° 到 60° 之间的角度(p=0.5
  • 缩放因子在 (0.7, 1.3) 范围内(p=0.5),同时允许形变(p=0.5
  • 截取开头或结尾的20%(p=0.5
  • 插值填充缺失值(p=0.5
  • 流形混合(Manifold Mixup)[1](按计划执行,p=0.5 * epoch / (0.9 * n_epochs)):在Transformer某层前随机对特征进行混合
  • 仅在训练前半段使用,因其能改善收敛:
    • 用另一只手的数据填充缺失的手(p=0.25
    • 面部CutMix:用另一个做相同手势的签名者的面部地标替换当前面部(p=0.25

训练配置

  • 100个epoch,lr=3e-4,25% warmup,线性学习率调度
  • 带标签平滑的交叉熵(eps=0.3
  • weight_decay=0.4batch_size=32(8块GPU)
  • OUSM [2]:排除损失最高的k个样本(k=3
  • Mean Teacher [3] 与知识蒸馏(见上图)。我们同时训练3个模型,使用蒸馏后的模型进行推理
  • 最后10个epoch检查点的模型汤(Model Soup)[4]

实验结果

验证策略

我们使用分层4折交叉验证,按患者分组。CV与LB相关性很好(见图),最佳模型达到 CV 0.749 - 公开榜 0.795 - 私有榜 0.877。我们提交了在全数据集上训练的单个模型和2个模型的集成。

有效改进及提升幅度

从四月初开始:

  • 基线:MLP + Bert:公开榜 0.72
  • Deberta 替代 Bert:CV +0.015 -> 公开榜 0.73
  • 改进特征提取器:CV +0.01 -> 公开榜 0.74
  • 翻转增强:CV +0.015 -> 公开榜 0.75
  • 增大模型尺寸:CV +0.006
  • 两阶段训练 + 插值增强:CV +0.002
  • 再次增大模型尺寸:CV +0.005 -> 公开榜 0.76
  • Deberta 重写:CV +0.005 -> 公开榜 0.77
  • OUSM:CV +0.003
  • Mean Teacher:CV +0.005
  • 集成两个蒸馏模型:+0.005 -> 公开榜 0.78
  • 卷积层:CV +0.001
  • Mish [5] 激活函数替代 ReLU/LeakyReLU:CV +0.001
  • Warmup 0.1 -> 0.25:CV +0.001
  • 模型汤:CV +0.001
  • Nobuco 替代 onnx:45ms/it -> 38ms/it,这使集成成为可能
  • 权重衰减 0 -> 0.4:CV +0.004
  • 截断增强:CV +0.001
  • 流形混合:CV +0.002
  • 集成中使用不同的输入、模型和教师尺寸:CV +0.005 -> 公开榜 0.79
  • MLP层前中心化:CV +0.004 -> 公开榜 0.795(最终)

无效尝试(对我们而言)

  • CNN 未能奏效
  • GCN 或其他针对 ASL 的"先进"架构
  • Heng 的架构,尽管其他人效果很好
  • 3个模型的成功集成
  • 重标记数据以减少标签噪声
  • 其他增强如噪声、dropout、丢帧、平移
  • Dropout 调度、每层自定义学习率
  • 模型部分预训练
  • 手工图特征(邻接矩阵、边特征)
  • 添加更多地标(眼睛、眉毛)

感谢阅读!

同比赛其他方案