反向传播的内存需求 - 为什么不使用平均激活值?

3
我需要帮助理解神经网络的内存需求,以及训练和评估过程中它们之间的差异。更具体地说,我正在使用运行在TensorFlow之上的Keras API,并关注训练过程的内存需求。
对于包含N个权重的CNN,在使用大小为x的批处理时,权重本身和输入数据需要恒定数量的内存。在前向传递期间,GPU需要额外的x*N个单位的内存(特定所需数量对问题不是至关重要),以便同时传递所有样本并计算每个神经元的激活。
我的问题涉及反向传播过程,似乎该过程需要针对每个样本的每个权重计算额外的x*N个单位的内存(*)。据我所知,这意味着算法计算每个样本的具体梯度,然后将它们相加以进行反向传播到前一层。
问:既然每批只有一个更新步骤,为什么不对每个神经元的平均激活执行梯度计算?这样,训练所需的额外内存仅为(x+1)*N,而不是2*x*N。
(*) 这是根据我自己的小实验得出的结论,最大允许的批处理大小为评估(~4200)和训练(~1200)。显然,这是一种非常简化的查看内存需求的方式。

我对你的问题没有答案,但我对你所说的很感兴趣。你能提供测试数据吗? - JanWillem Huising
我所做的并没有什么特别之处。在CIFAR10数据集上使用了稍微修改过的AlexNet模型。 - Mark.F
1个回答

2
简短回答:这就是小批量SGD反向传播算法的工作方式。回顾其起源以及使用标准SGD和小批量SGD之间的区别,就更清楚了。

标准随机梯度下降算法通过模型传递单个样本,然后反向传播其梯度并更新模型权重,然后再使用下一个样本重复此过程。主要缺点是它是串行过程(不能同时运行样本,因为每个样本需要在已经由前一个样本更新的模型上运行),因此计算成本非常高。此外,仅使用单个样本进行每次更新会导致梯度非常嘈杂。

小批量SGD利用相同的原理,唯一的区别在于从多个样本中累积梯度,并且仅在每x个样本后执行一次更新。这有助于在训练期间获得平稳的梯度,并使多个样本并行传递到模型。这就是使用keras/tensorflow进行小批量(通常称为“批次”,但该术语实际上意味着使用批量梯度下降,这是略微不同的算法)训练时使用的算法。

我还没有找到关于使用每层梯度平均值进行更新的工作。检查这种算法的结果是有趣的。虽然更节省内存,但很可能也不太能达到良好的极小值点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接