在CS231n 的讲义中,它说(强调我的)
... 有三个主要的内存来源需要跟踪:
- 来自中间体积大小:这些是 ConvNet 每一层的原始激活数,以及它们的梯度(大小相等)。通常,大多数激活都在 ConvNet 的较早层(即第一个 Conv 层)上。这些被保留是因为它们是反向传播所必需的,但是一个仅在测试时运行 ConvNet 的巧妙实现原则上可以通过仅在任何层存储当前激活并丢弃下面层上的先前激活来大大减少这一点.
- ……
通常我们想象一个神经网络从左(输入)到右(输出)传播,但是当前层之上/之下的层是什么?输入是底层还是顶层?
我猜输出是顶层。这是因为我们只需要下一个(更接近输出)层的梯度来计算当前层的梯度。不需要下一层的确切激活,因此我们可以在计算出相应的梯度后丢弃它们。这是可能的,因为我们向后计算梯度(首先是最后一层,最后一层)。