机器学习中的梯度下降法

March 22, 2017

原理

一个二维线性图像可以这样表示:

其中的表示输出,表示输入, 我们基于已有项的训练集

训练出最精确的, 这样机器就学习到一个函数, 因为历史原因我们把它称为假设 (hypothesis), 对于输入为,是其输出, 表示方法如下:

什么叫「最精确」? 每一项越接近越精确. 也就是说, 对于中的每一个,的和要最小, 为了摆脱正负数的困扰, 我们把每一项平方再求和, 就是的和最小, 为了便于之后的求导, 再乘上. 我们把各项误差的平方和称为,表示求和, 表示方法如下:

注意, 在这里,均为已知量,是未知量, 我们要找到使得最小, 也就是误差最小. 通过求导, 我们可以知道减小时,的方向, 往减小的方向踏出一步, 改变, 让的值下降. 这个要理解有点难度, 我再解释一下. 现在我们把忽略, 那么:

很明显是个二次函数, 我就假定这时化简求到的是这样:横轴是, 纵轴是, 形状呈抛物线. 用下图表示.

png

假如我们这时候随机取了一点,, 很明显这还不是最低点, 我在这个点上求导得, 高中数学告诉我们这个值是时的切线斜率.

我们先不管大小, 而是考虑它的正负号, 如果导数为正,增加,增加. 导数为负,增加,减小.

但我们还可以换个思路, 如果导数为正,减小,减小. 导数为负,减小,增加.

也就是说, 正号告诉我们若要让减小,应该减小, 往左移动. 负号告诉我们若要让 $J(\theta_0)$ 减小,应该增大, 往右移动.

我们可以看到导数的正负性是和移动方向相反的, 导数为正就要减的值, 导数为负就要加的值. 若要让更接近最低点, 我们要与导数符号相反的方向更新的值, 用表示我赋予一个新的值, 也就是

回到, 因为是个三维图像, 可以想象先在的方向切一刀取截面, 这就变成一个二维图像来求导,同理, 这就是偏导数的意义.

这个求导用表示, 偏导数用来判断减小的方向,表示一个系数,的绝对值就是步长. 踏完之后的值就不一样了, 我们获得了新的, 用表示我赋予一个新的值.

现在求了,时, 沿切一刀, 把看作常数:

同理, 因为有系数:

已经降无可降时, 我们称此时的的值收敛, 这时的就是我们想要的结果.

代码实现

生成训练集

生成11个 (x,y), 且 y 加了0~1之间的随机数干扰.

生成的结果如图, 点是训练集, 直线表示不加干扰时 x 和 y 的关系.

png

训练模型

每运算50次, 生成计算机预测的图像, 我们可以看到计算机的预测是如何逼近原图像的.

这是第一次预测:

第五十次:

第一百次:

第一百五十次:

第两百次, 基本完成: