计算机视觉工程师在面试过程中主要考察三个内容:图像处理、机器学习、深度学习。然而,各类资料纷繁复杂,或是简单的知识点罗列,或是有着详细数学推导令人望而生畏的大部头。为了督促自己学习,也为了方便后人,决心将常考必会的知识点以通俗易懂的方式设立专栏进行讲解,努力做到长期更新。此专栏不求甚解,只追求应付一般面试。希望该专栏羽翼渐丰之日,可以为大家免去寻找资料的劳累。每篇介绍一个知识点,没有先后顺序。想了解什么知识点可以私信或者评论,如果重要而且恰巧我也能学会,会尽快更新。最后,每一个知识点我会参考很多资料。考虑到简洁性,就不引用了。如有冒犯之处,联系我进行删除或者补加引用。在此先提前致歉了!
在训练的过程中,先明确几个概念:
batch size: 批大小,更新一次参数,用到的样本数量。
epoch: 周期数,将所有样本均使用一遍是1个epoch。
iteration: 迭代次数,在1个epoch内,更新参数的次数。
举个例子:
5000个样本,batch size是50,iteration就是100。
原理
训练过程有正向传播和反向传播。
正向传播计算损失,反向传播更新参数。
根据batch size大小分为三类:
- batch size = 1 (随机梯度下降) 在每次iteration中,正向传播1次,反向传播1次。
- batch size = 总样本量N (批梯度下降) 在每次iteration中,正向传播N次,反向传播1次。
- batch size = n (mini batch梯度下降) 在每次iteration中,正向传播n次,反向传播1次。
正向传播和反向传播次数不同,怎么做的?
比如batch size = 5
正向传播5次得到5个损失,5个损失取平均,计算1个梯度,反向传播1次。
优缺点
因为batch size大小的优缺点比较复杂,甚至有时候是矛盾的。了解以下原理,能够自己分析,才是最好的。
训练过程中,数据需要被读取到显卡(gpu)中。
batch size越大,占用的gpu显存越大。
batch size太小,比如11GB的显存只用了3GB,如果gpu没有其它任务,那么对gpu的利用显然是不充分的,从这个角度来讲,不利于效率的提升。
batch size过大,超过了gpu的显存容量,那么数据无法读取,无法训练。
n个样本正向传播的梯度相加取平均,n越大,每个iteration的梯度方向越稳定。
batch size变大,梯度方向越稳定,会向一个方向稳定地更新。
但是一直向相似方向前进,容易陷入局部最优。
batch size变小,梯度方向不稳定,训练过程不稳定,容易受到一些极端样本的影响。不过,也不容易陷入局部最优。
讨论不同batch size下训练得到的准确性没有太大的意义。
batch size小,梯度不稳定,需要采用小的学习率,防止受到某一批样本过大的影响。反之,batch size大,梯度稳定,就可以采用相对较大的学习率。
相同epoch,batch size大,iteration少,也就是参数更新次数少。所以针对不同的batch size,epoch的设置也是不同的。
综上,不同的batch size都有其合适的超参数选择,所以直接比较使用不同batch size训练的准确率,没有太大意义。
不同batch size的iteration的时间几乎相同。
理论上,每个iteration都是1次反向传播,batch size越大,正向传播次数越多,1次iteration的时间越长。
但是,和反向传播的时间比,正向传播的时间几乎可以忽略不计。
所以,不同batch size的iteration的时间几乎相同。
具体到1个epoch,因为大batch size的iteration次数少,所以大batch size的每个epoch的时间短。
如果,非要下一个通用的结论:
在一定范围内,大batch size注重效率,小batch size注重精度。
讨论
batch size通常是2的幂函数,比如32,64,128…
一问原因都说是因为计算机是2进制运算,具体又说不出来。
我能想到的一个强行解释是:
在求损失的平均值时,除以32这类数可以直接移位。但是这个差距我觉得可以忽略不计了吧。
所以很多人也通常不会遵守这一潜规则。
如果有大佬了解具体原因,恳请多多指教!
完
欢迎讨论 欢迎吐槽