学习笔记P12——BP算法
学习网址:https://www.bilibili.com/video/av48285039?p=12
用gradient descent的方法来train一个neuron network应该怎么做?通常利用BP【Backpropagation】算法。
本文主要介绍BP如何让neuron network的training变得有效率。
先介绍Gradient Descent的核心过程:
设network中的参数为:
初始化参数为:
根据梯度下降的原理,现对每个参数求微分:
然后再进行第二步参数的更新计算:
直到找到最优的那个参数。
这个过程和一般的LR求解过程没有差异,但是其中最大的不同就是在neuron network中有非常非常多的参数。
例如在做语音辨识系统时,会有7、8层的layer,每层layer有1K个neuron,即有上百万个参数。所以参数微分的vector是非常庞大的,因此现在的问题是通过什么方式把这上百万维的vector计算出来。这个就是BP算法做的事情。
BP算法并不是一个和GD不同的算法,它也是一个GD,只不过它是一个比较有效的演算法。BP算法我们需要注意的地方只有一个:链式法则(chain rule)。
Cn表示NN输出结果和实际结果之间的距离:距离越小NN效果越好,距离越大NN效果越差。
将其加和得到total loss L:
对上面左右两边求微分:
只要能计算出一个batch data的偏微分再将其加和,就可以得到所有loss;先考虑某一个neuron:
经过输入,得到:
怎么求解C对W的偏微分:
跟进Chain rule拆成两项:
计算前一项,我们称为forward pass,计算后一项我们称为backward pass。
OK,首先看看forward pass的过程:
根据:
可以计算出w1,w2的偏微分:
根据如上可知:W的偏微分就是输入值X。
forward pass 的示例:
开始输入为(1,-1),第一层的第二个neuron的输入为-1, z对w求偏微分即为-1;第一个neuron的值为0.12,则第二层第二个neuron 对w的偏微分为0.12.
backward pass:
则对应的求解过程,链式法则:
第一项:
对应的分布如下:
第二项偏微分的形式:
因为C和z的关系不明确,的值是不知道的。现在假设已经知道了和的值,则的值就知道了,如下:
图示法:
此处是常数,因为z在forward pass的过程中就已经确定了;
现在,再回头看看整个网络:
只要确定了和这两项,问题就都解决了。下面看看这两项该如何计算:
情况1:
假设Z'和Z‘’对应的neuron是最后的output layer,即上面图示的样子,则可以得到:
C是损失函数,以上两项都是可以计算得到的,则问题解决。
情况2:
最后对应的不是output layer,如下形式:
同上述可推出:
=(W5+W6)
这样依次往后面计算,直至到output layer那一层即可完成。
这样由前往后计算直观上感觉很复杂,其实实际上只要换一下视角,backward pass和forward pass 的运算量是一样的;
假设现在有6个neuron,没有neuron的activation function分别是z1,z2,z3,....,z6。现在要计算:。
总结:
a是neuron的输出值,通过forward pass知道,这层的偏微分结果就是a,然后在通过计算backward pass的两者相乘即得到C对W的偏微分;然后将计算得到的加和得到:;
这样就可以用来更新参数:
这样的过程不断继续知道求解得到最优的解。