回顾
在上一篇博客中,我简单的介绍了下线性回归模型,但是关于其参数更新方法我想单独开一篇博文来讲,毕竟这也可以单独拿出来做一个课题的切入点了。好!废话不多说!开始我的表演!
1. 引言
每个学习模型都需要制定一个Cost function来描述预测与实际之间的误差,从而确定一个目标,即我们要不断的减小Cost function的值从而使模型能够更好的拟合训练数据。换言之,设定Cost function就是设定一个目标,来引导我们接下来的步骤。
在上一篇博客中,我们设定的Cost Function是,这里是假设带更新的参数只有两个,分别为
和
,
表示第i组数据的预测值,
表示第i组数据的实际值。J描述的就是预测与实际之间的误差。我们的目的就是不断的更新参数来使得J不断的减小,J越小就表示模型在训练集上的准确度越高。
2. 梯度下降算法(Gradient descend)
梯度下降算法,顾名思义就是将函数沿着梯度最大的方向下降。梯度的数学含义我在这里就不解释了,自行百度吧!
借用吴恩达机器学习课程的一张图来具体解释一下梯度下降的过程。
这张图就是上面我们提到的Cost function的一个例子,立体表现出来就是和
取不同值时
的对应值。
我们先看黑色这条线,每一次迭代,参数值都会更新从而使J的值变小,且每一次迭代都是沿着这个函数在该点的梯度最大的方向更新。一直迭代到收敛或者达到最大迭代次数。
另外要强调一点,梯度下降算法是达到局部最小值,其最后结果即参数的值与初始状态有关,我们来看红色和黑色两条线,它们的起点是不同的,所以更新方向也会不同,从而最后的结果也不同。所以梯度下降算法的结果与初始状态相关。
梯度下降算法的公式如下所示:
j=1, 2, 3, 4, ....
上式中是指学习率,代表每一次向下降时的步长,关于
的取值,下一节我还会介绍一下。
这里我还要强调一下,所有的都是同时更新的,而不是每更新一个参数之后就替代原来的参数,而是将所有的参数全部计算出更新后的值之后,再全部替换依次更新。这里以两个参数
为例分别介绍一下错误的步骤和正确的错误
错误的步骤:
这样的做法是错误的,因为如果我们在计算完temp0之后,就拿来替换,那么在计算temp1的时候,其所在的初始点就不是
了,而是
,这样两个参数更新的前提条件就不是一样的了,会导致最后沿着的不是梯度最大的方向了。
那么正确的步骤就该是
3. 学习率的选择
学习率确定了每次更新时梯度要下降多少。
选择太小的话那么每次更新的步长就会很小,导致训练时间过长。训练时间过长这个后果还算可以接受,但是如果
选择过大的话,就会导致模型发散不收敛,这个后果就比较难以接受了。而为什么
选择过大会导致模型发散呢,我拿一个图来简单的描述一下。
假设现在我们的起点是在红色这个点,如果此时选择过大的话,下一次更新就会到蓝色这个点,然后是绿色的,再然后分别是紫色的和黄色的这个点,以此类推下去最终导致模型发散。所以我们在选择
的值的时候要慎重。一般选择0.001即可。
4. 特征缩放(Feature scaling)
特征缩放是对数据的一种预处理,是针对输入数据不同维度相差太大导致梯度下降算法难以收敛的情况。所以此时就要进行特征缩放从而使不同维度的特征映射在同一个范围,一般是[-1,1]这个区间内。
有一种缩放方法叫做均值归一化法,其公式如下:
其中x是待缩放的值,是x的均值,s是x的所在的范围内的最大值和最小值之间的差。比如x所在范围是[a,b],那么s=b-a。
上式将x缩放到[-0.5,0.5]这个范围。
5. 正规方程(Normal equation)
梯度下降算法是一个迭代的过程,正规方程不是,它是直接理由一个方程就得到最后的结果,十分方便。其公式如下
上式所有的值都是矩阵形式,其中表示的所有待更新的参数组成的一个矩阵,x表示所有的特征组成的一个矩阵。y表示所有数据的真实值的一个矩阵。
6. 正规方程和梯度下降的对比
梯度下降:
- 需要选择
- 需要多次迭代
- 即使输入数据的维度和量很大也有很好的性能
正规方程
- 不需要选择
- 不需要多次迭代
- 当输入数据的维度和量很大的时候,就很耗时间,比如求一个10000*10000矩阵的逆矩阵。。。。。