第6章 如何训练大语言模型
本章节主要探讨训练大语言模型的步骤和方法论。
目前,可能大家接触的最多的模型训练方式是微调,也能收到一定程度的比较好的效果,其中有代表性的项目有Github上的Alpaca, Baize,Vicuna等。
6.1 Pretrain 预训练
有了微调,为什么还需要预训练,直接拿一些成熟的模型来微调不能满足吗?
答案其实和大多数人的理解不同,绝大多数下游任务是无法通过微调来解决的,微调成功的前提的是
被微调模型的训练语料包括训练任务的种类本身和要微调的任务差距不大,最重要的是训练语料,要求预训练模型里面包含了微调训练所需要的知识。
日常的生产环境中,我们碰到的大多数问题有以下几种情况:
1-语言的不匹配,比如预训练模型是英文,微调任务是中文。
2-特定领域的专业词汇,比如医疗,生物,金融领域,这些泛知识领域或者互联网上的训练语料无法涵盖的部分。
当一个训练任务无法解决上述的问题,那么应该从预训练Pretrain开始对模型进行训练。
Pretrain实际上也分为若干个步骤。
和微调一样,我们一般会选择一个预训练的基座模型,这个模型可以是Llama,可以是ChatGLM或者任何的开源模型,当然也可以是一个自己编辑网络架构的模型。
如果使用开源的模型比如Llama,它算是一个相对优秀的语言模型,但是它的中文表达能力,确实受到诟病,和Llama一样,大多数市面上被认可的优秀语言模型,都没有对中文部分进行充分的预训练。
6.1.1扩充词表
除了没有充分的预训练以外,第二个问题,就是词表的问题。目前的开源模型词表构成主要是由英文构成的。中文的部分几乎每一个都不是特别的完善,所以大多在预训练之前都需要进行词表的扩充,也就是扩充tokenizer的文件。
一般在如图6-1 这个文件配置里可以看到模型的词表。
图6-1 词表描述文件-1
图6-2 词表描述文件-2
如6-2显示,词表中的每个词对应了一个数字,这个数字就是词表的idx,也就是词的id索引,这个索引会被embedding成相关的向量来进行训练。
我们输入进embedding层的时候往往都是一些句子,所以要对句子进行分词,NLP最早有两种。
第一是针对空格分,英文里常见,比如“I love you”,被拆成“I”, “love”, “you”。
第二是按字符分,还是“I love you”,就被拆分成“I”,“l”,“o”“,v”,“e”,“y”“o”,“u”。
目前比较成