为了简化一维数组(输入),我首先在下面导出卷积层的错误,然后可以轻松地将其转换为多维:
我们在这里的是,假定长度的Ñ是的输入升- 1个CONV。在层中,m是权重w的内核大小,用w i表示每个权重,输出是x l。
因此我们可以写(注意从零开始的总和):x l i = m − 1 ∑ a = 0 w a y l − 1 a + i
其中y l iÿl − 1ñl − 1米ww一世X升
X升一世= ∑a = 0m − 1w一个ÿl − 1一个+ 我
和
f激活函数(例如S型)。有了这个在眼前,我们现在可以考虑一些误差函数
Ë给出,并在卷积层(你以前层的一个)的误差函数
∂ Ë / ∂ Ÿ 升我。现在,我们要找出错误的依赖在先前层(多个)的一个权重:
∂ êÿ升一世= f(x升一世)FË∂Ë/ ∂ÿ升一世
,我们有在所有表达,其中所述总和
瓦特一个发生时,其是
ñ-米。还需要注意的是,我们知道最后一项源于一个事实,即
∂X升我∂Ë∂w一个= ∑a = 0ñ− 米∂Ë∂X升一世∂X升一世∂w一个= ∑a = 0ñ− 米∂Ë∂w一个ÿl − 1我+ 一个
w一个ñ− 米而可以从所述第一方程见。
为了计算,我们需要知道的第一项,它可以计算梯度:
∂ê∂xli∂wa=yl−1i+a
,其中再次第一项是在前面层和误差
˚F非线性激活函数。
∂E∂xli=∂E∂yli∂yli∂xli=∂E∂yli∂∂xlif(xli)
f
拥有所有必要的实体,我们现在能够计算误差和有效地传播回珍贵的层:
δl−1a=∂E∂yl−1i=∑a=0m−1∂E∂xli−a∂xli−a∂yl−1i=∑a=0m−1∂E∂xli−awflippeda
xliyl−1iflippedT
因此,您可以通过(现在使用矢量表示法)在下一层中计算误差:
δl=(wl)Tδl+1f′(xl)
δl=upsample((wl)Tδl+1)f′(xl)
upsample
请随时添加或纠正我!
有关参考,请参见:
http://ufldl.stanford.edu/tutorial/supervised/ConvolutionalNeuralNetwork/
http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/
对于C ++实现(无需安装):https :
//github.com/nyanp/tiny-cnn#supported-networks