返回列表

3rd Place Solution w code and notebook

478. Feedback Prize - Evaluating Student Writing | feedback-prize-2021

开始: 2021-12-14 结束: 2022-03-15 智能评测 数据算法赛
第三名解决方案(含代码和笔记本)

第三名解决方案(含代码和笔记本)

作者:Shujun | 团队:BestOverfitting | 排名:第3名

首先,感谢主办方举办了一场有趣且竞争激烈的比赛,并祝贺所有获奖者。其次,感谢我出色的队友 @aerdem4@thedrcat。虽然我们下滑了一位,但这仍然是一次很好的团队合作,我对结果感到满意。这是我的第一次NLP比赛,尽管它属于我熟悉的类别(即seq2seq预测)。

概述

我们的解决方案结合了使用Transformers的标记分类模型和一个堆叠框架,该框架分别对7种论述类型的跨度进行分类。感谢 @cdeotte@chasembowers 分享他们精彩的笔记本。

overview

深度学习模型

我们最好的集成模型由6折Longformer和6折滑动窗口Deberta-xl模型组成(根据CV按论述类型加权)。由于问题的序列性质,我们在Transformer隐藏状态之上添加了一个2层GRU,然后输出每个标记的预测。我们发现将训练/推理期间的max_len增加到2048是有益的,超过这个长度我们实际上看到了性能下降。在我们的案例中,deberta-l的表现明显优于longformer large,而deberta-xl甚至更好,尽管deberta-xl更难训练。

下面我将讨论训练这些模型的一些细节。

Longformer

训练Longformer相对简单,因为Longformer可以毫无问题地接受长度超过512的序列。我们的流程与公开可用的类似,主要来自 @cdeotte

滑动窗口 (SW) Deberta-xl

训练Deberta比Longformer稍微棘手一些,因为我们不能直接输入长度超过512的序列。相反,当序列长度超过512时,我们使用滑动窗口方法。首先,前512个位置被输入到Deberta编码器中。当我们输入下一段到Deberta时,我们实际上只将结束位置增加384,输入位置 [512-64:512-64+512],并且只将中间段 [64:448] 的隐藏状态连接到前512个位置的隐藏状态,这避免了边缘效应。我们这样做直到到达序列的末尾,如果最后一段等于或小于64,我们简单地取前一段的最后位置。在我们运行并连接所有段之后,我们通过一个2层GRU层运行序列。由于GRU按顺序处理连接的段,它本质上重新连接了所有段。

B,L=input_ids.shape
if L<=self.window_size:
    x=self.backbone(input_ids=input_ids,attention_mask=attention_mask,return_dict=False)[0]
else:
    segments=(L-self.window_size)//self.inner_len
    if (L-self.window_size)%self.inner_len>self.edge_len:
        segments+=1
    elif segments==0:
        segments+=1
    x=self.backbone(input_ids=input_ids[:,:self.window_size],attention_mask=attention_mask[:,:self.window_size],return_dict=False)[0]
    for i in range(1,segments+1):
        start=self.window_size-self.edge_len+(i-1)*self.inner_len
        end=self.window_size-self.edge_len+(i-1)*self.inner_len+self.window_size
        end=min(end,L)
        x_next=input_ids[:,start:end]
        mask_next=attention_mask[:,start:end]
        x_next=self.backbone(input_ids=x_next,attention_mask=mask_next,return_dict=False)[0]
        if i==segments:
            x_next=x_next[:,self.edge_len:]
        else:
            x_next=x_next[:,self.edge_len:self.edge_len+self.inner_len]
        x
同比赛其他方案