第6名解决方案 - Transformer 疯狂调优
第6名解决方案 - Transformer 疯狂调优
感谢竞赛组织者提供了一个既有趣又富有挑战性的问题,也感谢所有其他参赛者——每一位为微小进步而努力的人都值得称赞。
虽然我是这个帖子的发布者,但这是团队共同努力的结果,特别感谢 @christofhenkel。
简要总结
我们的解决方案是由两个模型组成的集成,模型架构为 MLP-Encoder-Frame-Transformer。我们将 Transformer 模型推向极限,并应用了大量技巧,最终攀升至第6名。我在四月有1403小时的实验监控时间(相当于每天48小时:)))。
更新:代码已发布在 https://github.com/TheoViel/kaggle_islr
详细总结
预处理与模型架构
预处理
- 移除没有手指的帧
- 对序列进行下采样(每隔n帧取1帧),使得序列长度
<= max_len。在最终集成中我们使用了 max_len=25 和 max_len=80
- 对整个序列进行归一化,使其均值为0、标准差为1。在特定MLP之前我们进行了额外的中心化处理。NaN值设为0
嵌入层
- 2层1D卷积(
k=5)用于平滑位置信息
- 嵌入地标ID和类型(如嘴唇、右手等),
embed_dim=dense_dim=16
特征提取器
- 一个MLP整合所有特征,另外4个MLP处理特定地标类型(2只手、面部、嘴唇)
- 对双手采用最大聚合,以考虑手语者可能使用单手的情况
dim=192,dropout=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.4,batch_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 调度、每层自定义学习率
- 模型部分预训练
- 手工图特征(邻接矩阵、边特征)
- 添加更多地标(眼睛、眉毛)
感谢阅读!