返回列表

6th-place solution: Single Multi-task LSTM

462. Google Brain - Ventilator Pressure Prediction | ventilator-pressure-prediction

开始: 2021-09-22 结束: 2021-11-03 临床决策支持 数据算法赛
第6名方案:单一多任务LSTM模型

第6名方案:单一多任务LSTM模型

作者:Leon (队友: Young for you, Saber, chlxyd, Fengari)
比赛排名:第6名

首先非常感谢我的队友和伟大的 Kaggle 社区,感谢所有持续分享的人,我们在这次比赛中学到了很多。每一位参赛者都值得尊敬。

同时,祝贺我的队友 @mahluo 晋升为 Grandmaster,@yzheng21 和我晋升为 Master。

我们的解决方案主要由两部分组成:

  1. 简单的特征工程和 LSTM 模型
  2. 利用邻居样本和多任务学习提升性能

特征工程

我们发现过多的特征和归一化并没有带来提升。因此,我们使用了以下未经归一化的特征:

原始特征 (raw_features)、u_in 累积和 (u_in_cumsum)、u_in 对数 (u_in_log)、[time_step, u_in, u_in_log] 的 1-4 阶差分。

模型与训练

我们的模型非常简单:

  • nn.LSTM(input_dim, 512, batch_first=True, bidirectional=True, num_layers=4, dropout=0.1)
  • 初始化方法参考:https://www.kaggle.com/c/ventilator-pressure-prediction/discussion/276568
  • batch_size 为 128,更大的 batch 速度虽快但性能较差
  • 优化器 AdamW,学习率 3e-4,迭代 280 个 epoch,使用 CosineAnnealingWarmRestarts(在使用了下文提到的两个技巧后,收敛速度大大加快,280 个 epoch 已经足够)

训练曲线图

邻居样本

这个精彩的想法来自 @hengck23https://www.kaggle.com/c/ventilator-pressure-prediction/discussion/280356。我们的方法与此图类似,但不完全相同。

邻居样本示意图

如何寻找最近邻

  1. 按 R, C 进行分组
  2. 按 u_in 的 MAE 进行排序(未使用 KNN,也未考虑 time_steps,这点有待改进)

如何用于训练

  1. 从训练集的 TOP5 邻居中随机选择一个
  2. 将邻居的 uin、uin_diff1-2、pressure、pressure_diff1-2、neighbour_uin-self_uin 加入特征中

如何用于测试 (TTA)

  1. 分别从训练集的 TOP5 邻居中选择 1-5 个
  2. 将邻居的 uin、uin_diff1-2、pressure、pressure_diff1-2、neighbour_uin-self_uin 加入特征中
  3. 使用这 5 个结果进行集成

多任务学习

我们发现增加多目标学习有利于加快收敛并提升性能。(正如他们提到的,uin 可以通过 pressure、pressure_diff 等计算出来。我们没有想到逆向工程,而是选择直接预测它们)

我们主要使用了这四个额外的目标:

  • pressure 的差分
  • pressure 的二阶差分
  • pressure - 邻居的 pressure
  • 分类标签 (950 类)

在训练中,我们给它们的损失赋予相同的权重,只有分类交叉熵损失过大,其权重调整为 0.025。

在推理中,我们只取 pressure 的输出,其他的都不使用。

其他

  • CV 和 LB 之间有很好的相关性,无论是 Public 还是 Private。

起初使用 20 折交叉验证,CV 为 120,LB 为 0.1040。

最后使用全量数据训练 30+ 个种子,LB 为 0.0999。

  • 伪标签训练,只来得及训练 14 个模型,LB 为 0.0998。
同比赛其他方案