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

Tensorflow 反向传播的内存要求-为什么不使用平均激活?,tensorflow,memory,keras,neural-network,backpropagation,Tensorflow,Memory,Keras,Neural Network,Backpropagation,我需要帮助理解神经网络的记忆需求以及它们在训练和评估过程中的差异。更具体地说,培训过程的内存需求(我使用的是运行在TensorFlow之上的KerasAPI) 对于包含N个权重的CNN,当使用大小为x的批次时,权重本身和输入数据需要恒定的内存量。在向前传递过程中GPU需要额外的x*N个内存单位(具体所需数量对问题并不重要),以便同时传递所有样本并计算每个神经元的激活 我的问题是关于反向传播过程,似乎该过程需要额外的x*N内存单位(*),用于每个样本每个权重的特定梯度。根据我的理解,这意味着该算法

我需要帮助理解神经网络的记忆需求以及它们在训练和评估过程中的差异。更具体地说,培训过程的内存需求(我使用的是运行在TensorFlow之上的KerasAPI)

对于包含N个权重的CNN,当使用大小为x的批次时,权重本身和输入数据需要恒定的内存量。在向前传递过程中GPU需要额外的x*N个内存单位(具体所需数量对问题并不重要),以便同时传递所有样本并计算每个神经元的激活

我的问题是关于反向传播过程,似乎该过程需要额外的x*N内存单位(*),用于每个样本每个权重的特定梯度。根据我的理解,这意味着该算法计算每个样本的特定梯度,然后将它们相加,以便反向传播到前一层

Q.既然每个批次只有一个更新步骤,为什么不对每个神经元的平均激活进行梯度计算?这样,训练所需的额外内存将仅为(x+1)*N,而不是2*x*N


(*)这是根据我自己在评估(~4200)和培训(~1200)期间允许的最大批量的小实验得出的。显然,这是一种非常简单的查看内存需求的方法。简短的回答是:这正是小批量SGD反向传播算法的工作方式。 回顾其起源以及使用标准SGD和小批量SGD之间的差异,更清楚的是原因

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

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


我还没有发现任何关于使用每个层中的梯度平均值进行更新的工作。检查这种算法的结果很有趣。它的内存效率会更高,但它也可能无法达到良好的最低点。

我对你的问题没有答案,但我对你说的话感兴趣。你能提供你的测试数据吗?我所做的没有什么特别之处。在CIFAR10数据集上使用了稍加修改的AlexNet。