第9名公开及私有方案:30个模型,每一列一个?
第9名公开及私有方案:30个模型,每一列一个?
作者: Phi (MASTER) | 比赛排名: 第9名 | 发布时间: 2020-02-12
首先,我要感谢组织者和我的队友 @murphy89,同时也祝贺所有参赛团队。我知道评估指标并不完美,但我相信大家都在这次比赛中有所收获。
其次,嗯,那个标题确实有点“标题党”,但在混合(Blending)部分我们确实做了一些类似的事情。以下是我们方案的概览:
概览
- 没有对文本进行特殊的预处理,只是进行了基本的清理,例如将
& 替换为 &,将 < 替换为 < 以及修复一些乱码符号。
模型
- 我们将模型分为两部分:用于预测前21个问题列的模型和用于预测后9个答案列的模型。
我的模型
问题部分
- 问题模型仅提取问题标题和问题正文中的文本。如果文本长度较长,则使用截取首尾的方法。
- 使用了特殊标记,如站点页面、类别等。
- 冻结最后4层,将它们拼接起来并输入到单层LSTM中,然后取平均池化和最大池化。最后接1-2个全连接层。
- 我使用了 BERT base、BERT large 和 XLNet。针对每个模型我做了一些变化,例如冻结不同的层,或者不拼接层而是直接求和。
- 对每一列使用 BCELogitsLoss 的总和对我来说效果更好。我猜这类似于加权损失。
答案部分
- 答案模型提取所有3列的文本,同样使用截取首尾的方法。
- 没有使用特殊标记,因为在答案部分加入特殊标记后我的交叉验证(CV)分数反而变差了。
- 冻结最后4层,做法与问题部分几乎相同,不同之处在于这里主要使用的是2层双向LSTM(BiLSTM)。
- 主要是 BERT base 和 BERT large,结构上只是对主模型进行了一些简单的变体调整。
- 使用常规的 BCELogitsLoss。
混合
我认为这是提升我们分数的关键部分。我们在最后一天才发现了正确的混合策略,当时我们保存了袋外预测并进行了离线交叉验证。虽然我们的单模型CV分数在 0.411-0.426 之间,但在以特定权重混合后似乎效果更好。后来我发现每个模型在预测某些列时表现更好,所以我使用启发式搜索来寻找每一列的最佳CV分数。对于那些严重依赖后处理的列,搜索是在后处理后的最终值上进行的。这就是为什么会有这样的标题:30个模型,因为我相信针对某些列调整特定的模型在后处理部分会更好。事实上,一些初始CV分数较低的模型在这里似乎拥有更高的权重。混合后的最佳CV分数是 0.435,后处理后是 0.478。
唯一的遗憾是,当我们做这些的时候,离截止日期只有4个小时了,所以最终方案中我们的一些列并没有达到最优。事实上,我在截止日期后再次尝试时,经过后处理我们的CV可以达到 0.482。
后处理
我们的后处理与其他团队没有什么不同;相反,我认为它的效果甚至更弱,因为只是简单地将某些列的预测值按特定阈值舍入到最接近的数值。
对我无效的方法
- 翻译增强: 我曾尝试在法语和意大利语之间来回翻译,但加入它们并没有帮助。
- SWA(随机权重平均): 无效。
- Multi-dropout: 对我无效,但对我队友 Morphy 的架构有效。
- 其他模型: XLNet-large、ALBERT 等。在我的情况下分数更差。