局部最小值(local minimum):对于目标函数f(x),f(x)在x上的值比在x邻近的其他点的值更小。
全局最小值(global minimum):f(x)在x上的值是目标函数在整个定义域上的最小值。
import d2lzh as d2l
from mpl_toolkits import mplot3d
import numpy as np
def f(x):
return x * np.cos(np.pi * x)
d2l.set_figsize((4.5, 2.5))
x = np.arange(-1.0, 2.0, 0.1) # 第一个参数为起点,第二个参数为终点,第三个参数为步长。其中步长支持小数。
fig, = d2l.plt.plot(x, f(x)) # 逗号表示只取返回列表中的第一个元素
# plt.plot(x,y,format_string,**kwargs) x轴数据,y轴数据,format_string控制曲线的格式字串
fig.axes.annotate('local minimum', xy=(-0.3, -0.25), xytext=(-0.77, -1.0),
arrowprops=dict(arrowstyle='->'))
# xy=(横坐标,纵坐标) 箭头尖端 xytext=(横坐标,纵坐标) 文字的坐标,指的是最左边的坐标 arrowprops= { facecolor= '颜色', shrink = '数字' <1 收缩箭头 }
fig.axes.annotate('global minimum', xy=(1.1, -0.95), xytext=(0.6, 0.8),
arrowprops=dict(arrowstyle='->'))
d2l.plt.xlabel('x') # 做标签x
d2l.plt.ylabel('f(x)'); #做标签f(x)
如果不作逗号会保存报错:
加上逗号后:
当一个优化问题的数值解在局部最优解附近时,由于目标函数有关解的梯度接近或变成零,最终迭代求得的数值解可能只令目标函数局部最小化而非全局最小化。
鞍点(saddle point)
x= np.arange(-2.0, 2.0, 0.1)
fig, = d2l.plt.plot(x, x**3)
fig.axes.annotate('saddle point', xy=(0, -0.2), xytext=(-0.52, -5.0),
arrowprops=dict(arrowstyle='->'))
d2l.plt.xlabel('x')
d2l.plt.ylabel('f(x)');
假设一个函数的输入为k维向量,输出为标量,那么它的海森矩阵(Hessian matrix)有k个特征值。该函数在梯度为0的位置上可能是局部最小值、局部最大值或者鞍点。
- 当函数的海森矩阵在梯度为零的位置上的特征值全为正时,该函数得到局部最小值。
- 当函数的海森矩阵在梯度为零的位置上的特征值全为负时,该函数得到局部最大值。
- 当函数的海森矩阵在梯度为零的位置上的特征值有正有负时,该函数得到鞍点。
随机矩阵理论告诉我们,对于一个大的高斯随机矩阵来说,任一特征值是正或者是负的概率都是0.5。那么,以上第一种情况的概率为0.5^k。由于深度学习模型参数通常都是高维的(k很大),目标函数的鞍点通常比局部最小值更常见。