返回列表

7th Place Solution Overview

344. The 3rd YouTube-8M Video Understanding Challenge | youtube8m-2019

开始: 2019-06-27 结束: 2019-10-11 音视频处理 数据算法赛
第7名方案概述

第7名方案概述

作者: Ceshine Lee
比赛排名: 第7名

2019年10月31日 更新

清理后的代码库已发布在 ceshine/yt8m-2019。模型已复现,仅有细微差异(仍能获得第7名的成绩)。

原始内容

这是我从事 Kaggle 竞赛六年多以来获得的第一枚金牌。我非常感谢 Kaggle 这个伟大的社区,以及我在网上结识的一些最优秀的朋友们的友谊和支持。感谢赞助商和组织者举办了这场非常有趣的比赛。也感谢提供的 300 美元 GCP 额度。如果没有 T4 和 P100 GPU 的使用权,我不可能达到这个位置。

直到整整一周前,我才意识到自己有机会进入前 10 名。我选择实现的上下文感知片段分类器(context-aware segment classifier)想法效果足够好,这非常幸运。我花了最后一周的时间调整超参数和模型架构。仅凭这一点,公开分数就从 0.79450 提高到了 0.81247。由于时间限制,仍有一些唾手可得的成果,但我认为它们对排名不会产生太大影响。

我的方法相当简单。首先,在帧级数据集上训练视频级模型。然后,在片段数据集上微调模型以创建片段分类器。片段分类器有两种类型——上下文感知和上下文无关。最终的预测来自简单平均这些分类器生成的概率(我没有尝试其他平均方法)(两种类型大致按 1:1 混合)。

视频级模型

仅使用了帧级训练和验证数据集的一些子集来训练基础视频级模型。它们的总大小略低于 1TB。我将在代码库中提供所使用的 tfrecord 文件列表。

训练中仅使用了标记有 1000 个相关标签的视频。这主要是为了加快训练速度。我没有尝试使用全套标签进行训练。

当视频长度超过 150 帧时,会从中随机抽取 150 帧。

在比赛结束时,我有两个足够好的视频级模型:

  • 一个 NeXtVLAD 模型,参数为 n_clusters = 64n_groups = 16。使用批量大小 48 和倾斜三角学习率(max_lr = 3e-4)训练了 20 万步。在单个 P100 GPU 上训练几乎花费了 15 小时。
  • 一个上下文门控 dbof 模型,参数为 frame_dim = 4096video_dim = 2048。使用批量大小 128 和倾斜三角学习率(max_lr = 3e-4)训练了 10 万步。在单个 T4 GPU 上训练花费了 13 小时(这是一个粗略的估计,因为实例被抢占了几次)。

片段分类模型

片段数据集被分为 8 折(按 tfrecord 文件划分)。

除了由人工标记的 5 秒/帧外,前后的 n 帧也被包含在训练样本中。因此,对于一个从时间 t 开始的标记片段,实际输入模型的片段从 t-n 开始,到 t+4+n 结束。我在早期实验中发现 n=3 效果最好,并坚持使用它。这个特定的选择可能导致了对排行榜的某种过拟合。

上下文无关分类器只是在片段数据集上微调的视频级模型。

一个上下文感知分类器由三部分组成:视频编码器、片段编码器和一个全连接分类器。视频编码器是通过移除视频级模型的最终逻辑(混合专家)层创建的。我尝试了不同的方法来创建片段编码器,发现使用与视频编码器相同的方法似乎造成的复杂情况最少。编码后的向量被连接并输入到全连接分类器(在混合专家分类器之上的一个线性层加 ReLU 激活)。

在输入视频编码器之前,视频特征中的前 6 个片段和后 2 个片段被丢弃以减少噪声(在训练视频级模型时可能也应该这样做)。就像在视频级模型的训练中一样,当视频长度超过 100~200 时,会随机抽取相应数量的样本。

训练时视频编码器的权重被冻结(即它们不被更新)。我尝试过微调视频编码器,但没有发现这样做有明显的好处。

片段编码器的学习率被设置为全连接分类器学习率的一半(即判别性学习率)。

我还做了一些负标签挖掘以加速收敛。

推理

就像在片段分类器的训练中一样,视频中的前 6 个片段和后 2 个片段被跳过,对于一个从时间 t 开始的片段,片段从 t-n 开始,到 t+4+n 结束。

概率从

同比赛其他方案