返回列表

4th Place Solution

573. Kaggle - LLM Science Exam | kaggle-llm-science-exam

开始: 2023-07-11 结束: 2023-10-10 自然语言处理 数据算法赛
Kaggle LLM科学考试第四名解决方案
作者:Yiemon773(Grandmaster) | 团队成员:hayaocelot, deoxy, mitmul | 发布日期:2023-10-11 | 排名:第4名

Kaggle LLM科学考试第四名解决方案

首先,我们要向主办方和Kaggle团队表示诚挚的感谢,感谢他们组织了这场精彩的比赛。同时,也要向所有参赛者致意,感谢你们经历了这场激烈的竞争。这是一场极具教育意义和令人兴奋的比赛。

下面,我们介绍我们的解决方案。

我们的解决方案基于高质量的检索+Deberta v3模型的组合。高质量检索的实现以及如何将其作为上下文引入是至关重要的。

检索部分

示例代码:https://www.kaggle.com/code/linshokaku/4th-elasticsearch-retrieval-example

检索工作流程

  • 阶段1
    • 逐句关键词检索
    • 使用Elasticsearch
  • 阶段2
    • 版本3:Elasticsearch分数
    • 版本5:编辑距离分数
    • 版本7:语义搜索分数

验证(检索)

我们实现了多种检索规则,并以零样本方式评估分数,不介入模型训练。最初使用llama2 7b和train.csv进行评估。当使用上下文的预训练模型性能显著提升后,我们使用该模型评估从60k数据集(https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/436383)抽取的2000个实例的验证集。由于没有插入模型训练,能够以相对较高的速度执行改进循环。

细节

我们认为以下元素对于高质量检索至关重要:

  • 尽可能使用干净的维基百科数据
  • 搜索与提示和选项所有元素相关的内容
  • 全面搜索

通过cirrussearch转储可获得干净的维基百科数据,具体参考Wikiextractor文档(https://github.com/attardi/wikiextractor#wikipedia-cirrus-extractor)。我们使用cirrussearch转储中的文本(分割成句子)构建了Elasticsearch服务器,并在Kaggle内核上运行。

搜索始终逐句进行。对每个被分割成句子的提示或选项,我们提取所有单词,去除停用词和重复词,访问Elasticsearch服务器并提取相似句子。基于获取的维基百科句子,我们生成三种上下文:v3、v5和v7。每种上下文都涉及基础处理,如连接目标句子的上下文和连续句子。区别如下:

  • v3:根据Elasticsearch搜索分数排序上下文
  • v5:根据与问题句子的编辑距离排序上下文
  • v7:使用语义搜索排序上下文(通过sentence-transformers实现)
    提示与维基百科的嵌入使用msmarco-bert-base-dot-v5,选项与维基百科的嵌入使用all-mpnet-base-v2

技巧

Elasticsearch启动时需要写入操作,因此需复制到/kaggle/temp运行。如讨论帖所述,/kaggle/temp的I/O速度不稳定,因此我们通过符号链接将Elasticsearch数据库文件链接到/kaggle/input的文件系统,直接执行数据I/O。

建模部分

验证

为训练能有效参考跨领域上下文的模型,我们从开放数据集随机抽取2000个实例作为验证数据。原始train.csv过于简单,后期很少使用。通过信任验证分数(2000样本)与LB的相关性,成功避免了过拟合。

验证分数与LB相关性图示:

验证分数与LB相关性

训练

模型:Deberta v3 Large
数据集:主要使用60k和40k数据集
将token数量从512扩展到768和1280后,准确率显著提升

上下文引入方法

我们发现包含更多上下文token能提升性能,因此采用先放置提示和选项,再用尽可能多的上下文填充剩余部分的方法。

上下文集成

某些问题与检索匹配良好,某些则不匹配。对单个模型的三种上下文推断结果进行集成提升了分数(训练时v7单独表现良好,但推理时集成多上下文进一步提升性能)。这表明检索器的多样性确保了搜索结果的覆盖度。

同比赛其他方案