463. chaii - Hindi and Tamil Question Answering | chaii-hindi-and-tamil-question-answering
首先,我要感谢 Kaggle 和竞赛主办方。这场比赛非常有趣,因为训练数据非常少,而且鼓励我们使用外部数据。
我的方案非常简单。只有两个关键点 —— 字符级集成 & 后处理。
Colab pro+ & kaggle notebook
我训练了三个模型。
模型: deepset/xlm-roberta-large-squad2
数据: 竞赛数据集 + MLQA + XQUAD
折数: 5折
最大长度 (max_length): 384
步长 (stride): 128
轮数: 2
学习率: 2.0e-5
模型: google/muril-large-cased
数据: 竞赛数据集 + MLQA + XQUAD
折数: 5折
最大长度 (max_length): 384
步长: 128
轮数: 2
学习率: 2.0e-5
印地语模型: roberta-large-wechsel-hindi
泰米尔语模型: roberta-large-wechsel-tamil
印地语数据: 竞赛数据集 + MLQA + XQUAD
泰米尔语数据: 竞赛数据集 + 翻译后的 SQuAD2.0
折数: 5折
最大长度 (max_length): 400
步长: 135
轮数: 3
学习率: 2.0e-5
| 模型 | CV | Public LB | Private LB |
|---|---|---|---|
| XLM-RoBERTa | 0.7060 | 0.778 | 0.738 |
| MuRIL | 0.7038 | 0.760 | 0.743 |
| RoBERTa | 0.7481 & 0.5907 | 0.763 | 0.735 |
MuRIL 很强💪
因为分词器不同,无法简单地平均上述三个模型的输出。所以我利用偏移量将 token 概率扩展为字符概率。
起初,我尝试集成 XLM-RoBERTa & MuRIL。Public LB 得分为 0.782(+0.004 提升),但 Private LB 得分为 0.754(+0.011 提升)!!
在最后一个周末,我检查了模型是如何得出错误答案的。
我发现有些预测结果由梵文数字组成,而不是阿拉伯数字。
例如) 答案文本: 1945, 预测结果: १९४५
我的后处理函数如下。
def postprocess_v3(pred, context, language):
if language == "hindi":
bad_starts = [".", ",", "(", ")", "-", "–", ";", "।"]
bad_endings = ["...", ",", "(", ")", "-", "–", ";", "।"]
elif language == "tamil":
bad_starts = [".", ",", "(", ")", "-", "–", ";"]
bad_endings = ["...", ",", "(", ")", "-", "–", ";", "."]
tamil_ad = "கி.பி"
tamil_bc =