高效微调大型预训练模型的方法 - LoRA 微调 ChatGLM3-6B 原理

高效微调大型预训练模型的方法 - LoRA 微调 ChatGLM3-6B 原理

flyfish

LoRA(Low-Rank Adaptation)微调背后的原理是通过引入低秩分解来减少模型微调过程中的参数数量,从而显著降低计算成本和存储需求,同时保持模型性能。

LoRA 微调的核心原理

  1. 低秩近似
    深度学习模型中的权重矩阵通常是高维的。为了在不损失太多信息的前提下减少这些权重矩阵的参数量,LoRA 假设这些矩阵可以用低秩矩阵来近似。这种近似的数学基础在于矩阵的低秩分解。
    具体来说,假设某个权重矩阵 W W W 可以表示为两个低秩矩阵 A A A B B B 的乘积: W ≈ W + Δ W = W + A × B W \approx W + \Delta W = W + A \times B WW+ΔW=W+A×B

其中:

A A A 的维度是 d in × r d_{\text{in}} \times r din×r B B B 的维度是 r × d out r \times d_{\text{out}} r×dout r r r 是低秩矩阵的秩,通常远小于 d in d_{\text{in}} din d out d_{\text{out}} dout

Δ W \Delta W ΔW 是权重矩阵的低秩近似,用于更新原始的权重矩阵 W W W
通过使用低秩矩阵 A A A B B B,可以在较少的参数下实现对权重矩阵的有效更新。

  1. 冻结原始权重 在传统的微调方法中,模型的所有权重都会参与训练,这需要大量的计算资源。LoRA 的一个关键优化点在于冻结模型的原始权重,只微调通过低秩分解得到的矩阵 A A A B B B
    因此,LoRA 微调只需要更新少量的参数,而不是整个模型,这大大降低了训练过程中的计算和存储开销。

  2. 缩放因子 为了控制低秩更新矩阵 Δ W \Delta W ΔW 对原始权重的影响,LoRA 引入了一个缩放因子 α \alpha α W new = W + α × ( A × B ) W_{\text{new}} = W + \alpha \times (A \times B) Wnew=W+α×(A×B)
    这个缩放因子 α \alpha α 用来调整低秩矩阵对整体权重更新的贡献,确保模型在微调过程中保持数值稳定性和有效性。

对应到配置文件

LoRA (Low-Rank Adaptation) 微调中的秩 r r r 和缩放因子 α \alpha α 的数学原理是基于矩阵的低秩分解和缩放机制,以减少参数量并保持模型的表现。让我们详细探讨这两个概念背后的数学原理。

1 低秩矩阵的秩

  1. 低秩矩阵的秩 r r r在深度学习模型中,权重矩阵通常是高维的。例如,对于一个全连接层或自注意力机制中的线性变换,权重矩阵 W W W 的维度可能是 d in × d out d_{\text{in}} \times d_{\text{out}} din×dout。当这个矩阵非常大时,训练和推理的计算成本都很高。低秩分解 (重要的事重复一遍) 是一种将高维矩阵近似为两个低维矩阵乘积的方法。具体来说,LoRA 假设原始的权重矩阵 W W W 可以被分解为两个低秩矩阵 A A A B B B 的乘积: Δ W = A × B \Delta W = A \times B ΔW=A×B

其中:
A A A 的维度是 d in × r d_{\text{in}} \times r din×r
B B B 的维度是 r × d out r \times d_{\text{out}} r×dout

这里的秩 r r r 决定了这两个低秩矩阵的大小。通过选择一个较小的 r r r,可以显著减少参数的数量。例如,如果 r r r 远小于 d in d_{\text{in}} din d out d_{\text{out}} dout,则矩阵 A A A B B B 的参数总数为 r × ( d in + d out ) r \times (d_{\text{in}} + d_{\text{out}}) r×(din+dout),远小于原始矩阵 W W W 的参数总数 d in × d out d_{\text{in}} \times d_{\text{out}} din×dout。这种低秩分解的数学基础是线性代数中的矩阵分解理论。秩 r r r 代表矩阵的有效维度数,或者说是其线性独立的向量的最大数量。通过使用低秩分解,LoRA 能够在保持大部分信息的前提下显著降低参数量。

2 LoRA 的缩放因子

  1. LoRA 的缩放因子 α \alpha αLoRA 引入了一个缩放因子 α \alpha α 来调节低秩更新矩阵 Δ W \Delta W ΔW 对原始权重矩阵 W W W 的影响。完整的权重更新表达式为: W new = W + α ⋅ Δ W W_{\text{new}} = W + \alpha \cdot \Delta W Wnew=W+αΔW

其中:
Δ W = A × B \Delta W = A \times B ΔW=A×B
α \alpha α 是一个标量,用于调整更新矩阵 Δ W \Delta W ΔW 的幅度。

数学原理
数值稳定性 :在训练过程中, α \alpha α 可以防止低秩矩阵更新过大,导致数值不稳定或过拟合。它通过缩放因子 α \alpha α 控制更新的步幅,使得模型的学习过程更加平稳。
学习速率调节 α \alpha α 还可以被视为一个超参数,用来调整模型学习的速度。在许多情况下,低秩矩阵可能需要与原始权重矩阵有不同的学习速率。通过调节 α \alpha α,可以有效控制低秩矩阵的贡献。

通过这种缩放机制,LoRA 既能够在低秩矩阵上捕捉到有效的模型调整,同时避免了由于低秩矩阵过度影响原始权重而引发的数值问题。

一句话

