返回列表

Private LB 10th Place Solution

362. Google QUEST Q&A Labeling | google-quest-challenge

开始: 2019-11-22 结束: 2020-02-10 自然语言处理 数据算法赛
Private LB 第10名方案

Private LB 第10名方案

作者: Ram Ramrakhya | 团队: Giba, Mathurin Ache, Cl_ev, Theo Viel, Ram Ramrakhya

恭喜获奖者,并感谢我的队友( @theoviel @cl2ev1 @mathurinache @titericz )。以下是我们解决方案中关键点的简要概述:

损失函数

  • 我们长期坚持使用 BCE(二元交叉熵),并且无法通过更改它来改善结果。然而,我们设法找到了非常适合我们后处理策略的权重。
loss_fct = nn.BCEWithLogitsLoss(pos_weight=torch.Tensor([
0.9, 1, 1.5, 0.8, 0.8, 0.8, 0.96, 1.1, 1.1, 3,  1, 1.1, 2, 3, 3,   2, 1, 2, 1, 2, 0.9, 0.75, 0.9, 0.75, 0.75, 0.7, 1, 2.5, 1, 0.75]))
  • 我们进行了多次其他自定义损失函数的实验,但 BCE 表现最好。

训练细节

  • 冻结编码器训练 1 个 epoch + 解冻所有层训练 2 个 epoch。
  • 线性学习率调度,根据层不同使用自定义学习率。Transformer 使用较低的学习率,因为它经过预训练,而越靠近输出层,学习率越大。
  • 使用 AdamW,参数设置为 betas=(0.5, 0.999),且无偏置衰减(bias decay)设为 1。
  • 第一个 epoch 的 Batch size 为 64,之后根据 GPU 显存尽可能调大,有时会使用梯度累积步骤。

模型

  • 我们的解决方案是 4 个模型的集成(3 个 BERT-Large + 1 个 BERT-Base)。
  • 我们使用 bert-base-uncased 架构进行了大多数实验,并在比赛结束前约 1 周成功建立了强大的流程。这使我们能够轻松切换到更大的模型,这最终构成了我们集成的优势。
  • 我们在 Transformer 之上构建了 4 种不同的架构,总共使用了其中的两种。

BERT Base Uncased

  • 这是我们为 bert-base 方法选择的定制架构思路:

    • 输入为 [CLS] title [Q] question [A] answer [SEP],ID 为 [0, … 0, 1, …., 1, 2, …, 2]。我们使用 [SEP] 标记的值初始化特殊标记。定制 ID 也使用模型值进行了初始化。
    • 定制头部:取最后 n=8 层的 [CLS] 标记,应用大小为 m=1024 的全连接层和 tanh 激活函数,然后将所有内容拼接起来。
    • categoryhost 列的嵌入(+ tanh)。我们将它们与定制池化器的输出拼接并获得 logits。还进行了一些文本清理(latex、url、空格、反斜杠)。
  • 这是唯一使用文本清理和嵌入的模型,我想这有助于多样性。

BERT Larges

  • 它们基于相同的架构。我们使用两个输入:

    • [Q] title [SEP] question [SEP] 用于 token,[0, … 0, 1, …., 1] 用于 ID。
    • [A] title [SEP] answer[SEP] 用于 token,[0, … 0, 1, …., 1] 用于 ID。
    • [Q][A][CLS] 标记的值开头。
同比赛其他方案