GPTQ量化技术中的hessian矩阵原理

Hessian矩阵

一个由多变量实值函数的所有二阶偏导数组成的方阵

定义

假设有一实值函数f(x_1,x_2,……,x_n),如果f的所有二阶偏导数都存在并在定义域内连续,那么函数f的hessian矩阵为

或使用下标记号表示为

\mathbf{H}_{ij} = \frac{\partial^2 f}{\partial x_{i} \partial x_{j}}

显然黑塞矩阵\mathbf{H}是一个n×n方阵。黑塞矩阵的行列式被称为黑塞式(英语:Hessian),而需注意的是英语环境下使用Hessian一词时可能指上述矩阵也可能指上述矩阵的行列式。

公式推导过程

由高等数学知识可知,若一元函数f(x)在x = x_0点的某个领域内具有任意阶导数,则函数f(x)在x = x_0点处的泰勒展开式为:

f(x) = f(x_{0}) + f'(x_{0}) \Delta x + \frac{f''(x_{0})}{2!} \Delta x^{2} + \cdots

其中,\Delta x = x - x_0

同理,二元函数f(x_1,x_2)x_0(x_{10},x_{20})点处的泰勒展开式为

f(x_{1},x_{2}) = f(x_{10},x_{20}) + f_{x_{1}}(x_{10},x_{20}) \Delta x_{1} + f_{x_{2}}(x_{10},x_{20}) \Delta x_{2} + \frac{1}{2} \left[ f_{x_{1}x_{1}}(x_{10},x_{20}) \Delta x_{1}^{2} + 2f_{x_{1}x_{2}}(x_{10},x_{20}) \Delta x_{1} \Delta x_{2} + f_{x_{2}x_{2}}(x_{10},x_{20}) \Delta x_{2}^{2} \right] + \cdots

其中,\Delta x_{1} = x_{1} - x_{10}, \quad\\ \Delta x_{2} = x_{2} - x_{20}, \quad\\ f_{x_{1}} = \frac{\partial f}{\partial x_{1}}, \quad f_{x_{2}} = \frac{\partial f}{\partial x_{2}}, \quad f_{x_{1}x_{1}} = \frac{\partial^{2}f}{\partial x_{1}^{2}}, \quad f_{x_{2}x_{2}} = \frac{\partial^{2}f}{\partial x_{2}^{2}}, \quad f_{x_{1}x_{2}} = \frac{\partial^{2}f}{\partial x_{1}\partial x_{2}} = \frac{\partial^{2}f}{\partial x_{2}\partial x_{1}}.

将上述展开式写成矩阵形式,则有

f(x) = f(x_{0}) + \nabla f(x_{0})^{\mathrm{T}} \Delta x + \frac{1}{2} \Delta x^{\mathrm{T}} G(x_{0}) \Delta x + \cdots

其中,\Delta x = \begin{bmatrix} \Delta x_{1} \\ \Delta x_{2} \end{bmatrix}, \quad \Delta x^{\mathrm{T}} = \begin{bmatrix} \Delta x_{1} & \Delta x_{2} \end{bmatrix}\Delta x的转置,\nabla f(x_{0}) = \begin{bmatrix} \frac{\partial f}{\partial x_{1}} \\ \\ \frac{\partial f}{\partial x_{2}} \end{bmatrix}是函数f(x_1,x_2)x_0(x_{10},x_{20})的梯度,矩阵G(x_{0}) = \begin{bmatrix} \frac{\partial^{2} f}{\partial x_{1}^{2}} & \frac{\partial^{2} f}{\partial x_{1} \partial x_{2}} \\ \\ \frac{\partial^{2} f}{\partial x_{2} \partial x_{1}} & \frac{\partial^{2} f}{\partial x_{2}^{2}} \end{bmatrix}_{x_{0}}既函数f(x_1,x_2)x_0(x_{10},x_{20})点处的2 \times 2hessian矩阵,它是由函数f(x_1,x_2)x_0(x_{10},x_{20})点处的所有二阶偏导数所组成的方阵。