r r r :决定了低秩矩阵的大小,通过降低 r r r 来减少参数数量和计算成本。缩放因子 α \alpha α :控制低秩矩阵对原始权重的影响,确保模型的稳定性和有效性。

一个简单的数值示例来说明 SVD(奇异值分解)和 LU 分解的过程和结果。

两句话

SVD 分解 用于将矩阵分解为多个矩阵的乘积,广泛应用于数据降维、噪声消除等领域。

LU 分解 是用于方阵的一种分解方式,通常用于求解线性方程组和计算矩阵行列式。

1. SVD(奇异值分解)

SVD 将一个矩阵 A A A 分解为三个矩阵的乘积: A = U Σ V T A = U \Sigma V^T A=UΣVT,其中:
U U U 是一个列正交矩阵(左奇异矩阵),包含了 A A A 的左奇异向量。
Σ \Sigma Σ 是一个对角矩阵,包含了 A A A 的奇异值。
V T V^T VT 是一个行正交矩阵(右奇异矩阵),包含了 A A A 的右奇异向量的转置。

示例:

设矩阵 A A A 为: A = ( 3 2 2 3 ) A = \begin{pmatrix} 3 & 2 \\ 2 & 3 \end{pmatrix} A=(3223)

进行 SVD 分解后,我们得到:
A = U Σ V T A = U \Sigma V^T A=UΣVT

其中:

U U U 为:
U = ( 1 2 1 2 1 2 − 1 2 ) U = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix} U=(2 12 12 12 1)

Σ \Sigma Σ 为:
Σ = ( 5 0 0 1 ) \Sigma = \begin{pmatrix} 5 & 0 \\ 0 & 1 \end{pmatrix} Σ=(5001)

V T V^T VT 为:
V T = ( 1 2 1 2 1 2 − 1 2 ) V^T = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix} VT=(2 12 12 12 1)
所以, A A A 可以表示为 U Σ V T U \Sigma V^T UΣVT 的乘积。

2. LU 分解

LU 分解将一个方阵 A A A 分解为两个矩阵 L L L U U U 的乘积: A = L U A = LU A=LU,其中:
L L L 是一个下三角矩阵(Lower triangular matrix),对角线上元素为 1。
U U U 是一个上三角矩阵(Upper triangular matrix)。

示例:

设矩阵 A A A 为: A = ( 4 3 6 3 ) A = \begin{pmatrix} 4 & 3 \\ 6 & 3 \end{pmatrix} A=(4633)

我们进行 LU 分解,得到:
A = L U A = LU A=LU

其中:

L L L 为:
L = ( 1 0 1.5 1 ) L = \begin{pmatrix} 1 & 0 \\ 1.5 & 1 \end{pmatrix} L=(11.501)

U U U 为:
U = ( 4 3 0 − 1.5 ) U = \begin{pmatrix} 4 & 3 \\ 0 & -1.5 \end{pmatrix} U=(4031.5)
因此,矩阵 A A A 可以分解为 L L L U U U 的乘积: A = ( 1 0 1.5 1 ) ( 4 3 0 − 1.5 ) = ( 4 3 6 3 ) A = \begin{pmatrix} 1 & 0 \\ 1.5 & 1 \end{pmatrix} \begin{pmatrix} 4 & 3 \\ 0 & -1.5 \end{pmatrix} = \begin{pmatrix} 4 & 3 \\ 6 & 3 \end{pmatrix} A=(11.501)(4031.5)=(4633)

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要对 chatglm2-6b 进行微调以适应 LORA(低功耗广域网)环境,可以按照以下步骤进行操作: 1. 首先,执行 chatglm2_6b_lora.py 脚本来启动微调过程。可以使用命令行输入以下命令:`python chatglm2_6b_lora.py`。 2. 接下来,修改配置文件中的几个值。可以使用以下命令在配置文件中替换一些字符串: ``` sed -i 's/THUDM\/chatglm2-6b--//g' ./chatglm2_6b_lora/config.json sed -i 's/THUDM\/chatglm2-6b/\.\.\/chatglm2_6b_lora/g' ./chatglm2_6b_lora/config.json sed -i 's/THUDM\/chatglm2-6b--//g' ./chatglm2_6b_lora/tokenizer_config.json sed -i 's/THUDM\/ChatGLM2-6B/\.\.\/chatglm2_6b_lora/g' ./chatglm2_6b_lora/modeling_chatglm.py sed -i 's/THUDM\/chatglm2-6b/\.\.\/chatglm2_6b_lora/g' ./chatglm2_6b_lora/modeling_chatglm.py ``` 这些命令将修改配置文件中的一些路径,以使其适应 LORA 微调环境。 3. 最后,调用导出的模型进行微调。具体操作可以参考 ChatGLM-Efficient-Tuning 项目的 README 文件,首先克隆该项目的仓库,然后创建并激活一个新的 Python 环境,安装所需的依赖,并根据提供的数据集说明进行微调。可以使用以下命令执行这一步骤: ``` git clone https://github.com/hiyouga/ChatGLM-Efficient-Tuning.git conda create -n chatglm_etuning python=3.10 conda activate chatglm_etuning cd ChatGLM-Efficient-Tuning pip install -r requirements.txt ``` 然后,根据项目提供的数据集说明进行微调。 通过按照上述步骤进行操作,您可以对 chatglm2-6b 进行 LORA 微调。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [修改 ChatGLM2-6B 自我认知的 Lora 微调教程](https://blog.csdn.net/engchina/article/details/131492403)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西笑生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值