梯度下降

概述

梯度下降,Gradient Descent,找到一个函数的局部极小值

在机器学习、深度学习中,梯度下降的作用就是找到 损失函数 的最小值,使得 预测值 和 真实值 的 误差最小

代码实现

https://www.malaoshi.top/show_1EF4G05NJ24L.html

案例

损失函数

这里使用均方误差作为损失函数,该函数有唯一最小值,那么假设该损失函数图像如下:

y轴代表损失值

目的

在上图中,人眼很容易找到最小值,即当x为0时,但要让计算机找到最小值,就要计算

假设 出发点(a点) 在下图位置 ,我们要做的就是判断该点 是否 此函数的极值,如果不是就 求出极值

判断是否极值

对这一点进行求导,其 导数值 等于该点的 切线斜率,如果切线 斜率不为0,那么该点 不在极值点 上。

注意:上图的切线 斜率为 负数

移动的方向

当判断出a点不是极值后,接下来就要 移动 到下一个位置,首先要确定 往哪个方向 移动

上图中红线的 斜率 为 负数,a点的x值 与 斜率(负数)做 加法 运算时,y值反而越大

而我们的目的是找到 y的最小值,所以下一个点(b点)的x值 计算如下:

a点的x值 - 斜率

移动的步长

上面的计算,a点的x值 减去 斜率,可能达不到我们的要求,我们要控制 下降速度,就需要设置 步长

步长是需要手动设置的,也就是 超参数

步长 在机器学习、深度学习中 称为 学习率(learning rate)

所以下一个点的x值 计算如下:

a点的x值 - 步长*斜率

有经验所得,一般步长设置为 0.01

步长太小,移动的速度就太慢

如下图,需要运算的次数过多

步长太大,可能得不到最优解

如下图:

步长太大时,会导致跳跃,甚至跳跃后,损失值会增大

求出极值


按照步长在负方向上移动,求导数,如果导数不为极值,那么重复执行,一直到导数为极值停止

复杂函数(多个极值点)

对于 均方误差,有唯一极值点

但在很多 复杂函数 中,可能有 多个极值点

如上图,此函数有多个极值点

如果出发点在 b点和c点之间,有可能最终找到b点或c点,这只是 局部最小值
如果出发点在 a点的两侧,才能找到真正的 全局最小值

出发点的位置也是 超参数

解决方法:

  • 多次运行,随机 初始点
  • 手动 设置出发点的位置

总结

梯度法思想的三要素

从案例中,我们发现,有三个要素

  1. 出发点(超参数)
  2. 下降方向
  3. 下降步长(学习速率,超参数)

原文出处:/show_1EF44cFgc3QB.html