文章目录

  • 引言
  • 深层神经网络
  • 深层网络中的前向传播
  • 核对矩阵的维数
  • 为什么使用深层表示
  • 搭建深度神经网络
  • 前向和反向传播
  • 参数与超参数
  • 参考

引言

本文是吴恩达深度学习第一课:神经网络与深度学习的笔记。神经网络与深度学习主要讨论了如何建立神经网络(包括一个深度神经网络)、以及如何训练这个网络。

第一课有以下四个部分,本文是第四部分。

  1. 深度学习概论
  2. 神经网络基础
  3. 浅层神经网络
  4. 深层神经网络

深层神经网络


我们已经了解逻辑回归和单隐层神经网络了。
下面是2个和5个隐藏层的例子:

我们知道逻辑回归可以看成一个浅层模型,而上图5隐藏层的神经网络明显要深的多。

有些问题只有深层神经网络才能处理,具体要多少层,也是一个可以探索的超参数。

下面看下描述深层神经网络的符号。

这是一个四层神经网络,输入层不计。每层的神经元数分别是5,5,3,1。

  • 我们用大写的LLL表示神经网络的层数,这里L=4L=4L=4;
  • 用n[l]n^{[l]}n[l]表示lll层上的神经元数量(输入层可以看出第000层,n[0]=nx=3n^{[0]} = n_x = 3n[0]=nx​=3);
    • 特别地,最后一层可以用LLL来表示,有n[L]=1n^{[L]}=1n[L]=1。
  • 用a[l]=g[l](z[l])a^{[l]} = g^{[l]}(z^{[l]})a[l]=g[l](z[l])表示每层的激活函数值,最后一层激活值a[L]=y^a^{[L]}=\hat ya[L]=y^​;
  • 用W[l]W^{[l]}W[l]表示lll层的权值,b[l]b^{[l]}b[l]表示每层的偏置;
  • 输入特征用xxx表示,xxx也可以说是a[0]a^{[0]}a[0];

深层网络中的前向传播


先看下给定上面这样的神经网络,并有一个样本xxx,如何计算第一层的激活值。

xxx: z[1]=W[1]a[0]+b[1]z^{[1]} = W^{[1]}a^{[0]} + b^{[1]}z[1]=W[1]a[0]+b[1] 这里的xxx用a[0]a^{[0]}a[0]来表示。
a[1]=g[1](z[1])a^{[1]} = g^{[1]}(z^{[1]})a[1]=g[1](z[1])

那第二层呢
z[2]=W[2]a[1]+b[2]z^{[2]} = W^{[2]}a^{[1]} + b^{[2]}z[2]=W[2]a[1]+b[2]
a[2]=g[2](z[2])a^{[2]} = g^{[2]}(z^{[2]})a[2]=g[2](z[2])

后面几层以此类推。我们来算下输出层:

z[4]=W[4]a[3]+b[4]z^{[4]} = W^{[4]} a^{[3]} + b^{[4]}z[4]=W[4]a[3]+b[4]
a[4]=g[4](z[4])=y^a^{[4]} = g^{[4]}(z^{[4]}) = \hat ya[4]=g[4](z[4])=y^​

因此,基本规律就是:

z[l]=W[l]a[l−1]+b[4]z^{[l]} = W^{[l]} a^{[l-1]} +b^{[4]}z[l]=W[l]a[l−1]+b[4]
a[l]=g[l](z[l])a^{[l]} = g^{[l]}(z^{[l]})a[l]=g[l](z[l])


上面是针对一个样本,如果多个样本,怎么向量化呢。

第一层。

XXX: Z[1]=W[1]A[0]+b[1]Z^{[1]} = W^{[1]}A^{[0]} + b^{[1]}Z[1]=W[1]A[0]+b[1] 这里的XXX用A[0]A^{[0]}A[0]来表示。
A[1]=g[1](Z[1])A^{[1]} = g^{[1]}(Z^{[1]})A[1]=g[1](Z[1])

第二层
Z[2]=W[2]A[1]+b[2]Z^{[2]} = W^{[2]}A^{[1]} + b^{[2]}Z[2]=W[2]A[1]+b[2]
A[2]=g[2](Z[2])A^{[2]} = g^{[2]}(Z^{[2]})A[2]=g[2](Z[2])

后面几层以此类推。我们来算下输出层:

