11

我正在研究复制神经网络。我试图了解标准图层类型的工作原理。特别是,我无法在任何地方找到关于跨通道归一化层在后向传递中的行为的描述。

由于规范化层没有参数,我可以猜测两个可能的选项:

  1. 来自下一个(即后来的)层的误差梯度被向后传递而不对它们做任何事情。

  2. 误差梯度的归一化方式与前向通道中激活跨通道的归一化方式相同。

我想不出你为什么会根据任何直觉做一个而不是另一个的原因,因此为什么我需要一些帮助。

编辑1:

该层是 caffe 中的标准层,如此处所述http://caffe.berkeleyvision.org/tutorial/layers.html(请参阅“本地响应规范化 (LRN)”)。

该层在前向传递中的实现在 alexNet 论文的第 3.3 节中进行了描述:http: //papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

编辑2:

我相信这里的 Torch 库中都描述了前向和后向传递算法:https ://github.com/soumith/cudnn.torch/blob/master/SpatialCrossMapLRN.lua

并在此处的 Caffe 库中:https ://github.com/BVLC/caffe/blob/master/src/caffe/layers/lrn_layer.cpp

请熟悉这两种方法的任何人都可以将向后传递阶段的方法翻译成简单的英语吗?

4

3 回答 3

5

它使用链式法则通过局部响应归一化层向后传播梯度。从这个意义上说,它有点类似于非线性层(它本身也没有可训练的参数,但确实会影响向后的梯度)。

从您链接到的 Caffe 中的代码中,我看到它们将每个神经元中的错误作为参数,并通过执行以下操作计算前一层的错误:

首先,在前向传递中,他们缓存了一个所谓的比例,即计算(根据 AlexNet 论文,参见第 3.3 节中的公式):

scale_i = k + alpha / n * sum(a_j ^ 2)

这里和下面sum是总和索引j并从max(0, i - n/2)min(N, i + n/2)

(请注意,在论文中它们没有标准化n,所以我认为这是 Caffe 与 AlexNet 不同的东西)。然后将前向传递计算为b_i = a_i + scale_i ^ -beta

为了向后传播误差,假设来自下一层be_i的误差是 ,我们需要计算的误差是ae_i。然后ae_i计算为:

ae_i = scale_i ^ -b * be_i - (2 * alpha * beta / n) * a_i * sum(be_j * b_j / scale_j)

由于您打算手动实现它,我还将分享 Caffe 在其代码中使用的两个技巧,它们可以使实现更简单:

  1. 当你计算总和的加数时,分配一个 size 的数组,并在每一端用零N + n - 1填充它。n/2通过这种方式,您可以计算从i - n/2到的总和i + n/2,而无需关心低于零和超过N

  2. 您不需要sum在每次迭代时重新计算,而是提前计算加数(a_j^2对于前传,be_j * b_j / scale_j后传),然后计算sumfor i = 0,然后对于每个连续的i只是 addaddend[i + n/2]和减去addend[i - n/2 - 1],它会给你i恒定时间内的新值的总和值。

于 2015-11-28T03:30:53.643 回答
-1

当然,您可以打印变量以观察它们的变化,也可以使用调试模型查看通过网络时错误如何变化。

于 2015-11-24T02:22:08.883 回答
-1

我有一个替代的落后公式,我不知道它是否等同于 caffe 的:

所以咖啡是:

ae_i = scale_i ^ -b * be_i - (2 * alpha * beta / n) * a_i * sum(be_j * b_j / scale_j)

通过区分原始表达式

b_i = a_i/(scale_i^-b)

我明白了

ae_i = scale_i ^ -b * be_i - (2 * alpha * beta / n) * a_i * be_i*sum(ae_j)/scale_i^(-b-1)
于 2016-12-16T22:31:12.887 回答