返回列表

3rd place solution

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

开始: 2024-04-18 结束: 2024-07-15 气象预报 数据算法赛
第三名解决方案 - LEAP Atmospheric Physics AI Climsim

第三名解决方案

作者: pao (Team: capaomat)
队友: @bamps53, @kmat2019
比赛: LEAP - Atmospheric Physics AI Climsim
发布日期: 2024-07-30
排名: 第 3 名

大家好,感谢大家在比赛中的辛勤付出。

@jerrylin 感谢组织这次比赛。我知道这一定很艰难,但我相信正是 благодаря您的真诚奉献直到最后的检查,我们才能走到这一步。
祝贺所有排名靠前并取得好成绩的人。与你们一起比赛很愉快,你们都是很好的激励。
致我的队友 @bamps53@kmat2019,很有趣,我也学到了很多。非常感谢。
另外,我很高兴在本次比赛中晋升为 Grandmaster。@kmat2019 也成为了 Grandmaster。恭喜!!

模型总结

总体总结

总体流程图

每个团队成员都构建了自己的神经网络模型。

在获得 Camaro 模型的预测后,我们创建了几个特征输入到 GBDT 回归器中。这些回归器优化了模型的预测。虽然这个第二阶段可以应用于其他模型,但我们只将其应用于 Camaro 模型,因为 Pao 和 Kmat 模型缺乏验证数据集。

最终预测是通过这些预测的加权平均计算得出的。

Pao 部分

概览

  • 模型: 1d CNN + Transformer + LSTM
  • 特征: 原始相对湿度及其在高度上的序列一阶导数和二阶导数(diff 和 diff-diff)
  • 辅助损失: 预测相邻垂直层级之间的差异
  • 无行全量训练 (Row-less full training)

模型架构

Pao 模型架构
  • 输入层: 每个特征进行带偏置的线性变换
    • 示例:feature1 = feature1_original * a1 + b1 (a1 和 b1 是可训练参数)
  • 特征拼接: 在每个全连接层后将标量特征拼接到每个高度序列特征
    • 示例:features_level0 = concat([seq_features_level0, dense_level0(scalar_features)])
  • 位置编码: 向隐藏层添加每个高度的嵌入
  • 模型块:
    • 残差块: 1dCNN (Conv1d + BN + GELU) * 2 + Transformer
      • Conv1d: 卷积核大小 = 5
      • Transformer: n_head = 8, n_layers = 1
    • LSTM: 双向 2 层
    • MLP: 简单的 MLP (Linear 和 GELU,无 dropout)

训练

  • 辅助损失: 预测相邻垂直层级之间的差异(与 Camaro 部分类似)
  • 损失: 使用 EMA 的 Huber Loss
  • 学习率: 余弦退火 1e-3 到 1e-5, 10 个 epoch
  • 优化器: AdamW

其他

  • 数据集: WebDataset 用于 LowRes 全量训练
  • 归一化:
    • 特征: (input - mean(input)) / std(input)
    • 目标: 乘以 old_sample_submission 权重
  • 后处理:ptend_q0002_0-27 的预测替换为 -1 * input / 1200
  • 集成: 3 个模型,在 dropout、隐藏层大小和 Huber Loss delta 上有所不同

Camaro 部分

概览

  • 全量数据集和长时训练: 在全量数据集上训练
  • 模型架构: CNN 和 Transformer 的组合,或使用 CLIP Encoder 的纯 Transformer
  • 辅助损失: 预测相邻垂直层级之间的差异

数据集和预处理

  • HuggingFace 数据集: 用于训练的全量数据集
  • 特征工程: 添加饱和蒸气压作为特征
  • 归一化: 使用 Kaggle 训练和测试数据集预先计算
  • WebDataset: 高效加载以加快训练

模型

  • 架构: CNN 和 Transformer 的组合,或带有重型嵌入和头层的纯 Transformer

训练

  • 目标变换: 除以旧样本提交权重并减去均值
  • 辅助损失: 结合关于导数和二阶导数的信息
  • 损失函数: delta 为 2.0 的 Huber loss

