更合理地选取参数(梯度下降算法)
理论课
从上篇文章中可见,用穷举的方法是不容易找寻合适的参数 (w, b),梯度下降算法给我们指明了一条路。
先进行简单复习一些重要知识点(单变量线性回归模型及其代价函数)。
概念 | 符号 | 值 |
---|---|---|
模型 | f w , b f_{w,b} fw,b | w x ( i ) + b wx^{(i)}+b wx(i)+b |
代价函数 | J J J |
e
r
r
=
y
^
(
i
)
−
y
(
i
)
err=\hat{y}^{(i)}-y^{(i)}
err=y^(i)−y(i) J = ∑ i = 1 m e r r 2 2 m J=\frac{\sum^m_{i=1} err^2}{2m} J=2m∑i=1merr2 |
通过选取 (w, b),努力缩小 J,让 y ^ \hat{y} y^ 与 y 间的总偏差减小,以得到能够拟合样本点的模型 f 。
要科学的选择 (w, b),我们只有一个参照——J 的形式。一般的想法是,针对 J 的结构,去选择 (w, b),以期更快的找到合适的值。那么我们就先对 J 这个函数进行研究吧。
J 的解析式: J ( w , b ) = ∑ i = 1 m e r r 2 2 m = ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 2 m = ∑ i = 1 m ( w x ( i ) + b − y ( i ) ) 2 2 m J(w,b)=\frac{\sum^m_{i=1} err^2}{2m}=\frac{\sum^m_{i=1} (\hat{y}^{(i)}-y^{(i)})^2}{2m}=\frac{\sum^m_{i=1} (wx^{(i)}+b-y^{(i)})^2}{2m} J(w,b)=2m∑i=1merr2=2m∑i=1m(y^(i)−y(i))2=2m∑i=1m(wx(i)+b−y(i))2
所以,我们要研究的其实是,如何使一个二元函数最小。一般来说,要求一个函数的最值是比较复杂的,所以我们会选择先计算函数的极值,结合端点,用比较的方式找出最值。
从数学的角度,求 J 的极值点是很容易的。
-
求 J 的偏导:
∂ J ∂ w = ∑ i = 1 m ( w x ( i ) + b − y ( i ) ) x ( i ) m ∂ J ∂ b = ∑ i = 1 m ( w x ( i ) + b − y ( i ) ) m \begin{aligned} & \frac{\partial J}{\partial w}=\frac{\sum^m_{i=1} (wx^{(i)}+b-y^{(i)})x^{(i)}}{m} \\ & \frac{\partial J}{\partial b}=\frac{\sum^m_{i=1} (wx^{(i)}+b-y^{(i)})}{m} \end{aligned} ∂w∂J=m∑i=1m(wx(i)+b−y(i))x(i)∂b∂J=m∑i=1m(wx(i)+b−y(i)) -
求极值:
令: ∂ J ∂ w = 0 , ∂ J ∂ b = 0 w = ∑ i = 1 m x ( i ) y ( i ) − m x ˉ y ˉ ∑ i = 1 m x ( i ) 2 − m x ˉ 2 b = y ˉ − w x ˉ \begin{aligned} & 令:\frac{\partial J}{\partial w}=0,\frac{\partial J}{\partial b}=0\\ & w=\frac{\sum^m_{i=1}x^{(i)}y^{(i)}-m\bar{x}\bar{y}}{\sum^m_{i=1}x^{(i)2}-m\bar{x}^2}\\ & b=\bar{y}-w\bar{x} \end{aligned} 令:∂w∂J=0,∂b∂J=0w=∑i=1mx(i)2−mxˉ2∑i=1mx(i)y(i)−mxˉyˉb=yˉ−wxˉ
这就是经典的但变量问题线性回归系数公式,作为一种重要的思想,在这里简单谈谈,当然不是今天的重点。因为有许多的函数并不是那么容易解出 (w, b)。
在借助计算机的情况下,我们可以容忍不是一步到位求出 (w, b),而是通过迭代的方法,缓慢逼近 J 的极值点。更新 (w, b) 的方法如下。
w = w − α u 1 w=w-\alpha u_1 w=w−αu1
b = b − α u 2 b=b-\alpha u_2 b=b−αu2
关键在于找到合适的 u 1 , u 2 u_1\ ,\ u_2 u1 , u2 使每一此迭代,(w, b) 总向着 J 减小的方向运动,准确说,向着 J 的一个极值点运动。 u 1 , u 2 u_1\ ,\ u_2 u1 , u2 可以随迭代次数变化。
我们可以简单地猜一下, u 1 , u 2 u_1\ ,\ u_2 u1 , u2 应该满足的性质
- 指示当前点偏移极值点的方向,在数学上,“方向” 反应为 “函数值的正负”;
- 在每个点都应该可求 u 1 , u 2 u_1\ ,\ u_2 u1 , u2 ;(这不是必要性质,我们完全可以想办法规避这些不可求的点,只要这个算法值得我们这么做)
α \alpha α 被称为学习率(learning rate),表示每一次更新 (w, b) 的幅度。
我们发现,取 u 1 = ∂ J ∂ w , u 2 = ∂ J ∂ b u_1=\frac{\partial J}{\partial w}\ ,\ u_2=\frac{\partial J}{\partial b} u1=∂w∂J , u2=∂b∂J 恰好能满足这个要求,可以从一元函数的导数中理解到这一点。基于此,我们可以设了一种让计算机迭代优化 (w,b) 的算法,称之为梯度下降算法
即按照如下方法更新 (w, b):
w = w − α ∂ J ∂ w w=w-\alpha \frac{\partial J}{\partial w} w=w−α∂w∂J
b = b − α ∂ J ∂ b b=b-\alpha \frac{\partial J}{\partial b} b=b−α∂b∂J
这与梯度有什么关系呢?从 w-b 图像上可以看到,点 (w, b) 是沿向量 ( ∂ J ∂ w , ∂ J ∂ b ) (\frac{\partial J}{\partial w},\frac{\partial J}{\partial b}) (∂w∂J,∂b∂J) 的方向运动的,这个向量就是我们所说的 “梯度”。数学上可以证明,沿梯度方向函数下降得最快,这就是为什么我们给 w, b 取相同的 α \alpha α 。
- 举一反三,了解了这个算法设计的思路,我们是不是还能根据观察,设计出其它算法呢?
- 用一种更加通俗的方法来理解梯度下降算法:从山上一点出发,沿着坡度最大的方向小步前进,下坡,最终你一定会走到一个山谷中。