本文知识点:

  1. 什么是 mini-batch 梯度下降
  2. mini-batch 梯度下降具体算法
  3. 为什么需要 mini-batch 梯度下降
  4. batch, stochastic ,mini batch 梯度下降的比较
  5. 如何选择 mini batch 的参数 batch size 呢
  6. 在 TensorFlow 中应用举例

之前写过一篇文章:
如何选择优化器 optimizer

里面对 BGD,SGD,MBGD,Adagrad,Adadelta,RMSprop,Adam 进行了比较,
今天对其中的 mini-batch 梯度下降 作进一步详解。

1. 什么是 mini-batch 梯度下降

先来快速看一下 BGD,SGD,MBGD 的定义,
当每次是对整个训练集进行梯度下降的时候,就是 batch 梯度下降,
当每次只对一个样本进行梯度下降的时候,是 stochastic 梯度下降,
当每次处理样本的个数在上面二者之间,就是 mini batch 梯度下降。

我们知道 Batch 梯度下降的做法是,在对训练集执行梯度下降算法时,必须处理整个训练集,然后才能进行下一步梯度下降。

如果在处理完整个训练集之前,先让梯度下降法处理一部分数据,那么算法就会相对快一些。

也就是把整个大的训练集划分为若干个小的训练集,被称为 mini batch。

例如 500 万的训练集,划分为每个子集中只有 1000 个样本,那么一共会有 5000 个这样的子集。同样的,对 y 也做相应的划分:

(注:上角标用大括号表示为第几个子集,小括号为第几个样本,中括号为神经网络的第几层。)

这时候,每一次对每个子集进行整体梯度下降,也就是对 1000 个样本进行整体梯度下降,而不是同时处理 500万 个 x 和 y。相应的这个循环要执行 5000 次,因为一共有 5000 个这样的子集。


2. mini-batch 梯度下降具体算法

t 代表第几个子集,从 1 到 5000,因为划分后,一共有 5000 个子集,

1. 对每个子集,先进行前向计算,从第一层网络到最后一层输出层

因为 batch 梯度下降是对整个数据集进行处理,所以不需要角标,而 mini batch 这里需要对 x 加上角标,代表的是第几个子集。

2. 接下来计算当前子集的损失函数,因为子集中一共有 1000 个样本,所以这里要除以 1000。损失函数也是有上角标,和第几个子集相对应。

3. 然后进行反向传播,计算损失函数 J 的梯度。

4. 最后更新参数。

将 5000 个子集都计算完时,就是进行了一个 epoch 处理 ,一个 epoch 意思是遍历整个数据集,即 5000 个子数据集一次,也就是做了 5000 个梯度下降,
如果需要做多次遍历,就需要对 epoch 进行循环。当数据集很大的时候,这个方法是经常被使用的。


3. 为什么需要 mini-batch 梯度下降

当数据集很大时,训练算法是非常慢的,

和 batch 梯度下降相比,使用 mini batch 梯度下降更新参数更快,有利于更鲁棒地收敛,避免局部最优。
和 stochastic 梯度下降相比,使用 mini batch 梯度下降的计算效率更高,可以帮助快速训练模型。


4. 进一步看 batch, stochastic ,mini batch 梯度下降的比较

让我们来看一下 cost 函数随着训练的变化情况:

在 batch 梯度下降中,单次迭代的成本是会下降的,如果在某次迭代中成本增加了,那就是有问题了。

在 mini batch 梯度下降中,并不是每一批的成本都是下降的,
因为每次迭代都是在训练不同的子集,所以展示在图像上就是,整体走势是下降的,但是会有更多的噪音
噪音的原因是,如果是比较容易计算的子集,需要的成本就会低一些,遇到难算的子集,成本就要高一些。

我们知道图中中间那个点就是想要达到的最优的情况:

蓝色:为 batch 梯度下降,即 mini batch size = m,
紫色:为 stochastic 梯度下降,即 mini batch size = 1,
绿色:为 mini batch 梯度下降,即 1 < mini batch size < m。

  1. Batch gradient descent ,噪音少一些,幅度大一些

BGD 的缺点是,每次对整个训练集进行处理,那么数量级很大的时候耗费时间就会比较长。

  1. Stochastic gradient descent ,因为每次只对一个样本进行梯度下降,所以大部分时候是向着最小值靠近的,但也有一些是离最小值越来越远,因为那些样本恰好指向相反的方向。所以看起来会有很多噪音,但整体趋势是向最小值逼近

