https://www.leiphone.com/news/202003/PlC1Y1sb36jlBpz1.htmlhtml
Anna Vander Stel 发布在 Unsplash 上的照片git
近日,由 Google 举办的 Quest 问答标签大赛结果出炉,由 Dmitry Danevskiy、Yury Kashnitsky、Oleg Yaroshevskiy 和 Dmitry Abulkhanov 组成的四人团队「Bibimorph」斩获冠军。github
在 QUEST 问答标签大赛中,参与者被要求为不一样的问答构建预测算法。比赛提供的数据集包含数千个问答对,大部分来自 StackExchange。问答对被贴上了标签,以反映问题好坏以及答案是否相关。大赛的结果将有助于促进问答系统的发展。面试
在获奖者访谈中,Bibimorph 团队公布了他们解决这一挑战的独特方法。算法
Q1:请分享一下你的背景,包括你是如何开始 Kaggle 之旅的?数据库
Dmitriy Danevskiy编程
我拥有应用数学和物理学背景。4 年前,我开始主攻工业应用方面的机器学习。两年来,我一直在一家小型人工智能服务公司工做,负责分割时间序列、人脸识别、语音处理及实现复杂的深度学习解决方案。如今我在一家名为 Respeecher 的初创公司工做,是从事音频合成前沿研究的首席工程师之一。网络
我参加不一样的 Kaggle 竞赛不少年了,我认为现代的深度学习方法很是广泛,几乎能够应用于任何非结构化和结构化的数据。这听起来可能有争议,但我用经验证实它可以在图像、文本、音频和表格数据比赛中得到金牌。在 Google Quest 问答标签竞赛中获胜对我来讲尤其重要——我成功地得到了 Grandmaster 头衔。iphone
Yury Kashnitsky机器学习
我是物理和应用数学博士。小时候,我热衷于航空技术,因而进入莫斯科物理技术学院航空专业学习。那时,我开始编程,并学习用 Python 处理 VR 应用程序的数据库。在从事数据库和商业智能相关的工做几年后,我回到学校,开始应用数学的全日制博士课程。后来我去了俄罗斯 IT 巨头 Mail.Ru 集团担任该公司第一个数据科学家,目前在荷兰生活和工做,主要在荷兰国家实验室从事研发工做。在过去的 3 年里,我一直在领导 ML course.ai,这是一个开放的 ML 课程,很是关注 Kaggle 比赛。
谈到 Kaggle,我经历了长期的学习、挣扎、再学习的过程。直到两年前我才开始认真参加 NLP 比赛。很长一段时间里,当我在 mlcourse.ai 的学生一次又一次斩获金牌时,我只幸运地爬上了银牌区的顶端。在 Google Quest 问答标签比赛中获胜,终于给我带来了期待已久的 Master 头衔。
这是拿着 Nvidia Quadro P6000 卡的 Elmo:
Oleg Yaroshevskiy
我有应用统计学和计算机科学的背景。做为一名学生,我对技术对社会的影响很感兴趣。在 Andrej Karpathy 的著名文章「The Unreasonable Effectiveness of Recurrent Neural Networks」的鼓励下,我决定从软件工程转向机器学习。
做为一名研究工程师,我从一开始就为语音处理、机器翻译、机器理解和其余 NLP 任务设计深度模型。2017 年 7 月,我了解了 transformers,这改变了个人职业生涯。我对文学和文字艺术充满热情,但愿有一天能看到人工智能创做的戏剧。
今天我是一名研究工程顾问和积极的 Kaggler。我相信 Kaggle 有助于在训练深度神经网络和模式识别背后创建深度直觉。我鼓励其余人尝试数据科学竞赛,并加入这个快速增加的 Kaggle 爱好者社区。
Dmitriy Abulkhanov
我在莫斯科物理技术学院和 Yandex 数据分析学院学习,拥有数学和物理学背景。做为一名学生,我参加了许多数据科学黑客竞赛。从这些比赛中,我得出一个结论:只要时间足够,没有没法解决的问题。我相信参加比赛可以提供有用的专业知识,以解决数据科学中的各类问题。
目前,我在华为担任 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. 领导团队训练模型,制定验证方案和模型混合方案。
咱们认为团队协做是一份宝贵的经历,夺冠是你们一块儿努力的结果。
Q3:大家团队最重要的发现是什么?
简而言之:迁移学习。考虑到咱们在这场竞赛中拥有一个很是小的公共数据集,利用好大量未标记的数据是关键。
但实际上,咱们有三个主要的秘诀:
语言模型预训练
伪标签
后处理预测
秘诀 1:语言模型预训练
咱们使用了大约 700 万个 StackExchange 问题,经过一个屏蔽语言模型任务(MLM)和一个额外的句子顺序预测任务来微调 BERT 语言模型。
除此以外,咱们还创建了额外的辅助目标:在微调 LM 的同时,咱们还预测了 5 个指标——问题得分、问题查看数、问题最喜好计数、答案得分、答案计数,这些目标是咱们基于 StackExchange 数据设计的。
咱们使用定制的扩展词汇表的缘由很简单:StackExchange 问题一般不只包含纯口语,还包含数学和代码。用 LaTeX 符号、数学公式和部分代码片断扩展词汇表有助于捕捉这一事实。
通常来讲,LM 预训练在改进咱们的模型方面起到了关键做用:
迁移学习。咱们的模型在使用竞赛数据训练以前已经「看到」了10倍以上的数据。
领域适应。因为 LM 微调的自定义词汇表和辅助目标,使咱们的预训练模型更好地适应手头的数据。
秘诀 2:伪标签
伪标签曾经是 Kaggle 的一个热门话题,但如今它已经成为一种众所周知的经常使用技术。
图片来源: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。
实际上,这是整个竞赛的缺点之一——目标指标对阈值预测等黑客攻击有点过于敏感。许多团队将各类阈值启发式方法应用于后期处理,一般对每个目标都这样操做。咱们清楚地认识到这是过度的。可是,咱们仍然对模型预测采起了一些后处理。
咱们没有对预测进行阈值化,而是根据训练集中的分布将预测离散。其思想是使特定目标列的预测分布与训练数据集中相应列的相应分布相匹配。有关其余详细信息,请参阅咱们共享的解决方案代码:https://github.com/oleg-yaroshevskiy/quest_qa_labeling/blob/yorko/step11_final/blending_n_postprocessing.py#L48。
Q4:大家的最终解决方案是什么样的?
基线模型
咱们的基线模型几乎是 vanilla BERT 与平均池隐藏状态之上的线性层。至于输入,咱们只传递了用特殊标记分隔的问题标题、问题正文和答案正文。
除了上面描述的三个「秘密」以外,还有一些技巧,包括全部 BERT 层中隐藏状态的 softmax 规范化权重和多样本丢失。
最终融合
最后的解决方案是将四个模型(两个 BERT 基模型、一个 RoBERTa 基模型和一个大的 BART)的折叠预测与上述三个「秘密」相结合:预训练语言模型、伪标签和后处理预测。
Q5:大家从此次比赛中学到了什么?
咱们学到了不少!
不要过早参加比赛。先打好技术基础。
对于小的训练数据集,重点是以适当的方式利用额外的大数据集。
迁移学习不只适用于计算机视觉任务,在天然语言处理中也一样重要。
若是是小型训练数据集,请特别注意验证。
寻找可以在技能、方法、模型等方面为最终解决方案引入多样性的队友。
你对那些刚开始学数据科学的人有什么建议吗?
咱们能够从视频「How to jump into Data Science」中总结 Yury 的建议(视频网址:https://www.youtube.com/watch?v=FGuGg9F2VUs)。
有 8 个主要步骤:
Python。经过 Kaggle Learn、Dataquest、codearcademy 或相似工具学习这种编程语言的基础知识。初级数据科学家几乎不须要高级 Python 技巧,可是在工做中使用 Python 是很好的。
SQL 语言。学习基本知识,Kaggle Learn 也能作到,在面试前更新你的 SQL 技能,剩下的你将在工做中学习。
数学。微积分、线性代数、统计学等基础知识对于理解将要使用的工具集是必不可少的。开放的麻省理工课程多是最好的资源。
算法。在多大程度上须要算法,这是一个有争议的问题,但你能够学习 R. Sedgewick 和 T. Roughgarden 的经典课程,leetcode 也会有帮助。
开发技巧。有软件工程背景者优先考虑。「ML工程师」这个词如今实际上比「数据科学家」要热门得多,由于这项业务不是在 Jupyter notebook 上运行的,你必须将其部署到生产中。不管如何,你最好至少知道如何使用 git 和 Docker。
机器学习。mlcourse.ai 中包含基本的 ML课程。一些 Coursera 专业也将是一个很好的切入点。至于深度学习,斯坦福大学的 cs231n 或 fast.ai 是两个不错的选择。
项目或比赛。这是很好的证实,你作了一个最低限度的可行的产品。经过练手项目,你能够学到不少。比赛是一个很好的选择,但不要抱着游戏的心态,要最大限度地利用你在 Kaggle 得到的知识。
面试。不要只是坐在家里学习,作些面试练习,尝试、失败、学习、迭代,总有一天你会成功的。
资源
在 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
雷锋网雷锋网(公众号:雷锋网)雷锋网
雷锋网版权文章,未经受权禁止转载。详情见转载须知。