519. Feedback Prize - English Language Learning | feedback-prize-english-language-learning
感谢组织者举办这次比赛,也感谢所有的参赛者!
这里简要介绍一下我的解决方案,该方案取得了最高的 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 模型的集成
使用了以下模型:
所有模型的学习参数如下: