批量梯度下降(BGD)、随机梯度下降(SGD)、小批量随机梯度下降(MSGD)
来源:互联网 发布:java tcp服务器框架 编辑:程序博客网 时间:2024/06/06 03:27
梯度下降算法
一、学习背景:
本人在初学吴恩达机器学习视频中看到有关于梯度下降相关算法,查找相关资料整理如下:
研究过深度学习的人士可能对BGD、SGD、MSGD这几种训练方式并不陌生,在Caffe、Touch、TensorFlow等框架工具上,这些就是你用来训练网络所选的方式,你只需要用特定的参数设置就可以实现其对应的训练过程,可是对于其实现的详细方式却未必真正了解,笔者也曾对这几种训练方式有过困惑。现以简单例子展示梯度下降算法到底是个什么东西。学习之余,以作备份与记录。
二、问题的提出:
假设我们提供了这样的数据样本(样本值取自于y=3*x1+4*x2):
x1 x2 y
1 4 19
2 5 26
5 1 19
4 2 29
——1式
我们的目的就是要求出θ1和θ2的值,让h(θ)尽量逼近目标值y。
这是一个线性回归问题,若对线性回归有所了解的同学就知道:利用最小二乘法则和梯度下降法可以求出两个参数,而深度学习也同样可以利用这两种方法求得所有的网络参数,因此,在这里用这个数学模型来解释BGD、SGD、MSGD这几个概念。
三、先熟悉一下梯度下降法:
我们首先确定损失函数:
——2式
其中,J(θ)是损失函数,m代表每次取多少样本进行训练,如果采用SGD进行训练,那每次随机取一组样本,m=1;如果是批处理,则m等于每次抽取作为训练样本的数量。θ是参数,对应(1式)的θ1和θ2。求出了θ1和θ2,h(x)的表达式就出来了:
——3式
我们的目标是让损失函数J(θ)的值最小,根据梯度下降法,首先要用J(θ)对θ求偏导:
——4式
由于是要最小化损失函数(2式),所以参数θ按其负梯度方向来更新:
——5式
四、现在结合代码来说明(python):
BGD(Batch gradient descent)批量梯度下降法:每次迭代使用所有的样本
每次迭代都需要把所有样本都送入,这样的好处是每次迭代都顾及了全部的样本,做的是全局最优化。
#-*- coding: utf-8 -*-import random#用y = Θ1*x1 + Θ2*x2来拟合下面的输入和输出#input1 1 2 5 4#input2 4 5 1 2#output 19 26 19 20input_x = [[1,4], [2,5], [5,1], [4,2]] #输入y = [19,26,19,20] #输出theta = [1,1] #θ参数初始化loss = 10 #loss先定义一个数,为了进入循环迭代step_size = 0.01 #步长eps =0.0001 #精度要求max_iters = 10000 #最大迭代次数error =0 #损失值iter_count = 0 #当前迭代次数err1=[0,0,0,0] #求Θ1梯度的中间变量1err2=[0,0,0,0] #求Θ2梯度的中间变量2while( loss > eps and iter_count < max_iters): #迭代条件 loss = 0 err1sum = 0 err2sum = 0 for i in range (4): #每次迭代所有的样本都进行训练 pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1] #预测值 err1[i]=(pred_y-y[i])*input_x[i][0] err1sum=err1sum+err1[i] err2[i]=(pred_y-y[i])*input_x[i][1] err2sum=err2sum+err2[i] theta[0] = theta[0] - step_size * err1sum/4 #对应5式 theta[1] = theta[1] - step_size * err2sum/4 #对应5式 for i in range (4): pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1] #预测值 error = (1/(2*4))*(pred_y - y[i])**2 #损失值 loss = loss + error #总损失值 iter_count += 1 print ("iters_count", iter_count)print ('theta: ',theta )print ('final loss: ', loss)print ('iters: ', iter_count)
执行结果:
这里我们只有4个样本,所以训练的时间不长。但是,如果面对数量巨大的样本量(如40万个),采取这种训练方式,所耗费的时间会非常长。
SGD(Stochastic gradientdescent)随机梯度下降法:每次迭代使用一组样本
针对BGD算法训练速度过慢的缺点,提出了SGD算法,普通的BGD算法是每次迭代把所有样本都过一遍,每训练一组样本就把梯度更新一次。而SGD算法是从样本中随机抽出一组,训练后按梯度更新一次,然后再抽取一组,再更新一次,在样本量及其大的情况下,可能不用训练完所有的样本就可以获得一个损失值在可接受范围之内的模型了。
#-*- coding: utf-8 -*-import random#用y = Θ1*x1 + Θ2*x2来拟合下面的输入和输出#input1 1 2 5 4#input2 4 5 1 2#output 19 26 19 20input_x = [[1,4], [2,5], [5,1], [4,2]] #输入y = [19,26,19,20] #输出theta = [1,1] #θ参数初始化loss = 10 #loss先定义一个数,为了进入循环迭代step_size = 0.01 #步长eps =0.0001 #精度要求max_iters = 10000 #最大迭代次数error =0 #损失值iter_count = 0 #当前迭代次数while( loss > eps and iter_count < max_iters): #迭代条件 loss = 0 i = random.randint(0,3) #每次迭代在input_x中随机选取一组样本进行权重的更新 pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1] #预测值 theta[0] = theta[0] - step_size * (pred_y - y[i]) * input_x[i][0] theta[1] = theta[1] - step_size * (pred_y - y[i]) * input_x[i][1] for i in range (3): pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1] #预测值 error = 0.5*(pred_y - y[i])**2 loss = loss + error iter_count += 1 print ('iters_count', iter_count)print ('theta: ',theta )print ('final loss: ', loss)print ('iters: ', iter_count)
执行结果:
MBGD(Mini-batch gradient descent)小批量梯度下降:每次迭代使用b组样本
SGD相对来说要快很多,但是也有存在问题,由于单个样本的训练可能会带来很多噪声,使得SGD并不是每次迭代都向着整体最优化方向,因此在刚开始训练时可能收敛得很快,但是训练一段时间后就会变得很慢。在此基础上又提出了小批量梯度下降法,它是每次从样本中随机抽取一小批进行训练,而不是一组。
#-*- coding: utf-8 -*-import random#用y = Θ1*x1 + Θ2*x2来拟合下面的输入和输出#input1 1 2 5 4#input2 4 5 1 2#output 19 26 19 20input_x = [[1,4], [2,5], [5,1], [4,2]] #输入y = [19,26,19,20] #输出theta = [1,1] #θ参数初始化loss = 10 #loss先定义一个数,为了进入循环迭代step_size = 0.01 #步长eps =0.0001 #精度要求max_iters = 10000 #最大迭代次数error =0 #损失值iter_count = 0 #当前迭代次数while( loss > eps and iter_count < max_iters): #迭代条件 loss = 0 #这里每次批量选取的是2组样本进行更新,另一个点是随机点+1的相邻点 i = random.randint(0,3) #随机抽取一组样本 j = (i+1)%4 #抽取另一组样本,j=i+1 pred_y0 = theta[0]*input_x[i][0]+theta[1]*input_x[i][1] #预测值1 pred_y1 = theta[0]*input_x[j][0]+theta[1]*input_x[j][1] #预测值2 theta[0] = theta[0] - step_size * (1/2) * ((pred_y0 - y[i]) * input_x[i][0]+(pred_y1 - y[j]) * input_x[j][0]) #对应5式 theta[1] = theta[1] - step_size * (1/2) * ((pred_y0 - y[i]) * input_x[i][1]+(pred_y1 - y[j]) * input_x[j][1]) #对应5式 for i in range (3): pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1] #总预测值 error = (1/(2*2))*(pred_y - y[i])**2 #损失值 loss = loss + error #总损失值 iter_count += 1 print ('iters_count', iter_count)print ('theta: ',theta )print ('final loss: ', loss)print ('iters: ', iter_count)
执行结果:
参考资料:
批量梯度下降(BGD)、随机梯度下降(SGD)、小批量随机梯度下降(MSGD)实现过程详解:https://www.2cto.com/net/201610/557111.html
斯坦福大学公开课 :机器学习课程02_监督学习应用梯度下降: https://pan.baidu.com/s/1nuIyKEt 密码: aiaa
- 批量梯度下降(BGD)、随机梯度下降(SGD)、小批量随机梯度下降(MSGD)实现过程详解
- 批量梯度下降(BGD)、随机梯度下降(SGD)、小批量随机梯度下降(MSGD)实现过程详解
- 批量梯度下降(BGD)、随机梯度下降(SGD)、小批量随机梯度下降(MSGD)实现过程详解
- 批量梯度下降(BGD)、随机梯度下降(SGD)、小批量随机梯度下降(MSGD)
- 批量梯度下降BGD、随机梯度下降SGD、小批量随机梯度下降MSGD
- 批量梯度下降(BGD)、随机梯度下降(SGD)、小批量随机梯度下降(MSGD)的理解与实现
- 批量梯度下降法BGD,随机梯度下降法SGD
- 批量梯度下降算法BGD,小批量梯度下降法MBGD,随机梯度下降算法SGD的比较
- 梯度下降、随机梯度下降(SGD)、批量梯度下降(BGD)的对比
- 机器学习小组知识点5:随机梯度下降(SGD)以及与批量梯度下降(BGD)的比较
- 随机梯度下降(SGD)
- 随机梯度下降(SGD)
- 三种梯度下降的方式:批量梯度下降、小批量梯度下降、随机梯度下降
- 批处理梯度下降BGD与随机梯度下降SGD
- 随机梯度下降与批量梯度下降
- 随机梯度下降和批量梯度下降
- 批量梯度下降与随机梯度下降
- 随机梯度下降和批量梯度下降
- Python opencv 中文路径乱码解决方法
- Codeforces Problem 332A
- Ubuntu17.04查看本机IP
- 《DOS命令一日通》第一章 引论,DOS概述
- Hive修改表
- 批量梯度下降(BGD)、随机梯度下降(SGD)、小批量随机梯度下降(MSGD)
- Jetty在win10上的配置,IDEA中配置Jetty,Maven中配置Jetty插件,Eclipse中配置Jetty插件及其使用,通过java代码内嵌Jetty Server
- 【大数据】开发环境搭建(一):Linux安装以及配置环境Nat
- 面试时必须理解的spring要点
- 《多核程序设计》学习笔记:蒙特卡洛法串行与并行求解π值
- mount: no medium found on /dev/sr0
- nodejs在windows下的安装配置(使用NVM的方式)
- n维立方体独立数
- HDU 5972 Regular Number Bitset优化字符串匹配 +Shift-And算法