返回列表

27th Place Solution

617. LEAP - Atmospheric Physics using AI (ClimSim) | leap-atmospheric-physics-ai-climsim

开始: 2024-04-18 结束: 2024-07-15 气象预报 数据算法赛
第 27 名解决方案

第 27 名解决方案

作者: chumajin (及团队成员)
发布时间: 2024-07-30
竞赛排名: 27

感谢主办如此有趣的比赛。我们深深感谢主办者和 Kaggle 工作人员。我还要感谢 @sae20gorilla@hidebu@takatoyoshikawa@khiroki 与我组队。尽管我们在截止前一周才组建团队,但我们进行了许多非常有教育意义的讨论,每次看到我们的分数和公共 LB 排名提高都很愉快。

1. 总结

我们最好的私有解决方案是 8 个模型的集成。

组建团队后,我们开始使用外部数据进行验证集成,这是我们任何人都未用于训练的数据。由于本次比赛中 CV 和公共 LB 之间的关系良好,我们使用 Nelder-Mead 方法计算了每个模型的系数,从而显著提高了 CV (sub1)。此外, anticipating 存在异常值,我们使用 Nelder-Mead 方法计算了每列的系数 (sub2),但正如预期的那样,这方面的私有 LB 并不好。下面我们将更详细地描述 sub1 的每个部分。

模型 部分 模型架构 损失函数 使用训练数据量 备注 CV 公共分数 私有分数 权重
1 tenten 1dConv-Transformer-GRU Huberloss 73.5M 0.77776 0.77697 0.77157 0.49187
2 tenten 1dConv-Transformer-GRU Huberloss 35M 0.77257 0.77292 0.76602 0.09789
3 chumajin squeeze former Huberloss 16M dim 192 + 重训练 0.76961 0.77050 0.76239 0.32106
4 sae 1dConv - GRU Huberloss 16M 0.76787 0.76890 0.76192 0.01156
5 tenten 1dUnet Huberloss 73.5M 0.76723 0.76611 0.76139 0.07264
6 sae 1dConv - LSTM Huberloss 16M 0.76618 0.76739 0.76001 0.18994
7 chumajin squeeze former Huberloss 16M dim 128 0.76121 0.76278 0.75497 -0.24416
8 tenten 1dConv-Transformer-GRU MSEloss 16M 0.76108 0.75965 0.75654 0.07312

最终集成 CV : 0.78116375, 公共 LB : 0.78052, 私有 LB : 0.77477

2. tenten 的部分

  • 概述
    tenten 模型概述
  • 输入
    • StandardScaler
    • 标量被扩展以匹配序列长度 (60)。
  • 模型
    • 1dUnet
      • down_channels: [128, 256, 512]
    • 1dConv-Transformer-GRU
  • 训练
    • 损失函数:HuberLoss(delta=1.0)
    • 优化器:AdamW
    • 调度器:Warmup Cosine Annealing
    • 数据:所有低分辨率数据
  • 后处理
    • 我使用 torch.min 将所有常数目标限制为非负值,除了 cam_out_FLWDS(我在计算损失之前在训练期间应用此操作)
    • ptend_q0002_x = -state_q0002_x * 1200 (12≤x≤27)
  • 效果不佳的方法
    • 辅助损失 (latlon, grid id)
    • 通过上采样增加序列长度
    • Robust scaler
    • 调整损失权重

3. saeNeko 的部分

saeNeko 模型概述
  • 模型:

    ・ 1D CNN + GRU

    ・ 1D CNN + LSTM

  • 预处理:

    对特征和目标都应用了 StandardScaler。

  • 训练数据:
    ・使用了 Kaggle 的 train.csv。
    ・600 万额外数据(感谢 @khirokifor 从 Hugging Face 提取数据!)

  • 训练:

    分别训练序列目标和标量目标。

  • 损失函数:

    RMSE

  • 后处理:

    对于 ptendq0002_x(1<=x<=27),使用了线性模型。
    ptend_q0002_x = state_q0002_x * coef + intercept_

4. chumajin 的部分

  • 预处理

    ・序列部分的差分以及 StandardScaler
    ・标量部分在应用 StandardScaler 后重复。

  • 训练数据:

    ・使用了 Kaggle 的 train.csv。
    ・600 万额外数据

  • 架构

    SqueezeFormer 来自 Stanford Ribonanza RNA Folding 比赛的第 2 名解决方案,(https://www.kaggle.com/competitions/stanford-ribonanza-rna-folding/discussion/460316)

  • 损失掩码

    我没有使用不可预测目标的损失。

  • 重训练

    20 个 epoch 后额外进行 10 个 epoch 的微调。
    cv 0.767055 → 0.768034112 (我称此为 chumajin model1.)

  • 来自队友的见解
    ・ Huberloss(delta=1)
    CV 提高了约 0.01。

    ・通过分离损失进行重训练 (re-finetune)
    通过再次训练限制损失,并从上述 chumajin model1 创建三个额外模型,我将它们的预测平均,这些预测是从模型的限制损失部分推断出来的,并与 chumajin model1 结合

    1. model 2 : 限制 ptend_q0001, q0002, 和 q0003 的损失
    2. model 3 : 限制 ptend_t, ptend_u, 和 ptend_v 的损失
    3. model 4 : 限制标量值的损失

通过这样做,我将模型的 CV 从 0.7680 提高到了 0.7696。结果,重训练导致 CV 提高了 +0.0026。

  • 后处理

    ・应用 tenten 的 torch.min 后处理用于标量部分。
    ・应用 sae 的后处理,CV 提高了约 0.002。

  • 遗憾与致谢

    在 tenten 的见解下,改进 CV 的 SqueezeFormer 是在截止日期前大约一天半创建的。在 A100 上训练 1600 万训练数据大约需要 24 小时,所以我无法在所有 7350 万低分辨率数据上进行训练……但是从组队中学到了很多,尤其是从队友那里。感谢队友!!

同比赛其他方案