神经网络反向传播的数学原理

如果能二秒内在脑袋里解出下面的问题,本文便结束了。

已知:J=(Xw-y)^T(Xw-y)=\left | \right | Xw-y\left | \right | ^2,其中X\in R^{m\times n},w\in R^{n\times1},y\in R^{m\times1}

求:\frac{\partial J}{\partial X},\frac{\partial J}{\partial w},\frac{\partial J}{\partial y}

到这里,请耐心看完下面的公式推导,无需长久心里建设。

首先,反向传播的数学原理是“求导的链式法则” :

设f和g为x的可导函数,则(f\circ g)'(x)=f'(g(x))g'(x)

接下来介绍

  • 矩阵、向量求导的维数相容原则

  • 利用维数相容原则快速推导反向传播

  • 编程实现前向传播、反向传播

  • 卷积神经网络的反向传播

快速矩阵、向量求导

这一节展示如何使用链式法则、转置、组合等技巧来快速完成对矩阵、向量的求导

一个原则维数相容,实质是多元微分基本知识,没有在课本中找到下列内容,维数相容原则是我个人总结:

维数相容原则:通过前后换序、转置 使求导结果满足矩阵乘法且结果维数满足下式:

如果x\in R^{m \times n},f(x) \in R^1 ,那么\frac{\partial f(x)}{\partial x} \in R^{m \times n}

利用维数相容原则解上例:

step1:把所有参数当做实数来求导,J=(Xw-y)^2

依据链式法则有\frac{\partial J}{\partial X}=2(Xw-y)w, \frac{\partial J}{\partial w}=2(Xw-y)X, \frac{\partial J}{\partial y}=-2(Xw-y)

可以看出除了\frac{\partial J}{\partial y}=-2(Xw-y)\frac{\partial J}{\partial X}\frac{\partial J}{\partial w}的求导结果在维数上连矩阵乘法都不能满足。

step2:根据step1的求导结果,依据维数相容原则做调整:前后换序、转置

依据维数相容原则\frac{\partial J}{\partial X} \in R^{m \times n},但\frac{\partial J}{\partial X} \in R^{m \times n}=2(Xw-y)w(Xw-y)\in R^{m \times 1}X \in R^{m \times n},自然得调整为\frac{\partial J}{\partial X}=2(Xw-y)w^T

同理:\frac{\partial J}{\partial w} \in R^{n \times 1},但\frac{\partial J}{\partial w} \in R^{n \times 1}=2(Xw-y)X(Xw-y) \in R^{m \times 1}X \in R^{m \times n},那么通过换序、转置我们可以得到维数相容的结果2X^T(Xw-y)

对于矩阵、向量求导:

  • “当做一维实数使用链式法则求导,然后做维数相容调整,使之符合矩阵乘法原则且维数相容”是快速准确的策略;

  • “对单个元素求导、再整理成矩阵形式”这种方式整理是困难的、过程是缓慢的,结果是易出错的(不信你试试)。

如何证明经过维数相容原则调整后的结果是正确的呢?直觉!简单就是美...

快速反向传播

神经网络的反向传播求得“各层”参数W和b的导数,使用梯度下降(一阶GD、SGD,二阶LBFGS、共轭梯度等)优化目标函数。

接下来,展示不使用下标的记法(W_{ij},b_iorb_j)直接对W和b求导反向传播链式法则维数相容原则的完美体现,对每一层参数的求导利用上一层的中间结果完成。

这里的标号,参考UFLDL教程 - Ufldl

前向传播:

z^{(l+1)}=W^{(l)}a^{(l)}+b^{(l)}    (公式1)

a^{(l+1)}=f(z^{(l+1)})             (公式2)

z^{(l)}为第 l 层的中间结果,a^{(l)} 为第 l 层的激活值,其中第 l +1层包含元素:输入a^{(l)},参数W^{(l)}b^{(l)},激活函数f(),中间结果z^{(l+1)},输出a^{(l+1)}

设神经网络的损失函数为J(W,b) \in R^1(这里不给出具体公式,可以是交叉熵、MSE等),根据链式法则有:

图片

这里记 \frac{\partial J(W,b)}{\partial {z^{(l+1)}}}=\delta ^{(l+1)},其中\frac{\partial z^{(l+1)}}{\partial W^{(l)}}=a^{(l)}\frac{\partial z^{(l+1)}}{\partial b^{(l)}}=1可由 公式1 得出,a^{(l)}加转置符号(a^{(l)})^T是根据维数相容原则作出的调整。

如何求 \delta ^{(l)}=\frac{\partial J(W,b)}{\partial z^{(l)}} ?可使用如下递推(需根据维数相容原则作出调整):

图片

其中

图片

那么我们可以从最顶层逐层往下,便可以递推求得每一层的\delta ^{(l)}=\frac{\partial J(W,b)}{\partial z^{(l)}}

注意:\frac{\partial a^{(l)}}{\partial z^{(l)}}=f'(z^{(l)})是逐维求导,在公式中是点乘的形式。

反向传播整个流程如下:

1) 进行前向传播计算,利用前向传播公式,得到隐藏层和输出层 的激活值。

2) 对输出层(第 l 层),计算残差:\delta ^{(l)}=\frac{\partial J(W,b)}{\partial z^{(l)}}(不同损失函数,结果不同,这里不给出具体形式)

3) 对于l-1,l-2,\cdot \cdot \cdot ,2的隐藏层,计算:

图片

4) 计算各层参数W^{(l)},b^{(l)}偏导数:

图片

编程实现

