神经网络前向传播与反向传播

神经网络

神经网络可以理解为一个输入x到输出y的映射函数,即f(x)=y,其中这个映射f就是我们所要训练的网络参数w,我们只要训练出来了参数w,那么对于任何输入x,我们就能得到一个与之对应的输出y。只要f不同,那么同一个x就会产生不同的y,我们当然是想要获得最符合真实数据的y,那么我们就要训练出一个最符合真实数据的映射f。训练最符合真实数据f的过程就是神经网络的训练过程,神经网络的训练可以分为两个步骤:一个是前向传播,另外一个是反向传播

神经网络的前向传播

神经网络前向传播从输入层到输出层:前向传播就是从输入层开始(Layer1),经过一层层的Layer,不断计算每一层的神经网路得到的结果 n e t a net_{a} neta及通过激活函数(一般使用Relu函数)的本层输出结果 o u t z out_{z} outz,最后得到输出 y ˉ \bar{y} yˉ的过程。前向传播公式:
a ( 1 ) = x z ( 2 ) = R e l u ( a ( 1 ) ) a ( 2 ) = g ( z ( 2 ) ) z ( 3 ) = R e l u ( a ( 2 ) ) . . . . \\a^{(1)}=x\\z^{(2)}=Relu(a^{(1)})\\a^{(2)}=g(z^{(2)})\\z^{(3)}=Relu(a^{(2)})\\.... a(1)=xz(2)=Relu(a(1))a(2)=g(z(2))z(3)=Relu(a(2))....
这里公式只写了包括输入层的前三个Layer的结果,依次最后由Layer4输出的结果为 y ˉ = a ( 4 ) = g ( z 4 ) \bar{y}=a^{(4)}=g(z^{4}) yˉ=a(4)=g(z4)

神经网络的反向传播
前向传播计算出了预测值 y ˉ \bar{y} yˉ,就可以根据 y ˉ \bar{y} yˉ和真实值y的差别来计算损失 L ( y ˉ , y ) L(\bar{y},y) L(yˉ,y),反向传播就是根据损失函数 L ( y ˉ , y ) L(\bar{y},y) L(yˉ,y)来反方向地计算每一层的a、z、w、b的偏导数(梯度),从最后一层逐层向前去改变每一层的权重,也就是更新参数,其核心是损失L对每一层的每一个参数求梯度的链式求导法则。

计算反向传播,我们首先需要通过前向传播的输出 y ˉ \bar{y} yˉ和真实样本y(target)计算此时神经网络的损失,这个神经网络有两个输出,所以我们的损失应该是两个输出神经元损失的和, 神经网络的总损失 E ← L ( y ˉ , y ) E\leftarrow L(\bar{y},y) EL(yˉ,y)
E t o t a l = ∑ 1 2 ( t a r g e t − o u t p u t ) 2 E t o t a l = E o 1 + E o 2 E_{total}=\sum{\frac{1}{2}(target-output)^{2}}\\E_{total}=E_{o1}+E_{o2} Etotal=21(targetoutput)2Etotal=Eo1+Eo2
对参数w5求偏导可以看出w5对整体误差产生的影响,总体误差对w5求偏导的链式规则如下所示:
E o 1 = ∑ 1 2 ( t a r g e t o 1 − o u t p u t o 1 ) 2 E t o t a l = E o 1 + E o 2 E_{o1}=\sum{\frac{1}{2}(target_{o1}-output_{o1})^{2}}\\E_{total}=E_{o1}+E_{o2} Eo1=21(targeto1outputo1)2Etotal=Eo1+Eo2
w5求偏导进行整合,求出偏导数之后,下面的任务就是进行梯度下降从而更新参数:
w 5 + = w 5 − η ∗ ∂ E t o t a l ∂ w 5 \\w_{5}^{+}=w_{5}-\eta*\frac{\partial E_{total}}{\partial w_{5}} w5+=w5ηw5Etotal

梯度下降 神经网络就是通过不断的前向传播和反向传播不断调整神经网络的权重,最终到达预设的迭代次数或者对样本的学习已经到了比较好的程度后,就停止迭代,那么一个神经网络就训练好了。