Chinese_LLaMA2
Chinese_LLaMA2
目前有一种很多人认同的观点:预训练学知识,指令微调学格式,强化学习对齐人类偏好,LIMA等论文算是这一观点的证据。(LIMA: Less Is More for Alignment这篇文章是Meta的一篇工作,作者提出了一个假设,即”大模型绝大部分知识已经在预训练阶段学习到了,因此我们只需要很少一部分精选的instructions去tuning模型,就能使得模型产生高质量的内容“,如标题所说less is more。在实验部分,作者在LLaMA-65B模型上仅仅使用1000个精心挑选的Instructions进行tuning,甚至也不用进行强化学习RLHF训练,就能达到GPT-4的效果。但是这一切的前提是预训练的大模型的参数量要足够大,预训练的数据量要足够多,像The False Promise of Imitating Proprietary LLMs这篇工作中指出的,13B的llama+100k的instruction tuning是不够的。)
为了更好地学习大语言模型,本人参考chinese-llama-alpaca-2项目,基于llama-2-7B模型进行了词表扩充、增量预训练、SFT、RLAIF等试验,并尝试了llvm、TGI、llama.cpp等多种推理部署手段,记录于本篇博客之中。
扩充中文词表
LLaMA2词表中的中文token比较少(只有几百个)。这将导致了两个问题:
- LLaMA2 原生tokenizer词表中仅包含少量中文字符,在对中文字进行tokenzation时,一个中文汉字往往被切分成多个token(2-3个Token才能组合成一个汉字),显著降低编解码的效率。
- 预训练中没有出现过或者出现得很少的语言学习得不充分。
为了解决这些问题,我们可能就需要进行中文词表扩展。比如:在中文语料库上训练一个中文tokenizer模型,然后将中文 tokenizer 与 LLaMA2 原生的 tokenizer 进行合并,通过组合它们的词汇表,最终获得一个合并后的 tokenizer 模型。
因此这一节主要记录如何使用 SentencePiece 基于中文语料训练一个中文分词模型,以及如何将两个tokenizer合并。
数据准备及清洗
常用的文本预训练数据集有如下几种:
数据集 | 规模 |
---|---|
BooksCorpus | 2.2 GB + 37 GB |
Wikipedia | 21.23 GB |
CommonCrawl | > PB |
ROOT | 1.6 TB |
The Pile | 825GB |
悟道 | 3 TB |
CLUE | 100 GB |
MNBVC | 2.18 TB |
常用的代码预训练数据集有如下几种:
数据集 | 规模 |
---|---|
CodeSearchNet | 17 GB |
CodeNet | 8 GB |
THEPILE | 825 GB |
thestack | 3100 GB |
BigQuery | 340 GB |
BIGPYTHON | 217 GB |
CodeParrot | 180 GB |
GCPY |
构造好txt版本的预训练数据集之后,需要对数据进行简单的清洗,去除文件中的所有空行及特殊字符,保证每一行都是一个语义完整的段落。接下来就是参考Chinese-LLaMA-Alpaca项目将LLaMA原本的tokenizer和我们训练好的中文tokenizer进行合并。
中文增量预训练(基于lora)
chat/instructions SFT(基于lora)
常用的中文指令微调数据集有如下几种:
数据集 | 规模 |
---|---|
alpaca | 53.8 MB |
BELLE | 5.5 GB |
CBLUE | 870 MB |
COIG | 338 MB |
firefly | 1.2 GB |
MOSS | 2.7 MB |
OL-CC | 9.8 MB |
pCLUE | 1.2 GB |