深度学习的基础
常见的临界点的种类为局部最小值和鞍点
1.局部最小值
对于任何目标函数f(x),如果在x处对应的f(x)值小于在x附近任意其他点的f(x)值,那么f(x)可能是局部最小值。如果f(x)在x处的值是整个域中目标函数的最小值,那么f(x)是全局最小值。
我们可以看一个例子:
f(x) = x · cos(πx) for − 1.0 ≤ x ≤ 2.0
%matplotlib inline
import numpy as np
import torch
from mpl_toolkits import mplot3d
from d2l import torch as d2l
def f(x):
return x*torch.cos(np.pi*x)
def g(x):
return f(x)+0.2*torch.cos(5*np.pi*x)
def annotate(text,xy,xytext): #@save
d2l.plt.gca().annotate(text,xy=xy,xytext=xytext,arrowprops=dict(arrowstyle='->'))
x=torch.arange(-1.0,2.0,0.01)
d2l.plot(x,[f(x),],'x','f(x)')
annotate('local minimum',(-0.3,-0.25),(-0.77,-1.0))
annotate('global minimum',(1.1,-0.95),(0.6,0.8))
在这个例子中,我们能够很明显的区分出局部最小值和全局最小值
2.鞍点
鞍点(saddle point)是指函数的所有梯度都消失但既不是全局最小值也不是局部最小值的任何位置。
%matplotlib inline
import numpy as np
import torch
from mpl_toolkits import mplot3d
from d2l import torch as d2l
def f(x):
return x*torch.cos(np.pi*x)
def g(x):
return f(x)+0.2*torch.cos(5*np.pi*x)
def annotate(text,xy,xytext): #@save
d2l.plt.gca().annotate(text,xy=xy,xytext=xytext,arrowprops=dict(arrowstyle='->'))
x=torch.arange(-2.0,2.0,0.01)
d2l.plot(x,[x**3],'x','f(x)')
annotate('saddle point',(0,-0.2),(-0.52,-5.0))
怎么判断一个临界点的种类,有什么方法呢?接下来我们一起学习一下:
网络本身很复杂,用复杂网络算出来的损失函数显然也很复杂。虽然无法完整知道整个损失函数的样子,但是如果给定某一组参数,比如 θ′,在 θ′ 附近的损失函数是有办法写出来的——虽然 L(θ) 完整的样子写不出来。θ′ 附近的 L(θ) 可近似为:
其中,第一项 L(θ)′ 告诉我们,当 θ 跟 θ′ 很近的时候,L(θ) 应该跟 L(θ′) 还蛮靠近的;第二项 θg 中,g 代表梯度,它是一个向量,可以弥补 L(θ′) 跟 L(θ) 之间的差距。有时候梯度 g 会写成 ∇L(θ′)。gi 是向量 g 的第 i 个元素,就是 L 关于 θ 的第 i 个元素的微分,即
但是看 g 还是没有办法完整地描述 L(θ),还要的第三项 。第三项跟海森矩阵(Hessian matrix)H 有关。H 里面放的是 L 的二次微分,它第 i 行,第 j 列的值 HiHij 就是把 θ 的第 i 个元素对 L(θ′)作微分,再把 θ 的第 j 个元素对 作微分后的结果,即
在临界点,梯度 g 为零,因此 为零。所以在临界点的附近,损失函数可被近似为L(θ) ≈
为了符号简洁,我们用向量 v 来表示 θ − θ′,可改写为 ,有如下三种情况。
(1)如果对所有 v, > 0. 这意味着对任意 θ,L(θ) > L(θ′). 只要 θ 在 θ′ 附近,L(θ) 都大于 L(θ′). 这代表 L(θ′) 是附近的一个最低点,所以它是局部极小值。
(2)如果对所有 v, < 0. 这意味着对任意 θ,L(θ) < L(θ′),θ′ 是附近最高的一个点,L(θ′) 是局部极大值。
(3)如果对于 v,有时候大于零,有时候小于零。这意味着在 θ′ 附近,有时候L(θ) > L(θ′),有时候 L(θ) < L(θ′). 因此在 θ′ 附近,L(θ′) 既不是局部极大值,也不是局部极小值,而是鞍点。
但是我们根据来判断临界点的种类,需要带入所有的θ,比较复杂,所以我们使用的正负来判断会更简单。算出一个海森矩阵后,不需要把它跟所有的 v 都乘乘看,只要看 H的特征值。若 H 的所有特征值都是正的,H 为正定矩阵,则 v^{T}Hv > 0,临界点是局部极小值。若 H 的所有特征值都是负的,H 为负定矩阵,则 < 0,临界点是局部极大值。若 H 的特征值有正有负,临界点是鞍点。
接下来我使用李宏毅老师的ppt来用例子再解释一下:
在深度学习中,判断临界点的种类可以通过以下几种方法进行详细解释:
1. 梯度方法:梯度是指函数在某一点的变化率,对于一个临界点来说,梯度为零。因此,可以通过计算网络参数的梯度来判断是否达到了临界点。如果梯度接近于零,表明参数已经收敛到一个临界点。
2. Hessian矩阵方法:Hessian矩阵是二阶导数矩阵,它可以提供有关函数在某一点的曲率信息。对于一个临界点来说,Hessian矩阵的特征值为零。因此,可以通过计算网络参数的Hessian矩阵来判断是否达到了临界点。如果主特征值接近于零,表明参数已经收敛到一个临界点。
3. 自适应学习率方法:自适应学习率是指根据网络参数的变化情况自动调整学习率的方法。在训练过程中,如果自适应学习率几乎不再变化,说明参数已经收敛到一个临界点。
4. 梯度探索方法:梯度探索是指在训练过程中,通过调整网络参数的初始值、学习率等超参数,反复训练网络,观察网络达到的各个临界点的性能变化。如果在某个临界点的性能变化较小,说明参数已经收敛到该临界点。
这些方法可以帮助判断网络参数是否达到了临界点,但需要注意的是,临界点并不一定是局部最小值,也可能是鞍点或局部最大值。因此,判断网络参数是否收敛到一个理想的临界点还需要结合其他信息和经验。