在监督学习里,我们有一个数据集,它被称为一个训练集
一些符号:
m:训练样本的数量
x:输入变量/特征
y:输出变量/目标变量
(x,y):表示一个训练样本
(x(i),y(i)):第i个训练样本
1.我们向学习算法提供训练集
2.学习算法的任务是输出一个函数,,通常用小写h表示,h代表假设函数(hypothesis),假设函数的作用是,输入x值,输出预测的y值
3.下一个要考虑的问题是如何表示这个假设函数h?
一种形式是 h ( x ) = a x + b h(x) = ax + b h(x)=ax+b,即y是x的线性函数,这就被称为线性回归,由于只有一个自变量x,所以称为一元线性回归或者单变量线性回归(Univariate linear regression)
我们要做的就是得出a和b的值,来让假设函数表示的直线尽量地与这些数据点很好的拟合
在标准定义中,线性回归我们要解决一个最小化问题,即让预测的h(x)值和准确的y值的误差尽可能的小,即让误差的平方和最小,数学公式表示为:
m i n i m i z e a , b ∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) 2 ( m 表 示 训 练 样 本 的 数 量 ) minimize_{a,b} \displaystyle\sum_{i=1}^{m}(h(x^{(i)}) - y^{(i)})^2\qquad (m表示训练样本的数量) minimizea,bi=1∑m(h(x(i))−y(i))2(m表示训练样本的数量)
或者
m i n i m i z e a , b 1 2 m ∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) 2 ( m 表 示 训 练 样 本 的 数 量 ) minimize_{a,b}\quad \frac{1}{2m}\displaystyle\sum_{i=1}^{m}(h(x^{(i)}) - y^{(i)})^2\qquad (m表示训练样本的数量) minimizea,b2m1i=1∑m(h(x(i))−y(i))2(m表示训练样本的数量)
定义代价函数(cost function)
J ( a , b ) = 1 2 m ∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) 2 ( m 表 示 训 练 样 本 的 数 量 ) J(a,b)= \frac{1}{2m}\displaystyle\sum_{i=1}^{m}(h(x^{(i)}) - y^{(i)})^2\qquad (m表示训练样本的数量) J(a,b)=2m1i=1∑m(h(x(i))−y(i))2(m表示训练样本的数量)
代价函数也被称为平方误差函数或者平方误差代价函数,在线性回归问题中,平方误差函数是最常用的手段。
图中 θ 0 \theta_0 θ0对应b, θ 1 \theta_1 θ1对应a
在实际中,需要求解的参数可能不止两个,可能有n个: θ 0 , θ 1 , θ 2 . . . θ n \theta_0,\theta_1,\theta_2...\theta_n θ0,θ1,θ2...θn。
代价函数其实是关于a和b的二次函数,所以代价函数关于a和b的变化曲线就是碗状的
1.Start with some θ 0 , θ 1 \theta_0,\theta_1 θ0,θ1,即我们指定 θ 0 和 θ 1 \theta_0和\theta_1 θ0和θ1的初始值,比如可以让他们都为0
2.Keep changing θ 0 , θ 1 \theta_0,\theta_1 θ0,θ1 to reduce J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1),不断改变 θ 0 和 θ 1 \theta_0和\theta_1 θ0和θ1的值,使 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1)不断减小
3.Until we hopefully end up at a minimum.直到我们得到一个最小值或者局部最小值
梯度的概念:函数中某一点 ( x , y ) (x,y) (x,y)的梯度代表函数在该点变化最快的方向,对于有两个自变量 x , y x,y x,y的函数来说,梯度是一个二维向量。
在下面图中,我们从一个点开始,不断寻找所在点的梯度,并沿梯度方向移动一小段距离,最后会到达一个局部最小值;
然而如果我们选择另一个点开始算法,则有可能到达另一个不同的局部最小值。这是梯度下降算法的一个特点。
重复执行下面的式子,直到到达一个局部最小值
θ j : = θ j − α ∂ J ( θ 0 , θ 1 ) ∂ θ j ( j = 0 , 1 ) \theta_j := \theta_j - \alpha \frac{\partial J(\theta_0,\theta_1)}{\partial \theta_j}\qquad (j=0,1) θj:=θj−α∂θj∂J(θ0,θ1)(j=0,1)
其中 : = := :=表示赋值, α \alpha α是学习率(Learning Rate),它控制我们以多大的幅度更新参数 θ j \theta_j θj, α \alpha α越大,算法就会更快地到达局部最小值。
需要注意的是, θ 0 和 θ 1 \theta_0和\theta_1 θ0和θ1是同步更新的,正确的顺序:
t e m p 0 : = θ 0 − α ∂ J ( θ 0 , θ 1 ) ∂ θ 0 temp0 := \theta_0 - \alpha \frac{\partial J(\theta_0,\theta_1)}{\partial \theta_0} temp0:=θ0−α∂θ0∂J(θ0,θ1)
t e m p 1 : = θ 1 − α ∂ J ( θ 0 , θ 1 ) ∂ θ 1 temp1 := \theta_1 - \alpha \frac{\partial J(\theta_0,\theta_1)}{\partial \theta_1} temp1:=θ1−α∂θ1∂J(θ0,θ1)
θ 0 : = t e m p 0 \theta_0 := temp0 θ0:=temp0
θ 1 : = t e m p 1 \theta_1 := temp1 θ1:=temp1
错误的顺序:
t e m p 0 : = θ 0 − α ∂ J ( θ 0 , θ 1 ) ∂ θ 0 temp0 := \theta_0 - \alpha \frac{\partial J(\theta_0,\theta_1)}{\partial \theta_0} temp0:=θ0−α∂θ0∂J(θ0,θ1)
θ 0 : = t e m p 0 \theta_0 := temp0 θ0:=temp0
t e m p 1 : = θ 1 − α ∂ J ( θ 0 , θ 1 ) ∂ θ 1 temp1 := \theta_1 - \alpha \frac{\partial J(\theta_0,\theta_1)}{\partial \theta_1} temp1:=θ1−α∂θ1∂J(θ0,θ1)
θ 1 : = t e m p 1 \theta_1 := temp1 θ1:=temp1
错误的顺序在计算 t e m p 1 temp1 temp1时,已经更新了 θ 0 \theta_0 θ0, t e m p 1 temp1 temp1的值会产生微小的差别,此时的算法不再是梯度下降算法。
假设只有一个参数 θ 1 \theta_1 θ1的情形
考虑 α \alpha α大小问题, α \alpha α很小时,每次只移动一小步,最终到最小值收敛,算法结束,但是如果 α \alpha α很大,每次移动一大步,可能会越过最小值,最终不会收敛甚至会发散
考虑 θ 1 \theta_1 θ1位于局部最小值时的场景,此时导数为0, θ 1 \theta_1 θ1不再变化,这是为什么即使 α \alpha α是固定值,算法最终也能收敛到局部最小值的原因,在逐渐接近局部最小值的过程中,导数逐渐减小,每一步的步幅也会越来越小,所以不需要随着时间变化而改变 α \alpha α值,当然 α \alpha α太大是不行的
J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) 2 J(\theta_0,\theta_1) = \frac{1}{2m}\displaystyle\sum_{i=1}^{m}(h(x^{(i)})- y^{(i)})^2 J(θ0,θ1)=2m1i=1∑m(h(x(i))−y(i))2
= 1 2 m ∑ i = 1 m ( ( θ 0 + θ 1 x ( i ) ) − y ( i ) ) 2 \qquad\qquad= \frac{1}{2m}\displaystyle\sum_{i=1}^{m}((\theta_0 + \theta_1x^{(i)}) - y^{(i)})^2 =2m1i=1∑m((θ0+θ1x(i))−y(i))2
偏导数:
∂ J ( θ 0 , θ 1 ) ∂ θ 0 = 1 m ∑ i = 1 m ( ( θ 0 + θ 1 x ( i ) ) − y ( i ) ) \frac{\partial{J(\theta_0,\theta_1) }}{\partial \theta_0} = \frac{1}{m}\displaystyle\sum_{i=1}^{m}((\theta_0 + \theta_1x^{(i)}) - y^{(i)}) ∂θ0∂J(θ0,θ1)=m1i=1∑m((θ0+θ1x(i))−y(i))
∂ J ( θ 0 , θ 1 ) ∂ θ 1 = 1 m ∑ i = 1 m ( ( θ 0 + θ 1 x ( i ) ) − y ( i ) ) x ( i ) \frac{\partial{J(\theta_0,\theta_1) }}{\partial \theta_1} = \frac{1}{m}\displaystyle\sum_{i=1}^{m}((\theta_0 + \theta_1x^{(i)}) - y^{(i)}) x^{(i)} ∂θ1∂J(θ0,θ1)=m1i=1∑m((θ0+θ1x(i))−y(i))x(i)
每一步更新如下:
θ 0 : = θ 0 − α 1 m ∑ i = 1 m ( ( θ 0 + θ 1 x ( i ) ) − y ( i ) ) \theta_0 := \theta_0 - \alpha \frac{1}{m}\displaystyle\sum_{i=1}^{m}((\theta_0 + \theta_1x^{(i)}) - y^{(i)}) θ0:=θ0−αm1i=1∑m((θ0+θ1x(i))−y(i))
θ 1 : = θ 1 − α 1 m ∑ i = 1 m ( ( θ 0 + θ 1 x ( i ) ) − y ( i ) ) x ( i ) \theta_1 := \theta_1 - \alpha \frac{1}{m}\displaystyle\sum_{i=1}^{m}((\theta_0 + \theta_1x^{(i)}) - y^{(i)}) x^{(i)} θ1:=θ1−αm1i=1∑m((θ0+θ1x(i))−y(i))x(i)
对于线性回归, J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1)只有一个最小值,所以梯度下降算法最后收敛到这个最小值
这个梯度下降算法又叫“Batch”梯度下降算法,“Batch”意味着在每一步中都使用了所有的训练样本。
后面会讲到正规方程组方法(normal equations methods)求解最小值问题,它不需要多步骤梯度下降,但是梯度下降算法可以用于更大的数据集。