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