梯度下降算法是一种用于优化方程中参数的迭代算法,其目的是减少损失(通常称为代价函数)。在深入探讨之前,首先需要了解梯度的含义,为什么要计算函数的梯度,以及使用此算法的最终目标是什么。函数的梯度指的是在某个点处函数的斜率。计算函数的梯度是为了实现函数的全局最小值,目标是为函数找到最佳的参数集(系数),以使损失值最小化。
现在已经知道了要做什么以及目标是什么,让逐步探索这个概念。以一个简单的线性方程为例,该方程包含m个变量,代表一个人口样本。在这个方程中,参数的数量将是m+1(X1, X2, X3...XM加上截距项)。代价函数(损失)是预测值与实际值之差的平方和的平均值。目标是找到损失函数的全局最小值,因此需要绘制所有参数的损失函数。但是,可以看到实际绘图的维度总数已成为m+2,即方程的实际参数(m+1)加上因变量(损失)。绘制如此多的维度并进行解释相当困难,因此需要一个迭代算法来达到函数的全局最小值。最常见的算法是梯度下降算法。
接下来,将尝试了解梯度下降背后的逻辑。假设这是损失函数,现在如果想计算x=1.5处的梯度,将发现它是正的(大约1.66)。现在的问题是应该如何相对于x=1.5移动以达到最小值。关键是必须朝斜率的相反方向移动以达到最小值,即如果斜率是正的,则向负方向移动;如果斜率是负的,则向正方向移动。(与上述图表相关,x=1.5处的斜率)。好的,现在知道了,因为x=1.5处的斜率是正的,必须向负方向移动以寻找最小值。但是,应该移动多少呢?这就是第二个问题,应该从点(1.5,2.5)移动多少才能接近函数的最小值。这被称为学习率。假设它是“α”,所以“α”决定了必须向负方向移动的步长。学习率应该明智地选择,因为太快的步长可能会错过最小值,而极小的学习率将导致到达最小值的时间很长。因此,应该在大和小的值之间选择一个学习率。下面是一个简单的图表,表示达到最小值的步长。
现在已经熟悉了所有需要理解这个迭代算法的概念,让看看算法的迭代过程中涉及的步骤。为了简单起见,将以一个单变量的线性方程为例,然后将其推广到m项:y=b+w1x1。假设下面的图表表示y与变量x1的散点图。目标是找到最佳的参数集,以便尽可能地减少损失(即找到最佳的w1和b值以最小化损失函数)。在上述图表中,可以计算每个数据点的损失为(预测值-实际值)^2。如果绘制损失与参数w1的关系图,将得到一个类似下面的碗形图。在这里,可以看到每个w1都有一个与之相关的损失。由于在这里采取了一个简单的模型来理解,但可以想象,随着参数的增加,维度增加(特征)。因此,对来说,很难直观地判断最小值。
// 步骤1: 初始化w1为任意值(例如上图中的点C)。
// 步骤2: 计算损失函数J(w1, b)。
// 步骤3: 在点C处取切线并计算其梯度。可以发现点C的斜率是负的。因此,应该向正方向移动以达到最小值。
// 步骤4: 决定学习率“α”。
// 步骤5: w1(new) = w1(old) - α*(梯度)
// (梯度将在每次迭代中减小,步长也将变短)
现在,让为m+1个参数推广梯度下降算法。y=b+w1x1+w2x2+w3x3+...+wmxm(损失函数)J(b,w)= 1/2 { Σ(i=1 to m) [hw,b(xi)-yi]^2 }。首先,将随机初始化b, w1, w2, w3...wm。使用所有参数值并预测训练数据集中每个数据点的hw,b(xi)。计算损失J(b, w)。计算J(b, w)相对于每个参数的梯度。b(new) = b(old) - α*(梯度)b,w1(new) = w1(old) - α*(梯度)w1,w2(new) = w2(old) - α*(梯度)w2,依此类推,直到第m项w_m(new) = w_m(old) - α*(梯度)wm。更新所有参数b, w1, w2, w3, w4, ...wm。回到步骤3。重复直到收敛。