Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

Anna Vander Stel 发布在 Unsplash 上的照片

  近日,由 Google 举办的 Quest 问答标签大赛结果出炉,由 Dmitry Danevskiy、Yury Kashnitsky、Oleg Yaroshevskiy 和 Dmitry Abulkhanov 组成的四人团队「Bibimorph」斩获冠军。

  在 QUEST 问答标签大赛中,参与者被要求为不同的问答构建预测算法。比赛提供的数据集包含数千个问答对,大部分来自 StackExchange。问答对被贴上了标签,以反映问题好坏以及答案是否相关。大赛的结果将有助于促进问答系统的发展。

  在获奖者访谈中,Bibimorph 团队公布了他们解决这一挑战的独特方法。

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

  Q1:请分享一下你的背景,包括你是如何开始 Kaggle 之旅的?

  Dmitriy Danevskiy

  我拥有应用数学和物理学背景。4 年前,我开始主攻工业应用方面的机器学习。两年来,我一直在一家小型人工智能服务公司工作,负责分割时间序列、人脸识别、语音处理及实现复杂的深度学习解决方案。现在我在一家名为 Respeecher 的初创公司工作,是从事音频合成前沿研究的首席工程师之一。

  我参加不同的 Kaggle 竞赛很多年了,我认为现代的深度学习方法非常普遍,几乎可以应用于任何非结构化和结构化的数据。这听起来可能有争议,但我用经验证明它能够在图像、文本、音频和表格数据比赛中获得金牌。在 Google Quest 问答标签竞赛中获胜对我来说尤为重要——我成功地获得了 Grandmaster 头衔。

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

  Yury Kashnitsky

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

  我是物理和应用数学博士。小时候,我热衷于航空技术,于是进入莫斯科物理技术学院航空专业学习。那时,我开始编程,并学习用 Python 处理 VR 应用程序的数据库。在从事数据库和商业智能相关的工作几年后,我回到学校,开始应用数学的全日制博士课程。后来我去了俄罗斯 IT 巨头 Mail.Ru 集团担任该公司第一个数据科学家,目前在荷兰生活和工作,主要在荷兰国家实验室从事研发工作。在过去的 3 年里,我一直在领导 ML course.ai,这是一个开放的 ML 课程,非常关注 Kaggle 比赛。

  谈到 Kaggle,我经历了长期的学习、挣扎、再学习的过程。直到两年前我才开始认真参加 NLP 比赛。很长一段时间里,当我在 mlcourse.ai 的学生一次又一次斩获金牌时,我只幸运地爬上了银牌区的顶端。在 Google Quest 问答标签比赛中获胜,终于给我带来了期待已久的 Master 头衔。

  这是拿着 Nvidia Quadro P6000 卡的 Elmo:

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

  Oleg Yaroshevskiy

  我有应用统计学和计算机科学的背景。作为一名学生,我对技术对社会的影响很感兴趣。在 Andrej Karpathy 的著名文章「The Unreasonable Effectiveness of Recurrent Neural Networks」的鼓励下,我决定从软件工程转向机器学习。

  作为一名研究工程师,我从一开始就为语音处理、机器翻译、机器理解和其他 NLP 任务设计深度模型。2017 年 7 月,我了解了 transformers,这改变了我的职业生涯。我对文学和文字艺术充满热情,希望有一天能看到人工智能创作的戏剧。

  今天我是一名研究工程顾问和积极的 Kaggler。我相信 Kaggle 有助于在训练深度神经网络和模式识别背后建立深度直觉。我鼓励其他人尝试数据科学竞赛,并加入这个快速增长的 Kaggle 爱好者社区。

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

  Dmitriy Abulkhanov

  我在莫斯科物理技术学院和 Yandex 数据分析学院学习,拥有数学和物理学背景。作为一名学生,我参加了许多数据科学黑客竞赛。从这些比赛中,我得出一个结论:只要时间足够,没有无法解决的问题。我相信参加比赛能够提供有用的专业知识,以解决数据科学中的各种问题。

  目前,我在华为担任 NLP 研究员。

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

  Q2:你们团队是如何组建、如何协作的?

  在 TensorFlow 2.0 问答挑战赛中,我们与冠军失之交臂。为了证明自己,我们参加了 Google QUEST 问答标签比赛。

  幸运的是,这次比赛的形式和我们之前参加的两次编码比赛一样!因此,在 Google QUEST 问答标签比赛的前 2-3 周里,虽然出现了很多让其他参与者抓狂的问题,但这些对我们来说都很容易。

  我们四个人进行了合并,Dmitriy A 提出了一种使用 StackExchange 数据进行语言模型预训练的强大技术。

  Oleg 从一个基于一个公共 notebook 的简单 PyTorch 基线(https://www.kaggle.com/phoenix9032/pytorch-bert-plain)开始,他还训练了 BART 模型。Dmitriy A. 和 Yury 主要研究预训练语言模型。Dmitriy D. 领导团队训练模型,制定验证方案和模型混合方案。

  我们认为团队协作是一份宝贵的经历,夺冠是大家一起努力的结果。

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

  Q3:你们团队最重要的发现是什么?

  简而言之:迁移学习。考虑到我们在这场竞赛中拥有一个非常小的公共数据集,利用好大量未标记的数据是关键。

  但实际上,我们有三个主要的秘诀:

  • 语言模型预训练

  • 伪标签

  • 后处理预测

  秘诀 1:语言模型预训练

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

  我们使用了大约 700 万个 StackExchange 问题,通过一个屏蔽语言模型任务(MLM)和一个额外的句子顺序预测任务来微调 BERT 语言模型。

  除此之外,我们还建立了额外的辅助目标:在微调 LM 的同时,我们还预测了 5 个指标——问题得分、问题查看数、问题最喜爱计数、答案得分、答案计数,这些目标是我们基于 StackExchange 数据设计的。

  我们使用定制的扩展词汇表的原因很简单:StackExchange 问题通常不仅包含纯口语,还包含数学和代码。用 LaTeX 符号、数学公式和部分代码片段扩展词汇表有助于捕捉这一事实。

  一般来说,LM 预训练在改进我们的模型方面起到了关键作用:

  • 迁移学习。我们的模型在使用竞赛数据训练之前已经「看到」了 10 倍以上的数据。

  • 领域适应。由于 LM 微调的自定义词汇表和辅助目标,使我们的预训练模型更好地适应手头的数据。

  秘诀 2:伪标签

  伪标签曾经是 Kaggle 的一个热门话题,但现在它已经成为一种众所周知的常用技术。

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

图片来源:Vinko Kodžoman 的「Pseudo-labeling a simple semi-supervised learning method」教程

  这个想法总结在上图中。有关详细信息,请参阅上面提到的教程。简而言之,对于某些未标记的数据集,可以使用模型预测作为「伪标签」来扩展已标记的训练数据集。

  我们使用来自 StackExchange 问题转储的 20k 和 100k 样本的伪标签来改进四分之三的训练模型。

  秘诀 3:后处理预测

  为比赛选择的标准是 Spearman 关联。对于 30 个目标标签中的每一个,计算预测和真实值之间的 Spearman 相关性。然后平均 30 个 Spearman 相关系数产生最终度量。

  正如在这篇关于 Kaggle 文章(https://www.kaggle.com/c/google-quest-challenge/discussion/118724)中所观察到的,Spearman 关联对某些预测的相等与否相当敏感:

  上面的示例表明,预测向量 b 可以「阈值化」生成 b2,从而将其与 a(真值)的 Spearman 关联从 0.89 增加到 1。

  实际上,这是整个竞赛的缺点之一——目标指标对阈值预测等黑客攻击有点过于敏感。许多团队将各种阈值启发式方法应用于后期处理,通常对每一个目标都这样操作。我们清楚地认识到这是过分的。但是,我们仍然对模型预测采取了一些后处理。

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

  我们没有对预测进行阈值化,而是根据训练集中的分布将预测离散。其思想是使特定目标列的预测分布与训练数据集中相应列的相应分布相匹配。有关其他详细信息,请参阅我们共享的解决方案代码:https://github.com/oleg-yaroshevskiy/quest_qa_labeling/blob/yorko/step11_final/blending_n_postprocessing.py#L48。

  Q4:你们的最终解决方案是什么样的?

  基线模型

  我们的基线模型几乎是 vanilla BERT 与平均池隐藏状态之上的线性层。至于输入,我们只传递了用特殊标记分隔的问题标题、问题正文和答案正文。

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

  除了上面描述的三个「秘密」之外,还有一些技巧,包括所有 BERT 层中隐藏状态的 softmax 规范化权重和多样本丢失。

  最终融合

  最后的解决方案是将四个模型(两个 BERT 基模型、一个 RoBERTa 基模型和一个大的 BART)的折叠预测与上述三个「秘密」相结合:预训练语言模型、伪标签和后处理预测。

Google Quest冠军访谈:3个秘诀8条建议,还有人在华为做NLP研究员-冯金伟博客园

  Q5:你们从这次比赛中学到了什么?

  我们学到了很多!

  • 不要过早参加比赛。先打好技术基础。

  • 对于小的训练数据集,重点是以适当的方式利用额外的大数据集。

  • 迁移学习不仅适用于计算机视觉任务,在自然语言处理中也同样重要。

  • 如果是小型训练数据集,请特别注意验证。

  • 寻找能够在技能、方法、模型等方面为最终解决方案引入多样性的队友。

  你对那些刚开始学数据科学的人有什么建议吗?

  我们可以从视频「How to jump into Data Science」中总结 Yury 的建议(视频网址:https://www.youtube.com/watch?v=FGuGg9F2VUs)。

  有 8 个主要步骤:

  1. Python。通过 Kaggle Learn、Dataquest、codearcademy 或类似工具学习这种编程语言的基础知识。初级数据科学家几乎不需要高级 Python 技巧,但是在工作中使用 Python 是很好的。

  2. SQL 语言。学习基本知识,Kaggle Learn 也能做到,在面试前更新你的 SQL 技能,剩下的你将在工作中学习。

  3. 数学。微积分、线性代数、统计学等基础知识对于理解将要使用的工具集是必不可少的。开放的麻省理工课程可能是最好的资源。

  4. 算法。在多大程度上需要算法,这是一个有争议的问题,但你可以学习 R. Sedgewick 和 T. Roughgarden 的经典课程,leetcode 也会有帮助。

  5. 开发技巧。有软件工程背景者优先考虑。「ML 工程师」这个词现在实际上比「数据科学家」要热门得多,因为这项业务不是在 Jupyter notebook 上运行的,你必须将其部署到生产中。无论如何,你最好至少知道如何使用 git 和 Docker。

  6. 机器学习。mlcourse.ai 中包含基本的 ML 课程。一些 Coursera 专业也将是一个很好的切入点。至于深度学习,斯坦福大学的 cs231n 或 fast.ai 是两个不错的选择。

  7. 项目或比赛。这是很好的证明,你做了一个最低限度的可行的产品。通过练手项目,你可以学到很多。比赛是一个很好的选择,但不要抱着游戏的心态,要最大限度地利用你在 Kaggle 获得的知识。

  8. 面试。不要只是坐在家里学习,做些面试练习,尝试、失败、学习、迭代,总有一天你会成功的。

  资源

  • 在 GitHub 上共享的解决方案:https://github.com/oleg-yaroshevskiy/quest_qa_labeling/tree/yorko

  • Kaggle Notebook 再现了解决方案的推理部分:https://www.kaggle.com/ddanevskyi/1st-place-solution 

  • Kaggle 上的冠军解决方案:https://www.kaggle.com/c/google-quest-challenge/discussion/129840 

  via:https://medium.com/kaggle-blog/the-3-ingredients-to-our-success-winners-dish-on-their-solution-to-googles-quest-q-a-labeling-c1a63014b88