由于之前看的深度学习的知识都比较零散,补一下吴老师的课程希望能对这块有一个比较完整的认识。课程分为5个部分(粗体部分为已经看过的):

  1. 神经网络和深度学习
  2. 改善深层神经网络:超参数调试、正则化以及优化
  3. 结构化机器学习项目
  4. 卷积神经网络
  5. 序列模型

第 1 部分讲的是神经网络的基础,从逻辑回归到浅层神经网络再到深层神经网络。

一直感觉反向传播(Back Propagation,BP)是这部分的重点,但是当时看的比较匆忙,有些公式的推导理解的不深刻,现在重新回顾一下,一是帮助自己梳理思路加深理解,二是记录下来以免遗忘。

1. 符号规定

图1 神经网络示意图1

一般计算神经网络层数时不包括输入层,因此图1中的网络层数 L 为4;

n[l] 表示第 l 层的神经元的数量,n[1] = n[2] = 5,n[3] = 3, n[4] =1,n[0] = nx = 3;

z[l] = W[l]·a[l-1] + b[l],w[l] 表示第 l 层的权重,b[l] 表示偏置;

a[l] 表示第 l 层中通过激活函数 g[l] 激活后的值,表示如下:a[l] = g[l](z[l])。

2. 核对矩阵维数

吴恩达老师推荐的小技巧,通过核对矩阵的维数可以有效地判断代码是否有错。核对矩阵维数对后面的反向传播公式的推导很有帮助

图2 神经网络示意图2

举个例子:z[1] = W[1]·x+ b[1]

从图2可以看出:x 的维度是 (2,1),且 z[1] 的维度是 (3,1),由于等式两边维度一致,因此可以推出 W[1] 的维度为 (3,2),且 b[1] 也为(3,1)。从正面看,因为第 1 层有 3 个神经元,且有 2 个输入,因此每个神经元中的参数要分别与两个输入相乘,也很容易得出 W[1] 的维度。同理可以推出后面层的参数的维度,总结规律是:

W[l] = (n[l],n[l-1])

a[l] = (n[l],1)

z[l] = b[l] = (n[l],1)

dx 和 x 的维度相同

若有 m 个样本,将公式向量化之后只需将 a[l] 和 z[l] 改为大写,并将 1 改为 m 即可(对b,Python的广播机制将其维数从 1 变为 m )。

3. 前向传播和反向传播

3.1 前向传播

Input:a[l-1]

Output:a[l], cache(z[l]) (or W[l], b[l])

FP 的两个公式,比较简单,直接代入即可(主要根据这两个公式推导BP):

z[l] = W[l]·a[l-1] + b[l]  ---------  ①