后处理

  • ptend_q0002_0-26 的预测替换为 -1 * input / 1200

结果

实验 批次大小 架构 维度 损失 公共 LB 私有 LB 公共 LB (2 阶段) 私有 LB (2 阶段)
1 256 ConvTransformer 256 Huber2 0.78468 0.78176 0.78504 0.78199
2 1024 ConvTransformer 384 Huber2 0.78418 0.78131 0.78451 0.78159
3 512 Transformer n_layer=8 256 Huber2 0.78545 0.78154 0.78572 0.78154
4 768 ConvTransformer x 2 256 Huber4 0.78395 0.78122 0.78427 0.78141
5 768 Transformer n_layer=6 256 Huber8 0.78245 0.77951 0.78255 0.77957
集成 (1+2+3+4) 0.79025 0.78694
集成 (1+2+3+4+5) 0.78998 0.78685

Kmat 部分

概览

如图 6-1 所示,Kmat 部分包括:

  • 添加特征
  • 通过平均值和标准差进行归一化
  • 1D CNN 模型预测气候
  • 后处理(部分预测替换为 -input/1200

特征工程

  • 来自 1D 数据的差分特征:x[z] - x[z-1]
  • 相对湿度相关特征,如露点 (dew_point) 和 蒸气压 / 饱和蒸气压

归一化

  • 输入:
    1. (x - x_mean(axis=0)) / x_std(axis=0)
    2. (x - x_mean(axis=(0,1))) / x_std(axis=(0,1))
    3. (log_x - log_x_mean(axis=(0,1))) / log_x_std(axis=(0,1))
  • 目标:
    • (x - x_mean(axis=0)) / x_std(axis=0)

模型架构

  • 核心架构: FiLM 1D UNet
    • 标量特征由全连接层处理
    • 1D 特征由 1D FiLM 卷积层处理
    • 初始和最终卷积分为多个分支
    • 三个头分支用于温度、q000X 和风向量预测
    • 用于 state_q 下降的分类分支
  • 损失函数: Huber loss (beta=2)

训练

  • 优化器: 带 clip norm 的 Adam
  • 调度器: 7 个 epoch 的余弦调度器
  • 批次大小: 384,学习率 0.0012
  • 训练时间: 在 RTX 3090 上对整个 LowRes 数据集训练 3 天
Kmat 流程图

第二阶段建模

我们要队 capaomat(第 3 名)的最终提交是三名成员预测的集成。部分 Camaro 预测(ptend_q0001, q0002, q0003)通过第二阶段进行了优化。分数提升小于 0.0004。神经网络建模占主导地位。

特征

为了防止过拟合,我们使用了少量来自原始输入和第一阶段预测的特征。模型提供了 State_t, state_q, ptend_q, future_state_q 特征以及 future_state_q2 与 q3 的比率。

Fraction of liquid cloud over total cloud as a function of temperature

(参考论文图表:液云占总云的比例随温度的变化)

模型 / 训练

我们采用 lightGBM 来预测每个层级的 ptend_q。具体来说,我们训练了模型并更新了各个层级的预测。在 CPU 上训练所有 91 个模型耗时不到 20 分钟。

集成

作为最终提交,我们混合了以下 9 个模型。我们的解决方案取得了以下结果:

实验 公共 LB 私有 LB 权重 1 权重 2
Camaro1_v2 0.78504 0.78199 3.0 3.0
Camaro2_v2 0.78451 0.78159 3.0 3.0
Camaro3_v2 0.78572 0.78154 3.0 3.5
Camaro4_v2 0.78427 0.78141 3.0 2.0
Camaro5_v2 0.78255 0.77957 3.0 1.0
Pao1 0.78139 0.77770 1.0 0.5
Pao2 0.78252 0.77864 3.0 2.0
Pao3 0.77985 0.77801 1.0 0.5
Kmat1 0.78120 0.77647 3.0 1.5
集成 with weight1 (私有最佳) 0.79026 0.78810
集成 with weight2 (最终提交) 0.79048 0.78792
同比赛其他方案