神经网络:Epoch、Batch Size和迭代

Epoch、Batch Size和迭代

深度学习模型离不开这3个术语,下面我们来了解下它们的区别
和联系?

背景知识:
梯度下降

分三点:1.直观理解 2. 梯度下降怎么做 3. 梯度下降有啥用

1、直观理解梯度下降:

其实它没啥就是让计算机不断猜最小值的那个点自变量x在哪,猜大了让它小一点,猜小了让它大一点。
主要三点:
1.梯度下降:两个意思,1.根据梯度(导数)的符号来判断最小值点x在哪;让函数值下降(变小)
2.梯度就是导数(对于多维就是偏导数)
3.梯度下降作用是找到函数的最小值所对应的自变量的值(曲线最低点对应x的值)。记住我们目的是为了找x

2、梯度下降怎么做的?

1、梯度下降它是一个函数f(x)找它的最小值所在的那个点x(0)的一种方法
2、怎么找呢?它原理就是猜,按照一定规则的猜。高中老师教过当前这个点导数大于0证明它周围单调增,最小值点肯定比当前猜的这个点小,那我下次就猜小一点

3、梯度有什么用?

机器学习和神经网络,还有各种数学建模问题。最终不是有个目标函数|损失函数|代价函数|误差函数。不管叫啥函数反正他们都一样。反正就是求他最小值点x。

注意是最小值点而不是最小值。

为啥?因为机器学习和神经网络等等他们损失函数|代价函数|误差函数最小值肯定是0啊

我们想要的是当误差最小时,最优自变量|权重|参数是啥。不同问题叫法不一样,但是一样的是他们都是想找自变量而不是函数值。

4、学习率

梯度下降中有一个称为学习率的参量。

我们当前的f(x)和目标函数的T的误差,那么我们可以将这个误差转移到每一个参数上,也就是变成每一个参数w和目标函数T的参数w_t的误差. 然后我们就以一定的幅度stride来缩小和真实值的距离,我们称这个stride为学习率learning_rate .

学习率对模型的影响

学习率 大学习率 小
学习速度
使用时间点刚开始训练时一定轮数过后
副作用1、易损失值爆炸2、易振荡1、易过拟合2、收敛速度慢

学习率越大,输出误差对参数的影响就越大,参数更新的就越快,但同时受到异常数据的影响也就越大,很容易发散。

学习率就是来控制我们每次靠近真实值的幅度,为什么要这么做呢?
因为我们表述的误差只是一种空间表述形式我们可以使用均方差也可以使用绝对值,还可以使用对数,以及交叉熵等等,所以只能大致的反映,并不精确,就想我们问路一样,别人告诉我们直走五分钟,有的人走的快,有的人走的慢,所以如果走的快的话,当再次问路的时候,就会发现走多了,而折回来,这就是我们训练过程中的loss曲线震荡严重的原因之一. 所以学习率要设置在合理的大小

5、decay_gamma、decay_epoches等

在第4点中提到了学习率之后,不得不提到学习率指数衰减。
从4中了解到学习率对模型的影响,我们可以看出,最理想的学习率不是固定值,而是一个随着训练次数衰减的变化的值,即在训练初期,学习率比较大,随着训练的进行学习率不断的减小,直到模型收敛。常见的衰减机制有:

轮数减缓指数减缓分数减缓
英文名step decayexponential decay1/t decay
方法每N轮学习率减半学习率按训练轮数增长指数插值递减lr=lr/(1+kt),k控制减缓幅度,t为训练轮数

在paddle video_tag模型中这几个参数体现在下面的代码中:

def optimizer(self):
    assert self.mode == 'train', "optimizer only can be get in train mode"
    values = [
        self.learning_rate * (self.decay_gamma**i)
        for i in range(len(self.decay_epochs) + 1)
    ]
    iter_per_epoch = self.num_samples / self.batch_size
    boundaries = [e * iter_per_epoch for e in self.decay_epochs]
    return fluid.optimizer.RMSProp(
        learning_rate=fluid.layers.piecewise_decay(
            values=values, boundaries=boundaries),
        centered=True,
        regularization=fluid.regularizer.L2Decay(self.weight_decay))

learning_rate:学习率
decay_gamma:衰减率,每次衰减的比例,在tensorflow等一些框架或者模型中,常常称该参数为decay_rate,两者是等价的,只是叫法不同。
decay_epochs:比如值为:[5],则表示经过5次epoch后,学习率衰减一次
decay_steps:衰减步数,每隔多少步衰减一次。在paddle video_tag模型就是boundaries中的值,见下面的测试代码:

