鞍点 Hessian矩阵

https://blog.csdn.net/baidu_27643275/article/details/79250537

长期以来,人们普遍认为,神经网络优化问题困难是因为较大的神经网络中包含很多局部极小值(local minima),使得算法容易陷入到其中某些点。到2014年,一篇论文《Identifying and attacking the saddle point problem in high-dimensional non-convex optimization》,提出高维非凸优化问题之所以困难,是因为存在大量的鞍点而不是局部极值。
图一表示:神经网络只有两个参数时的情况,水平方向分别为两个参数,纵轴代表损失函数
图二表示:神经网络具有高维参数时。

鞍点(saddle point)这个词来自z=x2−y2” role=”presentation” style=”position: relative;”>z=x2y2z=x2−y2的图形,在x轴方向向上曲,在y轴方向向下曲,像马鞍,鞍点为(0,0)。

拥有两个以上参数的函数。它的曲面在鞍点好像一个马鞍,在某些方向往上曲,在其他方向往下曲。在一幅等高线图里,一般来说,当两个等高线圈圈相交叉的地点,就是鞍点。
这里写图片描述

扩展:
神经网络优化问题中的鞍点即一个维度向上倾斜且另一维度向下倾斜的点。

鞍点:梯度等于零,在其附近Hessian矩阵有正的和负的特征值,行列式小于0,即是不定的。
鞍点和局部极值的区别
鞍点和局部极小值相同的是,在该点处的梯度都等于零,不同在于在鞍点附近Hessian矩阵是不定的,非正定,非负定,非半正定(行列式小于0),而在局部极值附近的Hessian矩阵是正定的。

在鞍点附近,基于梯度的优化算法(几乎目前所有的实际使用的优化算法都是基于梯度的)会遇到较为严重的问题:
鞍点处的梯度为零,鞍点通常被相同误差值的平面所包围(这个平面又叫Plateaus,Plateaus是梯度接近于零的平缓区域,会降低神经网络学习速度),在高维的情形,这个鞍点附近的平坦区域范围可能非常大,这使得SGD算法很难脱离区域,即可能会长时间卡在该点附近(因为梯度在所有维度上接近于零)。

在鞍点数目极大的时候,这个问题会变得非常严重。

高维非凸优化问题之所以困难,是因为高维参数空间存在大量的鞍点。

补充:
Hessian矩阵是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。可用于判定多元函数的极值。



### Hessian矩阵在机器学习中的应用及计算方法 #### 什么是Hessian矩阵Hessian矩阵是一个由多元函数的二阶偏导数组成的方阵,用于描述目标函数曲面的局部弯曲程度。对于一个具有 \( n \) 个变量的目标函数 \( f(\mathbf{x}) \),其Hessian矩阵定义如下: \[ H(f) = \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}. \] 如果该函数是二次可微分的,则根据Schwarz定理,混合偏导数相等,即 \( \frac{\partial^2 f}{\partial x_i \partial x_j} = \frac{\partial^2 f}{\partial x_j \partial x_i} \)[^3]。 --- #### Hessian矩阵在机器学习中的作用 Hessian矩阵广泛应用于优化问题中,尤其是在涉及高维空间的情况下。以下是几个主要应用场景及其意义: ##### 1. **牛顿法(Newton’s Method)** 牛顿法是一种基于二阶信息的优化算法,在每次迭代过程中利用目标函数的一阶梯度Hessian矩阵来更新参数向量。更新公式为: ```python delta_x = -np.linalg.inv(H).dot(g) x_new = x_old + delta_x ``` 这里,\( g \) 表示当前点处的梯度矢量,而 \( H \) 则表示对应的Hessian矩阵[^2]。通过这种方法可以更高效地逼近极值点,尤其当接近最优解时收敛速度更快。 ##### 2. **评估损失表面特性** 通过对Hessian矩阵特征值分析可以帮助理解成本函数的行为模式。例如,所有特征值均为正值表明此位置附近存在局部最小值;反之如果有负特征值则可能意味着鞍点或者最大值的存在[^5]。 ##### 3. **加速训练过程** 尽管直接求取完整的Hessian矩阵并不可行于大规模数据集上执行,但是某些近似技术能够有效减少内存消耗同时保持良好性能表现。比如共轭梯度(CG)方法或是LBFGS准牛顿类算法均属于此类改进措施之一[^4]。 --- #### 如何计算Hessian矩阵? 由于显式构建整个Hessian矩阵通常非常昂贵甚至不可能实现(特别是在神经网络这样的复杂模型里),因此实际操作中有几种替代方案可供选择: - **数值估计**: 使用有限差分法估算各个元素值。 ```python def numerical_hessian(func, x, h=1e-5): dim = len(x) Hess = np.zeros((dim,dim)) for i in range(dim): for j in range(i,dim): xi_plus = copy.deepcopy(x); xi_minus = copy.deepcopy(x); xi_plus[i]+=h; xi_plus[j]+=h; xi_minus[i]-=h; xi_minus[j]-=h; fi_pj_p = func(xi_plus) fi_mj_p = func([xi_plus[k] if k!=i else xi_minus[k] for k in range(len(x))]) fi_pj_m = func([xi_plus[k] if k!=j else xi_minus[k] for k in range(len(x))]) fi_mj_m = func(xi_minus) second_derivative=(fi_pj_p-fi_pj_m-fi_mj_p+fi_mj_m)/(4*h**2) Hess[i,j]=second_derivative if i != j: Hess[j,i]=second_derivative return Hess ``` - **自动微分工具**: 借助现代深度学习框架如TensorFlow或PyTorch内置的支持功能来自动生成所需的导数项。 --- #### 小结 综上所述,Hessian矩阵不仅提供了关于目标函数几何形状的重要线索而且还是多种高级优化策略的核心组成部分。然而考虑到存储需求与运算代价等因素影响,针对特定场景选取合适的技术手段显得尤为重要.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值