BP 这个algorithm(算法)是怎么运作的呢?怎么样让neural network的training变得比较有效率?
当用GD 方法的时候跟LR的做法是一样的都是选定参数,计算微分,更新参数按这样的步骤遗址进行下去,但是在neural network里面我们有非常多的参数,我们要做语音辨识系统的时候在neural network通常有7,8层,每层里有很多的神经元,所以上图中的向量当中有很多很多的元素,所以现在的事情就是如何有效的把这一个百万维的向量计算出来?(下面图中的这个向量)这个就是BP 所要做的东西
(BP所要做的就是把这个向量有效的计算出来)
BP里面唯一知道的就是Chain Rule(链式法则)
假设给x一个很小的变化,那么对应的y和z也会发生相应的变化
假设对输入s做一个很小的变化,相应的x和y也会发生变化,那么z也会发生变化。
回到neural network的training,会定图个loss function,但是这个loss function是什么呢?
上面图中的值得是和之间的距离,越大 ,说明和(期望的是最正确的)之间的距离就大. 则Loss就不是很好。
对L做微分:
接下来的计算就是对某一组数据进行右边式子的计算即可,再把所有的训练数据加起来,
怎么做呢?只考虑其中的一个神经元
经过上面的一系列操作步骤之后最终得到的输出是y1,y2.
现在的问题是这样,假设我们拿出一个w换成z(就是把weight当作z)来看怎么计算?某一个weight对cost的偏微分。
先看一下怎么计算:很简单
(图中的x1和x2是:如果w1前面接的是x1,后面的微分接的也是x1)
这个步骤叫做Forward pass
接来讲Backward pass:怎么计算
sigmoid的微分:
(假设我们知道❓处的值)
所以整个的过程我们就可以直接算出来:
这个式子我们从里一个角度分析:现在有一个新的neural (就是把上面的式子用一个新的结构表示一下以便于了解)
现在是一个常数,不是一个function,z已经是一个固定的值
最后的一个问题就是怎么计算:
现在进行两种假设:
假设一:是把图中红色的神经元当作是输出,也就是整个神经网络的输出y1,y2.
假设二:没有输出的情况下,后面还有其他的神经网络。
黄色线的部分是已知的情况下,可以进行上面红色部分的运算,这样就可知道绿色圈里面的内容
上面的这个算法当中,黄色圈里面的是我们假设知道的,但是实际上我们是不知道的,那如何计算呢?
如果后面的绿色神经元是知道的话,就是可以秒算前面的这个微分(假设一的算法),但是如果绿色的神经元不是输出的话,就做假设二的算法,这样周而复始下去。这种做法看上去很麻烦,但是是BP算法的核心:
从最后的神经元的微分开始计算
这个算法就是将前面讲的一个综合,最后的神经元的微分很好计算,在经过从后往前的一个算法逐层递进。
(这个步骤就叫做BP)
总结:
先做一个Forward Pass 只要知道每一个神经元的输出a,这个微分就是她所连接的weight的微分。
在BP当中将整个的神经网络反过来,知道神经元的微分。
将上面的两个步骤相乘最后得到的就是整个神经网络对weight的微分。
原创不易,转载请告知,随手笔记,内容有误,还请谅解~