谈谈大模型-预训练

最近一直在研究和实践大模型预训练。记录一些思考和训练的过程。 我研究和实践的主要是NLP领域的模型,对于CV领域的暂不涉及。

预训练其实是属于迁移学习的一种,就是在一个通用的已经训练好的基础模型上进一步再做大规模语料的训练。 之所以需要预训练,主要还是考虑到训练的成本、时间周期以及投入产出比。我个人目前的实践研究也主要是使用社区现成的基础模型进行训练,主要还是训练资源(主要在GPU卡的投入上)有限。不过,自己去从头开始训练一个模型的理论和实践过程还是要清楚的。

做模型训练无非就是要经历如下几个过程:

1、寻找通用数据集;

2、对通用数据集进行清洗和处理,目前开源社区也有很多现成可用的数据集,比如Wiki文本、医疗数据、知乎问答数据等,这些都是可以拿过来做自己的训练数据集合,但如果需要训练某些特定领域的数据集,那只能自己来处理,模型的优劣和上限最本质还是由数据的质量来决定,算法和策略不占主要因素;

3、有了数据集之后,就是做Tokenizer和Embendding,目前社区已经有很多现成工具进行对语料进行处理,比如HuggingFace Transform的一些Tokenizer词元包;

4、做了词的处理之后,就可以去选择一些预训练语言模型,其实在OpenAI的ChatGPT火之前,就已经有很多预训练模型了,近几年主要的训练模型也基本围绕着Transformer的骨架进行,只是会去区分,比如是Encoder-Only、Decoder-Only、Encode-Decoder中的哪一种,这个都可以根据自己的诉求进行选择。Encoder主要是属于自编码类型,就比如选择题或则掩码猜词都可以选择此类模型;Decoder主要是自回归模型,他会根据前面的词元去预测下面的词条,比如我们所知道的GPT就是Decoder-Only,生成式模型。像google的BERT就是ENcoder-Only,我研究学习的主要参照的是T5模型,其是Encoder-Decoder模式,只是在遵循Transformer的基础上做了系列模型优化。Transformer以及Attention机制确实带来的了变革,解决了以前RNN/LSTM等模型的一些问题,所以如今只要把Transformer弄懂了,基本能做不少事情。当然,以前传统的模型还是需要去研究和实践,有对比才能对新的东西有更深刻的理解;

5、选择了模型之后就可以去想办法做预训练了。当然肯定逃不开coding,这里会涉及如下的一些工作:

加载生成Tokenizer

对模型参数进行设置,比如会涉及模型的层数和维度、词表的大小、全连接层的大小、头的大小等,目前预训练模型都会有相关的论文呈现,一些参数的设置,可以在训练之初阅读论文进行学习获取

初始化模型

通过Tokenizer词元(可以自己生成,比如耗费资源)和准备的预训练语料生成预训练数据集

设置模型训练超级参数,会涉及训练的批次/轮数、训练的精度(比如是否需要进行量化)、学习率、模型优化算法等,这些参数有些可以从论文的最佳实践中获取,有些需要自己按照社区或者个人经验去进行微调

设置模型训练器,比如T5模型,是Seq2Seq类型,社区有专门的模型训练器进行使用,只需要模型参数定义好了就可以设置使用

进行训练,保存各类训练结果,这里会涉及梯度计算、loss计算等

模型评测,进行计分

保存模型

6、通过以上步骤,你可以去训练自己的一个模型了,训练好的模型会自动保存生成系列模型文件,比如.bin、.safetensors或者pks参数文件等。这些模型文件包括你所训练生成的tokenizer其实都属于模型的一部分,在模型做推理的过程中都会去调用。

当然,一个预训练模型训练好了之后,还没完,后面还会涉及各类调整,比如基于特定语料的Fint-tune、RLHF/DPO优化,后面我会结合个人的训练情况再进行整体阐述。

(完)

—————–EOF——————



Previous     Next
mjgao /