Z[4]=W[4]A[3]+b[4]Z^{[4]} = W^{[4]} A^{[3]} + b^{[4]}Z[4]=W[4]A[3]+b[4]
A[4]=g[4](Z[4])=y^A^{[4]} = g^{[4]}(Z^{[4]}) = \hat yA[4]=g[4](Z[4])=y^​

因此,基本规律就是:

Z[l]=W[l]A[l−1]+b[4]Z^{[l]} = W^{[l]} A^{[l-1]} +b^{[4]}Z[l]=W[l]A[l−1]+b[4]
A[l]=g[l](Z[l])A^{[l]} = g^{[l]}(Z^{[l]})A[l]=g[l](Z[l])

看起来只要一个for l in range(1,L+1)循环就好了,这个循环是必须的哦,不能再向量化了。

在实现深层神经网络时,想要得到没有bug的程序,最好要仔细核对矩阵的维数。下面就来看一下。

核对矩阵的维数


我们有个这样的NN,我们知道
z[1]=W[1]x+b[1]z^{[1]} = W^{[1]} x + b^{[1]}z[1]=W[1]x+b[1]

我们来看下上面几个符号的维数。
z[1]z^{[1]}z[1]是第一个隐藏层的激活值向量,第一个隐藏层的单元数n[1]=3n^{[1]}=3n[1]=3,所以它的维度是(3,1)(3,1)(3,1),也可以写成(n[1],1)(n^{[1]},1)(n[1],1)。

xxx有2个输入特征,所以维度是(2,1)(2,1)(2,1),也就是(n[0],1)(n^{[0]},1)(n[0],1)。

我们需要W[1]W^{[1]}W[1] 乘以一个(n[0],1)(n^{[0]},1)(n[0],1)的向量能得到(n[1],1)(n^{[1]},1)(n[1],1)的向量,因此W[1]W^{[1]}W[1]的维度要是(n[1],n[0])(n^{[1]},n^{[0]})(n[1],n[0]),这里是(3,2)(3,2)(3,2)。W[l]W^{[l]}W[l] 就是对lll层的每个单元对每个输入都有1个权重,总共有n[l]n^{[l]}n[l]个单元,以及n[l−1]n^{[l-1]}n[l−1]个输入,即**(单元数,输入数)**。

总结起来,W[l]W^{[l]}W[l]的维度必须是(n[l],n[l−1])(n^{[l]},n^{[l-1]})(n[l],n[l−1])。

比如W[2]W^{[2]}W[2]的维度是(5,3)(5,3)(5,3),即(n[2],n[1])(n^{[2]},n^{[1]})(n[2],n[1])。

我们知道每个逻辑回归单元只有一个偏置,每层有n[l]n^{[l]}n[l]个单元,因此b[l]b^{[l]}b[l]的维度是(n[l],1)(n^{[l]},1)(n[l],1)。

在实现反向传播时dWdWdW和dbdbdb的维度与WWW和bbb的维度是一样的。

再来看下z[l]z^{[l]}z[l]和a[l]a^{[l]}a[l],因为z[l]=g[l](a[l])z^{[l]} = g^{[l]}(a^{[l]})z[l]=g[l](a[l]),所以它们的维度是一样的。

我们再来看下向量化后的维度,哪怕向量化后,下面这几个参数的维度是一样的。

变化的是Z,A,X(=A[0])Z,A,X(=A^{[0]})Z,A,X(=A[0])的维度。


我们已经知道向量化之前上面的维度。

向量化后,

Z[1]=W[1]X+b[1]Z^{[1]} = W^{[1]} X + b^{[1]}Z[1]=W[1]X+b[1]

Z[1]Z^{[1]}Z[1]是(Z[1](1),Z[1](2),⋯,Z[1](m))(Z^{[1](1)},Z^{[1](2)},\cdots,Z^{[1](m)})(Z[1](1),Z[1](2),⋯,Z[1](m)) m个样本叠加到一起的结果。

所以Z[1]Z^{[1]}Z[1]的维度是(n[1],m)(n^{[1]},m)(n[1],m)。

XXX也是叠加后的结果,类似Z[1]Z^{[1]}Z[1],XXX的维度是(n[0],m)(n^{[0]},m)(n[0],m)


向上面所说的b[1]b^{[1]}b[1]的维度还是(n[1],1)(n^{[1]},1)(n[1],1),我们可以用python的广播直接相加。

向量化后Z[l],A[l]Z^{[l]},A^{[l]}Z[l],A[l]的维度中的列变成了样本数。

为什么使用深层表示

