面试记录:你是怎么微调千问大模型的?
前言
表面上看,这个是在问实际经验,但是实际上,这里有一个很重要的前提:Qwen
在一代、二代,甚至之后的decoder-only
的,这也就从本质上改变了输入数据的格式。
对比差距
在最初的MHA
结构中,有一个encoder
和一个decoder
,而千问从decoder-only
。
这个decoder-only
是什么结构?
简单地讲,可以总结为:
图片摘自Deep (Learning) Focus的文章:Decoder-Only Transformers: The Workhorse of Generative LLMs
原本的结构中,存在一个encoder
,而decoder-only
则只存在一个decoder
。
为什么偏偏是encoder
删掉了?它有什么作用?
被删掉的encoder到底有什么作用
我们重新回到Transformer
的图中:
不难发现,transformer
的输入实际上是同时带有input
和output
,输出是output
的概率预测。也就是说,encoder-decoder
的擅长领域其实并不是单纯的文本生成,毕竟单纯的去预测下一个token
,完全没必要输入output
。而需要input
和output
同时输入的模型,本质上也是一种拟合模型。
到这里也就基本能猜个大概了:encoder-decoder
模型,学习的应该是input
和output
的对应关系。
所以,对于这一点,milvus
也给出了自己的答案:
encoder-decoder
结构在输入与输出在结构或者意义上存在显著差异的时候表现优异。
摘自:milvus官网的文章what-are-decoderonly-models-vs-encoderdecoder-models
为了佐证上述观点,我们再来看一个encoder-only
:BERT
。
不难发现,BERT
的核心是找到段落中文本的正确顺序与词语的正确含义。
所以也有人总结:
encoder-only
适合分类任务encoder-decoder
适合翻译任务decoder-only
适合生成任务
也是有一定道理的。
那么,我们再回过头去解释,decoder-only
删去了原本的encoder
,取消了分类任务的适配性,直接考虑生成任务,虽然会带来理解能力的退化,但是增强了基于上下文生成的能力。
如何微调
那么我们最后再回到最初的问题:怎么样微调。
既然是decoder-only
,那么其实我们所需要的并不是一个input
与output
对照着的问答对,其实连续长文本就足够训练。
其中,在微调的过程中,面对不同场景、不同业务,也需要采取不同的手段。
Fine-tuning
Fine-tuning
,翻译过来其实是全量微调。在维基百科中,他的解释是:
在深度学习中,
fine-tuning
是一种迁移学习,将预训练的神经网络参数在新的数据上再次训练。
在这个过程中,全量微调主要面相领域任务,并将所有的参数一次性全部调整到位。比如,对于通信领域大模型,直接喂一整段通信领域相关的连续长文本,即可开始全量微调。对于原始参数权重
LoRA
LoRA
,英文全称Low-Rank Adaptation
,翻译过来是低秩适配。这个过程并没有修改所有的矩阵,而是将原始权重
此时,可更新的部分就不再是
Prefix-tuning
Prefix-tuning
,翻译过来是前缀微调。与RAG
相同的是,他的任务本质是将一段前缀拼接到prompt
前方;不同的是,Prefix-tuning
的前缀是一段可学习的向量,在后续过程中,也将采用MHA
结构对这段可学习的向量进行优化。
为了和其他的学习方式做个区分,可学习的前缀包括MHA
中引入为:
可以看到,它本质上修改的是神经网络结构信息,而不是单纯的在输入数据中添加前缀。
Prompt-tuning
要说在输入数据前添加前缀,这个就是最匹配的了。具体而言,就是直接在prompt
的embedding
前面再拼上一段前缀,构成一段新的input_emb
。
顺带一提,他还有个名字是P-tuning
。
为了与式MHA
进行修改,而是在原先的基础上,额外添加一份可学习的前缀向量。
我们知道,MHA
主要提升了大模型的模型推理性能,因此,P-tuning
的思路,本质上是为了提升模型的零样本分类能力,也就是优化prompt
泛用性。