use*_*804 10 machine-learning backpropagation neural-network deep-learning conv-neural-network
我正致力于复制神经网络.我试图了解标准图层类型的工作原理.特别是,我无法在任何地方查找跨通道归一化层在后向传递上的行为.
由于规范化层没有参数,我可以猜测两种可能的选择:
来自下一个(即后一个)层的误差梯度向后传递而不对它们做任何事情.
误差梯度的标准化方式与正向通道中的通道上的激活标准化的方式相同.
我想不出你为什么要根据任何直觉做另一个的原因,因此我为什么要对此有所帮助.
EDIT1:
该层是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
任何熟悉这两种方法的人都可以将后向传递阶段的方法翻译成普通英语吗?
它使用链式规则通过本地响应归一化层向后传播梯度。从某种意义上说,它有点类似于非线性层(它本身也没有可训练的参数,但是会影响向后的渐变)。
从您链接到的Caffe中的代码中,我看到它们将每个神经元中的错误作为参数,并通过执行以下操作来计算上一层的错误:
首先,在前向传递中,它们缓存一个所谓的比例,该比例的计算方式(根据AlexNet论文,请参阅第3.3节中的公式)为:
scale_i = k + alpha / n * sum(a_j ^ 2)
Run Code Online (Sandbox Code Playgroud)
这里和下面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)
Run Code Online (Sandbox Code Playgroud)
由于您打算手动实现,因此我还将分享Caffe在其代码中使用的两个技巧,这些技巧使实现更加简单:
在计算总和的加数时,请分配一个size数组N + n - 1,并n/2在其两端各加零。这样,您可以计算从i - n/2到的总和i + n/2,而不必担心低于零和超出零N。
您无需sum在每次迭代中重新计算,而是预先计算加数(a_j^2对于前遍,be_j * b_j / scale_j对于后遍),然后计算sumfor i = 0,然后对于每个连续的i加法addend[i + n/2]和减法addend[i - n/2 - 1],它将为您提供i恒定时间内新值的总和值。
| 归档时间: |
|
| 查看次数: |
1670 次 |
| 最近记录: |