机器学习:梯度下降算法
来源:互联网 发布:网上开店铺的软件 编辑:程序博客网 时间: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.其他问题
步长(学习率)的选择
当随着迭代次数增加损失函数值反而增加时,需要减小步长。如果步长过大,下降的幅度过大,会跳过极小值;过小则收敛的很慢。总之就是多试试了。。
- 机器学习-梯度下降算法
- 机器学习算法-梯度下降
- 机器学习:梯度下降算法
- 机器学习:梯度下降算法
- 【机器学习】(2):梯度下降算法
- 机器学习算法--梯度下降法
- 机器学习04-logistic梯度下降算法
- 机器学习—梯度下降算法
- 机器学习入门(5)--梯度下降算法
- 机器学习之梯度下降算法
- 机器学习算法之梯度下降法
- 机器学习——梯度下降算法
- 从零开始机器学习002-梯度下降算法
- 《机器学习》 梯度下降
- 《机器学习》 梯度下降
- 机器学习 ~~ 梯度下降
- 机器学习 梯度下降
- 机器学习----梯度下降
- c++ new 的相关
- UVA 10112
- 欢迎使用CSDN-markdown编辑器
- 工作笔记——jQuery的事件绑定
- android:TextView
- 机器学习:梯度下降算法
- 浅析Java类和数据结构中常用的方法
- UVA 539
- Git 出现的问题
- Java多线程--初始
- 【多媒体编解码】Openmax IL (二)Android多媒体编解码Component架构
- 关于spring mvc,spring data,spring,MongoDB整合框架的一些思考和常用注解
- 关于EasyUI与富文本编辑器结合使用的问题(kindueditor与uueditor)
- 漏洞挖掘