第14名解决方案:公开共享的Transformer架构如此强大!
第14名解决方案:公开共享的Transformer架构如此强大!
作者:Bilzard (Kaggle Grandmaster)
竞赛排名:第14名
发布时间:2023年5月2日
总结
感谢Kaggle主办方组织这次竞赛。虽然处理TensorFlow的晦涩错误以及失败的TFLite转换尝试非常艰难,但这些底层经验对我而言十分宝贵。以下是我的竞赛解决方案总结。
解决方案流程
我在本次竞赛中尝试了超过377种不同的模型训练模式,但最终最佳架构仅是在Mark Wijkhuizen的优秀公开笔记本基础上做了少量修改。
混合PostLN & PreLN架构
我测试了a) PostLN, b) PreLN, c) 混合架构三种方案,发现混合架构效果最佳。该架构最初(可能是无意的)在Mark Wijkhuizen的公开笔记本(早期版本)中实现。
其他改进
- 在预处理阶段保留无手部帧(而非丢弃)
- 增加关键点编码器的层数。层数越多准确率越高,4倍层数设置是准确率与推理时间的最佳平衡点
- 为关键点编码器各部分独立设置隐藏单元数(嘴唇=192, 左手=256, 右手=256, 姿态=128),在不损失准确率的前提下减少推理时间
- 训练时附加ArcFace层
训练设置
- 损失函数:
0.5 * ArcFace + 0.5 * 交叉熵(该设置来自Med Ali Bouchhioua)。ArcFace与交叉熵损失结合使用能更快收敛,且准确率更高
- 测试了50、80、100、120个epoch,100个epoch在LB上表现最佳
- 标签平滑(0.20-0.25)可避免过拟合,但ArcFace效果更好。同时使用标签平滑和ArcFace并未提升CV/LB
数据增强
增强策略基本与@hengck23分享的方案一致:
- 手部朝向交换(p=0.5)
- 全局2D仿射变换(p=0.5, 平移=(-0.1, 0.1), 旋转=(-30, 30), 缩放=(0.9, 1.1), 剪切=(-1.5, 1.5))
- 随机帧掩码(p=0.5, 掩码比例=0.75)
帧掩码模拟关键点检测失败的情况,同时在图像任务中起到cutout增强的作用。
TFLite转换
当对Mark的原始实现应用FP16量化时,Transformer块会输出NaN值。因此我基于@henck23的实现重写了transformer块。FP16量化使模型大小减少约一半,且未损失准确率。
测试时增强(TTA)
输出TFLite模型
未生效的实验
- 距离/速度特征未提升准确率
- 使用合成手部姿态数据集训练z轴预测模型。将该模型的预测结果用于a) 3D仿射变换增强和b) 从关键点编码器输出预测z轴的子任务,但两种尝试均未提升准确率