大部分开源library(如:caffe,Kaldi/src/{nnet1,nnet2})的实现通常把W^{(l)},b^{(l)}作为一个layer,激活函数f()作为一个layer(如:sigmoid、relu、softplus、softmax)。

反向传播时分清楚该层的输入、输出即能正确编程实现,如:

图片

(1)式AffineTransform/FullConnected层,以下是伪代码:

图片

注: out_diff = \frac{\partial J}{\partial z^{(l+1)}}是上一层(Softmax 或 Sigmoid/ReLU的 in_diff)已经求得:

图片

(2)式激活函数层(以Sigmoid为例)

图片

注:out_diff = \frac{\partial J}{\partial a^{(l+1)}}是上一层AffineTransform的in_diff,已经求得,

图片

在实际编程实现时,in、out可能是矩阵(通常以一行存储一个输入向量,矩阵的行数就是batch_size),那么上面的C++代码就要做出变化(改变前后顺序、转置,把函数参数的Vector换成Matrix,此时Matrix out_diff 每一行就要存储对应一个Vector的diff,在update的时候要做这个batch的加和,这个加和可以通过矩阵相乘out_diff*input(适当的转置)得到。

如果熟悉SVD分解的过程,通过SVD逆过程就可以轻松理解这种通过乘积来做加和的技巧。

丢掉那些下标记法吧!

卷积层求导

卷积怎么求导呢?实际上卷积可以通过矩阵乘法来实现(是否旋转无所谓的,对称处理,caffe里面是不是有image2col),当然也可以使用FFT在频率域做加法。

那么既然通过矩阵乘法,维数相容原则仍然可以运用,CNN求导比DNN复杂一些,要做些累加的操作。具体怎么做还要看编程时选择怎样的策略、数据结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/192865.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 整合 Freemarker

通过 Freemarker 模版,我们可以将数据渲染成 HTML 网页、电子邮件、配置文件以及源代码等。 Freemarker 不是面向最终用户的,而是一个 Java 类库,我们可以将之作为一个普通的组件嵌入到我们的产品中。 Freemarker 模版后缀为 .ftl(FreeMarke…

PC端使子组件的弹框关闭

子组件 <template><el-dialog title"新增部门" :visible"showDialog" close"close"> </el-dialog> </template> <script> export default {props: {showDialog: {type: Boolean,default: false,},},data() {retu…

9 HDFS架构剖析

问题 100台服务器&#xff0c;存储空间单个200GB 20T 5T文件如何存储&#xff1f; 128MB一块 128MB81GB 1288*10241TB 5T数据分成的128MB的块数 8192 * 5 客户端(client)代表用户通过与namenode和datanode交互来访问整个文件系统。 HDFS集群有两类节点&#xff1a; 一个na…

Unity中Shader立方体纹理Cubemap

文章目录 前言一、什么是立方体纹理二、立方体纹理的生成方式1、使用6个面的生成方式2、使用单张图片的生成方式 三、Cubemap的采样方式四、在Unity中看一下Cubemap五、在Shader中&#xff0c;对立方体纹理进行采样使用1、我们在属性面板定义一个Cube类型的变量来存放立方体纹理…

多功能神器,强劲升级,太极2.x你值得拥有!

嗨&#xff0c;大家好&#xff0c;今天给大家分享一个好用好玩的软件。那就是太极2.x软件&#xff0c;最近在1.0版本上进行了全新升级&#xff0c;升级后的功能更强更稳定&#xff0c;轻度用户使用基本功能就已经足够了&#xff0c;我们一起来看看吧&#xff01; 首页 首页左…

15项基本SCADA技术技能

1. 人机界面 人机界面是将操作员连接到设备、系统或机器的仪表板或用户界面。 以下是 hmi 在 scada 技术人员简历中的使用方式&#xff1a; 完成了查尔斯湖废水处理厂和提升站的完整 HMI 图形界面。对加油系统、加油车、PLC、HMI、触摸屏进行故障排除和维修。对 Horner HMI …

策略模式在数据接收和发送场景的应用(升级版)

1.背景 在数据接收和发送场景打算使用了 if else 进行判断&#xff1a; if("A".equals(system)){ASystem.sync("向A同步数据"); } if("B".equals(system)){BSystem.sync("向B同步数据"); } ... 非常麻烦&#xff0c;需求多了很臃肿&…

C/C++字符判断 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C字符判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C字符判断 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 对于给定的字符&#xff0c;如果该字符是大小写字母或…

使用opera/火狐浏览器将网页固定到桌面和任务栏

1.单击Windows 图标&#xff0c;搜索Opera&#xff0c;右键单击它&#xff0c;然后选择Open file location 2.右键单击Opera&#xff0c;然后选择Show more options 3.将光标悬停在“发送到”选项上&#xff0c;然后选择“桌面&#xff08;创建快捷方式&#xff09;” 4.转到…

springboot项目中获取业务功能的导入数据模板文件

场景: 在实际业务场景中,经常会遇到某些管理功能需要数据导入共功能,但既然是导入数据,肯定会有规则限制,有规则就会有数据模板,但这个模板一般是让客户自己下载固定规则模板,而不是让客户自己随便上传模板。下面介绍直接下载模板 一、下载模板示例 1、在项目的…

剑指JUC原理-20.并发编程实践

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

综述:目标检测二十年(机翻版)(未完

原文地址 20年来的目标检测&#xff1a;一项调查 摘要关键词一 介绍二 目标检测二十年A.一个目标检测的路线图1)里程碑&#xff1a;传统探测器Viola Jones探测器HOG检测器基于可变形零件的模型&#xff08;DPM&#xff09; 2)里程碑&#xff1a;基于CNN的两阶段探测器RCNNSPPN…