梯度下降法(代码片段)

木屐呀 木屐呀     2022-12-23     591

关键词:

在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练。其实,常用的梯度下降法还具体包含有三种不同的形式,它们也各自有着不同的优缺点。

下面我们以线性回归算法来对三种梯度下降法进行比较。

一般线性回归函数的假设函数为:

 

 对应的代价函数为:

 

 下图作为一个二维参数([公式][公式])组对应能量函数的可视化图:

 

 下面我们来分别讲解三种梯度下降法

批量梯度下降法BGD

我们的目的是要代价函数尽可能的小,即求解weights使误差函数尽可能小。首先,我们随机初始化weigths,然后不断反复的更新weights使得代价函数减小,直到满足要求时停止。这里更新算法我们选择梯度下降算法,利用初始化的weights并且反复更新weights:

 

 这里[公式]代表学习率,表示每次向着J最陡峭的方向迈步的大小。为了更新weights,我们需要求出函数J的偏导数。首先当我们只有一个数据点(x,y)的时候,J的偏导数是:

 

 则对所有数据点,上述损失函数的偏导(累和)为:

 

再最小化代价函数的过程中,需要不断反复的更新weights使得误差函数减小,更新过程如下:

那么好了,每次参数更新的伪代码如下(\\alpha暂时被省略了):

 

 由上图更新公式我们就可以看到,我们每一次的参数更新都用到了所有的训练数据(比如有m个,就用到了m个),如果训练数据非常多的话,是非常耗时的

下面给出批梯度下降的收敛图:

 

 从图中,我们可以得到BGD迭代的次数相对较少。

随机梯度下降法SGD

由于批梯度下降每跟新一个参数的时候,要用到所有的样本数,所以训练速度会随着样本数量的增加而变得非常缓慢。随机梯度下降正是为了解决这个办法而提出的。它是利用每个样本的损失函数对θ求偏导得到对应的梯度,来更新θ(\\alpha暂时被省略了):

 

 更新过程如下:

 

 随机梯度下降是通过每个样本来迭代更新一次,对比上面的批量梯度下降,迭代一次需要用到所有训练样本(往往如今真实问题训练数据都是非常巨大),一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向

随机梯度下降收敛图如下:

 

 我们可以从图中看出SGD迭代的次数较多,在解空间的搜索过程看起来很盲目。但是大体上是往着最优值方向移动。

min-batch 小批量梯度下降法MBGD

我们从上面两种梯度下降法可以看出,其各自均有优缺点,那么能不能在两种方法的性能之间取得一个折衷呢?即,算法的训练过程比较快,而且也要保证最终参数训练的准确率,而这正是小批量梯度下降法(Mini-batch Gradient Descent,简称MBGD)的初衷。

我们假设每次更新参数的时候用到的样本数为10个(不同的任务完全不同,这里举一个例子而已)

更新伪代码如下:

 

 实现代码

BSD

 1 import numpy as np
 2 
 3 def batch_gradient_descent(X, y, alpha, theta, iteration):
 4     m = X.shape[0]
 5     ## X_train = X.transpose() # 转置
 6     
 7     for i in range(iteration):
 8         h = np.dot(X_train, theta)
 9         loss = h - y
10         gradient = np.dot(X_train.T, loss) / m
11         theta = theta - alpha * gradient
12     
13     return theta

SGD

 1 import numpy as np
 2 
 3 def stochastic_gradient_descent(X, y, alpha, theta, iteration):
 4     m = X.shape[0]
 5     np.random.shuffle(X) # 打乱样本顺序
 6     
 7     for _ in range(iteration): # 外层迭代次数
 8         for j in range(m): # 遍历样本
 9             h = np.dot(X[j], theta)
10             loss = h - y
11             gradient = np.dot(X[j], loss)
12             theta = theta - alpha * gradient
13     
14             return theta

总结

1.批梯度下降每次更新使用了所有的训练数据,最小化损失函数,优点是易得到全局最优解,易于并行实现;缺点是如果样本值很大的话,更新速度会很慢。

2.随机梯度下降在每次更新的时候,只考虑了一个样本点,这样会大大加快训练数据,但是这样造成噪声点较多,那么每一次利用噪声点进行更新的过程中,就不一定是朝着极小值方向更新,但是由于更新多轮,整体方向还是大致朝着极小值方向更新。

3.小批量梯度下降法是为了解决批梯度下降法的训练速度慢,以及随机梯度下降法的准确性综合而来,不同问题的batch是不一样的。

参考:

https://zhuanlan.zhihu.com/p/25765735、

https://www.cnblogs.com/maybe2030/p/5089753.html#_label0

机器学习:随机梯度下降法(线性回归中的应用)(代码片段)

一、随机梯度下降法基础 #梯度中的每一项计算:,要计算所有样本(共m个); #批量梯度下降法的思路:计算损失函数的梯度,找到优化损失函数的最近距离,或者称最直接的方向;  #批量梯度下降法的梯度计算:... 查看详情

sparkmlib:梯度下降算法实现(代码片段)

声明:本文参考《 大数据:Sparkmlib(三)GradientDescent梯度下降算法之Spark实现》1.什么是梯度下降?梯度下降法(英语:Gradientdescent)是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找到一个函数的局部极小... 查看详情

一元线性回归-梯度下降法-房价预测(代码片段)