由函数的二次连续性,有{\displaystyle {\frac {\partial ^{2}f}{\partial x_{1}\partial x_{2}}}={\frac {\partial ^{2}f}{\partial x_{2}\partial x_{1}}}},所以,hessian矩阵G(x_{0})是对称矩阵。

由二元函数的泰勒展开式推广到多元函数,函数{\displaystyle f(x_{1},x_{2},\cdots ,x_{n})\,}{\displaystyle x_{0}(x_{1},x_{2},\cdots ,x_{n})\,}点处的泰勒展开式为{\displaystyle f(x)=f(x_{0})+\nabla f(x_{0})^{\mathrm {T} }\Delta x+{\frac {1}{2}}\Delta x^{\mathrm {T} }G(x_{0})\Delta x+\cdots \,}

其中:{\displaystyle \nabla f(x_{0})={\begin{bmatrix}{\frac {\partial f}{\partial x_{1}}}&{\frac {\partial f}{\partial x_{2}}}&\cdots &{\frac {\partial f}{\partial x_{n}}}\end{bmatrix}}_{x_{0}}^{T}\,}为函数f(x)在点{\displaystyle x_{0}(x_{1},x_{2},\cdots ,x_{n})\,}点的梯度,那么就有{\displaystyle G(x_{0})={\begin{bmatrix}{\frac {\partial ^{2}f}{\partial x_{1}^{2}}}&{\frac {\partial ^{2}f}{\partial x_{1}\,\partial x_{2}}}&\cdots &{\frac {\partial ^{2}f}{\partial x_{1}\,\partial x_{n}}}\\\\{\frac {\partial ^{2}f}{\partial x_{2}\,\partial x_{1}}}&{\frac {\partial ^{2}f}{\partial x_{2}^{2}}}&\cdots &{\frac {\partial ^{2}f}{\partial x_{2}\,\partial x_{n}}}\\\\\vdots &\vdots &\ddots &\vdots \\\\{\frac {\partial ^{2}f}{\partial x_{n}\,\partial x_{1}}}&{\frac {\partial ^{2}f}{\partial x_{n}\,\partial x_{2}}}&\cdots &{\frac {\partial ^{2}f}{\partial x_{n}^{2}}}\end{bmatrix}}_{x_{0}}\,}为函数f(x)在点{\displaystyle x_{0}(x_{1},x_{2},\cdots ,x_{n})\,}点的n \times nhessian矩阵,若函数有n次连续性,则函数的n \times nhessian矩阵为对称矩阵。

Hessian矩阵在模型参数中的意义

Hessian矩阵是一个二阶偏导数矩阵,用于描述多变量函数的局部曲率。对于一个标量函数 f(\mathbf{W})(如神经网络的损失函数),Hessian矩阵\mathbf{H}的元素为:(这个标量函数实际就是模型的损失函数)

\mathbf{H}_{ ij} ​ = \frac{ ∂^2f }{∂w_i∂w_j} ​

这里,\mathbf{W}是模型权重向量。

在模型中,Hessian矩阵就标志着权重大小对模型的影响程度,hessian矩阵在何处曲率最大,那么模型对该方向上的参数变化就更加敏感,故而在量化过程中要小心处理那些曲率较大的参数以避免精度损失。

在GPTQ中,通过对hessian矩阵的分析,设计出针对不同参数类型的自适应量化策略。主要作用在于利用二阶导数信息来优化量化策略。

Hessian矩阵的逆

GPTQ的量化过程涉及使用hessian矩阵的逆,Hessian矩阵H 是一个多变量函数 f的所有二阶偏导数组成的方阵,通常用于描述函数在某一点上的局部曲率。如果H 是非奇异的(即其行列式不为零),则它可以有一个逆矩阵H ^{-1}

可以通过这个逆来找到最小化f的p值,具体涉及公式为;

f(x+p)≈f(x)+∇f(x) ^Tp+ \frac 1 2 p^TH(x)p

