反向传播的内存要求——为什么不使用均值激活?
Memory requirements for back propagation - why not use the mean activation?
我需要帮助来理解神经网络的内存要求以及训练和评估过程之间的差异。更具体地说,训练过程的内存要求(我在 TensorFlow 之上使用 Keras API 运行)。
对于包含 N 个权重的 CNN,当使用大小为 x 的批次时,权重本身和输入数据需要恒定的内存量。在 forward pass 期间,GPU 需要额外的 x*N 内存单元(具体所需数量对问题并不重要)以同时传递所有样本并计算每个神经元的激活。
我的问题是关于反向传播过程,似乎该过程需要额外的 x*N 单元内存(*) 用于每个样本的每个权重的特定梯度.按照我的理解,就是算法计算每个样本的特定梯度,然后将它们相加,用于反向传播到上一层。
Q.既然每个batch只有一个update step,为什么不对每个神经元的平均激活进行梯度计算呢?这样,训练所需的额外内存将仅为 (x+1)*N 而不是 2*x*N。
(*) 这是根据我自己在评估 (~4200) 和训练 (~1200) 期间允许的最大批量大小的小实验得出的。显然,这是查看内存需求的一种非常简化的方式
简短的回答是:这就是小批量 SGD 反向传播算法的工作方式。
回顾它的起源和使用标准 SGD 和 mini-batch SGD 的区别,原因就更清楚了。
标准随机梯度下降 算法通过模型传递单个样本,然后反向传播其梯度并更新模型权重,然后再对下一个样本重复该过程。主要的缺点是它是一个串行过程(不能 运行 同时采样,因为每个样本需要 运行 在已经被前一个样本更新的模型上,所以它在计算上非常昂贵的。此外,每次更新仅使用一个样本会导致非常嘈杂的梯度。
mini-batch SGD利用了相同的原理,但有一个区别——梯度是从多个样本中累积的,并且每 x 个样本只执行一次更新。这有助于在训练期间获得平滑的梯度,并使多个样本能够并行地通过模型。这是在使用 keras/tensorflow 进行小批量训练时使用的算法(通常称为批量,但该术语实际上意味着使用批量梯度体面,这是一种略有不同的算法)。
我还没有找到任何关于使用每层梯度的平均值进行更新的工作。检查这种算法的结果很有趣。它的内存效率更高,但它也可能无法达到良好的最低点。
我需要帮助来理解神经网络的内存要求以及训练和评估过程之间的差异。更具体地说,训练过程的内存要求(我在 TensorFlow 之上使用 Keras API 运行)。
对于包含 N 个权重的 CNN,当使用大小为 x 的批次时,权重本身和输入数据需要恒定的内存量。在 forward pass 期间,GPU 需要额外的 x*N 内存单元(具体所需数量对问题并不重要)以同时传递所有样本并计算每个神经元的激活。
我的问题是关于反向传播过程,似乎该过程需要额外的 x*N 单元内存(*) 用于每个样本的每个权重的特定梯度.按照我的理解,就是算法计算每个样本的特定梯度,然后将它们相加,用于反向传播到上一层。
Q.既然每个batch只有一个update step,为什么不对每个神经元的平均激活进行梯度计算呢?这样,训练所需的额外内存将仅为 (x+1)*N 而不是 2*x*N。
(*) 这是根据我自己在评估 (~4200) 和训练 (~1200) 期间允许的最大批量大小的小实验得出的。显然,这是查看内存需求的一种非常简化的方式
简短的回答是:这就是小批量 SGD 反向传播算法的工作方式。 回顾它的起源和使用标准 SGD 和 mini-batch SGD 的区别,原因就更清楚了。
标准随机梯度下降 算法通过模型传递单个样本,然后反向传播其梯度并更新模型权重,然后再对下一个样本重复该过程。主要的缺点是它是一个串行过程(不能 运行 同时采样,因为每个样本需要 运行 在已经被前一个样本更新的模型上,所以它在计算上非常昂贵的。此外,每次更新仅使用一个样本会导致非常嘈杂的梯度。
mini-batch SGD利用了相同的原理,但有一个区别——梯度是从多个样本中累积的,并且每 x 个样本只执行一次更新。这有助于在训练期间获得平滑的梯度,并使多个样本能够并行地通过模型。这是在使用 keras/tensorflow 进行小批量训练时使用的算法(通常称为批量,但该术语实际上意味着使用批量梯度体面,这是一种略有不同的算法)。
我还没有找到任何关于使用每层梯度的平均值进行更新的工作。检查这种算法的结果很有趣。它的内存效率更高,但它也可能无法达到良好的最低点。