梯度下降算法简介

梯度下降法本质是一种求极小值的方法,对于凸函数可求出函数的最小值。梯度下降算法是当前机器学习优化算法的根本,几乎所有的优化算法都建立梯度下降算法的基础上,因此理解梯度下降算法非常重要。之后我们详细介绍梯度下降在机器学习中的应用。

例子

先来看一个求函数极小值的问题,函数的表达式为:

f(x) = x^3 – 6x^2 + 2x + 5, x\in [-5, 10]

对于高次函数很显然我们采用求导的方法

f'(x) = 3x^2 -12x+2 = 0

我们很容易得到两个极值点

x_1 = \frac{12+2\sqrt{30}}{6} =3.825741858350554
x_2 = \frac{12-2\sqrt{30}}{6} = 0.17425814164944628

通过导数的分析方法得出x_1为极小值,x_2位极大值点。接下来我们通过梯度下降法求解这个极小值点x_1.

梯度下降法

梯度下降法也是基于求导

x_{n+1} = x_n – \gamma \frac{\mathrm df}{\mathrm dx} |_{x=x_n}

其中\gamma为步长,在机器学习中称为学习率。梯度下降作为一种迭代算法,需要指定迭代初始值x_0,迭代的终止条件为:

|x_{n+1} – x_n| < \epsilon

这个终止条件可作为while循环的条件,于是得出程序:

import numpy as np

def compute(x0):
    alpha = 0.01
    df = lambda x: 3 * x**2 - 12 * x + 2
    x1 = x0 - alpha * df(x0)
    while np.abs(x0 - x1) > 1e-8:
        x0 = x1
        x1 = x0 - alpha * df(x0)
    return x1

画出函数图像的代码:

import numpy as np
import matplotlib.pyplot as plt

f = lambda x: x**3 -  6* x**2 + 2 * x + 5
x = np.linspace(-5, 10, 100)
y = f(x)
plt.plot(x, y)

初始值x_0是非常重要的,如果x_0大于x_2则可以根据梯度下降法得出极小值点,如果小于x_2,函数在这个区间不存在极小值,迭代会超出计算机内存,导致无法计算结果。

下面给出几个计算结果:

>>>compute(6)
3.8257419384334606
>>>compute(10)
3.8257419373804
>>>compute(2)
3.8257417808086083
>>>compute(0.2)
3.825741781378174
>>>compute(0.1)
OverflowError                             Traceback (most recent call last)
<ipython-input-70-8e1fcf499c97> in <module>()
----> 1 compute(0.1)

<ipython-input-59-17b3a1a35660> in compute(x0)
      5     while np.abs(x0 - x1) > 1e-5:
      6         x0 = x1
----> 7         x1 = x0 - alpha * df(x0)
      8     return x1

<ipython-input-59-17b3a1a35660> in <lambda>(x)
      1 def compute(x0):
      2     alpha = 0.01
----> 3     df = lambda x: 3 * x**2 - 12 * x + 2
      4     x1 = x0 - alpha * df(x0)
      5     while np.abs(x0 - x1) > 1e-5:

OverflowError: (34, 'Result too large')

小节

梯度下降算法作为机器学习优化算法的基石,深入理解算法非常重要。在机器学习中梯度算法的难点,往往在于对误差函数求导数,应用链式法则。如果要求解极大值点,对应的就是梯度上升,也就是把减号变成加号,对于有兴趣的小朋友可以自行尝试。

关注机器学习和算法的码农,喜欢编程和读书
文章已创建 66

发表评论

电子邮件地址不会被公开。

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部