当前位置:   article > 正文

LoRA微调GLM-4、Qwen2_glm-4 lora微调

glm-4 lora微调

  在大模型掀起新一轮的AI热潮以来,各类大语言模型百花齐放,算法模型由原来的几万、几十万的参数,上升到现在的数十亿、百亿、千亿的情况。
  以前我们比较熟悉的是全量微调,即利用新数据对模型所有参数全部进行调整。但对于大语言模型而言,想要在消费级显卡上完成模型的全量微调根本无法实现。目前对于大模型来说,主流的微调技术叫做高效微调,这种方式是通过微调大模型少量或者额外的一些参数,固定预训练模型大语言模型参数,以此来降低计算和存储成本,同时,还可以在一定程度上实现与全量参数微调相当的性能。
  高效微调方法有很多种,本节只介绍目前最常用的微调方法:LoRA

一、LORA定义

1.1 LoRA概述

  对于大模型微调,本质是追求通过对少量参数的高效修改,来最大化地影响模型的原始参数,以适配特定下游任务。
   LoRA来源于微软在2021年发布的Paper:《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》 ,地址:https://arxiv.org/pdf/2106.09685.pdf , 同时也在Github上开源了LoRA的技术实现过程,其Github地址:https://github.com/microsoft/LoRA

1.2 LoRA原理

  LoRA在涉及矩阵乘法的模块中引入两个低秩矩阵A和B(更新矩阵)来模拟全量微调的过程。相当于只对模型中起关键作用的矩阵维度进行更新。下面这张图,很好的表达了LoRA的核心思想:
image.png

  1. x x x:局部的某一个输入,维度为 d d d
  2. 左侧蓝色框:大模型某一部分的原始权重,其参数 W W W是一个 d × d d \times d d×d的高维空间;
  3. 右侧橘色框:两个低维的矩阵空间 A A A B B B,也叫做更新矩阵,是LoRA引入的两个新矩阵;

  LoRA并不是直接去微调预训练模型权重中的参数,而是仅优化低秩分解的矩阵,产生近似于全量微调的效果,因为当r=d时,实质上就是全量微调的效果。在实践中,r的值非常小就足够了,这样能够在对性能影响最小的情况下显著降低计算和内存成本。

  在整体的架构设计上,LoRA的核心是在原始的预训练大语言模型旁外挂一个附加的网络通路,这个网络通路的目的,就是通过两个矩阵A和B相乘得到的维度来模拟本征维度,即:用小矩阵模拟大矩阵,其公式如下:
h = W 0 x + Δ W x = W 0 x + B A x h = W_0x + \Delta Wx = W_0x + BAx h=W0x+ΔWx=W0x+BAx
  其中,B初始化为零,A初始化为高斯分布,x为输入数据, W 0 W_0 W0为原始模型的参数,且
W 0 ∈ R d × k , B ∈ R d × r , A ∈ R r × k W_0 \in R^{d \times k}, B \in R^{d \times r}, A \in R^{r \times k} W0Rd×k,BRd×r,ARr×k
  通过上述的维度设计可以看到,原来的预训练模型的权重矩阵是d×k的大小,A和B相乘后,最终输出的维度同样还是d×k。当维度保持一致后,便可以保证矩阵运算的正常执行。

1.2.1 低秩分解

  矩阵A先将输入的d维数据降维至r维,这个r,就是一个矩阵的秩,因为r<< d,所以在微调/训练的过程中,矩阵计算的量就会大幅度的降低,从 d×d变为 d×r+r×d 。
  通常情况下r设置为d的百分之一甚至是千分之一,所以通过低秩分解这个过程来达到大幅降低模型的参数量和计算量的目的。

1.2.2维度映射

  最后,B矩阵将r维的参数矩阵再映射回d维,从而与预训练模型的原始矩阵维度保持一致。
  整个训练过程是:模型的原始权重矩阵在训练时保持冻结状态,仅训练A和B,最终使用微调后的模型时,将原始权重和适应后的权重进行合并,从而达到对特定数据集的参数调整的目的。

1.3 低秩矩阵AB几个关键问题

  1. 为什么B初始化为0,A是高斯分布?
    1. 保持模型初始行为: 初始化
      声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/1007188
推荐阅读
相关标签