我们先来看下深度神经网络在看下,假设你建立一个人脸识别系统,输入一张人脸图片后,(CNN)隐藏层中的第一层,可以看成是边缘检测。


上图中的小方块就代表一个隐藏神经元,它们会检测有没有出现这种边缘的图像。


如果把第一层中的边缘放到一起,可能就形成脸部的不同特征。可能有些单元在检测左眼部分,有些在检测鼻子部分。


最后把它们放到一起,就可以检测不同的人脸了。

通常我们可以把这个神经网络前面几层看成是探测边缘的函数,之后把后面几层结合在一起,那么总体上就可以学习更加复杂的函数。

因此,这需要神经网络有一定的深度。深度神经网络其实就是很多隐藏层的神经网络。

当遇到新问题时,建议先从逻辑回归开始,然后尝试一到两层的神经网络,把隐藏层数量当成超参数取寻找比较合适的层数。

搭建深度神经网络


我们先来关注第lll层的。

正向传播:上面是如何从输入a[l−1]a^{[l-1]}a[l−1]到输出a[l]a^{[l]}a[l]的相关步骤,此时需要把z[l]z^{[l]}z[l]的值缓存起来,这样对后面的正向传播和反向传播都很有用。

反向传播:反向传播的输入是da[l]da^{[l]}da[l],输出是da[l−1]da^{[l-1]}da[l−1]。

总结起来,在第lll层,我们会有正向函数来计算正向传播

然后用作反向传播的反向函数是

如果已经实现了这两个函数,那么神经网络的计算过程会是下面这样的:

首先是正向传播,从a[0]a^{[0]}a[0]到a[L]=y^a^{[L]} = \hat ya[L]=y^​需要缓存所有的z[l]z^{[l]}z[l],以便反向传播时使用。

然后是反向传播

所以神经网络的训练,从a[0](x)a^{[0]}(x)a[0](x)开始,然后经过一系列正向传播得到输出y^\hat yy^​,然后再实现反向传播,更新每层的参数。

前向和反向传播

本节我们看下具体如何实现前向和反向传播。


在前向传递过程中最好也缓存W[l],b[l]W^{[l]},b^{[l]}W[l],b[l],这些都在反向传播中用得到。上图右边就是向量化后的公式。

下面看下反向传播的步骤。

上面的公式其实就是上篇文章中反向传播相关的公式。只需要四步,加上对每层的(反向)循环,就能写出反向传播的代码。


总结一下,就是给定输入XXX,如果用ReLU作为激活函数的话,经过几层隐藏层,最后用sigmoid作为输出层的激活函数,得到输出,然后需要计算出成本函数。

接着就可以反向迭代,先是计算da[L],dW[L],db[L]da^{[L]},dW^{[L]},db^{[L]}da[L],dW[L],db[L],然后反向传播。


下面我们来看下之前一直说的超参数。

参数与超参数

我们已经知道了参数是W,bW,bW,b这种,那超参数是什么呢

超参数就是输入到学习算法的参数,比如学习率在神经网络中还有隐藏层的层数,每个隐藏层的隐藏单元数,还可以选择激活函数。

这些会控制我们得到的参数W,bW,bW,b,因此它们叫超参数。


应用深度学习是非常依据经验的,可能你知道通常什么样的学习率比较好。如果不知道的话, 你就需要不停的尝试。

比如先尝试了一个比较大的学习率,结果随着迭代次数的增加,损失值反而增加;此时你就需要减小学习率,不停的尝试,最终选择一个比较好的学习率。

其他超参数的选择也是一样的。

要注意的是,在开发的过程中,可能学习率(或其他超参数)的最优数值是会变化的,因为电脑的CPU或GPU或者数据可能会变化很大。

参考

(推荐网易云课堂,可以免费看并且还有课堂笔记。)

1. 吴恩达深度学习

