386. Tweet Sentiment Extraction | tweet-sentiment-extraction
首先,我要感谢 @abhishek 提供的优秀的 kernel。我从这项工作中学到了很多。
以下是为我带来显著提升的事项列表:
我不打算详细描述我尝试过的所有事情,因为其中大部分在其他讨论中已经有了很好的涵盖。我只想谈谈第2点。
让我们假设模型返回的是起始索引的概率向量和结束索引的概率向量。在下图中,垂直的绿线代表起始索引的概率,红线代表结束索引的概率。

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

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