本期精彩
随着,ChatGPT 迅速爆火,引发了大模型的时代变革。然而对于普通大众来说,进行大模型的预训练或者全量微调遥不可及。由此,催生了各种参数高效微调技术,让科研人员或者普通开发者有机会尝试微调大模型。
因此,该技术值得我们进行深入分析其背后的机理,本次分享主要讲述目前业界常见的一些大模型微调技术原理(如:LoRA、Prefix Tuning、Adapter Tuning 等)以及在进行大模型微调技术研究时的最佳实践分享;同时,将分享大模型微调实践过程中如何选择模型及 GPU 型号等。
内容详情
BitFit
BitFit 是一种稀疏的微调方法,它训练时只更新 bias 的参数或者部分 bias 参数。
对于 Transformer 模型而言,冻结大部分 transformer-encoder 参数,只更新 bias 参数跟特定任务的分类层参数。涉及到的 bias 参数有 attention 模块中计算 query,key,value 跟合并多个 attention 结果时涉及到的 bias,MLP 层中的 bias,Layernormalization 层的 bias 参数。
Prefix Tuning
Prefix Tuning 方法在输入 token 之前构造一段任务相关的 virtual tokens 作为 Prefix,然后训练的时候只更新 Prefix 部分的参数,而 PLM 中的其他部分参数固定。
针对不同的模型结构,需要构造不同的 Prefix。
针对自回归架构模型:在句子前面添加前缀,得到 z = [PREFIX; x; y],合适的上文能够在固定 LM 的情况下去引导生成下文(比如:GPT3 的上下文学习)。
针对编码器-解码器架构模型:Encoder 和 Decoder 都增加了前缀,得到 z = [PREFIX; x; PREFIX0; y]。Encoder 端增加前缀是为了引导输入部分的编码,Decoder 端增加前缀是为了引导后续 token 的生成。
Adapter Tuning
Adapter Tuning 方法设计了 Adapter 结构,并将其嵌入 Transformer 的结构里面,针对每一个 Transformer 层,增加了两个 Adapter 结构(分别是多头注意力的投影之后和第二个 feed-forward 层之后),在训练时,固定住原来预训练模型的参数不变,只对新增的 Adapter 结构和 Layer Norm 层进行微调,从而保证了训练的高效性。
LoRA
LoRA 方法的核心思想就是通过低秩分解来模拟参数的改变量,从而以极小的参数量来实现大模型的间接训练。
在涉及到矩阵相乘的模块,在原始的 PLM 旁边增加一个新的通路,通过前后两个矩阵 A,B 相乘,第一个矩阵 A 负责降维,第二个矩阵 B 负责升维,中间层维度为 r,从而来模拟所谓的本征秩。
在下游任务训练时,固定模型的其他参数,只优化新增的两个矩阵的权重参数,将 PLM 跟新增的通路两部分的结果加起来作为最终的结果(两边通路的输入跟输出维度是一致的),即 h=Wx+BAx。第一个矩阵的 A 的权重参数会通过高斯函数初始化,而第二个矩阵的 B 的权重参数则会初始化为零矩阵,这样能保证训练开始时新增的通路 BA=0 从而对模型结果没有影响。
在推理时,将左右两部分的结果加到一起即可,h=Wx+BAx=(W+BA)x,所以只要将训练完成的矩阵乘积 BA 跟原本的权重矩阵 W 加到一起作为新权重参数替换原本 PLM 的 W 即可,对于推理来说,不会增加额外的计算资源。
UniPELT
UniPELT 方法是 LoRA、Prefix Tuning 和 Adapter 的门控组合。
更具体地说,LoRA 重新参数化用于 WQ 和 WV 注意力矩阵,Prefix Tuning 应用于每一 Transformer 层的 key 和value,并在 Transformer 块的 feed-forward 子层之后添加 Adapter。对于每个模块,门控被实现为线性层,通过 GP 参数控制 Prefix-tuning 方法的开关,GL控制LoRA方法的开关,GA 控制 Adapter 方法的开关。可训练参数包括 LoRA 矩阵 WA(Down)和 WB(Up),提示调优参数 Pk 和 Pv、Adapter 参数和门函数权重。即图中蓝颜色的参数为可学习的参数。