吴恩达深度学习——深层神经网络相关推荐

  1. 吴恩达深度学习 ——深层神经网络(选择题)

    1.在实现前向传播和反向传播中使用的"cache"是什么?(D) A.它用于跟踪我们正在搜索的超参数,以加速计算. B.用于在训练期间缓存代价函数的中间值. C.我们使用它传递反向 ...

  2. 【深度学习】吴恩达深度学习-Course1神经网络与深度学习-第四周深度神经网络的关键概念编程(下)——深度神经网络用于图像分类:应用

    在阅读这篇文章之前,请您先阅读:[深度学习]吴恩达深度学习-Course1神经网络与深度学习-第四周深度神经网络的关键概念编程(上)--一步步建立深度神经网络,这篇文章是本篇文章的前篇,没有前篇的基础 ...

  3. 吴恩达深度学习笔记——神经网络与深度学习(Neural Networks and Deep Learning)

    文章目录 前言 传送门 神经网络与深度学习(Neural Networks and Deep Learning) 绪论 梯度下降法与二分逻辑回归(Gradient Descend and Logist ...

  4. 吴恩达深度学习 | (2) 神经网络与深度学习专项课程第二周学习笔记

    课程视频 第二周PPT汇总 吴恩达深度学习专项课程共分为五个部分,本篇博客将介绍第一部分神经网络和深度学习专项的第二周课程:神经网络基础.由于逻辑回归算法可以看作是一个单神经元(单层)的网络结构,为了 ...

  5. 吴恩达深度学习—02神经网络和深度学习(视频笔记)

    02神经网络和深度学习 第一周:深度学习的深实用层面 第二周:优化算法 第三周:超参数调试.Batch正则化和程序框架 第一周:深度学习的深实用层面 第二周:优化算法 第三周:超参数调试.Batch正 ...

  6. 吴恩达深度学习卷积神经网络学习笔记(2)——经典神经网络

    目录 1.经典网络 1.1 LeNet-5(1998) 1.2 AlexNet 1.3 VGG-16 2 ResNets(残差网络) 2.1残差块(Residual block) 2.2 残差网络为什 ...

  7. 吴恩达深度学习L2W1——神经网络权重初始化方法、正则化

    文章目录 神经网络的初始化 初始化数据 模型搭建 简单函数 零初始化--initialize_parameters_zeros 随机初始化--initialize_parameters_random ...

  8. 吴恩达深度学习 | (12) 改善深层神经网络专项课程第三周学习笔记

    课程视频 第三周PPT汇总 吴恩达深度学习专项课程共分为五个部分,本篇博客将介绍第二部分改善深层神经网络专项的第三周课程:超参数调试.Batch Normalization和深度学习框架. 目录 1. ...

  9. 吴恩达深度学习课程之第四门课 卷积神经网络 第二周 深度卷积网络

    本文参考黄海广主编针对吴恩达深度学习课程DeepLearning.ai <深度学习课程 笔记 (V5.1 )> 第二周 深度卷积网络 2.1 为什么要进行实例探究?(Why look at ...

  10. 吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究

    吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究 吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究 2.1 为什么要进行实例探究 2.2 经典网络 LeNet-5 AlexNet VGG- ...

最新文章

  1. 计算机在线作业题,中医大计算机在线作业及答案-20210412090026.docx-原创力文档
  2. keras从入门到放弃(十五)图片数据增强
  3. 在Unity实现游戏命令模式
  4. 吴恩达Coursera机器学习 - Chapter 1 引言
  5. 比navicat更好用的工具_5118是查什么的?做什么用的?对比站长工具和爱站谁更好?...
  6. FastTunnel-开源内网穿透框架
  7. 通过命令修改wampserver的mysql密码
  8. 给大家推荐9个专业分享生信技术的公众号
  9. 面向对象 —— 静态成员(变量与方法)
  10. Python入门学习笔记05(内置函数)
  11. windows怎么远程关linux系统,从windows远程关闭linux、windows系统.doc
  12. 计算机1级题库软件,计算机一级软件哪个好_计算机一级刷题软件_计算机一级试题软件...
  13. wps下一步快捷键_wps后退前进快捷键是什么?
  14. Python基础:pip的安装与卸载
  15. 微信开放平台授权登录详细流程-第三方登录
  16. 构建自己的人脉网络——高科技人才在跨国大公司的生存之道(四)
  17. phpstudy 运行PHP项目
  18. python简化逻辑式
  19. From Nand to Tetris Week1 超详细2021
  20. [干货] 杜绝广告, 让你的电脑变的更加干净舒适

热门文章

  1. 文章,记录按内容分页显示,根据文章内容按字数进行分页(转)
  2. javascript_11-函数面试题
  3. java之重定向与转发
  4. ViewPager,使用Fragment实现
  5. 什么是“5个9”(99.999%)的可靠性?
  6. jquery 使用下拉效果的实现
  7. 1458: 移动距离(暴力模拟)
  8. 手机端输入键盘导致 position fixed
  9. 周鸿祎:做产品体验先把自己切换到二傻子模式
  10. python load