基于经典的前向传播算法和反向传播算法共同完成神经网络的训练
神经网络
神经网络可以理解为一个输入X到输出Y的映射函数,f(X)=Y,其中这个映射f就是我们所要训练的网络参数W,我们只要训练出来了参数W,那么对于任何输入x,我们就能得到一个与之对应的输出y。只要f不同,那么同一个x就会产生不同的y,我们当然是想要获得最符合真实数据的y了,那么我们就要训练出一个最符合真实数据的映射f,那么训练最符合真实数据f的过程就是神经网络的训练过程,神经网络的训练可以分为两个步骤:一个是前向传播,另外一个是反向传播。
神经网络
神经网络的前向传播
神经网络从输入层到输出层
前向传播就是从输入层开始(Layer1),经过一层层的Layer,不断计算每一层的z和a,最后得到输出y^的过程。
我们可以将神经网络分解为许多个神经元,每个神经元接收上一层的输入进行简单的逻辑回归操作,全部神经元从输入层开始到输出层依次进行逻辑回归的过程我们可以简单的理解为神经网络的前向传播。
单个神经元的逻辑回归
前向传播是从神经网络的输入层开始,逐渐往输出层进行前向传播,上一层的神经元与本层的神经元有连接,那么本层的神经元的激活等于上一层神经元对应的权值进行加权和运算,最后通过一个非线性函数(激活函数)如ReLu,sigmoid等函数,最后得到的结果就是本层神经元的输出。神经网络逐层逐神经元通过该操作向前传播,最终得到输出层的结果。
前向传播公式
我们通过公式可以看出来前向传播是从Layer1层到Layer4层,最终的a(4)就是神经网络的前向传播输出y^。
神经网络的反向传播
前向传播计算出了预测值y^,就可以根据y^和真实值y的差别来计算损失L(y^,y),反向传播就是根据损失函数L(y^,y)来反方向地计算每一层的z、a、w、b的偏导数(梯度),从最后一层逐层向前去改变每一层的权重,也就是更新参数,其核心是损失L对每一层的每一个参数求梯度的链式求导法则。
现在我们有一个如下所示的神经网络,我们对其进行反向传播,来看一下反向传播的是怎样进行的?
反向传播示例
计算反向传播,我们首先需要通过前向传播的y^(output)和真实样本y(target)计算此时神经网络的损失,这个神经网络有两个输出,所以我们的损失应该是两个输出神经元损失的和:
神经网络的总损失E——L(y^,y)
我们先来看一下参数w5对整体误差产生了影响,可以用整体误差对w5求偏导,总体误差对w5求偏导的链式规则如下所示:
对参数w5求偏导
我们如图所示可以看到总损失E对W5求偏导,我们可以直接使用总损失对W5求偏导,它的效果和Eo1对W5求偏导是一样的,因为Eo2和W5并没有链式连接,所以Eo2对W5的偏导数为0。
对w5求偏导的链式法则
其中:
链式法则分解
我们对其进行整合:
对w1求导进行整合
这样我们就将损失对w5的偏导数求出来了,我们在来看一下总损失E对w1的偏导数的计算过程
对参数w1求偏导
我们知道反向传播的核心是链式求导,我们可以看到Eo1和Eo2都可以将损失传递给w1,所以我们可以分为两条链来对w1求偏导,一条链是Eo1对w1求偏导,另外一条链是Eo2对w1求偏导。
对w1求偏导
其中:
链式法则分解
对w5求偏导进行整合
w5求偏导进行整合
我们分别对w1和w5求偏导数,现在我们已经知道了如何对神经网络权重参数求解偏导数,这就是神经网络的反向传播算法,求出偏导数之后,我们下面的任务就是进行梯度下降从而更新参数。
梯度下降
神经网络就是通过不断的前向传播和反向传播不断调整神经网络的权重,最终到达预设的迭代次数或者对样本的学习已经到了比较好的程度后,就停止迭代,那么一个神经网络就训练好了。