为什么深度学习模型很难找到局部最优?

深度学习的最终目标是让模型在预测时的误差很小。而在训练过程中,我们需要制定一个损失函数,使训练过程中的函数值“最小”。这时候,我们可以把该损失函数看做一个目标函数。从优化的思路上来讲,我们尽可能地降低训练误差就是最小化这个目标函数的过程。在深度学习过程中,要找到最小化损失函数不是那么容易的。要理解这个概念,首先需要了解 —— 对于一个多元函数,我们如何确定其极小值(局部最小值),也就是找到其局部最优。


我们很容易知道,梯度为0是极值的一个必要条件,但非充分条件(还可能是鞍点)。于是,我们需要掌握理解一个数学概念海森矩阵(Hessian matrix):

假设,存在n元实函数:
f ( x q , x 2 , . . . , x n ) ; x i ∈ R , ∀ i ∈ [ 1 , . . . , n ] f(x_q, x_2, ..., x_n); x_i \in R, \forall i\in[1, ..., n] f(xq,x2,...,xn);xiR,i[1,...,n]
若,函数f在任意维度二阶可导,则其Hessian矩阵为:
H ( f ) = [ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 ∂ x 2 . . . ∂ 2 f ∂ x 1 ∂ x n ∂ 2 f ∂ x 2 ∂ x 1 ∂ 2 f ∂ x 2 2 . . . ∂ 2 f ∂ x 2 ∂ x n : . . . . . . : ∂ 2 f ∂ x n ∂ x 1 ∂ 2 f ∂ x n ∂ x 2 . . . ∂ 2 f ∂ x n 2 ] H(f) = \begin{bmatrix} \frac{\partial^2f}{\partial x_1^2} & \frac{\partial^2f}{\partial x_1\partial x_2} & ... & \frac{\partial^2f}{\partial x_1\partial x_n} \\ \frac{\partial^2f}{\partial x_2\partial x_1} & \frac{\partial^2f}{\partial x_2^2} & ... & \frac{\partial^2f}{\partial x_2\partial x_n} \\ : & ... & ...& :\\ \frac{\partial^2f}{\partial x_n\partial x_1} & \frac{\partial^2f}{\partial x_n\partial x_2} & ... & \frac{\partial^2f}{\partial x_n^2} \end{bmatrix} H(f)=x122fx2x12f:xnx12fx1x22fx222f...xnx22f............x1xn2fx2xn2f:xn22f
即,其第i行,j列的元素为f对x_i, x_j求偏导:
H ( f ) i , j = ∂ ∂ x i ( ∂ f ∂ x j ) H(f)_{i,j} = \frac{\partial}{\partial x_i}({\frac{\partial f}{\partial x_j}}) H(f)i,j=xi(xjf)
则,针对目标函数极值的判断,有以下规则(满足梯度为0的前提下):

  • 当函数的Hession矩阵为正定矩阵时(特征值全为正数),该点为函数极小值点;
  • 当函数的Hession矩阵为负定矩阵时,该点为函数的极大值点;
  • 当函数的Hession矩阵为不定矩阵时,该点为函数的鞍点;
  • 当函数的Hession矩阵为半正定或者半负定时,为可以极值点,需要通过其他方法进一步确定。

举两个例子验证如上理论:

假设,目标函数为
f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2
我们先plot出函数的形状

from matplotlib import pyplot as plt
from mpl_toolkits import mplot3d

x, y = np.mgrid[-1:1:50j, -1:1:50j]
z = x**2 + y**2
ax = plt.figure(figsize=(12, 8)).add_subplot(111, projection='3d')
ax.plot_wireframe(x, y, z, **{'rstride':1, 'cstride':1})
ax.plot([0], [0], [0], 'rx')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

为什么深度学习模型很难找到局部最优?_第1张图片

