前一篇手写识别的博文《深度学习数学基础—反向传播》中已经简单分析和推导过反向传播的原理,但是基于特定的场景给出的推导过程,现在我们再来系统的加深下神经网络反向传播的算法理解。
首先定义几个变量。
我们用
来表示(l-1)层第k节点到l层第j节点的权重w
例如:
我们用
来表示l层第j节点的偏差b,用
来表示l层j节点所受到的总影响。
例如:
可以分析得出整个神经网络正向是个递归推进的过程,公式如下:
其中σ是转换函数,在手写识别案例中σ就是sigmoid函数。
公式用矩阵简化后为:
用
再对公式进行一次简化:
整个网络输出的误差计算公式:
这里需要注意前面用的都是小写的l,对应着具体的l层节点的运算;最终误差这里用的是大写的L,对应着整个神经网络的总体的运算。
以上都是铺垫,下面我们来真正看一下一旦我们对神经网络中的某个节点做出改变会如何影响到整个网络。
如图对l层第j节点有个小恶魔做了微小的变动
改变后对该节点的产出变为:
,对α的的影响是
假设
套用公式三后结果为:
前面介绍过L大小写的区别了,小恶魔对整个网络引起的差异速率为:
对公式四求导带入上面公式得:
PS:这是很重要的一步,因为万事开头难,对于反向传播来说整个网络output层反倒是修正时的最原始的input,到目前为止我们已经有了这个“input”的计算公式了,下面要解决的就是如何将其一点点往真正的input方向传递。
上面是站在整个网络上宏观的来分析对最终的输出造成的影响,下面我们聚焦到小恶魔只对后面一层(也就是l+1层的影响速率)
根据公式二推导出:
PS:这是另一个里程碑式的成功,因为我们具备了从l+1层计算l层误差率的方式。
有了上面2个ps的理论,我们反向传播LàL-1àL-2à……l+1àlàl-1à….这条路就彻底打通了。
我们上面的小恶魔改动的是
,最终我们产出的是每层的权重和偏差,再根据公式二求偏导:
这两个结果很容易推导的过来,但是给我们的启发是在求偏差还好通过结果数据可以计算的出来,但是在求每层权重的时候需要用到本节点的输入(也就是上一个节点的输出),所以我们在正向的运算时就需要把这些数据维护起来,否则无法完成反向传播的过程。
于是理解了上面的推导过程我们在处理反向传播时就有了一套很成熟的方法论了:
第一步:
将原始出入x作为α1的输入
第二步:
利用
正向运算记得维护每层的输出。
第三步:
利用
求网络总输出的误差率
其实这么写是为了方便理解,因为我们这里的求误差的方式是公式四,如果不是用欧氏距离来求误差需要修改等号右边第一个括号内的内容。
第四步:
利用
从后向前求每一层的误差率
第五步:
利用
求每一层的权重和偏差
第六步:
设置好步长和循环次数不断调优。
有了本篇的理论基础再回头看深度学习数学基础—反向传播求导过程和代码应该如虎添翼了吧。