第26名解决方案 - 1D Unet结合1D CNN、混合CNN-Transformer与WBF
竞赛排名: 第26名
作者: Đăng Nguyễn Hồng (Kaggle Master)
2023-12-06
第26名解决方案 - 1D Unet结合1D CNN、混合CNN-Transformer与WBF
非常感谢竞赛主办方和Kaggle带来的又一个有趣的挑战。热烈祝贺所有获奖选手!
和往常一样,我在本次竞赛中学到了很多。在本文中,我将简要介绍我的解决方案。
预测目标
我的所有模型都学习预测3个目标:
- 事件(转换/关键点)的低分辨率热图
- 事件偏移量(从粗粒度坐标到像素级事件步长)
- 睡眠期的二进制分割掩码
输入处理
输入是一个2或4天的时间窗口,其中首尾各4小时(接近边界部分)仍包含在输入序列中,但在损失计算中被忽略。这样做的目的是防止因边界区域上下文不足而产生的歧义判断。
更长的窗口能提供更多上下文,有助于提高预测准确性,但也会增加过拟合风险。特别是对于容量更大的混合CNN-Transformer模型,使用大窗口时过拟合速度很快。因此,窗口长度(crop_len)是一个重要的超参数。
分割掩码预测仅作为辅助目标使用,并未在推理流程中实际应用。
模型架构
采用1D Unet配合分层1D编码器。编码器分为两种类型:纯1D-CNN或混合CNN-Transformer。输出预测的分辨率为原始分辨率的1/4(即每3步或15秒进行一次预测)。
1D-CNN模型
尝试将2D-CNN图像模型转换为1D版本,将所有BatchNorm替换为LayerNorm:
- 窗口长度:4天
- 基础模块:MobilenetV3,扩展比率为2,各阶段恒定维度为96
- 深度:8层,各阶段计算比率均为[3, 3, 3, 3, 3, 3, 3, 3](类似VGG风格)
- ECA/SE注意力机制
- backbone_dropout = 0.4,head_dropout = 0.4
混合CNN-Transformer模型
- 窗口长度:2天
- 采用SqueezeformerBlock配合RoPE(旋转位置编码),来自此前ASL手语拼写竞赛的顶级方案
- 最终提交包含两种架构:分层/非分层Transformer
尝试了多种stem结构,Squeezeformer stem在交叉验证中表现略好且更稳定。
损失函数
采用简单的加权组合:
- 热图:二元交叉熵(BCE)
- 偏移量:均方误差(MSE)或L1损失
- 分割掩码:二元交叉熵(BCE)
最佳权重配置:总损失 = 1.0 × 热图 + 0.2 × 偏移量 + 0.2 × 分割
训练策略
- FP16混合精度训练,模型EMA(指数移动平均)
- 批大小:16
- 最大更新次数:CNN模型为500×40,混合编码器为200×60
- 优化器:Lookahead AdamW配合余弦学习率衰减
后处理
- 训练期间,使用简单的基于点的NMS(非极大值抑制)跟踪验证分数
- 提交阶段采用基于点的加权框融合(WBF)来集成多个模型的预测结果(NMS后)
实验结果
通过两个模型的WBF集成,OOF AP从77.0提升至78.3,增加了1.3个点。
有效改进
- 调整高斯热图目标的sigma值:非常重要,带来显著提升。最佳sigma = 5 × 12 = 5分钟;高斯宽度 = 2 × 3 × sigma = 30分钟
- 辅助分割损失:提升约0.01 AP
- 调整损失权重
- 尝试多种架构设计:深度、维度、归一化、激活函数、阶段计算比率等
- 使用reshape简单下采样序列长度:比在原始序列上使用卷积下采样效果更好,可能有助于避免过拟合
- 模型EMA:显著稳定训练过程,支持更多轮次训练,对混合编码器至关重要
- 加权框融合:两模型集成带来+1.3 OOF AP提升
未见成效的尝试
- 特征工程:尝试了多种特征(单折测试),但未带来提升。令人惊讶的是,仅使用单个特征'anglez_sign'(+1或-1)就能达到CV=60.89
- 数据增强:在最后一天实现并尝试了一些简单方法(翻转、噪声、重采样、时间拉伸等),似乎也没有提升,需要更多调优
- 解耦头:在目标检测中,解耦头通常会提升objectness和偏移量预测,但在此任务中,简单的单线性头(输出维度=5)效果最佳
- 在后续处理中使用分割预测:没有明显提升