梯度下降算法是机器学习和深度学习中广泛使用的优化技术。本文将探讨梯度下降的基本概念、数学原理以及其在算法中的应用。
梯度下降的概念最早由柯西(Cauchy)在1847年提出。“梯度”一词指的是某种属性的增加或减少,而“下降”则意味着向下移动的行为。综合来看,梯度下降描述了在下降过程中对位置的观察,以及再次上升的过程。
在数学中,梯度下降可以类比为在一条曲线上找到最低点的过程。假设有一条形式为 y=f(x) 的曲线,那么在任何点的斜率就是 y 对 x 的导数。当沿着曲线向下移动时,斜率会减小,直到在最低点(最小值)处斜率为零,然后随着向上移动斜率再次增加。
在寻找曲线最低点的过程中,关注的是 x 和 y 值在最小点的变化。通过观察不同位置的五个点,可以发现,当向下移动时,相对于 x 值,y 值会减小。因此,在所有点中,能在曲线底部找到相对较小的 y 值。结论是,总是在曲线底部找到最小值 (x,y)。
在任何算法中,主要目标是最小化损失,这表明模型表现良好。为了分析这一点,将使用线性回归。线性回归使用一条线来预测连续输出,假设这条线是 y = w * x + c 的形式。目标是找到 w 和 c,使得得到最佳拟合线,从而最小化误差。因此,目标是找到最优的 w 和 c 值。
从 w 和 c 的一些随机值开始,并根据损失更新这些值,即更新这些权重,直到斜率等于或接近零。将损失函数放在 y 轴上,w 和 c 放在 x 轴上。按照以下步骤达到第一个图中的最小 w 值:
在这里减去斜率,因为想要移动到山的底部或者最陡下降的方向。随着减去参数,参数会更新,会得到一个小于前一个的斜率,这就是想要移动到斜率等于或接近零的点。稍后会讨论学习率!
学习率的引入是为了控制步长和图表的偏移。不能遍历从起始点到最小点之间的所有点——需要跳过一些点。在初始阶段,可以采取大象步。但在接近最小值时,需要采取婴儿步,因为可能会越过最小值,移动到斜率增加的点。因此,为了控制步长和图表的偏移,引入了学习率。
# 均方误差方程
# 将 (w * x + c) 替换为 Ypred,并相对于 w 求导
# 这里 LHS 的 m 实际上是斜率 (w)。对于 c 也是如此
# 将此应用于所有周期的给定点
for i in range(epochs):
y_pred = w * x + c
D_M = (-2/n) * sum(x * (y_original - y_pred))
D_C = (-2/n) * sum(y_original - y_pred)
# 这里 sum 函数一次添加所有点的梯度!
# 更新所有迭代的参数
W = W – lr * D_M
C = C – lr * D_C