Kaggle 经典比赛 CommonLit Readability Prize(文本复杂性识别大赛)高分方案解析

212 阅读7分钟
本篇文章为比赛金牌方案解析,该比赛涉及到NLP-文本分类-教育
介绍:在本次竞赛中,参赛者将构建算法来评估 3-12 年级课堂使用的阅读段落的复杂性
网址:www.kaggle.com/c/commonlit…

TLDR 解决方案
我创建了一个大量外部数据集。我使用了句子 BERT(Reimers 和 Gurevych 2019 - github.com/UKPLab/sent…)来为训练集中的每个摘录在外部数据集中选择 5 个最相似的片段。然后,我使用在原始训练数据上训练的 roberta-base(后来我使用了 roberta-base/-large 集成)模型来标记所选数据。然后,我根据每个样本的标准误差过滤数据,以保持与训练集大致相同的分布。

然后,我在伪标签数据上训练了一些不同的模型,共 1-4 个 epoch。在训练伪标签数据后,我在原始训练集上对每个模型进行了训练。我最终提交的模型使用了 albert-xxlarge、deberta-large、roberta-large 和 electra-large。我使用岭回归来集成这些模型。

详细解决方案

背景

这是我第一次参加 Kaggle 比赛,到目前为止,我的日常工作并没有涉及任何数据科学或机器学习的实际工作。我每天都与 NLP 领域的数据科学家合作,但作为产品总监,我并不编写代码。在思考这次比赛时,我一开始就知道自己无法在复杂的模型设计或广泛的超参数调整上竞争。我决定巧妙地利用外部数据。

我已经阅读了一些在这场比赛中看似有用的论文,并决定实施一种类似于这些论文的方法。

尼尔斯·雷梅斯和 UKPLab 的优秀工作无疑是我解决方案的基础。他们在句子嵌入方面的工作使我能够选择与此次比赛相关的数据。您可以在以下链接中了解更多关于句子转换器的信息:

Nils Reimers 和 Iryna Gurevych. 2019. Sentence-BERT:使用孪生 BERT 网络的句子嵌入

他们的论文之一,启发了我的解决方案,使用了未标记的外部数据和伪标记来提高句子嵌入性能。他们使用一个小型标记数据集来训练一个交叉编码器,使用 BM-25 或 Sentence BERT 检索未标记的外部数据对,并使用在黄金数据集上训练的交叉编码器对这些对进行标记。然后,他们继续使用黄金数据集和伪标记数据训练 Sentence BERT。参见:南丹·塔库尔,尼尔斯·雷梅尔斯,约翰内斯·达克森伯格,伊莉娜·古雷维奇。2020. Augmented SBERT:用于改进成对句子评分任务的二元编码器的数据增强方法

另一篇与此次比赛非常相关的论文是由 Facebook AI 和斯坦福大学发表的,其中作者们使用自训练来提高模型在广泛的自然语言理解(NLU)任务上的性能。在这里,使用句子嵌入在大型的外部句子库中进行搜索,并通过在目标数据上微调的模型对检索到的数据进行标注。然后,他们使用伪标注数据来训练另一个模型。参见:杜静飞,埃杜阿尔·格雷夫,贝利兹·古内尔,维什拉夫·乔达里,奥努尔·切莱比,迈克尔·奥利,韦斯·斯托扬诺夫,亚历克西斯·康努。2020. 自训练提升自然语言理解预训练

我也尝试将谷歌嘈杂的学生论文结果转移到 NLP。在原始论文中,作者将他们的策略应用于图像分类,但我想要看看它是否也适用于这次比赛。他们在一组标记图像上训练一个模型,然后使用这个模型来标记未标记的图像。然后他们使用这些数据来训练一个同样大小或更大的学生模型。与上述解决方案相反,他们不会在伪标记一轮后停止。相反,他们使用这个学生模型作为新的教师,并使用这个模型标记更多数据。他们还在学生中引入了数据增强和多种 dropout 技术作为噪声。总的来说,他们发现 3 轮教师/学生标记产生了最佳结果。我尝试用我的方法运行多轮,我还尝试引入噪声,形式为回译和词替换(预测 MASK 标记),我还给我的学生添加了 dropout。然而,尽管多轮伪标记持续提高我的 CV,但我的 LB 分数却变差了。我认为我过度拟合到我的评估折,因为我评估得太频繁了。 查看:齐泽谢,明-唐·龙,爱德华·霍维,国武·莱。2019。使用噪声学生进行自训练改进 ImageNet 分类。

训练过程

基础:

  • 我使用了 6 折交叉验证或自助法对我的最终提交模型进行了评估
  • 训练的模型为 albert-xxlarge、deberta-large、roberta-large、electra-large 和 roberta-base

外部数据选择:

  • 我整理了一个与此次竞赛相关的文本语料库(simplewiki、wikipedia、bookcorpus 等)
  • 我根据训练集数据的大致长度,从外部数据中提取了文本片段
  • 对于训练集中的每个摘录,我使用了此模型huggingface.co/sentence-tr…来生成句子嵌入并检索与原始摘录具有最高余弦相似度的五个文本片段

伪标签化

  • 我在训练集上训练了一个 roberta 基础模型,并使用我的最佳模型对第一步中检索到的外部数据进行标注
  • 稍后,我使用了本笔记本中的模型www.kaggle.com/andretugan/…来进行伪标签(CV 和 LB 方面有很好的改进)
  • 我使用每个原始摘录的标准误差来过滤伪标签的外部样本。每个伪标签得分与原始摘录偏差超过其标准误差的外部样本被从外部数据选择中移除

训练:

  • 首先,我仅在伪标签数据上训练了一个单一模型
  • 我使用了低学习率(7e-6 到 1e-5)
  • 根据模型大小,我每 10-600 步评估一次
  • 我评估了整个训练集
  • 最佳模型已保存

然后:

  • 我使用了上一步的模型,并在原始训练集的 6 个折叠上训练了 6 个模型
  • 低学习率
  • 评估每 10 步
  • 我也在没有评估的情况下,对所有训练数据训练了一个单的 albert-xxlarge 模型 4 个 epoch(对于我来说,albert xxlarge 非常稳定)。这个单一模型获得了 0.459 的公共 LB 分数,我相信它在我的获奖提交中非常重要。
  • 我也使用自助采样而不是交叉验证训练了一些模型

集成学习

  • 我得到了每个训练模型的出折叠预测
  • 我随后对 oof 样本进行了新的 6 折划分
  • 我使用了新的分割来训练 6 个岭回归模型
  • 最终提交使用了 2 个不同模型的岭回归集成、一个自助模型以及单个 albert-xxlarge 模型
  • 集成和其他模型使用加权平均(每个集成的权重根据感觉和公共 LB 分数选择)

奖金

我也使用 sentence transformers 训练了一个完全不同的模型。对于这个模型,我从原始数据和伪标签数据中生成了一对一摘录。然后,我使用每对之间的分数差异来生成这些对之间的难度距离标签。接着,我使用这些对训练了一个句子嵌入模型。对于推理,我嵌入训练集和测试集。然后,我使用句子嵌入模型为每个测试样本找到来自训练集的 20 个最相似(实际上是最难度的)样本。然后,我使用所选训练样本的分数和余弦相似度作为另一个回归器(岭回归或贝叶斯岭回归)的特征。基于这种句子嵌入方法,我的最佳模型在公共和私人 LB 上得分 0.447(句子嵌入+其他模型)。仅使用句子嵌入,我在公共 LB 上得到 0.456,在私人 LB 上得到 0.463。

github:github.com/321Leo123/k…