第15名方案及代码
第15名方案及代码
作者:jionie (Master) | 比赛排名:第15名 (银牌)
恭喜所有的获奖者,也感谢我的队友们!完成这场比赛并获得银牌是一段漫长的旅程,这是我第一次接触 NLP 项目。
我们的方案总结如下:
- 后处理:我们的想法是将数值归类为训练集中存在的离散值。我们通过比较 OOF(Out-of-Fold)分数来选择需要进行后处理的列。后处理代码可以在我的推理内核中找到。
- 模型集成:我们的最终提交由 8 个基础模型组成,正如你在推理内核中看到的那样。最好的模型是一个双部分 RoBERTa Base 模型,在没有后处理的情况下 OOF 分数为 0.412,在后处理后 LB 分数为 0.439。
- 修改池化层与多层隐藏状态:受这篇精彩帖子的启发,我们将多层隐藏状态作为池化层的输入。我们参考了 transformers 库中池化类的源代码。这也可以在我的推理内核中找到。我们根据验证结果选择了隐藏状态层。
- 差异化学习率:受这个优秀的内核启发,我们使用了差异化学习率。通过差异化学习率,我们的模型获得了更高的 OOF 分数且收敛更快。
- 双部分模型(Two part model):受讨论区启发,我们以两种风格训练模型。一种是将 title + question_body + answer 作为输入来预测问题标签和回答标签;另一种是使用 title + question_body 预测问题标签,使用 title + answer 预测回答标签。第二种风格带来了更高的 OOF 和 LB 分数,我认为这是因为针对单个问题包含了更多的信息。(同样,对 XLNet 使用 max_len 768 获得更高 OOF 也是基于同样的思路。)
- 数据增强:我们使用 nlpaug 进行了一些基本的数据增强,同时也使用谷歌翻译对其他语言的内容进行了回译。我是在很早的阶段决定这么做的,所以很抱歉我无法说出它能带来多少提升。我认为提升幅度不会很大。
对我们无效的尝试:
- T5 模型
- 额外的 Token
- 大模型:与 Base 模型相比,大模型给出了相似的 OOF 分数,但难以推理,总是很慢且容易耗尽资源。