通过跨通道局部响应归一化 (LRN) 层的反向传播算法
Posted
技术标签:
【中文标题】通过跨通道局部响应归一化 (LRN) 层的反向传播算法【英文标题】:Backpropagation algorithm through cross-channel local response normalization (LRN) layer 【发布时间】:2016-02-20 08:30:45 【问题描述】:我正在研究复制神经网络。我试图了解标准图层类型的工作原理。特别是,我很难在任何地方找到关于跨通道归一化层在后向传递中的行为的描述。
由于规范化层没有参数,我可以猜测两种可能的选择:
来自下一个(即后来的)层的误差梯度被向后传递而不对它们做任何事情。
误差梯度的归一化方式与前向通道中激活跨通道的归一化方式相同。
我想不出你为什么会根据任何直觉做一个而不是另一个的原因,因此为什么我需要一些帮助。
编辑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
EDIT2:
我相信这里的 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
请熟悉这两种方法中的任何一种/两种的任何人都可以将反向传递阶段的方法翻译成简单的英语吗?
【问题讨论】:
你能链接到关于“跨通道规范化层”的参考吗?谷歌只披露了一篇 arxiv 论文,该论文似乎也讨论了很多其他事情。它看起来不像是标准的图层类型。 【参考方案1】:我有一个backward的替代表述,不知道是不是相当于caffe的:
所以 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)
【讨论】:
【参考方案2】:它使用链式法则通过局部响应归一化层向后传播梯度。从这个意义上说,它有点类似于非线性层(它本身也没有可训练的参数,但确实会影响向后的梯度)。
从您链接到的 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 在其代码中使用的两个技巧,以简化实现:
当您计算和的加数时,分配一个大小为N + n - 1
的数组,并在每一端用n/2
填充它。这样您就可以计算从i - n/2
到i + n/2
的总和,而无需关心低于零和超过N
。
您不需要在每次迭代时重新计算 sum
,而是提前计算加数(a_j^2
用于前向传递,be_j * b_j / scale_j
用于反向传递),然后计算 @ 987654340@ 为i = 0
,然后对于每个连续的i
只需加上addend[i + n/2]
并减去addend[i - n/2 - 1]
,它将在恒定时间内为您提供i
的新值的总和值。
【讨论】:
不应该是b_i = a_i * scale_i ^ -beta
吗?【参考方案3】:
当然,您可以打印变量以观察它们的变化,也可以使用调试模型查看通过网络时错误如何变化。
【讨论】:
以上是关于通过跨通道局部响应归一化 (LRN) 层的反向传播算法的主要内容,如果未能解决你的问题,请参考以下文章