传统的机器学习是针对所有的训练数据来进行训练的,然后针对所有的训练数据来计算损失函数的值,以找出使该值尽可能小的一系列参数。
换句话说就是,如果训练数据有100万个的话,那么通过传统的方式,我们需要将这100万条数据的损失函数作为之后学习(优化)的指标,如果是这样的话,那对计算机来说,压力也太大了吧。
Mini-batch是一个一次训练数据集的一小部分,而不是整个训练集的技术。它可以使内存较小、不能同时训练整个数据集的电脑也可以训练模型。
Mini-batch从运算的角度来说是低效的,因为你不能在所有样本中都计算Loss值。
但是这点小代价也比根本不能运行模型要划算。其与随机梯度下降(SGD)结合在一起使用时也很有帮助。
使用方法是在每一代训练之前,都对数据进行随机混洗,然后创建mini-batches,对每一个Mini-batch,都使用梯度下降训练网络权重。
因为这些batches是随机的,因此你其实是在对每个batch做随机梯度下降(SGD)的操作。 之前的例子中,我们都是拿一条数据来计算损失函数的值,那如果有N条数据呢?
我们可以通过交叉熵误差公式来做一个改写: 公式虽然复杂了一点,但是简单理解一下,其只是将求单个数据的损失函数扩大到了N份数据之和罢了,最后还需要除以N来得到平均损失函数,用以规避样本数N的影响。
讲完了概念之后,我们再来看下如何通过Mini-batch技术来实现交叉熵误差(前提是标签已经转为one-hot encoding了)。
这里的y是实际值,p是神经网络的预测值。实现代码如下:
def cross_entropy_error(p, y):
delta = 1e-7
batch_size = p.shape[0]
return -np.sum(y * np.log(p + delta)) / batch_size
网友评论