数据32.502345269453031,31.7070058465699253.426804033275019,68.7775959816389161.530358025636438,62.56238229794580347.475639634786098,71.54663223356777759.813207869512318,87.23092513368739355.142188413943 查看详情

梯度下降法及其python实现(代码片段)

梯度下降法(gradientdescent),又名最速下降法(steepestdescent)是求解无约束最优化问题最常用的方法,它是一种迭代方法,每一步主要的操作是求解目标函数的梯度向量,将当前位置的负梯度方向... 查看详情

02_有监督学习--简单线性回归模型(梯度下降法代码实现)(代码片段)

有监督学习--简单线性回归模型(梯度下降法代码实现)0.引入依赖1.导入数据(data.csv)2.定义损失函数3.定义模型的超参数4.定义核心梯度下降模型函数5.测试:运行梯度下降算法,计算最优的w和b6.画出拟合曲线7.附录-测试数据... 查看详情

随机梯度下降法实例(代码片段)

...参数收敛缓慢。在训练过程中,参数的更新向着损失函数梯度下降的方向。参数的更新公式为:????+??=????−????????????????_??????????假设损失函数为loss=(w+1)2。梯度是损失函数loss的导数为&nabl 查看详情

梯度下降法求解线性回归(代码片段)

梯度下降法梯度下降法(英语:Gradientdescent)是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭... 查看详情

(梯度下降法)作业(代码片段)

第三题程序和结果:importnumpyasnpfromsympyimport*importmathimportmatplotlib.pyplotasplt#定义符号x1,x2,t=symbols('x1,x2,t')#sympy符号数学相当于代数式deffunc():#自定义一个函数return0.5*pow(x1,2)+pow(x2,2)defgr 查看详情

优化算法—梯度下降(代码片段)

转自:https://www.cnblogs.com/shixiangwan/p/7532858.html梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法。本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法... 查看详情

lr梯度下降法mse演练(代码片段)

...一波网上代码搬砖,先来个入门的线性回归模型训练,基于梯度下降法来,优化用MSE来做.理论部分就不讲了,网上一大堆,我自己也是理解好多年了,什么偏导数,梯度(多远函数一阶偏导数组成的向量),方向导数,反方向(梯度下降)这些基... 查看详情

机器学习梯度下降法应用波士顿房价预测(代码片段)

...2.2案例分析2.3回归性能评估2.4代码实现2.4.1正规方程2.4.2梯度下降法2.5小结1线性回归api介绍机器学习梯度下降算法:https://blog.csdn.net/ZGL_cyy/article/details/127037949sklearn.linear_model.LinearRegression(f 查看详情

07_lfm--梯度下降法--实现基于模型的协同过滤(代码片段)

LFM--梯度下降法--实现基于模型的协同过滤0.引入依赖1.数据准备2.算法的实现3.测试LFM--梯度下降法--实现基于模型的协同过滤0.引入依赖import numpy as np # 数值计算、矩阵运算、向量运算import pandas as pd&... 查看详情

无约束优化算法-第二节:梯度类算法(代码片段)

文章目录一:梯度下降法(1)梯度下降法概述(2)梯度下降法求解步骤(3)Python实现(4)常见梯度下降算法A:全梯度下降算法(FGD)B:随机梯度下降算法(SGD)C:... 查看详情

pytorch常用优化器总结(包括warmup介绍及代码实现)(代码片段)

文章目录梯度下降法梯度下降GD随机梯度下降(SGD)小批量梯度下降法(MBGD)动量优化SGD+MomentumNAGpytorch中SGD:自适应学习率AdaGradAdadeltaRMSPropAdamwarmup优化算法大致分为:梯度下降法,动量优化法,自适应学... 查看详情

pytorch常用优化器总结(包括warmup介绍及代码实现)(代码片段)

文章目录梯度下降法梯度下降GD随机梯度下降(SGD)小批量梯度下降法(MBGD)动量优化SGD+MomentumNAGpytorch中SGD:自适应学习率AdaGradAdadeltaRMSPropAdamwarmup优化算法大致分为:梯度下降法,动量优化法,自适应学... 查看详情

2018.08.28ali梯度下降法实现最小二乘(代码片段)

-要理解梯度下降和牛顿迭代法的区别#include<stdio.h>//1.线性多维函数原型是y=f(x1,x2,x3)=a*x1+b*x2+c*x3////2.用牛顿迭代法(或者梯度下降)对f(x1,x2,x3)做求解。//即找到一组[a,b,c],使得:argMinE[(f(x1,x2,x3)-y)^2]。其中E为sigma。这个lossfunc就... 查看详情

最速梯度下降法及matlab实践(代码片段)

最速梯度下降法及matlab实践写在前面梯度下降法属于最优化理论与算法中的研究内容,本文介绍了利用MATLAB实现最速梯度下降法过程中的容易出错的几点,并附上实验代码和运行结果。为了保持简单,和避免重复劳动... 查看详情

最速梯度下降法及matlab实践(代码片段)

最速梯度下降法及matlab实践写在前面梯度下降法属于最优化理论与算法中的研究内容,本文介绍了利用MATLAB实现最速梯度下降法过程中的容易出错的几点,并附上实验代码和运行结果。为了保持简单,和避免重复劳动... 查看详情