首先复习下神经网络的概念。

神经网络由一些相互链接的“神经元”组成。每个“神经元”有相应的权重。

神经网络的神奇之处就在于权重是通过训练自动得出的。所谓训练,就是让神经网络在训练数据集上跑一遍,看看损失函数的值怎么样。如果损失函数的值足够小,小到符合我们的需求,那就说明神经网络拟合得很好了,训练大功告成了(实际上并非如此,因为仅仅知道拟合得很好并不够,我们还要知道神经网络是不是拟合得太好了,也就是过拟合。所以还需要用测试数据集来测试是否过拟合。不过这里就姑且就当训练完成了把。)反之,如果损失函数的值不够小,那就还需要继续训练。

神经网络在训练数据集上跑一遍,称为一次迭代(iteration)。

那么epoch又是怎么回事?

我们知道,简单来说,深度学习就是很深很深的神经网络(这一说法并不准确,但姑且让我们这么说),也就是说,有很多层,每层可能有很多神经元,结构也可能比较复杂。然后相应的,数据集也可能比较大。那跑一遍(迭代)会比较慢。所以人们就想出了一个变通的办法,就是每次只使用数据集中的部分样本,这个数目就称为batch size。

虽然只使用了部分样本,但很多时候已经足以优化权重,降低损失函数了。这样训练效率高很多,训练时间也能缩短不少。

不过这样一来,一次迭代就不一定完整跑遍数据集中的所有样本了。那在比较的时候,就不太方便直接比较迭代次数了。

比如,假设深度神经网络A经过32次迭代损失函数的值足够低了,而深度神经网络B经过16次迭代损失函数的值足够低了,但实际上,A的batch size可能是256,而B的batch size可能是2048。所以直接比较A和B的迭代次数并没有什么意义。

所以就又提出了epoch这个概念,指数据集中的所有样本都跑过一遍。

那对于每次迭代都跑遍数据集中的样本的情况,epoch和迭代是一样的。否则的话,epoch就要换算。上面的例子中,假设数据集的样本总数是4096,那A的1个epoch就需要16次迭代,而B的1个epoch只需要2次。也就是说,A经过2个epoch就训练好了,而B需要8个epoch。