但 SGD 永远不会收敛,它只会在最小值附近不断的波动,不会到达也不会在此停留。

SGD 的噪音,可以通过调节学习率来改善,但是它有一个很大的缺点,就是不能通过进行向量化来进行加速,因为每次都只是对一个样本进行处理。

  1. Mini Batch gradient descent 的每个子集的大小正好位于两种极端情况的中间。

那就有两个好处,一个是可以进行向量化。另一个是不用等待整个训练集训练完就可以进行后续的工作。

MBGD 的成本函数的变化,不会一直朝着最小值的方向前进,但和 SGD 相比,会更持续地靠近最小值


5. 如何选择 mini batch 的参数 batch size 呢?

不难看出 Mini Batch gradient descent 的 batch 大小,也是一个影响着算法效率的参数。

如果训练集较小,一般 小于2000 的,就直接使用 Batch gradient descent
一般 Mini Batch gradient descent 的大小在 64 到 512 之间,选择 2 的 n 次幂会运行得相对快一些

注意这个值设为 2 的 n 次幂,是为了符合cpu gpu的内存要求,如果不符合的话,不管用什么算法表现都会很糟糕。


6. 在 TensorFlow 中应用举例

下面这个例子是对 fetch_california_housing 数据集 用一个简单的线性回归预测房价,在过程中用到了 mini batch 梯度下降:

损失用 MSE,对每个子集 X_batch, y_batch 应用 optimizer = tf.train.GradientDescentOptimizer

详细注释见代码内:

# fetch_california_housing 数据集包含9个变量的20640个观测值,
# 目标变量为平均房屋价,
# 特征包括:平均收入、房屋平均年龄、平均房间、平均卧室、人口、平均占用、纬度和经度。import numpy as np
import tensorflow as tf
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScalerhousing = fetch_california_housing()       #获取房价数据
m, n = housing.data.shape                 # 获得数据维度,矩阵的行列长度scalar = StandardScaler()                  #将特征进行标准归一化
scaled_housing_data = scalar.fit_transform( housing.data )
scaled_housing_data_plus_bias = np.c_[ np.ones( (m, 1) ), scaled_housing_data ]        # np.c_是连接的含义,加了一个全为1的列learning_rate = 0.01#  X 和 y 为 placeholder,为后面将要传进来的数据占位
X = tf.placeholder( tf.float32, shape = (None, n + 1), name="X" )       # None 就是没有限制,可以任意长
y = tf.placeholder( tf.float32, shape = (None, 1), name="y" )# 随机生成 theta,形状为 (n+1, n),元素在 [-1.0, 1.0) 之间
theta = tf.Variable( tf.random_uniform( [n + 1, 1], -1.0, 1.0, seed = 42 ), name="theta" )    # 线性回归模型
y_pred = tf.matmul( X, theta, name="predictions" )# 损失用 MSE
error = y_pred - y
mse = tf.reduce_mean( tf.square(error), name="mse" )optimizer = tf.train.GradientDescentOptimizer( learning_rate = learning_rate )
training_op = optimizer.minimize( mse )# 初始化所有变量
init = tf.global_variables_initializer()n_epochs = 10# 每一批内样本数设为 100
batch_size = 100
n_batches = int( np.ceil( m / batch_size ) )           # 总样本数除以每一批的样本数,得到批的个数,要得到比它大的最近的整数# 从整批中获取数据
def fetch_batch( epoch, batch_index, batch_size ):np.random.seed( epoch * n_batches + batch_index )               # 用于 randin,每次可以得到不同的整数 indices = np.random.randint( m, size = batch_size )                  # 设置随机索引,最大值为mX_batch = scaled_housing_data_plus_bias[ indices ]                 # 使用索引从整批中获取数据y_batch = housing.target.reshape( -1, 1 )[ indices ] return X_batch, y_batchwith tf.Session() as sess:sess.run(init)for epoch in range( n_epochs ):for batch_index in range( n_batches ):X_batch, y_batch = fetch_batch( epoch, batch_index, batch_size )sess.run( training_op, feed_dict = {X: X_batch, y: y_batch} )              # 使用 feed_dict 将值从 placeholder 传递给 训练操作best_theta = theta.eval()                                                             # 当相应的MSE小于之前的MSE时,theta将获得新值print("Best theta:\n", best_theta)

学习资料:
http://cs230.stanford.edu/syllabus.html