很容易看出来,这是个凸函数,其极小值只有一个点在x=0, y=0的位置。那么我们根据Hessian矩阵理论来验证一番。使梯度为0,也就是一阶偏导均为零:
∂ f ∂ x = 2 x = 0 → x = 0 ∂ f ∂ y = 2 y = 0 → y = 0 \begin{matrix} \frac{\partial f}{\partial x} = 2x = 0 \rightarrow x=0 \\ \frac{\partial f}{\partial y} = 2y = 0 \rightarrow y=0 \end{matrix} xf=2x=0x=0yf=2y=0y=0
接下来,我们计算该点处Hessian矩阵的元素:
∂ 2 f ∂ x 2 = 2 ∂ 2 f ∂ x ∂ y = 0 ∂ 2 f ∂ y ∂ x = 0 ∂ 2 f ∂ y 2 = 2 \begin{matrix} \frac{\partial^2 f}{\partial x^2} = 2 & \frac{\partial^2 f}{\partial x\partial y} = 0 \\ \frac{\partial^2 f}{\partial y\partial x} = 0 & \frac{\partial^2 f}{\partial y^2} = 2 \end{matrix} x22f=2yx2f=0xy2f=0y22f=2
此时,Hessian矩阵的特征值为2, 2,是正定矩阵。所以,x=0,y=0 为该函数的极小值点。

接下来,我们看另一个例子。假设,目标函数为:
f ( x , y ) = x 3 − 2 x y − y 3 f(x, y) = x^3 - 2xy - y^3 f(x,y)=x32xyy3
为什么深度学习模型很难找到局部最优?_第2张图片

同样地,另梯度为零,计算x,y的值:
∂ f ∂ x = 3 x 2 − 2 y = 0 ∂ f ∂ y = − 2 x − 3 y 2 = 0 \begin{matrix} \frac{\partial f}{\partial x} = 3x^2-2y = 0 \\ \frac{\partial f}{\partial y} = -2x-3y^2 = 0 \end{matrix} xf=3x22y=0yf=2x3y2=0
我们可以解除,一组符合上述条件的点为 x= 0, y = 0,在这个位置上,其Hessian矩阵的元素为:
∂ 2 f ∂ x 2 = 6 x = 0 ∂ 2 f ∂ x ∂ y = − 2 ∂ 2 f ∂ y ∂ x = − 2 ∂ 2 f ∂ y 2 = − 6 y = 0 \begin{matrix} \frac{\partial^2 f}{\partial x^2} = 6x = 0 & \frac{\partial^2 f}{\partial x\partial y} = -2 \\ \frac{\partial^2 f}{\partial y\partial x} = -2 & \frac{\partial^2 f}{\partial y^2} = -6y=0 \end{matrix} x22f=6x=0yx2f=2xy2f=2y22f=6y=0
利用线性代数的知识,求该矩阵的特征值:
∣ λ E − H ∣ = 0 → λ = − 2 , 2 |\lambda E-H|=0 \rightarrow \lambda = -2, 2 λEH=0λ=2,2
可以发现该函数的Hessian矩阵在点x=0, y=0的特征值为-2和2,为不定矩阵,所以该点是函数 f(x, y)的鞍点。


那么,我们回归到文章的主题——“为什么深度学习模型很难找到局部最优?”

我们已经知道了,目标函数的局部最小值与其梯度为0时的Hessian矩阵的正定性有关。当目标函数输出为N维时,其Hessian矩阵有N个特征值。我们这里先假设Hessian矩阵满足高斯分布,根据随机矩阵理论,高斯随机矩阵的任意特征值为正或者负的概率为0.5。那么,这个矩阵正定的概率就是0.5N 。如果某个目标函数的自变量维度为100,在上述随机的情况下,其Hessian矩阵为正定(出现极小值)的概率约为7.9e-31 。而深度学习模型的参数往往都是高维的,即目标函数的N往往是一个很大的数,所以其目标函数的鞍点通常比极小值点多得多。

在上述随机的情况下,其Hessian矩阵为正定(出现极小值)的概率约为7.9e-31 。而深度学习模型的参数往往都是高维的,即目标函数的N往往是一个很大的数,所以其目标函数的鞍点通常比极小值点多得多。

另外,我们讨论为什么我们说”局部最优“而不说”全局最优“呢? 首先,因为深度学习模型的复杂性,其函数模型往往是非凸的,非凸优化问题难以找到全局最优。 其二,在深度学习中,很多实验发现找到局部最优点,当此时模型的验证误差不大时,泛化误差也会相对理想;并且,深度学习的许多个局部最优点有着相似的预测误差。 所以,我们再优化深度学习模型的目标往往是使其逃离鞍点和不好的局部最优,找到比较好的局部最优(我们现在常用的SGD算法就能比较有效地帮助逃离鞍点)。

你可能感兴趣的:(深度学习,深度学习,机器学习,线性代数)