546. Google - Isolated Sign Language Recognition | asl-signs
感谢Google和Kaggle组织这场比赛,希望我们的解决方案能帮助开发PopSign产品,降低学习美国手语(ASL)的门槛。
在详细介绍前,我要祝贺队友@timriggins——通过这场比赛他成为了Kaggle竞赛特级大师!有趣的是,我们是在去年10月巴塞罗那Kaggle Days世界总决赛期间相识的,再次感谢HP和Kaggle Days提供的宝贵机会 :D
我们使用了类似@hengck23分享的Transformer模型,主要改进如下:
abdcoords_r = (rhand - np.nanmean(rhand, 0))racc = np.pad(rh_dist[1:] - rh_dist[:-1], [[0,1], [0,0], [0,0]])其中两个模型使用可学习的正弦位置编码,另外两个使用1D深度可分离卷积作为位置编码:
self.pe = nn.Conv1d(emb_dim, emb_dim, kernel_size=5, padding=2, stride=1, groups=emb_dim)
# x.shape (B, L, E)
x = self.pe(x.permute(0, 2, 1)).permute(0, 2, 1) + x
我们验证了以下有效的增强方法:
xyz = xyz[::2]Mixup是关键增强手段,使我们能够使用150个epoch的长时间训练配合余弦退火调度而不过拟合,所有模型均在最后一epoch收敛。
我们使用了nobuco工具,它非常直观易用。
我在代码中意外引入了一个提升性能的Bug。在实现Mixup增强时,我在模型前向传播函数中错误使用了正态分布而非均匀分布:
if np.random.randn() < 0.5 and mode_flag == 'train':
x, labels_ohe = self.mixup(x,labels_ohe)
后来发现这导致Mixup应用概率约为70%(基于正态分布PDF特性)。修正后性能反而下降,说明在此场景下更高概率的Mixup更优。