先得学会前一篇文章的代价函数,再来理解梯度下降。
我们要求出代价函数中 J(θ0,θ1) 为最小值时的θ0和θ1,梯度下降就是一种常见的求解方式。
操作:
- 初始化θ0,θ1
- 改变θ0,θ1使得J(θ0,θ1)取最小值或是局部最小值
用两个图解释一下为什么还有局部最小值的情况
两块红色的区域可以理解成山,梯度下降可以理解成就是为了下山。但是可能有两个地方能到达山底。
而梯度下降的流程
- 站在一个点
- 环绕四周,找到坡度最大方向
- 向那个方向走一段距离
- 到达下一个点
- 重复第一步
而第二个图可以看出我们选取的起始点相差很少,但是却可能得到不同的结果。
下面我们给出梯度下降算法:
反复执行 (for j = 1 and j = 0)
- α :学习速率(可以理解为下山的速度)
- : 导数项
值得注意的一点是这个梯度下降算法必须保证Simultaneous update(同步更新) 意思为:
而这种是错误的方式:
梯度下降函数解析
我们把函数改写:(我们用一个θ来表示)
这种写法和我们前面的写法是一样的,不过后面的式子表达的是导数,所以我们在数学中用d来表示。
这个图就是上面的函数的一个状态,斜率是为正的,所以我们θ1减去一个正数应该左移。就会越来越接近底部。反之同理。
现在我们来讨论一下α的过大或过小
α过小
我们之前说过α是梯度下降的速率,如果过小的话,会下降的非常慢。
α过大
可能会越过最低点,无法收敛,甚至发散。
为什么会导致发散呢?
原因:有可能α过大到跑到比低点到原点的距离还远的距离,就会发现斜率变大了,整个速率又变大了,就会离最低点越来越远。
现在我们讨论一个特殊情况,如果刚开始的时候θ就在局部最低点它会怎么移动呢?
答案是不动,因为在局部最低点的时候斜率为0,不管你下降速率多大他们的乘积还是0,所以是不会变的。
现在我们讨论一下斜率
用上面图的例子,我从一个位置梯度下降到另一个位置,他的斜率是不是稍微缓和了一下。因为下降速率是固定值,所以下降的就会越来越慢。