让我们将理论付诸实践。我们已经讨论了成本函数、梯度以及梯度下降 (gradient descent)的基本思想。现在,我们将使用一个小型数据集,手动计算一个简单线性回归模型的梯度。这项练习将巩固您对导数如何推动优化过程的理解。
场景设定:一个简单问题
假设我们有一个仅包含三个点 (x,y) 的小型数据集:(1,2)、(2,3) 和 (3,5)。我们的目标是为这些点找到形式为 y=mx+b 的最佳拟合直线。
我们的包含三个点的小型数据集,以及我们直线的初始猜测:y=0x+0。
我们需要一种方法来衡量我们直线的“好坏”。我们将使用我们之前讨论过的均方误差 (MSE) 作为成本函数。对于我们的三个数据点 (x1,y1),(x2,y2),(x3,y3),MSE 为:
J(m,b)=31i=1∑3(yi−y^i)2=31i=1∑3(yi−(mxi+b))2
让我们从参数 (parameter)的初始猜测开始:m=0 和 b=0。我们的直线初始为 y=0。
计算初始成本
首先,让我们计算初始猜测 (m=0,b=0) 的成本。
预测值 (y^i=mxi+b) 如下:
- y^1=0(1)+0=0
- y^2=0(2)+0=0
- y^3=0(3)+0=0
平方误差为:
- (y1−y^1)2=(2−0)2=4
- (y2−y^2)2=(3−0)2=9
- (y3−y^3)2=(5−0)2=25
均方误差为:
J(0,0)=31(4+9+25)=338≈12.67
这是我们的初始成本。我们的目标是通过调整 m 和 b 来降低这个值。
计算梯度
现在进入核心微积分部分:找到成本函数 J(m,b) 的梯度。梯度是一个包含关于每个参数 (parameter)的偏导数的向量 (vector):∇J=[∂m∂J,∂b∂J]。这些导数表示当我们微小改变 m 或 b 时,成本如何变化。
让我们找到 ∂m∂J 和 ∂b∂J。请记住,在对一个变量(如 m)取偏导数时,我们将其他变量(如 b)视为常量。
关于 m 的偏导数 (∂m∂J)
我们从成本函数开始:
J(m,b)=31[(y1−(mx1+b))2+(y2−(mx2+b))2+(y3−(mx3+b))2]
我们逐项对 m 求导。让我们关注一个项:(yi−(mxi+b))2。我们使用链式法则。设 u=yi−mxi−b。那么该项是 u2。
u2 关于 m 的导数是 2u⋅∂m∂u。
现在,我们找到 ∂m∂u=∂m∂(yi−mxi−b)。由于在对 m 求导时 yi、xi 和 b 被视为常量,这简化为 ∂m∂(−mxi)=−xi。
因此,(yi−(mxi+b))2 关于 m 的导数是 2(yi−mxi−b)(−xi)。
将此应用于我们的成本函数 J(m,b):
∂m∂J=31i=1∑32(yi−(mxi+b))(−xi)
∂m∂J=−32i=1∑3xi(yi−(mxi+b))
关于 b 的偏导数 (∂b∂J)
类似地,我们对 J(m,b) 关于 b 求导。同样,考虑一个项 (yi−(mxi+b))2。设 u=yi−mxi−b。
关于 b 的导数是 2u⋅∂b∂u。
现在,∂b∂u=∂b∂(yi−mxi−b)。将 yi、m 和 xi 视为常量,这得到 ∂b∂(−b)=−1。
因此,(yi−(mxi+b))2 关于 b 的导数是 2(yi−mxi−b)(−1)。
将此应用于成本函数:
∂b∂J=31i=1∑32(yi−(mxi+b))(−1)
∂b∂J=−32i=1∑3(yi−(mxi+b))
数值梯度计算
现在我们将数据点 (1,2),(2,3),(3,5) 和当前参数 (parameter) m=0,b=0 代入这些公式中。请记住我们的预测值为 y^1=0,y^2=0,y^3=0。
计算 ∂m∂J:
∂m∂J=−32[x1(y1−y^1)+x2(y2−y^2)+x3(y3−y^3)]
∂m∂J=−32[1(2−0)+2(3−0)+3(5−0)]
∂m∂J=−32[1(2)+2(3)+3(5)]
∂m∂J=−32[2+6+15]=−32[23]=−346≈−15.33
计算 ∂b∂J:
∂b∂J=−32[(y1−y^1)+(y2−y^2)+(y3−y^3)]
∂b∂J=−32[(2−0)+(3−0)+(5−0)]
∂b∂J=−32[2+3+5]=−32[10]=−320≈−6.67
因此,在 m=0,b=0 时,梯度为 ∇J≈[−15.33,−6.67]。
解释梯度
这些数字告诉我们什么?
- ∂m∂J≈−15.33:这是负数,意味着如果我们稍稍增加 m,成本 J 将会降低。大小 (15.33) 表明成本对 m 的变化非常敏感。
- ∂b∂J≈−6.67:这也是负数。稍稍增加 b 也会降低成本 J。在这一点上,成本对 b 的变化不如对 m 的变化敏感。
梯度 [−15.33,−6.67] 指向成本最陡峭上升的方向。为了降低成本(这是我们在优化中的目标),我们需要沿着梯度的相反方向移动。这意味着我们应该增加 m 和 b。
迈出小步(梯度下降 (gradient descent))
让我们执行一步梯度下降。我们需要一个学习率 α。我们选择一个较小的值,例如 α=0.01。
更新规则如下:
- mnew=mold−α∂m∂J
- bnew=bold−α∂b∂J
代入我们的值 (mold=0,bold=0, α=0.01, ∂m∂J=−46/3, ∂b∂J=−20/3):
- mnew=0−(0.01)(−346)=0.01×346=30.46≈0.153
- bnew=0−(0.01)(−320)=0.01×320=30.20≈0.067
我们的新参数 (parameter)大约是 m≈0.153 和 b≈0.067。
让我们可视化新直线 y≈0.153x+0.067:
我们的数据点,以及初始直线(虚线红色)和梯度下降一步后的直线(实线绿色)。新直线稍微更接近数据点。
如果我们计算成本 J(0.153,0.067),我们会发现它低于我们 12.67 的初始成本(如在思考过程中所计算的,大约是 10.03)。通过重复这个过程——计算梯度和更新参数——梯度下降会迭代地找到 m 和 b 的更优值,从而最小化成本函数。
这次手动计算展示了其机制:导数(梯度)告诉我们调整参数(m 和 b)的方向,以通过降低成本函数(MSE)来改进我们的模型。尽管库可以自动化此过程,但理解底层计算对于掌握机器学习 (machine learning)模型如何学习至关重要。