其中∇f(x)是梯度向量,p是在点x处的增量,想要最小化f,可以求解由上式对p求并取0得到的等式:H(x)p=−∇f(x),这里的H(x) ^{−1}就是用来找到p的。

hessian矩阵的逆还能被用来搜索方向,通过乘以负梯度,得到一个搜索方向。使得函数值在该方向上最快下降。

计算Hessian矩阵及其逆在高维空间中是非常昂贵的,特别是在深度学习中处理大规模神经网络时。因此,在实践中,经常使用近似方法或者替代技术(如拟牛顿法)来避免直接计算Hessian矩阵的逆。

GPTQ中的hessian矩阵

GPTQ对随机顺序的参数量化的优化效果不佳、但是在大部分固定顺序的模型参数量化效果较好。(这里的随机顺序与固定顺序应该是模型的结构,像是transformer中带位置编码和不带位置编码的,亦或者是全连接神经网络与卷积加Relu的过程)

{疑问:这种量化的过程是否等同卷积神经网络中的降维操作}

GPTQ中使用了“延迟批处理技术”,我目前并不是很理解这是在干什么,但是应该和这张图有关:

量化表示

在实际应用中,量化的步骤包括将原始浮点数参数映射到离散的整数值。例如:

  • 3 位量化:

    • 量化级别:通常有 8 个离散值,例如:{-7, -5, -3, -1, 1, 3, 5, 7}(如果使用对称量化)。

    • 原始参数值被映射到这些离散值中的一个,例如,一个浮点数值 2.5 可能会被量化为 3(在量化级别中最接近的值)。

  • 4 位量化:

    • 量化级别:通常有 16 个离散值,例如:{-15, -13, -11, -9, -7, -5, -3, -1, 1, 3, 5, 7, 9, 11, 13, 15}(如果使用对称量化)。

    • 原始参数值被映射到这些离散值中的一个,例如,一个浮点数值 7.2 可能会被量化为 7(在量化级别中最接近的值)。

GPTQ原文中的细节内容

  • 一种训练后量化方法

  • 可以在几小时内执行千亿参数的模型量化、

  • 不显著损失精度的情况下将模型压缩到每个参数3或者位、

  • 实践创建了一个生成任务的压缩模型。

  • 当前结果不包括激活量化。

  • OBQ量化方法:层级量化(独立处理每个row),找到使平方误差最小的量化权重矩阵W。通过计算每行的平方误差之和,独立的处理每行。每次只量化一个权重,同时更新所有尚未量化的权重,使用两个主要公式对权重进行迭代量化。附带了一个矢量化的实现,可以并行处理W的多行,可以在中等规模的模型实现合理的运行时间。

  • 找到了OBQ量化中无法有效量化重参数化层的权重的问题,文中分析的原因是在量化过程结束时,那些可以调整补偿其他权重的权重补偿被最后的量化过程抵消了,只剩少数几个可以调整以进行补偿的量化权重。

  • GPTQ中使用相同顺序量化所有行的权重,将算法同时作用于多个块,保持所有块的更新,在处理完成后才对整个H^{-1}和权重矩阵W进行全局更新。

  • 针对OBQ只能处理中型模型的原因进行了分析,同时提出了新的可以解决"无法正确利用现代GPU的大规模计算能力"的方法:”延迟批处理“(使用一组索引代替OBQ中的单个索引值),这个方法有效的解决了内存吞吐量瓶颈。

  • 优化Cholesky方法:这个方法的优化背景是大模型在量化后的数值不准确,H^{-1}_F的不确定会导致算法在不正确的方向积极更新剩余权重,这种情况与模型大小有关,主要原因为GPTQ主要公式2的重复应用。这里的解决办法是在H的对角线元素添加一个常数λ.这个方法对于大模型来说缺乏健壮性与通用性。

我们来观察以下公式内容,其包含了GPTQ主要的计算过程与思想:

