Backpropagation
Backpropagation(反向传播),就是告诉我们用gradient descent来train一个neural network的时候该怎么做,它只是求微分的一种方法,而不是一种新的算法
Gradient Descent
gradient descent的使用方法,跟前面讲到的linear Regression或者是Logistic Regression是一模一样的,唯一的区别就在于当它用在neural network的时候,network parameters θ = w 1 , w 2 , . . . , b 1 , b 2 , . . . \theta=w_1,w_2,...,b_1,b_2,... θ=w1,w2,...,b1,b2,...里面可能会有将近million个参数
所以现在最大的困难是,如何有效地把这个近百万维的vector给计算出来,这就是Backpropagation要做的事情,所以Backpropagation并不是一个和gradient descent不同的training的方法,它就是gradient descent,它只是一个比较有效率的算法,让你在计算这个gradient的vector的时候更有效率
Chain Rule
Backpropagation里面并没有什么高深的数学,你唯一需要记得的就只有Chain Rule(链式法则)
个人感觉跟微积分里面的链式求导法则差不多
对整个neural network,我们定义了一个loss function: L ( θ ) = ∑ n = 1 N l n ( θ ) L(\theta)=\sum\limits_{n=1}^N l^n(\theta) L(θ)=n=1∑Nln(θ),它等于所有training data的loss之和
我们把training data里任意一个样本点 x n x^n xn代到neural network里面,它会output一个 y n y^n yn,我们把这个output跟样本点本身的label标注的target y ^ n \hat{y}^n y^n作cross entropy,这个交叉熵定义了output y n y^n yn和target y ^ n \hat{y}^n y^n之间的距离 l n ( θ ) l^n(\theta) ln(θ),如果cross entropy比较大的话,说明output和target之间距离很远,这个network的parameter的loss是比较大的,反之则说明这组parameter是比较好的
然后summation over所有training data的cross entropy l n ( θ ) l^n(\theta) ln(θ),得到total loss L ( θ ) L(\theta) L(θ),这就是我们的loss function,用这个 L ( θ ) L(\theta) L(θ)对某一个参数w做偏微分,表达式如下:
∂ L ( θ ) ∂ w = ∑ n = 1 N ∂ l n ( θ ) ∂ w \frac{\partial L(\theta)}{\partial w}=\sum\limits_{n=1}^N\frac{\partial l^n(\theta)}{\partial w} ∂w∂L(θ)=n=1∑N∂w∂ln(θ)
这个表达式告诉我们,只需要考虑如何计算对某一笔data的 ∂ l n ( θ ) ∂ w \frac{\partial l^n(\theta)}{\partial w} ∂w∂ln(θ),再将所有training data的cross entropy对参数w的偏微分累计求和,就可以把total loss对某一个参数w的偏微分给计算出来
我们先考虑某一个neuron,先拿出上图中被红色三角形圈住的neuron,假设只有两个input x 1 , x 2 x_1,x_2 x1,x2,通过这个neuron,我们先得到 z = b + w 1 x 1 + w 2 x 2 z=b+w_1 x_1+w_2 x_2 z=b+w1x1+w2x2,然后经过activation function从这个neuron中output出来,作为后续neuron的input,再经过了非常非常多的事情以后,会得到最终的output y 1 , y 2 y_1,y_2 y1,y2
现在的问题是这样: ∂ l ∂ w \frac{\partial l}{\partial w} ∂w∂l该怎么算?按照chain rule,可以把它拆分成两项, ∂ l ∂ w = ∂ z ∂ w ∂ l ∂ z \frac{\partial l}{\partial w}=\frac{\partial z}{\partial w} \frac{\partial l}{\partial z} ∂w∂l=∂w∂z∂z∂l,这两项分别去把它计算出来。前面这一项是比较简单的,后面这一项是比较复杂的
计算前面这一项 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z的这个process,我们称之为Forward pass;而计算后面这项 ∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l的process,我们称之为Backward pass
Forward pass
先考虑 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z这一项,完全可以秒算出来, ∂ z ∂ w 1 = x 1 , ∂ z ∂ w 2 = x 2 \frac{\partial z}{\partial w_1}=x_1 ,\ \frac{\partial z}{\partial w_2}=x_2 ∂w1∂z=x1, ∂w2∂z=x2
它的规律是这样的:求 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z,就是看w前面连接的input是什么,那微分后的 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z值就是什么,因此只要计算出neural network里面每一个neuron的output就可以知道任意的z对w的偏微分
- 比如input layer作为neuron的输入时, w 1 w_1 w1前面连接的是 x 1 x_1 x1,所以微分值就是 x 1 x_1 x