黑盒环境下大语言模型的微调优化

介于有盒友想要chatgpt那种大模型的教程,随便写一点。

参考文献

文再文老师的文章


随着ChatGPT的爆火,各类大语言模型(后文以大模型代指)如雨后春笋般不断涌出,以提示词和微调为主流的工作也在AI领域变得热门,这类工作能使大模型更好地处理下游任务。

本文主要介绍黑盒环境下大模型的微调优化方法,部分复杂公式将使用LaTeX格式进行书写,请读者在大脑中自行编译。

微调是指稍微地改变大模型的参数矩阵,使其输出符合预期,其任务可以写成如下优化问题:

min f(X)

其中X是大模型的参数矩阵,其参数量的数量级通常以B(亿)为单位。而f(X)指大模型处理下游任务时的损失函数,因此我们要找到合适的矩阵X,能够最小化损失函数。

同时,因为f(X)中包含大模型的输出,其对于X是黑盒的存在,因此我们无法求f(X)对于X的精确导数,传统的梯度下降法难以直接应用。

一种常见的做法是采用零阶(Zeroth-Order)梯度技术,即利用函数值的差分估计梯度:

\hat{\nabla}f(X)=\frac{f(X+\mu Z)-f(X-\much Z)}{\mu}Z

其中Z是随机方向的单位矩阵

这种方法类似于数学中导数的定义式,是一种有效的梯度估计方法。

但是微调之所以被称为微调,原因在于对于现有的大模型初始参数矩阵X^0,我们不应该改变太多,以使大模型失去本身的性能,甚至导致其胡言乱语。所以即使利用零阶梯度解决了黑盒环境,与传统的优化问题不同,我们无法随机初始化一个参数。

而且在以往大模型的微调实验中,大家发现梯度矩阵存在低秩结构,即大部分奇异值极小甚至为0。有效地捕捉这其中梯度地低秩结构,将有效地提升大模型微调的效果。

一种简单的做法是低秩自适应(LoRA,Low-Rank Adaptation),即针对维度m×n的参数矩阵X^0,寻找合适的低秩矩阵AB,使得

min f(X^0+AB)

其中A的维度是m×r,B的维度是r×n,r远小于min{m,n}。如此一来,因为矩阵A、B的秩均小于等于r,其乘积矩阵AB的秩也小于等于r。

参考文献中文再文老师他们采用的做法,是针对零阶梯度的方向矩阵Z,将其改写为矩阵UV相乘。改写后的梯度公式如下:

\hat{\nabla}f(X)=\frac{f(X+\mu UV)-f(X-\much UV)}{\mu}UV

其中U的维度是m×r,C的维度是r×n,r远小于min{m,n}。

注意到,这种做法与LoRA几乎类似,但是是针对梯度的低秩稀疏化。LoRA是针对参数改变量AB的低秩稀疏化,而AB的计算也有一番学问,笔者在此不再赘述。

除此之外,他们的算法还采取了一种懒惰策略,即并非每次迭代都重新选择梯度的方向矩阵V,而是在一定迭代周期内,固定方向矩阵V,不断更新U。这种做法本质上是一种零阶的子空间选择方法,使得大模型参数在一个周期内寻找以V为基的低秩子空间可行解,从而达到子空间选择的效果,更有助于大模型的微调。

文再文老师还在文中提出了一种动量方法的变体,即每次梯度更新利用部分上一次的梯度信息,加速迭代。值得注意的是,由于算法是周期性的,在每个周期结束时,子空间的V发生了改变,不能简单的使用不同条件下的梯度信息。针对这一问题,文中采用了一种类似近端算子的做法,即寻找一个距离上一次梯度足够近又符合新的V^{t+1}的梯度动量,避免了上述问题。

常见的开源大模型有llama、OPT等,较小的参数有13B,较大的有66B甚至更多,有兴趣的盒友可以买几张4090尝试跑一下。

笔者就写到这里,有更多想了解的可以交流讨论。

更多游戏资讯请关注:电玩帮游戏资讯专区

电玩帮图文攻略 www.vgover.com