617. LEAP - Atmospheric Physics using AI (ClimSim) | leap-atmospheric-physics-ai-climsim
感谢举办这次比赛。我们非常享受这次比赛,也学到了很多经验。这是我们参加过的最艰难的比赛之一。我们简直是在比赛结束前几小时还在训练模型和制作集成,最终我们成功赢得了金牌。
以下是 Updraft 团队第 10 名解决方案的总结。更详细的撰写可能会由每位成员分享。
我们的解决方案是每位成员的回归模型的集成。
最终提交中包含 23 个具有不同架构和学习条件的模型。
我们开发了以下架构:
我们主要使用 1-7 年 LR 数据训练模型,并使用 8 年 LR 数据的 1/6 子采样进行评估。
部分模型还使用了:
在标准差归一化目标后,我们使用 1-MSE 而不是 R2。
我们使用这个指标是因为有成员报告说在主办方替换测试数据集后,R2 失去了相关性。
(然而,后来我们发现在使用足够小的 eps 进行归一化时,两者是相关的。)
在归一化中,我们使用了以下公式:
eps = 2.0 ** (-95)
target = target / maximum(std(target), eps)
基本上使用 1/7 ~ 1/6 的 LR 数据子采样,因为机器资源相对较差 (RTX4090 x 1)。
最有效的方法是:
我们提取了 Tom Beucler 等人 [1] 建议的气候不变特征。
从概念上讲,这些特征在冷温和暖温下都是不变的。
因此,预计这些特征可以抵消 ClimSim 数据集中逐年变暖的影响(我通过 EDA 观察到了这一点)。
在比赛期间,我们无法在全量 LR 数据集上训练具有这些特征的模型,但它在 1/7 到 1/6 的 LR 数据子采样上显示了约 1% 的显著增益。
请注意,后期提交结果显示这些特征在全量 LR 数据集上仍然具有显著增益(见附录 A1)。
我们使用了以下损失函数,我们称之为置信感知 MSE 损失,而不是 MSE。
直观地说,它具有 loosening 硬样本大误差贡献的效果。
这个想法是 @ryomak 之前分享的解决方案 [2] 的变体。
注意,模型除了回归均值外,还回归了目标的方差。因此我们模型的输出变量是基本模型的 2 倍大。
loss = 0.5 * (target - pred) ** 2 / var + 0.5 * torch.log(var)
正如我们在公开讨论中分享的 [3],大多数误差来自极端异常值。所以我们认为硬样本是所有数据集的良好代表:如果我们从 1/1 全量 LR 数据中掺杂少量硬样本,即使我们使用 1/n 子采样的 LR 数据,它也有助于减少回归误差。
我们使用我们最好的模型之一提取了约 14% 的平方误差大于阈值的硬样本,并掺杂到其他模型的训练中。我们发现使用这种方法有 ~0.x% 的增益。
我们还发现添加少量来自同一位置的相邻时间帧样本也有助于提高准确性。
基本上我们使用了以下两种架构:
第二种架构灵感来自堆叠沙漏架构 [5],它堆叠 U-Net 并通过回归前一堆叠的误差逐步提高输出变量的准确性(类似 boosting)。此外,将普通 U-Net 中的 ConvTranspose 解码器替换为 PixelShuffle 获得了 ~0.x% 的增益。
在训练更深的 Transformer (~8-12 层) 时,我们经常遇到梯度爆炸。
我们通过利用我们称为Tanh 归一化的技巧缓解了这个问题。
只是在计算 softmax 注意力之前插入 tanh 激活:
def forward(self, x):
x = rearrange(x, "b c n -> b n c")
qkv = self.qkv(x)
qkv = rearrange(qkv, "b n (h d) -> b h n d", h=self.num_heads)
q, k, v = qkv.chunk(3, dim=-1)
attn = (q @ k.transpose(-2, -1)) * self.scale
attn = attn.tanh() * self.attn_clip_val # 稳定注意力权重
attn = F.softmax(attn, dim=-1)
x = attn @ v
x = rearrange(x, "b h n d -> b n (h d)")
x = self.proj(x)
x = rearrange(x, "b n c -> b c n")
return x
在之前的比赛中,一些 Kagglers 报告说移除 Dropout 层对回归任务有显著改进 [6]。我们在本次比赛中也观察到了类似现象。
公开/私有 LB: 0.77784/0.77023
模型
- Transformer + 卷积 + LSTM
- 架构要点
- 可学习位置嵌入 (nn.Embedding 60)
- 几个 Transformer 层
- 最后一层 LSTM
特征
- 原始数据集 (standard scaler)
数据集
- 70M (全量低分辨率数据集)
损失
- Huber 损失 (> MSE)
未生效的方法
- Mixup
- EMA
- 更深的模型,我尝试了一些实验,但不稳定。
- 预训练高分辨率模型,但低分辨率和一些高分辨率数据在公开 LB 上有效。
待定 (TBD)
我们使用了树型集成方法,最终提交是这些的加权集成:
对于类型 2,基本上我们不能使用训练种子模型的数据来拟合 Stacking 中的参数。
所以我们采取以下方案:
对于最终提交,我们使用手动拟合的权重集成类型 1 ~ 类型 3 模型:
final_prediction = type1 * w1 + type2 * w2 + type3 * w3
后期提交结果显示,在私有 LB 上为类型 1 模型分配 100% 权重表现最好。
| 模型 | LB(公开) | LB(私有) | 最终提交 |
|---|---|---|---|
| type1 * 0.5 + type2 * 0.3 + type3 * 0.2 | 0.78803 | 0.78503 | ✔️ |
| type1 * 0.75 + type3 * 0.25 | 0.78801 | 0.78487 | ✔️ |
| type1 * 0.6 * type2 * 0.4 | 0.78777 | 0.78535 | |
| type1 | 0.78771 | 0.78536 |
我们针对每个 (目标,模型) 训练集成权重。这是基于 EDA 的研究,我们发现每个模型都有自己的专长:有些模型擅长回归混合比,有些擅长回归风速等。
我们测试了以下变体,发现 without normalization 和 with bias 的集成表现最好。
| 归一化权重? | 带 bias? | LB(公开) | LB(私有) |
|---|---|---|---|
| ✔️ | - | 0.78727 | 0.78532 |
| - | - | 0.78739 | 0.78563 |
| - | ✔️ | 0.78740 | 0.78569 |
在比赛期间,我们仅在 LR 数据的子采样上使用气候不变特征训练模型。然而,比赛结束后,我们成功地在相对“低吞吐量”的 GPU (RTX 4090) 上,在可行的训练时间 (~1 天) 内,使用气候不变特征在全量 LR 数据集上训练了 Phalanx 的轻量级 CNN 模型。
后期提交结果显示,它在私有 LB 上有 0.05% 的显著增益。因此,气候不变特征实际上对此任务有显著影响。
| 模型 | CV(1-MSE) | LB(公开) | LB(私有) |
|---|---|---|---|
| single w/o LR-full-clim-invariant | 0.78231 | 0.78025 | 0.77721 |
| single w LR-full-clim-invariant | 0.78434 | 0.7814 | 0.78017 |
| ensemble w/o LR-full-clim-invariant | 0.79192 | 0.78740 | 0.78569 |
| ensemble w LR-full-clim-invariant | 0.79218 | 0.78771 | 0.78618 |