返回列表

12th place- predict joint probabilities for start & end indices

386. Tweet Sentiment Extraction | tweet-sentiment-extraction

开始: 2020-03-23 结束: 2020-06-16 自然语言处理 数据算法赛
第12名方案 - 预测起始和结束索引的联合概率

第12名方案 - 预测起始和结束索引的联合概率

作者: oalenkin
比赛排名: 第12名

首先,我要感谢 @abhishek 提供的优秀的 kernel。我从这项工作中学到了很多。

以下是为我带来显著提升的事项列表:

  1. 使用在 SQuAD v2 数据集上微调过的 RoBERTa(相比原生 RoBERTa 提升 ~0.003)。
  2. 不仅仅选择最可能的起始和结束索引,而是采用更智能的方法(提升 ~0.003)。
  3. 当然,模型集成是有效的。在我的方案中,我集成了两个基于 RoBERTa 的模型(提升 ~0.004)。
  4. 我还进行了后处理,方法接近 此处 描述的方式(提升 ~0.008)。

我不打算详细描述我尝试过的所有事情,因为其中大部分在其他讨论中已经有了很好的涵盖。我只想谈谈第2点。

动机

让我们假设模型返回的是起始索引的概率向量和结束索引的概率向量。在下图中,垂直的绿线代表起始索引的概率,红线代表结束索引的概率。

概率分布示意图

在这种情况下,我们只有3个可能的答案。很容易看出,子字符串 1、2 和 3 的似然度分别为 0.49、0.49 和 0.02。

似然度示意图

如果我们选择最可能的起始和结束位置,这意味着我们倾向于子字符串 3。我们可以计算这三种情况下的 Jaccard 得分期望值:

  • 子字符串 1: 0.49 * 1 + 0.49 * 0 + 0.02 * 0.1 = 0.492
  • 子字符串 2: 0.49 * 0 + 0.49 * 1 + 0.02 * 0.1 = 0.492
  • 子字符串 3: 0.49 * 0.1 + 0.49 * 0.1 + 0.02 * 1 = 0.118

显然,第3个子字符串是最差的答案,最好选择子字符串 1 或 2。因此,如果我们能找到起始索引和结束索引每种组合的似然度,我们就可以最大化 Jaccard 得分的期望值。问题在于,我们并不总能正确找到每一对起始和结束索引的似然度。例如,考虑以下情况:

复杂情况示意图

这里有4个可能的答案,我们无法正确估计它们的似然度。

提出的解决方案

我修改了模型的顶层,使其返回成对的 logits,而不是分别返回起始和结束索引的 logits。

class TweetModel(transformers.BertPreTrainedModel):
    def __init__(self, conf):
        super(TweetModel, self).__init__(conf)
        self.base_bert = BASE_MODEL.from_pretrained(MODEL_PATH, config=conf)
        self.drop_out = nn.Dropout(0.1)
        self.linear_start = nn