梯度下降法

来源:互联网 发布:js传值到html 编辑:程序博客网 时间:2024/06/03 05:11

梯度下降法是机器学习中的一个常用的优化算法,是入门机器学习的基础。因为其简单,可以快速的寻找最优解,在机器学习中比较常用。但是,梯度下降法也有致命的缺点,比如,对于非凸函数,很容易陷入局部最优解,而无法找到全局最优解。下文将全面介绍梯度下降法的原理、算法以及优缺点。

  1. 梯度定义
    梯度在数学上定义为在某点处的方向导数,是一个矢量,公式定义如下:
    这里写图片描述
    对于多元函数f(x1, x2, …, xn),梯度定义为某点处的偏导数组成的一个向量,公式如下:
    这里写图片描述
    例如,对于如下二次函数,我们可以求出它的导数,并求出它在x = 5处的切线方程,便可画出f(x)在5处的切线,而切线的斜率便是f(x)在x = 5处的梯度。

这里写图片描述
这里写图片描述
这里写图片描述
利用Python换出f(x)和切线方程,就可以形象的看到f(x)在x = 5处的梯度:

x = np.array(range(-15, 15))y = x ** 2 - 5 * x + 10z = 5 * x - 15plt.plot(x, y)plt.plot(x, z)

这里写图片描述

2.梯度下降法解释
在解释梯度下降法时,我们先回忆一下之前求函数的最大值最小值时做法,对于函数f(x)求导,得到f’(x), 令f’(x)=0,求出x1,则f(x)在x1处存在极值,若f(x)为凸函数,则f(x)在x1处存在最大或最小值。以上过程说明函数的极值在梯度等于0处,而对于凸函数,函数的最值在梯度等于0处。所以求解最优的问题就转化为求解梯度等于零的的问题。
如下图,f(x) = x ** 2 在x = 0处取得最小值,在 x = 0 左边,斜率小于零 ,只能在该点往右(梯度负方向)走一定距离;在 x = 0 右边,斜率大于零,只能在该点往左(梯度负方向)走一定距离。因此,求解最小值,需要在负梯度方向走一定距离。直到找到最优解。
这里写图片描述
一种比较直观比较直观的解释是,假设我们现在从山顶走到山脚下,由于我们不知道怎么走,只能一步一步往下走,每次都沿着当前位置的梯度的负方向走,因为该方向是当前位置最陡的,下降的最快。每走一步都要计算当前位置的梯度,然后选择下一步的方向,直到山脚下。当然也有可能走不到山脚,而是到了山峰的一个山坳处,这种情况就是所谓的陷入局部最优解,,而无法找到全局最优解。
这里写图片描述

3.梯度下降算法代码

将以上寻优步骤总结如下,即梯度下降法:
x = initialize()//初始化
for i in range(num_iterations)://迭代寻优
dx = grads(x)//求解梯度
x = x - learning_rate * dx//更新,其中learning_rate为步长

梯度下降法完整代码如下:

import numpy as npdef function(x):    return x ** 2def grads(x):    delta_x = 0.0001    return (function(x + delta_x) - function(x)) / delta_xdef initialize():    x = np.random.randn(1,1)    return 1def grad_decend(learning_rate, num_iterations):    x = initialize()    for i in range(num_iterations):        dx = grads(x)        x -= learning_rate * dx    return "x = " + str(x) + "y = " + str(function(x))
原创粉丝点击