快捷搜索:  汽车  科技

机器学习杂谈之梯度下降算法(机器学习基础算法)

机器学习杂谈之梯度下降算法(机器学习基础算法)学习率=0.5import numpy as np import matplotlib.pyplot as plt # 目标函数:y=x^2 def func(x): return np.square(x) # 目标函数一阶导数也即是偏导数:dy/dx=2*x def dfunc(x): return 2 * x # Gradient Descent def GD(x_start df epochs lr): """ 梯度下降法。给定起始点与目标函数的一阶导函数,求在epochs次迭代中x的更新值 :param x_start: x的起始点 :param df: 目标函数的一阶导函数 :param epochs: 迭代周期 :param lr: 学习率 :return: x在每次迭代后的位置(包括起始点),长度为epochs 1 """ xs = np.zero

梯度下降法的定义

已知多元函数 f(x1 x2 … xn) 在定义域上可微,如果将f(x)在x处一阶泰勒展开(tayler expansion) 可得到:(说明:为了编辑方便下文中统一以 x=[x1 x2 … xn]T 代替 x )。

f(x ϵ)=f(x) ϵT∇xf O(||ϵ||)≈f(x) ϵT∇xf

其中∇xf=[∂f∂x1 … ∂f∂xn]T为 f在x处的梯度向量。

这个式子我们可以解读为当 x增加 ϵ时,f(x)增加ϵT∇xf,即ϵ与梯度∇xf的內积。如果我们限定ϵ的模长为定值,其方向怎样才能获得f(x ϵ)的最小值呢?答案当然是与∇xf方向相反的时候,此时ϵT∇xf获得最小值。

梯度下降法的形象化理解

我们也可以利用直觉上较好理解的爬山的例子来解释梯度下降法。假设你位于山上某一点坐标为θ(θ1 θ2),那么在此处(注意,是在这一点)下山最快的方向当然是沿着此处的梯度方向。

机器学习杂谈之梯度下降算法(机器学习基础算法)(1)

沿梯度方向下山最快

代码演示

假设现在要求解目标函数func(x) = x ∗ x的极小值,由于func是一个凸函数,因此它唯一的极小值同时也是它的最小值,其一阶导函数为 dfunc(x) = 2 ∗ x

  • 代码如下:

import numpy as np import matplotlib.pyplot as plt # 目标函数:y=x^2 def func(x): return np.square(x) # 目标函数一阶导数也即是偏导数:dy/dx=2*x def dfunc(x): return 2 * x # Gradient Descent def GD(x_start df epochs lr): """ 梯度下降法。给定起始点与目标函数的一阶导函数,求在epochs次迭代中x的更新值 :param x_start: x的起始点 :param df: 目标函数的一阶导函数 :param epochs: 迭代周期 :param lr: 学习率 :return: x在每次迭代后的位置(包括起始点),长度为epochs 1 """ xs = np.zeros(epochs 1) x = x_start xs[0] = x for i in range(epochs): dx = df(x) # v表示x要改变的幅度 v = - dx * lr x = v xs[i 1] = x return xs def demo_GD(): # 演示如何使用梯度下降法GD() line_x = np.linspace(-5 5 100) line_y = func(line_x) x_start = -5 epochs = 10 lr = 0.1 # 学习率为0.1时 x = GD(x_start dfunc epochs lr=lr) color = 'r' plt.plot(line_x line_y c='b') plt.plot(x func(x) c=color label='lr={}'.format(lr)) plt.scatter(x func(x) c=color ) plt.legend() plt.show() demo_GD()

  • 运行结果如下:

机器学习杂谈之梯度下降算法(机器学习基础算法)(2)

学习率=0.1

  • 当学习率调整为0.5时,运行结果如下:

机器学习杂谈之梯度下降算法(机器学习基础算法)(3)

学习率=0.5

  • 当学习率调整为0.05时,运行结果如下:

机器学习杂谈之梯度下降算法(机器学习基础算法)(4)

学习率=0.05

梯度下降法之总结
  • 学习率的重要性
  • 时间复杂度低,在每一个迭代中,只需要计算梯度,不需要对二阶导数矩阵(即海森矩阵(Hessian Matrix))进行计算。
  • 空间复杂度低,因为梯度向量为一个n×1的向量,比起Hessian Matrix来,占用存储空间小n倍。在实际应用中,x的维度可能非常高。
  • 梯度下降法的劣势
  • 对于部分求解函数,梯度下降法可能会出现下降非常缓慢的情形。其收敛速度也较其他方法低(其他文献分析其收敛速度为线性,本文不作推导)。如下图,梯度下降法的路径出现了z字型。

机器学习杂谈之梯度下降算法(机器学习基础算法)(5)

Z字型的梯度下降法的路径

  • 究其原因,私以为某一点的梯度只能作为这一点的一个极小的领域处的最快下降方向,一旦梯度变化较快,梯度下降法会出现因为学习率不合适而出现”zigzag”现象。而且,一直沿着梯度方向下降的速度不一定是最快的。如下图:

机器学习杂谈之梯度下降算法(机器学习基础算法)(6)

沿梯度方向下降的速度不一定最快

猜您喜欢: