神经网络,反向传播推导(超简单版)
标注与说明
- θ(l)i,j θ i , j ( l ) 表明从 (l) ( l ) 层的第i个元素到 (l+) ( l + ) 层的第j个元素的 θ θ 。这样的次序是指明了 θ(l) θ ( l ) 矩阵的排列次序。 θ(l)i,j θ i , j ( l ) 表明参数矩阵 θ(l) θ ( l ) 里的每一行为一个 a(l)j a j ( l ) 所对应的参数。
- l 表示网络的层数=1,2,3….L(L=网络总层数-1)
- a(l)j=g′(z(l)j)=sigmoid′(z(l)j) a j ( l ) = g ′ ( z j ( l ) ) = s i g m o i d ′ ( z j ( l ) )
- J(Θ)==C(Θ)=−1m∑mi=1∑kk=1[y(i)klog((hΘ(x(i)))k)+(1−y(i)k)log(1−(hΘ(x(i)))k)]+λ2m∑L−1l=1∑sli=1∑s(l+1)j=1(Θ(l)j,i)2 J ( Θ ) == C ( Θ ) = − 1 m ∑ i = 1 m ∑ k = 1 k [ y k ( i ) l o g ( ( h Θ ( x ( i ) ) ) k ) + ( 1 − y k ( i ) ) l o g ( 1 − ( h Θ ( x ( i ) ) ) k ) ] + λ 2 m ∑ l = 1 L − 1 ∑ i = 1 s l ∑ j = 1 s ( l + 1 ) ( Θ j , i ( l ) ) 2
- sl s l 表面 a(l) a ( l ) 的神经元个数是 s s 个。
明确我们的题目
在完成一次前向传播后,已知 也就是已知 (y^,y) ( y ^ , y ) ,为了实现梯度下降: θ(l):=θ(l)−∂C∂θ(l) θ ( l ) := θ ( l ) − ∂ C ∂ θ ( l ) 。我们需要求 ∂C∂θ(l) ∂ C ∂ θ ( l )
解题思路
δ δ 在很多书中翻译为‘误差’,但这与模型预测值与样本y之间的误差不是一个概念。实际上 δ δ 是一个微分值。我们定义 δ(l)=∂C∂z(l) δ ( l ) = ∂ C ∂ z ( l ) 。有了这个中间值设定,可以简化我们的计算,不用对每一层 θ θ 的偏导计算都从网络的输出层开始重新计算一遍。至于为什么将这个中间值设定在 ∂C∂z(l) ∂ C ∂ z ( l ) ,据我的理解是两个原因:1、这是离我们要求导的 θ(l) θ ( l ) 最靠近的一个元素。2、你也可以把这个中间值设定在 ∂C∂a(l) ∂ C ∂ a ( l ) ,但这样在推导后的公式表达上比较繁琐,不易直观理解。事实上没有这个中间值你也能完整表达整个网络的梯度求导,只不过那个公式肯定充满了 ∑ ∑ 会让你看着头晕。
如果你知道了 δ(l)=∂C∂z(l) δ ( l ) = ∂ C ∂ z ( l ) 的数值,那么据此求解 ∂C∂θ(l)=∂C∂z(l)⋅∂z(l)∂θ(l)=δ(l)⋅∂z(l)∂θ(l) ∂ C ∂ θ ( l ) = ∂ C ∂ z ( l ) ⋅ ∂ z ( l ) ∂ θ ( l ) = δ ( l ) ⋅ ∂ z ( l ) ∂ θ ( l ) 就变得简单多了。
再进一步,如果我们找到 δ(l) δ ( l ) 与 δ(l+1) δ ( l + 1 ) 之间的关系,在反向传播中,我们刚好可以从输出层往输入层方向一层层的计算下去。
寻找本层’误差’与下一层’误差’之间的关系
寻找 δ(l) δ ( l ) 与 δ(l+1) δ ( l + 1 ) 之间的关系
要寻找 δ(l) δ ( l ) 与 δ(l+1) δ ( l + 1 ) 之间的关系之前,就得明确一点 δ(l+1) δ ( l + 1 ) 是如何把‘误差’传给 a