机器学习:梯度下降算法

来源:互联网 发布:网上开店铺的软件 编辑:程序博客网 时间:2024/06/05 11:10

机器学习:梯度下降算法

我对梯度下降的学习基本是根据这两个博客:
机器学习算法入门之(一) 梯度下降法实现线性回归
梯度下降(Gradient Descent)小结
本文是我学习后的总结记录

1.背景

首先介绍一下损失函数(误差函数),损失函数可以评价模型的预测值Y^=f(X)与真实值Y的不一致程度,它是一个非负实值函数。通常使用L(Y,f(x))来表示(模型与数据差的平方和),损失函数越小,模型的性能就越好。而梯度下降算法就是一个用来寻找损失函数最小点的算法,虽然在实际中不会直接使用,但是它是很多算法的基础。

2.原理

首先回顾一下两个概念:

方向导数:方向导数的精确定义(以三元函数为例):设三元函数f在点P0(x0,y0,z0)的某邻域内有定义,l为从点P0出发的射线,P(x,y,z)为l上且含于邻域内的任一点,以ρ(rou)表示P和P0两点间的距离。若极限
lim( (f(P)-f(P0)) / ρ )= lim (△l f / ρ)(当ρ→0时)
存在,则称此极限为函数f在点P0沿方向l的方向导数。

梯度:函数在某点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,模等于方向导数的最大值。

也就是说,梯度的方向就是函数在当前点增长最快的方向,反方向就是下降最快的方向。

梯度下降算法就是利用了梯度的这个特性,首先计算损失函数(损失函数的变量是拟合函数的参数),然后求梯度方向,再沿反方向逐渐靠近(这里有一个学习率,这个学习率相当于步长),就能得到使损失函数最小化的参数值。另外结果一般是局部最优,单纯的梯度下降无法保证得到全局最优。

梯度方向计算
这里写图片描述
梯度的方向是一个向量,在实际使用时分别选取其中一维进行改变,只要不同维的学习率相同就行

3.实现(BGD,SGD,MBGD)

以一元线性回归为例:
误差函数:这里写图片描述

梯度方向:这里写图片描述

3.1 批量梯度下降(Batch Gradient Descent)

批量梯度下降是按照误差函数,每次迭代都使用所有样本,直到损失函数不再减小。

迭代公式:
这里写图片描述

一次迭代过程:

for i in range(0, len(points)):    x = points[i, 0]    y = points[i, 1]    m_gradient += (2 / N) * x * ((b_current + m_current * x) - y)    b_gradient += (2 / N) * ((b_current + m_current * x) - y)new_b = b_current - (learningRate * b_gradient)new_m = m_current - (learningRate * m_gradient)

其中learningRate是学习速率,它决定了逼近最低点的速率。如果learningRate太大,则可能导致我们不断地最低点附近来回震荡; 而learningRate太小,则会导致逼近的速度太慢

3.2 随机梯度下降(Stochastic Gradient Descent)

批量梯度下降是每次迭代都使用所有样本,迭代速度很慢。随机梯度下降是求每个样本的损失函数,对参数求偏导得到对应梯度,来更新参数。它每次迭代只使用一个样本。问题是噪声更多,并且不是每次都向着最优化方向。适用于大规模的问题。(批量梯度下降代价太大,通常随机梯度下降不需要迭代所有样本就获得了结果)

迭代公式:
这里写图片描述

3.3 小批量梯度下降法(Mini-batch Gradient Descent)

小批量梯度下降法算是上面两种的折中吧,从所有样本中选出一部分来迭代

4.其他问题

步长(学习率)的选择

当随着迭代次数增加损失函数值反而增加时,需要减小步长。如果步长过大,下降的幅度过大,会跳过极小值;过小则收敛的很慢。总之就是多试试了。。

原创粉丝点击