#测试代码
learning_rate= 0.000125
decay_epochs= [5]
decay_gamma= 0.1
values = [
            learning_rate * (decay_gamma**i)
            for i in range(len(decay_epochs) + 1)
        ]
iter_per_epoch = 176045 / 128
boundaries = [e * iter_per_epoch for e in decay_epochs]
print(values)  #  [0.000125, 1.25e-05]
print(iter_per_epoch)  #  1375.3515625
print(boundaries)  #  [6876.7578125]

paddle中对piecewise_decay解释,最终返回衰减的学习率
在这里插入图片描述

global_steps:当前训练步数,在piecewise_decay的源码中可见,根据当前的步数,可以看作上面截图中的step,能做到每隔decay_steps学习率更新一次

6、权重衰减weight_decay

通过调节weight_decay系数,来调节高阶函数的增长程度,这个系数在数学上称之为拉格朗日乘子系数,weight decay(权值衰减)使用的目的是防止过拟合,具体介绍参见下面链接
wieght_decay介绍

7、epoch、batch size、iteration

只有在数据很庞大的时候(在机器学习中,几乎任何时候都是),我们才需要使用 epochs,batch size,迭代这些术语,在这种情况下,一次性将数据输入计算机是不可能的。因此,为了解决这个问题,我们需要把数据分成小块,一块一块的传递给计算机,在每一步的末端更新神经网络的权重,拟合给定的数据。参考链接:https://www.jianshu.com/p/005d05e18c7d

深度学习中经常看到epoch、 iteration和batchsize,下面按自己的理解说说这三个的区别:

(1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;

(2)iteration:1个iteration等于使用batchsize个样本训练一次;

(3)epoch:1个epoch等于使用训练集中的全部样本训练一次;

epoch

当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个 epoch。

然而,当一个 epoch 对于计算机而言太庞大的时候,就需要把它分成多个小块。

为什么要使用多于一个 epoch?

在神经网络中传递完整的数据集一次是不够的,而且我们需要将完整的数据集在同样的神经网络中传递多次。我们使用的是有限的数据集,并且我们使用一个迭代过程即梯度下降,优化学习过程和图示。因此仅仅更新权重一次或者说使用一个 epoch 是不够的。

随着 epoch 数量增加,神经网络中的权重的更新次数也增加,曲线从欠拟合变得过拟合。

那么,几个 epoch 才是合适的呢?

不幸的是,这个问题并没有正确的答案。对于不同的数据集,答案是不一样的。但是数据的多样性会影响合适的 epoch 的数量。比如,只有黑色的猫的数据集,以及有各种颜色的猫的数据集。

BATCH SIZE

batchsize:中文翻译为批大小(批尺寸)。

简单点说,批量大小将决定我们一次训练的样本数目。

batch_size将影响到模型的优化程度和速度。

为什么需要有 Batch_Size :

batchsize 的正确选择是为了在内存效率和内存容量之间寻找最佳平衡。

Batch_Size的取值:

1、如果数据集比较小我们就采用全数据集。全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。
注:对于大的数据集我们不能使用全批次,因为会得到更差的结果。

2、选择一个适中的 Batch_Size 值。就是说我们选定一个batch的大小后,将会以batch的大小将数据输入深度学习的网络中,然后计算这个batch的所有样本的平均损失,即代价函数是所有样本的平均。

3、如果batch_size等于1的情况,则每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。

适当的增加Batchsize 的优点:

1.通过并行化提高内存利用率。

2.单次epoch的迭代次数减少,提高运行速度。(单次epoch=(全部训练样本/batchsize) / iteration =1)

3.适当的增加Batch_Size,梯度下降方向准确度增加,训练震动的幅度减小。(看上图便可知晓)

经验总结:

相对于正常数据集,如果Batch_Size过小,训练数据就会非常难收敛,从而导致underfitting。

增大Batch_Size,相对处理速度加快。

增大Batch_Size,所需内存容量增加(epoch的次数需要增加以达到最好结果)。

这里我们发现上面两个矛盾的问题,因为当epoch增加以后同样也会导致耗时增加从而速度下降。因此我们需要寻找最好的batch_size。

再次重申:batchsize 的正确选择是为了在内存效率和内存容量之间寻找最佳平衡。

iteration: 中文翻译为迭代。

迭代是重复反馈的动作,神经网络中我们希望通过迭代进行多次的训练以到达所需的目标或结果。

每一次迭代得到的结果都会被作为下一次迭代的初始值。

一个迭代 = 一个正向通过+一个反向通过

  • 7
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值