返回列表

39th place solution, submission errors and memory leakage

362. Google QUEST Q&A Labeling | google-quest-challenge

开始: 2019-11-22 结束: 2020-02-10 自然语言处理 数据算法赛
第39名方案:提交错误与内存泄漏
作者:DN | 排名:第39名 | 发布时间:2020-02-11

第39名方案:提交错误与内存泄漏

首先,我要感谢主办方所有参赛队伍!这是一场非常有趣且富有成效的比赛。

目录:

  • 模型与训练
  • 后处理
  • 痛点 1 - 提交错误
  • 痛点 2 - Keras 中使用 "load_weights" 导致的内存泄漏

模型与训练

  • 针对问题、答案以及问题和答案两者,分别使用了专门的 BERT 模型。
  • 使用 GroupKFold,按 question_title 进行分组。
  • 加权 BCE 损失函数效果最好。对于非零元素数量较少的列(例如 "question type spelling"),分配了更高的权重。
  • 采用了 Blending(融合)策略。
  • 我尝试了加权 MSE 损失函数以及 MSE + BCE 的混合损失,但结果都不如单独使用 BCE 好。

后处理

  • "0,1 映射" - 将高值映射为 1.0,将低值映射为 0.0 效果最好。映射值的百分比是针对每一列单独选择的(针对训练集的每个预测列解决了优化问题)。
  • "优化取整器 (Optimizer rounder)" 帮助我在上一届比赛 "2019 Data Science Bowl" 中获得了银牌。我很高兴在我们的目标中发现了离散类别(由评估者数量有限导致)。我尝试了不同的量化策略:

标准模式: 全局优化,即在整个训练集上使用目标列中的所有唯一值来建立类别集合(单一码本情况)。

高级模式: 逐列优化,类别数量等于训练集中每个目标列的唯一值数量(多码本情况)。

单独使用 "优化取整器"(标准和高级模式)带来了显著的 LB(+0.02)提升,但将其与 "0,1 映射" 结合使用却导致 LB 下降(见下文分数)。此外,众所周知,从过拟合的角度来看,"优化取整器" 是一种非常有风险的方法。因此,我最终决定选择两次提交:一次使用 "优化取整器",一次不使用。当私有测试集结果公布时,我发现我是对的,"优化取整器" 确实降低了最终得分。

公开分数 0.43318 -> 私有分数 0.40901 ("0,1 映射")
公开分数 0.43050 -> 私有分数 0.40635 ("0,1 映射" + "优化取整器")

不使用 "优化取整器" 的方案让我在私有测试集上的排名上升了 30 位。

痛点 1 - 提交错误

我花了很多时间来解决提交错误:

  • Submission CSV Not Found(提交 CSV 未找到)
  • Submission Scoring Error(提交评分错误)

我遇到这类错误超过 30 次,真的非常令人恼火。最糟糕的是,系统没有提供额外信息来帮助理解哪里出了问题。我通过实验发现,"Submission CSV Not Found" 通常是由 RAM 内存限制引起的。出现这种情况是因为私有测试集比公开测试集大 7 倍。"Submission Scoring Error" 是由非零元素数量很少的列引起的,原因在于相关性指标计算的特性。

痛点 2 - Keras 中的内存泄漏

我在执行 Blending 时遇到了 Keras 中 "load weights" 方法的问题。它将模型权重加载到 RAM 中,但在 clear_session() 后不会释放内存。这是一个众所周知的问题,在许多资源中被讨论过,但没有任何改变。(例如 这里这里)。不幸的是,最新版本的 Keras 2.3.1 仍然存在这个问题。

根据 @robieta 的说法,可能的原因如下:
"问题出在 K.clear_session(),它清除的是默认图。在 1.x 版本中,Keras 使用默认的