推荐阅读
历史技术博文链接汇总
也许可以找到你想要的:
[入门问题][TensorFlow][深度学习][强化学习][神经网络][机器学习][自然语言处理][聊天机器人]

为什么需要 Mini-batch 梯度下降,及 TensorFlow 应用举例相关推荐

  1. Mini-batch 梯度下降 与Tensorflow中的应用

    mini-batch在深度学习中训练神经网络时经常用到,这是一种梯度下降方法,可以很快的降低cost,接下来系统介绍一下. 1. 什么是 mini-batch梯度下降 先来快速看一下BGD,SGD,M ...

  2. Mini batch梯度下降法(吴恩达深度学习视频笔记)

    深度学习并没有在大数据中表现很好,但是我们可以利用一个巨大的数据集来训练神经网络,而在巨大的数据集基础上进行训练速度很慢,因此进行优化算法能够很大程度地增加训练速度,提升效率. 本节,我们将谈谈Min ...

  3. 梯度下降算法_批梯度下降法,Minibatch梯度下降法和随机梯度下降法之间的区别...

    什么是梯度下降法? 梯度下降法是一种机器学习中常用的优化算法,用来找到一个函数(f)的参数(系数)的值,使成本函数(cost)最小. 当参数不能解析计算时(如使用线性代数),并且必须通过优化算法搜索时 ...

  4. 神经网络之Mini-Batch梯度下降

    传统的梯度下降算法,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度.这种梯度下降法叫做这称为Batch gradient descent(BDG).我们知道 Batch 梯度下降的 ...

  5. 深度学习中的梯度下降优化算法综述

    1 简介 梯度下降算法是最常用的神经网络优化算法.常见的深度学习库也都包含了多种算法进行梯度下降的优化.但是,一般情况下,大家都是把梯度下降系列算法当作是一个用于进行优化的黑盒子,不了解它们的优势和劣 ...

  6. 深度学习必备:随机梯度下降(SGD)优化算法及可视化

    补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...

  7. 深度学习系列之随机梯度下降(SGD)优化算法及可视化

    补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...

  8. Mini-Batch 梯度下降

    这篇文章简要介绍什么是 mini-batch 梯度下降算法及其特点 在训练网络时,如果训练数据非常庞大,那么把所有训练数据都输入一次神经网络需要非常长的时间,另外,这些数据可能根本无法一次性装入内存. ...

  9. 2.2 理解 Mini-batch 梯度下降-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.1 Mini-batch 梯度下降 回到目录 2.3 指数加权平均 理解 Mini-batch 梯度下降 (Understanding Mini-batch Gradie ...

最新文章

  1. 如何使用Java获取当前日期/时间
  2. spoon kettle连接数据库失败解决方法
  3. Codis集群的搭建与使用
  4. 《美团点评》编程题---有一个二维数组(n*n),写程序实现从右上角到左下角沿主对角线方向打印
  5. 网络协议入门(OSI七层和TCP/IC四层协议)
  6. 让钱生钱!商人赚钱的6条方法
  7. 大数据学习——Hadoop第一天
  8. linux命令(一)查看进程的线程数top,ps
  9. Win7下使用VFW库连接摄像头
  10. numpy中的数组复制
  11. Java Lambda 表达式
  12. 华为虚拟专网客户端SecoClient报错“接受返回码超时”故障
  13. Windows7电脑启动时提示文件winload.exe无法验证其数字签名,错误代码0xc0000428的解决方法
  14. php怎么用origin打开,[转载]origin 使用技巧 (4)
  15. TFT-LCD与FSMC控制器
  16. admin5-用户管理
  17. R语言基础题及答案(二)——R语言与统计分析第二章课后习题(汤银才)
  18. 统计学习方法——最小二乘法及其具体实现
  19. 核苷酸(evolution)
  20. Linux基本操作知识一

热门文章

  1. 为苏州企业解读高新技术企业八大申报模块
  2. 关于MySQL的二次安装问题
  3. MATLAB生成exe脱离matlab运行可执行程序
  4. PUSHmall推贴S2B2B2C模式-共享电商营销平台正式版
  5. [ Linux ] 格式化硬盘出现/dev/sdb is apparently in use by the system
  6. 数据可视化查看2021全国各省份的GDP
  7. 陪玩MM谁是你的NO.1?Python获取陪玩MM照片颜值检测打分
  8. GOOGLE地图基站定位-Google Mobile Maps API
  9. Android下拉列表怎么做?(小白速成7)
  10. zynq开发中的设备树