![深度学习与MindSpore实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/465/34061465/b_34061465.jpg)
3.2 反向传播
第1章中介绍了梯度下降算法训练回归模型,神经网络模型也一样需要使用梯度下降算法来更新参数。然而一个神经网络通常会有上百万的参数,那么如何高效地计算这百万级别的参数是需要重点考虑的问题。神经网络中使用反向传播(Backward Propagation)算法,使得计算梯度更加有效率。
在介绍反向传播之前,先来介绍一下链式法则。假设有两个函数y=g(x)和z=h(y),那么z对x的求导过程如下:
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P44_12319.jpg?sign=1739604027-eMG25eBbnjmNoiMSsnjrtrjbQ6jt2pe8-0-5a7f52d98e7784d11321a64ba6dd795b)
假设有三个函数x=g(s)、y=h(s)和z=k(x,y),z对s的求导过程如下:
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P45_12322.jpg?sign=1739604027-iFrk2rycLENEx4MvfaHDAgiWgsCMYJEA-0-c8668691ae67dbec65c1bf90a1d48ebc)
神经网络的梯度计算,就是依赖链式法则一层层反向传播的。
如图3.4所示的前向神经网络,输入层有n个属性x1,x2,…,xn,中间隐藏层有p个神经元,第j个神经元为hj,j∈(0,p-1)。
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P45_3973.jpg?sign=1739604027-QWTVUYOpqHDOGzkmxzIgpuo1MUpgkoRs-0-d5689dc8942382b2218853f110fa8caa)
图3.4 神经网络结构
输出层为q维。对隐藏层的每一个神经元hj,先经过一个线性变换,公式如下:
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P45_12324.jpg?sign=1739604027-82ezyRUHksjGnyRc98SqvF6mtU2aEqB7-0-a81a2c86ddff2b6b0a84758de557a620)
式中,wj0——偏置值;
wj1,wj2,…,wjn——作用在属性x1,x2,…,xn上的权重。
输入给神经元后,经过激活函数的作用得到
。第二层同理有神经元输入:
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P45_12325.jpg?sign=1739604027-csw3yQALnIjWX7taOOYIbxlVJj3pdntk-0-293df59577c4a083a97068b97e9baaf2)
输出。以上为前向神经网络的前向传播(Forward Propagation)过程。
对单个数据样本(x,y),假设损失函数为均方差,则对第k个输出项的损失为:
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P45_12327.jpg?sign=1739604027-BoCLmUJC79C1vC8cSZViDXD8sDbLLPTC-0-b1cc0007845ba54d063c710ee34488d3)
通过链式法则,损失函数对权重vkj的梯度为:
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P45_12329.jpg?sign=1739604027-QLZ5nlEkrJfggjLB6GjVc3RXk8usdtMJ-0-3072fcedc15f62b21d4f94a8c72239c1)
式中,第一项;
第三项。
而对于第二项,假设激活函数为sigmoid函数,则梯度有一个很好的性质,即:
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P46_12344.jpg?sign=1739604027-Ujctm5CdxrYGkYOf1Ek1B8C76ICHA5Uj-0-5aecbf648d7b1cb4d1148ad9f0f1ff09)
三项相乘可以得到:
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P46_12346.jpg?sign=1739604027-SQnPpTKPy4cwgXZnNUyUwTTfBl8lGMIE-0-96999e99f72eb575dc593b1703a6a74c)
由于真实标签yk由数据给定,而输出值与hj均由前向传播算法计算得到,则可以轻易地计算得到每个中间层权重vkj,并且该计算过程可以并行进行。
类似地,可以得到损失值在隐藏单元hj上的累积梯度为
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P46_12348.jpg?sign=1739604027-vAOKe7eAhYiZaZpoIim6LBTamjPIbSaY-0-33c36b7779710a7a7bd2e7980a526fa0)
同理,可以通过链式法则,得到损失函数对第一层权重wji的梯度为(假设隐藏层激活函数为ReLU函数):
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P46_12350.jpg?sign=1739604027-54acZt2jId8lMcdZvcbiGDSQ1XwQ8mIn-0-28fd0b6bb665ad79c72ef7f516fec4d0)
式中,。
在上一步计算得到后,
也可以高效并行地计算出。
在上述过程中,假设了损失函数是均方差,激活函数为sigmoid和ReLU,其实这样的计算法则对任意可微的损失函数和激活函数都是有效的。从计算过程来看,在前向传播得到隐藏层与输出层数值后,先从损失函数算起,接着从顶层逐渐计算梯度,将梯度逐层往输入层传播。这与前向传播的顺序是相反的,也是该算法为什么被称为反向传播的原因。反向传播(见图3.5)得到所有参数的梯度之后,可以利用梯度下降算法对参数进行更新迭代,从而达到训练神经网络的目的。神经网络训练过程如算法3.1所示。
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P47_4100.jpg?sign=1739604027-klcBRJQfhIgWKWBCWENqUtiNyDlSXdcw-0-a09f3b17af33bed92a0e87f688328a26)
图3.5 反向传播示意图
算法3.1 神经网络训练过程
输入:数据集,步长为α,小批量训练样本的大小为b,迭代次数为T
输出:训练完成的神经网络
(1) 初始化网络参数w0
(2) for t∈{1,2,…,T}
(3) 从m个样本中均匀随机无放回选取b个样本mb
(4) 前向传播逐层计算隐藏层的参数值,得到样本输出
(5) 根据损失函数计算误差,得到输出层梯度
(6) 反向逐层计算隐藏层梯度
(7) 计算连接参数梯度并更新参数
![](https://epubservercos.yuewen.com/7DD6F1/18225432101803406/epubprivate/OEBPS/Images/Figure-P47_12363.jpg?sign=1739604027-5HpnZg6wvGiMjcgw9V4WYBIifJyugEgZ-0-9cd8db30473674914c71562b11d89ef3)