$$\text{{\color{red}Lo}w-{\color{red}R}ank {\color{red}A}daptation} $$
其本质上就是对于 $z = Wx$ 的计算,转化为 $z = (W + \Delta W) x$,其中 $\Delta W$ 在信息上是一个低秩矩阵(可以通过实验观察),于是可以通过分解将 $\Delta W$ 分解为 $AB$,其中 $A \in {\mathbb R}^{n \times r}, B \in {\mathbb R}^{r \times m}$。
训练过程:
我刚开始以为训练的过程是这样的:计算 $\frac {\partial L} {\partial W}$,那么将其进行某种分解,例如
SVD分解,然后裁剪后对 $\Delta W$ 加上去。继续通过 $\frac {\partial L} {\partial x}$ 进行反向传播。但是这样和全量微调就没有什么区别了,所以其实不好。
$$z = Wx + BAx $$
直接计算分解矩阵的梯度:
$$\begin{aligned} z_i &= \sum_t B_{it} x_t \\ \frac {\partial z_k} {\partial B_{ij}} &= x_{j} \delta_{ik} \\ \frac {\partial z} {\partial B_{ij}} &= \begin{bmatrix} 0 \\ 0 \\ \vdots \\ x_j \\ \vdots \\ 0 \\ 0 \end{bmatrix} \\ \end{aligned} $$
啊呀,怎么导数是一个三维张量啊?这是不是出了问题?在求导过程中,只有标量对矩阵求导,其导数形状才和矩阵形状相同,否则会升维(因为导数对应满足乘法原则)。也就是说 对于两个张量 $z \in R^{a_1 \times a_2 \times \cdots \times a_k},W \in R^{b_1 \times b_2 \times \cdots \times b_t}$ 有 $\frac {\partial z} {\partial W} \in R^{b_1 \times b_2 \times \cdots \times b_t \times a_1 \times a_2 \times \cdots \times a_k}$
这是分母布局,还有一种是分子布局,就是 $\frac {\partial z} {\partial W} \in R^{a_1 \times a_2 \times \cdots \times a_k \times b_1 \times b_2 \times \cdots \times b_t}$
所以实际所求是
$$\frac {\partial J} {\partial B} $$
这是一个标量关于矩阵求导,所以会出来一个矩阵,所以整个推到过程需要修正:
$$\frac {\partial J} {\partial B_{ij}} = \sum_t \frac {\partial J} {\partial z_t} \frac {\partial z_t} {\partial B_{ij}} = \sum_t \frac {\partial J} {\partial z_t} x_j \delta_{it} = \frac {\partial J} {\partial z_i} x_j $$
根据论文所述,对于 $\phi_{lora}$,放在 $W_q$ 和 $W_v$ 上是最有效果的,从感性上来讲, 因为对于一个词元,可以认为其期望暴露的内容其实和场景无关,但是对于 $W_q$ 和 $W_v$,其期望注意的东西和实际暴露的东西是需要微微调整的,所以可是使得该结论成立。
与其他微调方式:
BitFit:冻结变换矩阵,只训练偏重(Bias)PreEmbed:通过在输入前插入引导TokenPreLayer:对于插入的引导Token,为其单独开一个可训练网络Adapter tuning:- $Adapter^H$ 最初是在自注意力模块或者多层感知器模块和残差连接之间插入一个全连接层
- $Adapter^L$ 只在 MLP 和 LayerNorm 之后插入,类似的有 $Adapter^P$
- $AdapterDrop$ 类似 $Dropout$,随机关闭某些层的 $Adapter$,保证不依赖某一层。通过丢弃时的表现,对每个位置的 $Adapter$ 打分,低分仔就开了。