返回列表

20th Place Solution

519. Feedback Prize - English Language Learning | feedback-prize-english-language-learning

开始: 2022-08-30 结束: 2022-11-29 智能评测 数据算法赛
第20名解决方案

第20名解决方案

作者: colum2131 | 排名: 第20名

感谢组织者举办这次比赛,也感谢所有的参赛者!
这里简要介绍一下我的解决方案,该方案取得了最高的 Private LB 分数(相当于第20名)。

概述

我的解决方案由使用 Nelder-Mead 方法的多个 BERT 模型的加权平均组成,并结合了来自 Feedback 1 和 2 文本数据的伪标签技术。

我的推理代码

有效的方法

高影响力思路

伪标签

我先在本比赛数据上训练了 deberta-v3-large,然后对 Feedback 1 和 2 的数据进行伪标签处理,排除了与本比赛重叠的数据。
这些伪标签数据随后用于训练 deberta-v3-base、deberta-v3-large 和 deberta-v2-xlarge,采用了元伪标签方法(CV: +0.005~0.01)。

Nelder-Mead 方法

Nelder-Mead 方法是解决优化问题的一种算法,在 scipy 的 minimize 函数中实现。
使用该技术的最优加权平均方法基于 @takoihiraokazu 在 CommonLit 比赛中的第二名解决方案方法

实现代码在我的解决方案中,如下所示:

from scipy.optimize import minimize

target_cols = ['cohesion', 'syntax', 'vocabulary', 'phraseology', 'grammar', 'conventions']

def optimeze_func(weights, idx=0, col='cohesion'):
    opt_preds = np.zeros(len(train))
    for i in range(len(weights)):
        opt_preds += oof_preds[i, :, idx] * weights[i]
    score = mean_squared_error(train[col], opt_preds, squared=False)
    return score

opt_oof_preds = np.zeros((len(train), len(target_cols)))
opt_sub_preds = np.zeros((len(test), len(target_cols)))
weight_df = []

for idx, col in enumerate(target_cols):
    func = lambda x: optimeze_func(x, idx, col)
    weights = [1 / len(oof_preds)] * len(oof_preds)
    result = minimize(func, weights,  method="nelder-mead")
    weight_df.append(result.x)
    for i, weight in enumerate(result.x):
        opt_oof_preds[:, idx] += oof_preds[i, :, idx] * weight
        opt_sub_preds[:, idx] += sub_preds[i, :, idx] * weight

中等影响力思路

多个 BERT 模型的集成

使用了以下模型:

  • deberta-v3-base
  • deberta-v3-large
  • deberta-large
  • muppet-roberta-large
  • roberta-base
  • roberta-large
  • funnel-transformer-large
  • funnel-transformer-xlarge
  • deberta-v2-xlarge

所有模型的学习参数如下:

  • max_length = 512
  • criterion = nn.SmoothL1Loss(beta=1., reduction='mean')
  • learning_rate = 1e-5
  • optimizer = AdamW(betas=(0.9, 0.98), weight_decay=2e-5)
  • scheduler = get_linear_schedule_with_warmup
  • num_warmup_steps_rate = 0.01
  • clip_grad_norm = 1000
  • all dropout = 0

无效的方法

  • 使用 GBDT 进行
同比赛其他方案