返回列表

18th place solution: label variation

463. chaii - Hindi and Tamil Question Answering | chaii-hindi-and-tamil-question-answering

开始: 2021-08-11 结束: 2021-11-15 自然语言处理 数据算法赛
第18名方案:标签变化

第18名方案:标签变化

作者: guchio3 | 比赛排名: 第18名

感谢 Kaggle 和主办方举办如此精彩的比赛。我们学到了很多。

这是我尝试的内容,过程真的很艰难……

最终提交的关键点

  • 使用上下文的前20个字符作为键进行 GroupKFold
    • 我注意到训练数据中存在一些重复的上下文。其中一些并非完全相同的上下文,而是仅有微小变化的几乎相同的上下文。因此,我使用上下文的前20个字符作为键来进行 GroupKFold。
  • 7个全数据训练模型的加权集成(训练2个轮次,权重由 Optuna 调优)
    1. XLMRoBERTa
    2. XLMRoBERTa,使用上下文中的所有“answer_text”(许多正标签)
    3. XLMRoBERTa,过滤掉上下文中包含11个或更多“answer_text”的样本的正标签。我尝试这样做是为了给标签去噪,因为包含更多“answer_text”的样本标签往往更容易出错。我还过滤了包含“answer_text”但不持有起始/结束位置的文本批次,因为如果这个 answer_text 是正确的,这种情况也应该是噪声。
    4. XLMRoBERTa,采用负样本欠采样。正:负 = 1 : 1
    5. XLMRoBERTa,采用负样本欠采样。正:负 = 1 : 5
    6. XLMRoBERTa,使用训练伪标签。我尝试这样做是因为伪标签可以使标签更准确。第一个“answer_text”可能不是正确的。此外,存在模型无法回答问题的情况,因为文本批次的原因。如果关于问题和“answer_text”的信息不在同一个文本批次中,我认为模型不应该正确回答问题。伪标签也应该过滤掉这些情况。
    7. XLMRoBERTa,使用训练伪标签,并且仅使用包含“answer_text”的文本批次进行训练。
  • cumax 函数
  • 数字文本后处理
    • 如果预测文本仅包含天城文数字,我将其更改为阿拉伯数字。
def devanagari_number_to_arabic_number(
    answer_text: str, context: str, only_whole_numeric: bool
) -> str:
    if only_whole_numeric and not answer_text.strip().isnumeric():
        return answer_text

    devanagari_to_arabic = {
        "०": "0",
        "१": "1",
        "२": "2",
        "३": "3",
        "४": "4",
        "५": "5",
        "६": "6",
        "७": "7",
        "८": "8",
        "९": "9",
    }

    new_answer_text = answer_text
    for devanagari_num, arabic_num in devanagari_to_arabic.items():
        new_answer_text = new_answer_text.replace(devanagari_num, arabic_num)
    if context.find(new_answer_text) > 0:
        return new_answer_text
    return answer_text

尝试过但未使用的方法

  • 字符级集成
    • 我已经实现了字符级集成逻辑来集成多样化的(例如 muril)模型,但我没有使用它,因为它大大降低了公共 LB 分数。这对私有 LB 有效,但我无论如何都无法采用它……
  • 两阶段建模
    • 我认为模型不知道哪些批处理文本是好的。所以我尝试了两阶段建模。在第一阶段,我计算每个批处理文本持有“answer_text”的概率。在第二阶段,我尝试了两件事。① 将预测概率乘以每个批处理文本的 logits。② 过滤前 N 个批处理文本,并使用仅使用包含“answer_text”的批处理文本训练的模型计算 logits。第一阶段的本地 AUC 为 0.964,但这两种方法效果都不太好。

一个有趣的发现是,如果问题相同或相似,answer_text

同比赛其他方案