argmin_W ^ ​ ∥WX− W ^ X∥ ^2 _2 ​

w _Q =argmin_ {w_Q} \frac{ (quant(w_Q)−w_Q ) ^2} {[H_F^{−1}]_{qq}}

以下为OBQ中的主要公式:

δF=− \frac{w_q − quant(w_q)} {[H^{-1}_F]_{qq}} \cdot (H^{-1}_F) _{ :,q} ​

H^{−1} _{-q} = ( H^{−1} − \frac1 {[H^{−1}]_{qq}} H^{−1} _{:,q} H^{−1}_{ q,:} )_{ −q }

以下为GPTQ中的主要公式:

δF=−(w _Q ​ −quant(w_ Q ​ ))([H_F^{−1} ​ ] _{ QQ} ​ )^{ −1} (H_ F^{ −1} ​ )_{ :,Q} ​

H _{−Q}^{−1} ​=(H^{-1} - H^{−1}_{:,Q} ([H^{ −1}] _{QQ})^{-1} H_{Q,:}^{−1})_{-Q} ​

在上面的式子中,F为剩余的全精度权重集,w_q为贪婪最优权重,w_Q为一组序列的贪婪最优权重。δF为最优更新。

# 设置 LightGBM 参数(正则化和复杂度控制) > param <- list( + objective = "regression", + metric = "rmse", + learning_rate = 0.01, + num_leaves = 31, + feature_fraction = 0.8, + bagging_fraction = 0.8, + lambda_l1 = 0.1, + lambda_l2 = 0.2 + ) > > # 使用早停机制训练 LightGBM > lgb_model <- lgb.train( + params = params, + data = lgb_train, + nrounds = params$nrounds, + valids = list(validation = lgb.Dataset(test_matrix, label = test_labels)), + early_stopping_rounds = 10, + verbose = 1 + ) [LightGBM] [Info] Number of positive: 231, number of negative: 154 [LightGBM] [Info] Auto-choosing row-wise multi-threading, the overhead of testing was 0.000443 seconds. You can set `force_row_wise=true` to remove the overhead. And if memory is not enough, you can set `force_col_wise=true`. [LightGBM] [Info] Total Bins 792 [LightGBM] [Info] Number of data points in the train set: 385, number of used features: 13 [LightGBM] [Info] [binary:BoostFromScore]: pavg=0.600000 -> initscore=0.405465 [LightGBM] [Info] Start training from score 0.405465 [LightGBM] [Warning] No further splits with positive gain, best gain: -inf [LightGBM] [Warning] Stopped training because there are no more leaves that meet the split requirements [1]: validation's binary_error:0.395833 Will train until there is no improvement in 10 rounds. [LightGBM] [Warning] No further splits with positive gain, best gain: -inf [LightGBM] [Warning] Stopped training because there are no more leaves that meet the split requirements [2]: validation's binary_error:0.395833 [LightGBM] [Warning] No further splits with positive gain, best gain: -inf [LightGBM] [Warning] Stopped training because there are no more leaves that meet the split requirements [3]: validation's binary_error:0.395833 [LightGBM] [Warning] No further splits with positive gain, best gain: -inf [LightGBM] [Warning] Stopped training because there are no more leaves that meet the split requirements [4]: validation's binary_
03-16
<think>好的,我现在需要帮助用户解决关于LightGBM参数设置的问题,特别是正则化、复杂度控制、早停机制以及分裂警告的解决方案。首先,我需要回顾一下LightGBM的相关知识,确保自己对这些参数和机制有正确的理解。 用户提到的正则化和复杂度控制,这通常涉及到防止模型过拟合的参数。常见的正则化参数包括lambda_l1和lambda_l2,也就是L1和L2正则化项,还有max_depth、num_leaves这样的树结构参数,用于限制模型的复杂度。另外,min_data_in_leaf和min_sum_hessian_in_leaf也是控制叶子节点分裂的重要参数,可以避免模型过于复杂。 接下来是早停机制,也就是early_stopping。用户提到在早停机制下模型停止分裂的问题。这可能是因为早停设置的轮次(early_stopping_round)过小,或者在验证集上性能没有提升,导致训练提前终止。需要检查验证集的评估指标是否合适,以及早停的耐心参数是否合理。 关于分裂警告,比如遇到“Cannot split anymore”的提示,这可能是因为树的深度达到了限制,或者叶子节点的样本数、hessian和不足,导致无法继续分裂。这时候需要调整相应的参数,比如增加max_depth或num_leaves,或者降低min_data_in_leaf等阈值。 我需要确保回答的结构清晰,按照用户的要求分步骤说明参数设置方法、正则化配置、早停机制调整以及解决分裂警告的方案。同时,要引用提供的参考资料中的内容,比如LightGBM支持类别特征、并行方法等,但主要聚焦在参数调节部分。 需要检查是否有遗漏的参数,比如feature_fraction和bagging_fraction,这些用于随机选择特征和数据子集,也是防止过拟合的有效手段。另外,DART模式可能对防止过拟合有帮助,不过用户的问题中没有提到,但可以作为额外建议。 还要注意用户提到的引用标记,在回答中适当添加引用,比如提到直方图算法或并行优化时引用对应的资料。同时,生成的相关问题需要与主题相关,帮助用户深入理解。 最后,确保回答使用中文,数学公式用$$格式,行内公式用$,代码块用正确语法,并符合用户提供的格式示例。可能需要整理参数列表,使其易于阅读,并给出具体的示例代码,如设置早停和参数调整的Python示例。</think>### LightGBM参数调节与正则化设置方法 #### 一、正则化与复杂度控制参数 1. **树结构限制** - `max_depth`:控制树的最大深度(默认-1,无限制) - `num_leaves`:单棵树的最大叶子数,需满足 $num\\_leaves \leq 2^{max\\_depth}$ - `min_data_in_leaf`:叶子节点最小样本数(默认20) - `min_sum_hessian_in_leaf`:叶子节点最小Hessian和(默认1e-3)[^1] 2. **正则化参数** - `lambda_l1`:L1正则化系数(默认0) - `lambda_l2`:L2正则化系数(默认0) - `feature_fraction`:随机选择特征的比例(默认1.0) - `bagging_fraction`:随机采样数据的比例(默认1.0) 3. **梯度控制** - `min_gain_to_split`:分裂所需最小增益(默认0) - `extra_trees`:启用极端随机树模式(默认false) #### 二、早停机制与分裂警告解决方案 1. **早停机制设置** ```python model = lgb.train(params, train_set, valid_sets=[validation_set], early_stopping_rounds=50) # 验证集连续50轮无提升则停止 ``` - **问题排查**:若过早停止,需检查: - 验证集是否具有代表性 - 评估指标(`metric`)是否合适 - `learning_rate`是否过小导致收敛慢 2. **分裂警告处理** 当出现`Cannot split anymore`警告时,调整策略: - 增大`max_depth`或`num_leaves` - 降低`min_data_in_leaf`(建议值5-10) - 减小`min_sum_hessian_in_leaf`(建议1e-2) - 提升`min_gain_to_split`(防止无意义分裂) #### 三、参数调节示例 ```python params = { 'boosting_type': 'gbdt', 'objective': 'regression', 'metric': 'rmse', 'num_leaves': 31, # 初始值建议设为2^max_depth-1 'max_depth': -1, # 建议5-8层 'learning_rate': 0.05, 'feature_fraction': 0.9, # 随机选择90%特征 'lambda_l1': 0.1, # L1正则化 'lambda_l2': 0.1, # L2正则化 'min_data_in_leaf': 20, 'early_stopping_round': 30 } ``` #### 四、关键原理支持 LightGBM通过直方图算法加速训练,同时采用带深度限制的Leaf-wise生长策略,在保持精度的前提下降低复杂度[^1]。其直方图做差技术可减少50%的通信开销,这对分布式训练尤为重要[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值