a[l] = g[l](z[l]------------------- ②

3.2 反向传播

Input:da[l]

Output:da[l-1], dW[l], db[l]

BP的公式:

1. 首先求dz[l],由公式②,dz[l] = da[l]*g[l]'(z[l]),根据链式求导法则得出,因为*是元素对应相乘,所以两者顺序对结果不影响。

2. 再求dW[l],由公式①,dW[l] = dz[l]·a[l-1]T,因为乘积为点乘,因此两者顺序影响结果。此时,我们可以分析矩阵的维度来判断顺序以及是否要转置。dW[l] 为 (n[l],n[l-1]),dz[l]为 (n[l],1),a[l-1]为 (n[l-1],1),因此,要得到 dW[l] 的维度,应该将 dz[l] 放在前,并与a[l-1]T作点积运算。(注:吴恩达老师在讲课时,写的是a[l-1],我个人认为此处是笔误,欢迎大家讨论)

3. 同样根据公式①,容易得出:db[l] = dz[l]

4. 最后,根据公式①,da[l-1] = W[l]T·dz[l],da[l-1] 的维度为 (n[l-1],1),W[l] 的维度为 (n[l],n[l-1]),dz[l]为 (n[l],1),显然需要将W[l]转置再与dz[l]作点积。

这样我们就得到的 Output 的三个值。

上面是我总结的关于方向传播中公式推导的一些技巧。可能是刚接触深度学习,对这些矩阵的维数以及是否要转置等等还不敏感,在找相关资料时也没有详细的解释(可能是因为太简单?...),于是自己梳理了一下。当然如果大家有更好的方法,望不吝赐教!

参考资料:http://mooc.study.163.com/course/2001281002?tid=2001392029#/info

吴恩达深度学习 反向传播(Back Propagation)公式推导技巧的更多相关文章

  1. 吴恩达深度学习第1课第4周-任意层人工神经网络(Artificial Neural Network,即ANN)(向量化)手写推导过程(我觉得已经很详细了)

    学习了吴恩达老师深度学习工程师第一门课,受益匪浅,尤其是吴老师所用的符号系统,准确且易区分. 遵循吴老师的符号系统,我对任意层神经网络模型进行了详细的推导,形成笔记. 有人说推导任意层MLP很容易,我 ...

  2. 吴恩达深度学习第4课第3周编程作业 + PIL + Python3 + Anaconda环境 + Ubuntu + 导入PIL报错的解决

    问题描述: 做吴恩达深度学习第4课第3周编程作业时导入PIL包报错. 我的环境: 已经安装了Tensorflow GPU 版本 Python3 Anaconda 解决办法: 安装pillow模块,而不 ...

  3. 吴恩达深度学习第2课第2周编程作业 的坑(Optimization Methods)

    我python2.7, 做吴恩达深度学习第2课第2周编程作业 Optimization Methods 时有2个坑: 第一坑 需将辅助文件 opt_utils.py 的 nitialize_param ...

  4. 【Deeplearning.ai 】吴恩达深度学习笔记及课后作业目录

    吴恩达深度学习课程的课堂笔记以及课后作业 代码下载:https://github.com/douzujun/Deep-Learning-Coursera 吴恩达推荐笔记:https://mp.weix ...

  5. 深度学习 吴恩达深度学习课程2第三周 tensorflow实践 参数初始化的影响

    博主 撸的  该节 代码 地址 :https://github.com/LemonTree1994/machine-learning/blob/master/%E5%90%B4%E6%81%A9%E8 ...

  6. 吴恩达深度学习笔记(deeplearning.ai)之循环神经网络(RNN)(三)

    1. 导读 本节内容介绍普通RNN的弊端,从而引入各种变体RNN,主要讲述GRU与LSTM的工作原理. 事先声明,本人采用ng在课堂上所使用的符号系统,与某些学术文献上的命名有所不同,不过核心思想都是 ...

  7. 吴恩达深度学习第1课第3周编程作业记录(2分类1隐层nn)

    2分类1隐层nn, 作业默认设置: 1个输出单元, sigmoid激活函数. (因为二分类); 4个隐层单元, tanh激活函数. (除作为输出单元且为二分类任务外, 几乎不选用 sigmoid 做激 ...

  8. 吴恩达深度学习笔记(十一)—— dropout正则化

    主要内容: 一.dropout正则化的思想 二.dropout算法流程 三.dropout的优缺点 一.dropout正则化的思想 在神经网络中,dropout是一种“玄学”的正则化方法,以减少过拟合 ...

  9. Coursera 吴恩达 深度学习 学习笔记

    神经网络和深度学习 Week 1-2 神经网络基础 Week 3 浅层神经网络 Week 4 深层神经网络 改善深层神经网络 Week 1 深度学习的实用层面 Week 2 优化算法 Week 3 超 ...

随机推荐

  1. chromium之message_pump_win之一

    写了22篇博文,终于到这里了———— MessagePumpWin!!! MessagePumpWin这个类还是挺复杂的,可以分成好几部分.接下来分块分析 从介绍看,MessagePumpWin 是M ...

  2. 笔记: js构造函数与原型

    目录 构造函数与原型介绍 涉及三种引用的操作 有关原型及原型链的一些相关方法总结 @ 构造函数与原型介绍 1.函数与函数的原型对象(prototype object): 在JavaScript中,创建 ...

  3. 【mongodb分片中mogos启动的报错】

  4. HTML5文本

    1.重要文本.斜体文本 粗体:<strong></strong> 粗体:<b></b> 斜体:<em></em> 斜体:< ...

  5. 退出循环break,continue,return,goto分析

    /* 在循环中间设置单个或者多个退出点,可以使用的语句有:break语句.continue语句.goto语句. return */ (1)break :break语句语句用于循环或 switch 语句 ...

  6. 关于mysql 8.0.13zip包安装

    mysql 8.0.13默认有一个data文件夹,这个文件夹得删了,不然安装服务时候会有日志文件提示报错: Failed to find valid data directory. Data Dict ...

  7. 聊天功能插件Socket.io

    一.Socket.io是什么 是基于时间的实时双向通讯库 基于websocket协议的 前后端通过时间进行双向通讯 配合express快速开发实时应用 二.Socket.io和ajax区别 基于不同的 ...

  8. 北京Uber优步司机奖励政策(12月31日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. day 2 给程序传递参数

    1.如何实现变化name name = "alex" print("欢迎%s前来指导学习"%name) 欢迎alex前来指导学习 2.sys.argv impo ...

  10. sphinx生成cakephp文档

    cakephp的文档是用一个叫sphinx程序生成的 这个程序是python写的,所以我们要用sphinx本机必须先装python. 编译过程在Ubuntu下进行,默认Ubuntu已经安装了pytho ...