返回列表

7th Place Solution

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

开始: 2023-07-11 结束: 2023-10-10 自然语言处理 数据算法赛
解决方案: Kaggle LLM 科学考试第7名解决方案
作者: Takashi Someya 及其队友
排名: 第7名 (Private LB: 0.925)

感谢Kaggle团队组织这次全新且有趣的竞赛。通过这次竞赛,我学到了很多新知识,包括RAG和LLM微调技术。感谢所有在竞赛期间贡献有意义讨论和发布高水平笔记的参与者。同时感谢我的队友 @thedrcat@anonamename@kashiwaba,他们用各种想法完善了我们的解决方案。

概述

  • 使用从各种维基百科数据创建的上下文
  • 集成DeBERTa-V3大模型和LLM模型
  • 多阶段策略:通过在后期减少需要预测的问题数量,整合多种上下文和模型组合

检索部分

Wikipedia-20230801 (文章检索 -> 句子检索)

此搜索策略基于JJ的公开笔记中的方法,但做了以下改进:

  • 使用Wikipedia-20230801-dump数据集(包含667万篇文章,比之前的627万篇更多)
  • 文章检索使用由整篇文章嵌入构成的向量(每篇文章分割为256个token的块)
  • 使用gte-small模型创建嵌入
  • 改进了sectionize_documents函数以获得更好的句子分割效果
  • 句子检索使用TF-IDF方法

MB 270K + TF-IDF

采用MB的27万篇文章数据集和TF-IDF方法(来自MB的优秀笔记

MB 270K + sentence-transformer

使用gte-small模型(max_seq_length=512)搜索MB的27万篇文章文本

Cohere TF-IDF

此方法基于以下假设:针对本竞赛数据,段落搜索和稀疏方法可能比密集方法更有效。问题和选项通常包含非常具体的术语,这些术语可能无法通过密集嵌入很好地表示。同时,段落搜索通常被认为对问答任务更有效。挑战在于如何对数百万维基百科段落进行有效的稀疏检索。

  • 使用Hugging Face上的Cohere en-wiki数据集(非最新数据,可能导致某些文章变更问题,但 conveniently 已分割为段落)
  • 使用BERT分词器和词表进行TF-IDF以保持合理的词表大小
  • 在首批1000万个段落上训练TF-IDF向量化器,并用于所有段落
  • 预计算索引并将索引和段落存储在Kaggle数据集中(4个批次,每批1000万行)
  • 使用快速稀疏KNN查找(由Ahmet Erdem共同开发并分享)为每个问题查找前5个最接近的上下文段落

模型部分

验证策略

最初使用train.csv中的样本进行验证,但在CV达到~0.99后,难以评估CV与LB的相关性。因此通过Chat-GPT生成约3000个额外样本作为新验证集(使用13万篇STEM文章作为输入)。虽然存在一些模糊性,但CV与LB相关性较好,最终集成模型的组合基于该验证集的CV确定。

DeBERTa-V3 large模型

基于cderotte的笔记,训练了以下四个模型:

  • max_length=512, microsoft/deberta-v3-large (x2, 在集成部分称为v1和v2)
  • max_length=512, deepset/deberta-v3-large-squad2 (x1, 称为v3)
  • max_length=1024, microsoft/deberta-v3-large (x1)

LLM模型

CausalLM训练

使用transformers的AutoModelForCausalLM类和trl的SFTTrainer类进行训练:

  • 训练模型输出A/B/C/D/E中的一个字母,使用如下提示模板:
### 输入: <上下文>\\n\\n### 系统: 回答以下选择题,给出最合适的答案。答案必须是[A, B, C, D, E]中的一个。必要时可使用上面的输入文本作为参考。### 问题: <问题>\\nA) <选项A>\\nB) <选项B>\\nC) <选项C>\\nD) <选项D>\\nE) <选项E>\\n\\n### 答案:
  • 使用QLoRa节省内存
  • 训练时打乱选项顺序有一定效果

推理设置

  • max_new_tokens=1
  • 将第一个输出的[A,B,C,D,E] token的logits输入softmax函数获得各选项概率

CausalLM奖励建模

  • 修改trl的RewardTrainer类,使用AutoModelForCausalLM进行奖励建模
  • 输入格式:<上下文> #### <问题> #### <选项> ####
  • 生成配对数据:正确答案为"chosen",其他选项为"rejected"
  • 使用输入字符串中下一个"yes" token的预测值作为比较的logit
  • 使不支持AutoModelForSequenceClassification的LLM也能进行奖励建模,并与普通CausalLM模型集成

单模型结果

上下文:Wikipedia-20230801

模型 类型 Private LB Public LB
Mistral-7B-v0.1 CausalLM 0.874 0.868
Mistral-7B-OpenOrca CausalLM 0.882 0.876
Mistral-7B-v0.1 CausalLM 奖励建模 0.897 0.888
Mistral-7B-OpenOrca CausalLM 奖励建模 0.896 0.888
OpenOrca-Platypus2-13B CausalLM 0.872 0.880
Llama2-chat-AYT-13B CausalLM 0.872 0.875

集成策略

LLM的主要问题是推理时间长。因此首先使用Deberta模型过滤简单问题(定义为预测概率>0.7的问题),然后仅对剩余问题使用LLM推理。这样通过缩小LLM推理数据范围来减少总推理时间。同时对Deberta模型也应用这种分步推理,将总时间控制在9小时内。该集成方法使3个LLM能在9小时内完成推理。最终预测是8个Deberta模型和3个LLM在不同上下文上的加权平均,给予LLM更高权重。权重基于验证集的map3确定。

最终提交结果

Private LB: 0.925, Public LB: 0.931

模型 上下文 阶段 权重
DeBERTa-V3 large (max_length=512), v1 Wikipedia-20230801 第1阶段 1.0
DeBERTa-V3 large (max_length=512), v1 MB 270K + TF-IDF 第2阶段 1.0
DeBERTa-V3 large (max_length=512), v2 Wikipedia-20230801 第3阶段 0.5
DeBERTa-V3 large (max_length=512), v2 MB 270k + sentence-transformer 第3阶段 0.5
DeBERTa-V3 large (max_length=1024) Wikipedia-20230801 第3阶段 0.5
DeBERTa-V3 large (max_length=1024) MB 270k + sentence-transformer 第3阶段 0.5
DeBERTa-V3 large (max_length=512), v3 Cohere TF-IDF 第3阶段 0.5
DeBERTa-V3 large (max_length=512), v3 MB 270K + TF-IDF 第3阶段 0.5
Mistral-7B-v0.1, CausalLM 奖励建模 Wikipedia-20230801 第4阶段 1.25
Mistral-7B-v0.1, CausalLM 奖励建模 MB 270K + TF-IDF 第4阶段 1.5
OpenOrca-Platypus2-13B, CausalLM Wikipedia-20230801 第4阶段 1.25
同比赛其他方案