数据学习
登录
注册
原创博客
期刊会议
学术世界
期刊出版社
领域期刊
SCI/SCIE/SSCI/EI简介
期刊列表
会议列表
所有期刊分区
学术期刊信息检索
JCR期刊分区查询
CiteScore期刊分区查询
中科院期刊分区查询
领域期刊分区
管理 - UTD24期刊列表
管理 - AJG(ABS)期刊星级查询
管理 - FMS推荐期刊列表
计算机 - CCF推荐期刊会议列表
高校期刊分区
南大核心(CSSCI)
合工大小核心
合工大大核心
AI资源仓库
AI领域与任务
AI研究机构
AI学术期刊
AI论文快讯
AI数据集
AI开源工具
AI模型
AI模型概览图
AI模型月报
AI基础大模型
AI预训练大模型
数据推荐
网址导航
我的网址导航
程序员必备网站
深度学习的反向传播手动推导
标签:
#反向传播#
#梯度下降#
#深度学习#
时间:2019/06/04 11:37:14
作者:小木
反向传播算法是深度学习求解最重要的方法。这里我们手动推导一下。 一般来说,我们讲神经网络的层数,是包含输出层,但是不包含输入层的。因此,神经网络第一层的输入是数据,最后一层的输出就是预测结果了。在这里我们主要讲反向传播的推导,因此为了简便,忽略了维度的表示。以下符号并没有考虑维度。 [TOC] #### 一、符号说明 假设我们的输入数据是$X$,真实的标签是$y$。 首先假设神经网络有$L$层,最后一层是输出层,只有一个神经元。每层的变量和函数都使用
上标
表示其所在的层。每一层的激活函数的输出为$A$,激活函数的输入是$Z$,它是由权重矩阵$W$和偏移$b$一起,作用于输入得到的。当这个层是第一层的时候,输入是数据$X$,当这个层不是第一层的时候,其输入是前一层的激活函数的输出。假设输出层的输出是$\hat{y}$,即预测结果。 #### 二、前向传播表示 那么,假设我们考虑第$l$个隐层,其输入是$A^{[l-1]}$,那么,其前向传播(forward propagation)的表示为: ```math Z^{[l]} = W^{[l]} A^{[l-1]} + b^{[l]} ``` ```math A^{[l]} = g^{[l]}(Z^{[l]}) ``` 当$l=1$的时候,$A^{[0]}=X$。当$l=L$的时候,$A^{[L]}=\hat{y}$。 #### 三、反向传播推导 反向传播是从输出层开始,逐层计算梯度,并更新权重。我们首先定义损失函数,假设这里的标签是连续值,我们采用“平方损失函数(Square Loss)”: ```math J = \frac{1}{2}(\hat{y} - y )^2 = \frac{1}{2}(A^{[L]} - y )^2 ``` 我们先说明一下输出层的前向传播结果。输出层为$L$层,其输入是$A^{[L-1]}$,权重和偏移分别为$W^{[L]}$和$b^{[L]}$,激活函数为$g^{[L-1]}(\cdot)$,那么其前向传播的表示为: ```math Z^{[L]} = W^{[L]} A^{[L-1]} + b^{[L]} ``` ```math A^{[L]} = \hat{y} = g^{[L]}(Z^{[L]}) ``` 反向传播的第一步,初始化计算最后一层的$dA^{[L]} = \partial J / \partial A^{[L]}$: ```math \begin{aligned} dA^{[L]} &= \frac{\partial J }{ \partial A^{[L]}}\\ &\\ &= (\hat{y} - y )\hat{y}'\\ &\\ &= (\hat{y} - y ) \end{aligned} ``` 接下来,就是给定$dA^{[L]}$,计算$dZ^{[L]}$,也就是损失函数对$Z^{[L]}$的偏导: ```math \begin{aligned} dZ^{[L]} &= \frac{\partial J}{\partial Z^{[L]}}\\ &\\ &= (\hat{y} - y) \cdot \frac{\partial \hat{y}}{\partial Z^{[L]}} \\ &\\ &=(\hat{y} - y) \cdot g^{[L]'}(Z^{[L]}) \\ &\\ &= dA^{[L]} \cdot g^{[L]'}(Z^{[L]}) \end{aligned} ``` 接下来就是求$dW^{[L]}$: ```math \begin{aligned} dW^{[L]} &= \frac{\partial J}{\partial W^{[L]}}\\ &\\ &= (\hat{y} - y) \cdot \frac{\partial \hat{y}}{\partial W^{[L]}} \\ &\\ &=(\hat{y} - y) \cdot g^{[L]'}(Z^{[L]}) \cdot \frac{\partial Z^{[L]}}{\partial W^{[L]}} \\ &\\ &=dZ^{[L]} \cdot A^{[L-1]} \end{aligned} ``` 继续求$db^{[L]}$: ```math \begin{aligned} db^{[L]} &= \frac{\partial J}{\partial b^{[L]}}\\ &\\ &= (\hat{y} - y) \cdot \frac{\partial \hat{y}}{\partial b^{[L]}} \\ &\\ &=(\hat{y} - y) \cdot g^{[L]'}(Z^{[L]}) \cdot \frac{\partial Z^{[L]}}{\partial b^{[L]}} \\ &\\ &=dZ^{[L]} \end{aligned} ``` 最后求$dA^{[L-1]}$: ```math \begin{aligned} dA^{[L-1]} &= \frac{\partial J}{\partial A^{[L-1]}}\\ &\\ &= (\hat{y} - y) \cdot \frac{\partial \hat{y}}{\partial A^{[L-1]}} \\ &\\ &=(\hat{y} - y) \cdot g^{[L]'}(Z^{[L]}) \cdot \frac{\partial Z^{[L]}}{\partial A^{[L-1]}} \\ &\\ &=dZ^{[L]} \cdot W^{[L]} \end{aligned} ``` 然后就要更新参数了: ```math W^{[L]} = W^{[L]} - \alpha dW^{[L]} ``` ```math b^{[L]} = b^{[L]} - \alpha db^{[L]} ``` 至此,就是根据$dA^{[L-1]}$,继续计算剩下的$dA^{[L-2]}$、$dW^{[L-1]}$和$db^{[L-1]}$,然后更新参数。直到第一层为止。 注意:这里都是矩阵计算的方式,一个批次的数据一起计算求和之后需要除以批次中数据的数据量。 #### 四、总结 根据上述计算,我们知道,在计算反向传播的时候,第一步需要我们计算前向传播的结果并保存。以第$l$层为例,我们保存前向传播中的$A^{[l]}$、$Z^{[l]}$、$W^{[l]}$和$b^{[l]}$。 在反向传播中,我们先初始化计算最后一层的$dA^{[L]}$。剩下的就是循环计算: 给定$dA^{[L]}$,求$dA^{[L-1]}$、$dW^{[L]}$和$db^{[L]}$,计算过程中,我们会用到前面保存的前向传播结果,计算方法如下: ```math dZ^{[l]} = dA^{[l]} \cdot g^{[l]'}(Z^{[l]}) ``` ```math dW^{[l]} = dZ^{[L]} \cdot A^{[L-1]} ``` ```math db^{[l]} = dZ^{[L]} ``` ```math dA^{[l-1]} = dZ^{[L]} \cdot W^{[L]} ``` 至此,反向传播计算完成。
欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
相关博客
最热博客