其中,v为嵌入向量。实际训练过程中,我们在训练完一个batch的原始输入数据时,保存当前batch对输入词向量的梯度,得到对抗样本后,再使用对抗样本进行对抗训练。除了对抗训练,我们还利用虚拟对抗训练做半监督训练。知识蒸馏 与对抗训练类似,知识蒸馏也是一种常用的提高模型泛化能力的训练方法。知识蒸馏[7] 这个概念最早由Hinton在2015年提出。一开始,知识蒸馏通往往应用在模型压缩方面,利用训练好的复杂模型(teacher model)输出作为监督信号去训练另一个简单模型(student model),从而将teacher学习到的知识迁移到student。Tommaso[8]在18年提出,如果student和teacher的模型完全相同,蒸馏后则会对模型的表现有一定程度上的提升。在我们的训练过程中,我们先用RoBERTa + 对抗训练得到teachermodel,再用知识蒸馏的方法得到student模型。训练student时,我们同时采用真实label和teacher的输出来计算损失。后处理 在CoQA数据集中,有一小部分的问题是多选题,比如问题是“How Jack goes to school? Walk orride? ”,而Context中的片段是“walked”。即使模型抽取到了“walked”,也并不能得分。因此,针对这类问题,我们做了一个简单的后处理。通过一定规则识别到多选题型的问题,然后抽取出问题中出现的选项,找到与我们模型抽取的Context片段语义相似度最高的选项,作为我们系统最终的回答。结果分析与消融实验 最终,我们的单模型在CoQA Leaderboard上超越了微软团队2.6个百分点,并首次超过了人工评测的水平。值得一提的是,与微软和其他团队不同,我们在模型训练的过程,没有用任何CoQA以外的有监督的数据集,进行多任务训练或是数据增强。 验证集结果分析。 为了验证各个技巧的作用,我们进行了消融实验。从实验结果中可以看出,依据标记和对抗训练带来的提升较大,知识蒸馏和后处理也能带来一定程度的提升。 验证集消融实验结果。 最终可以看到,利用对抗训练、知识蒸馏等方法,我们的单模型在RoBERTa Baseline的基础上提升了1.8个百分点。总结 这次的CoQA挑战赛经历,是我们团队站在巨人肩膀上的一次眺望。在优化模型的过程中,我们发现由于预训练模型已经相当强大,以往一些屡试不爽的优化技巧在RoBERTa上却并不能奏效。这就需要我们在比赛的过程中,大胆地设想,仔细地实验,验证不同方法的有效性和稳定性,从而找到真正行之有效的解决方案。希望我们的这次分享也能给其他团队带来一些经验上的启发。 参考文献:[1] CoQA Leaderboard. https://stanfordnlp.github.io/coqa/[2] SQuAD: 100,000+ Questions for Machine Comprehension of Text. https://arxiv.org/abs/1606.05250[3] CoQA: A Conversational Question Answering Challenge. https://arxiv.org/abs/1808.07042[4] RoBERTa: A Robustly Optimized BERT Pretraining Approach. https://arxiv.org/abs/1907.11692[5] BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding. https://arxiv.org/abs/1810.04805[6] Adversarial Training Methods for Semi-Supervised TextClassification. https://arxiv.org/abs/1605.07725[7] Distilling the Knowledge in a Neural Network. https://arxiv.org/abs/1503.02531[8] Born Again Neural Networks. https://arxiv.org/abs/1805.04770机器之心「SOTA模型」:22大领域、127个任务,机器学习 SOTA 研究一网打尽。