返回列表

15th Place Solution

600. HMS - Harmful Brain Activity Classification | hms-harmful-brain-activity-classification

开始: 2024-01-09 结束: 2024-04-08 临床决策支持 数据算法赛
第15名方案 - HMS脑活动分类

作者:Bartley(团队成员:Bartley、Reacher)

比赛排名:第15名

比赛:Harvard Medical School – Harmful Brain Activity Classification

第15名方案

感谢哈佛医学院和Kaggle举办这次有趣的比赛。这次比赛对我们来说收获颇丰,学到了很多东西!

概要:@ihebch 和我构建了一个基于三个特征提取器的多模态模型。它们分别是改进的 1D‑WaveNet、可训练的 STFT 以及用于比赛频谱图的带有注意力池化的图像模型。我们使用了 hgnetv2_b4.ssld_stage2_ft_in1ktf_efficientnetv2_s.in21k_ft_in1k 骨干网络,并采用不同的架构配置来丰富集成模型。详情如下!

快速实验

我们 pipeline 中最重要的部分之一是快速实验。这使我们能够迅速尝试创意和疯狂的想法。我们的关键点包括使用更小的输入、使用更小的骨干网络,并在 GPU 上使用 nnAudio 生成频谱图。在比赛的最后几周,我们将节点差异从 8× 扩展到 24×,增大了骨干网络模型,并将三个特征向量拼接成一个多模态模型。

模型 1:改进的 1D WaveNet

我们最好的单一架构是对 WaveNet 模型做一些修改。我们添加 Mish 作为第三种激活函数,并使用来自输入卷积的残差连接,而不是在每一层内部进行残差连接。这些改动使我们能够使用更深的 WaveNet,但发现超过 7 个块后提升不明显。最后,我们在最后一个 wave 块后添加了降采样卷积,以显著降低显存占用。

改进的 WaveNet 块 原始 WaveNet 块

每个输入序列先通过具有改进块的 WaveNet,输出被堆叠成一张单通道图像。除了最后两个输出通道外,所有输出通道被堆叠在一起,最后两个输出通道被追加到图像的末尾。我们这样做是为了在所有 24 个节点差异的特征相近的区域创建一个位置。堆叠后的输出然后通过 timm 骨干网络获取特征向量。

WaveNet 堆叠

模型 2:STFT

我们使用 nnAudio 在 GPU 上生成 STFT,速度非常快,针对这部分模型的每次训练仅需 3‑10 分钟(取决于 STFT 参数)。在生成 STFT 后,我们将频谱 bins 重新堆叠为 2 列。最后,将每个输入的 STFT 堆叠在一起,并通过图像模型获取特征向量。

STFT 堆叠

我们仍然不确定重新堆叠方法为何有效,但想分享更多思考。我们认为通过降低 STFT 的高度,我们把来自不同节点的信息拉得更近。我们通过改变堆叠 STFT 的顺序进行测试,发现对 CV 有显著影响。这表明模型正在学习跨 STFT 特征,且堆叠顺序很重要。基于这些发现,我们认为缺少某种输入之间的注意力机制。我们在比赛最后几天开始实验,但遗憾的是时间不足。

模型 3:注意力池化

我们使用的最后一个特征提取器是对 10 分钟频谱图使用 timm 骨干网络加注意力池化。我们发现将频谱图之间的差异作为新图像加入有帮助,在训练时对图像边缘(0‑95%)施加强 dropout 也有帮助。

其他策略

数据增强

最重要的增强方式是垂直大脑翻转、水平大脑翻转,以及 CropCat [1] 增强的变体。其他增强包括大脑大小缩放和随机噪声。我们在推理时使用大脑翻转作为 TTA(测试时增强)。

CropCat 增强示意

训练数据

与其他参赛者相同,我们发现使用 ≥ 10 票的数据进行训练能获得更好的 LB 分数。我们在该子集上使用 GKF 创建相关的 CV/LB。为了构建训练数据集,我们按 eeg_id 分组,选择票数最多的行,然后去除重叠的段落。随后在每个 epoch 中对每个 eeg_id 采样一个数据点。训练时使用加权 KL 散度来强调票数更多的数据点。我们还以 15% 的概率采样噪声学生标签,以提升模型多样性。

结束语

我们的方案离不开 @cdeotte 的精彩笔记本和分享。同时,我们借鉴了 @christofhenkelASL 指拼比赛中的方案代码结构。感谢两位的分享。

我们的训练代码可以在 GitHub 上找到。快乐 Kaggle!

框架

参考来源

同比赛其他方案