由于之前看的深度学习的知识都比较零散,补一下吴老师的课程希望能对这块有一个比较完整的认识。课程分为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. 三、Hadoop 的 API

    1.环境搭建 <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop- ...

  2. iOS之利用runtime,避免可变数组和可变字典为nil或者数组越界导致的崩溃

    NSArray.NSMutableArray.NSDictionary.NSMutableDictionary.是我们的在iOS开发中非常常用的类.当然,在享受这些类的便利的同时,它们也给我们带来一些 ...

  3. JavaScript基础部分经典案例

    再复杂的程序都是由一个个简单的部分组成. 001案例 - 交换两个变量的值 方法01 - 使用临时变量 var n1 = 5; var n2 = 6; // 创建一个临时中介变量 tmp var tm ...

  4. 浅谈React、Vue 部分异步

    React中的setState setState为什么需要异步? 无法限制何时使用异步,多次连续使用setState 防止多次渲染,异步rendering不仅仅是性能上的优化,而且这可能是react组 ...

  5. 编译升级至openssh7.6

    1.概述 目的:下载源码包(https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-7.6p1.tar.gz),编译升级为openssh为7.6 ...

  6. 增强for循环和迭代器

    package example6; import java.util.ArrayList;import java.util.Iterator;import java.util.List; class ...

  7. @Component注解、@Service注解、@Repository注解、@Controller注解区别

    --------------------------------------------------------------------------------------------------- ...

  8. js数组去重(多种写法)

    最基本的写法 使用indexOf() var arr = [1,1,5,77,32,54,2,4,5,2,2,4,52,2,2,2,2,2] //比较常规的语法使用indexOf来判断是否已经存在 g ...

  9. .Net Core使用Redis-从安装到使用

    一.安装 本文使用的操作系统是Centos7 在Redis中文网下载最新的Redis压缩包:http://www.redis.cn/ 把包上传到Liunx服务器上,cd 到包所在的目录执行以下命令 # ...

  10. 第一章:程序设计和C语言

    一.什么是计算机程序? 所谓程序就是一组计算机能识别和执行的指令.计算机的一切操作都是由程序控制的,本质是程序的机器,程序和指令是计算机系统最基本的概念. 二.什么是计算机语言? 人和计算机交流信息要 ...