我试图训练一个包含两个卷积层(c1,c2)和两个隐藏层(c1,c2)的人工神经网络。我使用的是标准的反向传播方法。在反向传递中,我根据前一层的误差、前一层的权重和激活梯度相对于当前层的激活函数来计算一层(delta)的误差项。更具体地说,L层的三角洲是这样的:
delta(l) = (w(l+1)' * delta(l+1)) * grad_f_a(l)我能够计算c2的梯度,它连接到一个规则的层。我只是把h1的权重乘以它的增量。然后将该矩阵重构为c2的输出形式,并将其与激活函数的梯度相乘完成。
现在我有一个c2的δ项,它是一个大小的4D矩阵(featureMapSize,featureMapSize,filterNum,patternNum)。此外,我还有c2的权重,它是一个大小的三维矩阵(filterSize,filterSize,filterNum)。
对于这两个项和c1激活的梯度,我想要计算c1的增量。
长话短说:
给定前一卷积层的δ项和该层的权重,如何计算卷积层的增量项?
发布于 2015-07-21 21:45:39
首先,为了简化一维数组(输入),可以很容易地将其转换到多维数组(输入),我首先推导下面的卷积层的误差:
我们假设长度的y^{l-1} N是l-1-th conv的输入。层,m是由w_i表示每个权重的权重w的内核大小,输出是x^l。
因此,我们可以写(注意从零开始的求和):x_i^l = \sum\limits_{a=0}^{m-1} w_a y_{a+i}^{l-1},其中y_i^l = f(x_i^l)和f是激活函数(例如σ)。有了这些之后,我们现在可以考虑一些错误函数E和\partial E / \partial y_i^l 给出的卷积层上的误差函数(前一层之一)。我们现在要找出错误在上一层的权重中的相关性(S):
其中,我们对发生w_a的所有表达式都有和,即N-m。还请注意,我们知道最后一个项来自于\frac{\partial x_i^l}{\partial w_a}= y_{i+a}^{l-1},您可以从第一个方程中看到这一点。
要计算梯度,我们需要知道第一个项,它可以通过以下方法计算:
其中,第一个项是前一层的误差,f是非线性激活函数。
有了所有必要的实体,我们现在就能够计算错误并有效地将其传播回宝贵的层:
注意,在编写x_i^l-s w.r.t时,可以很容易地理解最后一步。y_i^{l-1}-s.flipped指的是转置重量最大值(T)。
因此,您只需计算下一层中的错误(现在采用向量表示法):
这就变成了一个卷积和次采样层:
其中,upsample操作通过最大池层传播错误。
请随意添加或纠正我!
参考资料见:
对于C++实现这 (不需要安装)
https://datascience.stackexchange.com/questions/5987
复制相似问题