上一篇文章中,我介绍了损失函数的图像,以及什么是局部最优解和全局最优解,那么这篇文章就来讲解如何找到最优解,方法就是梯度下降法。
梯度下降法是一种比较古老的方法,但是对于入门机器学习而言,这是一个不能避开的话题。
什么是梯度下降法
还记得上一篇文章中的损失函数的二维图像吧
大家应该学过导数,没学过也没关系。狭义并且笼统的说,导数可以作为衡量函数图像下降或上升快慢的工具。比如在上面的图中,J(𝜃1) 其实是个二次函数,那么,以 x=1 为中心,越往两边的图像上升的越快,导数的绝对值也越来越大。沿 x 轴正方向,图像上升部分的导数为正,下降部分的导数为负。
由于我们的目标是找到图像中的最低点,那么就要使 𝜃 不断的靠近 𝜃=1 这个位置,一个办法就是让 𝜃 减去当前的导数值。比如,假如 𝜃=2,那么此时导数值大于 0,如果减去导数值,就会使 𝜃 减小,更靠近 𝜃=1 这个位置,假如 𝜃=0,那么此时导数值小于 0,如果减去导数值,就会使 𝜃 增大,同样更靠近 𝜃=1 这个位置。因此,只要一遍又一遍的让 𝜃 减去当前的导数值,最后让 𝜃 到达最优解(有可能是局部最优),这就是梯度下降法。
在下文中,我会用 梯度下降 来表示 𝜃 减去导数值这个过程。
需要注意的问题
上面提到,让 𝜃 不断的减去导数值是梯度下降法的思想,也许有人会疑惑,万一在靠近 𝜃=1 时,𝜃 在减去导数值后跳到了 𝜃=1 的另一边怎么办。这的确是个问题,所以这里要引入学习率的概念。
所谓学习率,其实就是导数值乘上的一个比较小的数,用来把导数值控制在一个比较小的范围,这样就可以避免在靠近最优解时 𝜃 的跨度过大的问题。
而且,在上面的图像中,越靠近 𝜃=1 的图像下降/上升的越缓慢,导数值也越小,这本身就有利于避免 𝜃 的跨度过大。
不过,学习率的大小很关键,如果过大,会导致 𝜃 在靠近最优解时直接跨过最优解,如果过小,会导致 𝜃 需要减去很多很多次导数值之后才达到最优解,消耗会比较大,所以如何设置学习率成为了一个需要注意的问题,下面这张图可以帮助大家理解。
公式表达
Machine Learning 绕不开用公式表达各种方法和思想,也只有用公式表达了,才能将公式转化为代码,毕竟 ML 是用来解决实际问题的。
我们将问题推广到一般的形式,即 𝜃 的数量不止一个,这时,在每次梯度下降的过程中,每个 𝜃 都要减去当前的导数值,而由于有很多 𝜃,这时的导数是对每个 𝜃 求偏导,所谓偏导,其实就是把除了当前 𝜃 外的其余所有变量都当作常数,再对当前 𝜃 求导。
举个例吧,假如有两个 𝜃 分别为 𝜃1,𝜃2,并且用 𝛼 表示学习率,那么在每次梯度下降中,就会有如下过程
其中
就代表求 𝜃0 的偏导,相当于把 J(𝜃0,𝜃1) 中的 𝜃1 当作常数,只求 𝜃0 的导数。
这里有一点需要注意,对 𝜃0,𝜃1 的梯度下降要同时进行,也就是说,当 𝜃0 完成梯度下降后,𝜃0 的值已经进行了更新,再对 𝜃1 进行梯度下降时,应该使用 𝜃0 更新前的值,而不是更新后的值,这样就保持了同步更新,至于为什么,大家可以自己上网找找,这不是这个教程的重点。
把这个式子推广到一般情况,就是如下形式:
小结
虽然这篇文章给出了梯度下降法的公式,但也许有人还不是很理解,下一篇文章中我会举一个具体的例子来帮助大家理解这个公式。
网友评论