前言我们在训练网络的时候经常会设置batch_size。这个batch_size有什么用?10000张图片的数据集应该设置多大?那么,将其设置为1、10、100或10000有什么区别?#手写数字识别网络训练方法network.fit(train_images,train_labels,epochs=5,batch_size=128)批量梯度下降(BatchGradientDescent,BGD)梯度下降算法一般用于最小化损失函数:原始数据网络馈入网络,网络会进行一定的计算,得到一个损失函数,代表网络计算结果与实际情况的差距。梯度下降算法是通过调整参数,使训练结果更符合实际,这就是梯度下降的意义。批量梯度下降是梯度下降的最原始形式。它的思想是利用所有的训练数据一起更新梯度。梯度下降算法需要对损失函数求导。可以想象,如果训练数据集比较大,需要将所有数据一起读入,在网络中一起训练,一起求和,那将是一个巨大的矩阵,计算量会非常巨大。当然,这也有好处,就是因为考虑了所有训练集的情况,所以网络必须朝着最优(极值)的方向优化。随机梯度下降(SGD)不同于批量梯度下降。随机梯度下降的思想是每次取出其中一个训练集,进行拟合训练,进行迭代训练。训练过程是先取出一个训练数据,修改网络的参数去拟合它并修改参数,然后取出下一个训练数据,用刚刚修改的网络去拟合并修改参数,不断迭代,直到每一个数据已经输入到网络中,然后重新从头开始,直到参数比较稳定。优点是每次拟合只用一个训练数据,每一轮的更新迭代速度非常快。缺点是每次进行拟合时,只考虑一个训练数据,优化的方向不一定是整个训练集中网络的最优方向,往往会抖动或收敛到局部最优。小批量梯度下降(Mini-BatchGradientDescent,MBGD)小批量梯度下降采用了计算机中最常用的折衷方案。每次输入网络进行训练,既不是整个训练数据集,也不是训练数据集。某一个,但是其中的一部分,比如每次输入20。可以想象,这既不会造成数据量过大和计算速度变慢,也不会因为某个训练样本的某些噪声特性而导致网络严重抖动或向非最优方向优化。比较这三种梯度下降算法的计算方式:批量梯度下降是一个大的矩阵运算,可以考虑使用矩阵计算优化进行并行计算,对内存等硬件性能要求较高;随机梯度下降的每次迭代都依赖于前面的计算结果,不能并行计算,硬件要求低;而smallbatchgradientdescent,在每次迭代中,都是一个较小的矩阵,对硬件要求不高,矩阵运算可以在迭代之间使用并行计算和串行计算,整体上会节省时间。看下图,更能体现三种剃须减法算法优化网络的迭代过程,大家会有更直观的印象。总结一下梯度下降算法的优化,训练数据集小,直接使用batch梯度下降;一次只能获取一个训练数据,或者实时在线传输训练数据,使用随机梯度下降;其他情况或者一般情况最好使用批量梯度下降算法。
