(学习笔记)吴恩达深度学习课程第一课—神经网络与深度学习

(学习笔记)吴恩达深度学习课程第一课—神经网络与深度学习

写在前面

本篇博客是根据吴恩达老师的课程整理出来的笔记。
由于本人水平能力都有限,有些地方可能也总结不到位,所以仅供参考,如果有相关错误指出或问题讨论可以留言哈。最后附上吴恩达老师的深度学习课程链接,大家可以一起学习~
视频链接:https://www.bilibili.com/video/BV164411m79z?p=8&spm_id_from=pageDriver

第一周 深度学习概述

一、什么是神经网络

在这里插入图片描述
​ 在房价预测问题中,我们根据训练数据训练出一条如上图中的曲线,来尽可能拟合这些数据,然后就可以用该曲线来根据房屋大小预测房价。这个拟合房价的曲线函数,就可以看成一个非常简单的神经网络

在这里插入图片描述

​ size作为输入,price是输出,而中间的小圆就是一个独立的神经元,该神经元完成的任务就是输入size,完成线性计算,取不小于0的值,最后得到输出的预测price。而复杂一点的神经网络,就是把这样的单个神经元堆叠起来形成的。
(上面的曲线所表示的函数,起始为0,后面转变为一条直线,这样的函数被称作ReLU函数)
在这里插入图片描述
​ 上图的每一个圆可能都表示一个ReLU函数,或是其他非线性的函数(基于房屋面积和卧室数量来估计家庭人口,基于邮编可以估计步行化程度,基于邮编也可以估计附近学校的质量),事实上房价和人们关注什么,有很大关系。在该例中,家庭人口、步行化程度、学校质量都可以帮助我们预测房价,这就是一个使用多神经元的神经网络。
在这里插入图片描述

​ 在已知这些输入的特征的前提下,神经网络的工作就是预测对应的房价。而图中的圈圈也被称为神经网络的隐藏单元,负责计算输入进来的数据,最终得到预测房价y。


二、用神经网络进行监督学习

监督学习,需要给机器一组含有标签的训练集。所谓含有标签,就是告诉机器,这个输入属于哪个类,机器通过在训练集中训练,最终得到一个可以用来预测的函数,而无监督学习则没有这个标签。以下为神经网络进行监督学习的应用列举。
在这里插入图片描述

​ 下图中从左到右依次是标准的神经网络,卷积神经网络(CNN)和循环神经网络(RNN)。CNN主要应用于图像处理,而RNN主要应用于处理一维序列数据。
在这里插入图片描述

​ 机器学习也被应用于结构化数据非结构化数据。结构化数据是数据的数据库,例如在房价预测中,你可能有一个数据库或者数据列,告诉你房间大小、卧室数量…这就是结构化数据,每个特征都有着清晰的定义。与之相反的就是非结构化数据,比如音频、图像,相比于结构化数据,计算机其实很难理解非结构化数据,而通过深度学习、神经网络,现在的计算机能够更好地理解和解释非结构化数据,语音识别、图像识别、自然语言文字处理等技术应运而生。



第二周 神经网络基础

一、二分分类

二分类问题例如,输入一张图片,判断是不是猫,是则输出1,不是就输出0。
在这里插入图片描述

计算机是如何表达一张图片的?

​ 计算机保存一张图片,需要保存三个独立矩阵,分别对应**红(R)、绿(G)、蓝(B)**三个颜色通道,例如,如果输入图片是64×64像素的(长宽各有64个像素),就有三个64×64的矩阵,把这三个矩阵中的所有像素亮度值放进一个特征向量X中,就可以用X来表示这一张图片:

​ x=(255,231,…,255,134,…,255,134,…)T ,如果图片是64×64的,那么向量X的总维度就是12288(即64×64×3),一般用nx或n来表示输入的特征向量的维度。
在这里插入图片描述
​ 在二分类问题中,目标是训练出一个分类器,它以图片的特征向量x作为输入,预测输出的结果y是1还是0。

以下是课程中需要用到的一些符号:

(x,y):表示一个单独的样本,例如x是一个图片的特征向量,y是1或0;

m:表示训练集由m个训练样本构成;

(x(1),y(1)):表示样本1的输入和输出,依次类推;

X:可以用来表示训练集中所有x组成的矩阵,X=(x(1),x(2),…,x(m)),该矩阵有nx行m列;

Y:可以用来表示所有y组成的矩阵,Y=(y(1),y(2),…,y(m)),该矩阵有1行m列。


二、Logistic回归

​ Logistic回归算法,是一种广义的线性回归分析模型,在监督学习问题中用于预测某事发生的概率。在上述的二分类问题中,输入一张猫图,用x表示,我们可得到输出y^ =P(y=1|x),我们希望y^ 告诉我们这是一张猫图的概率:

  • x是一个nx维向量;
  • Logistic回归的参数w也是一个nx维的向量,而b是一个实数;
  • 所以,已知x、w、b,我们可以使用线性方程计算出y^ =wTx+b。

以上是我们做线性回归的常规做法,但这并不是一个很好的二分类算法,因为我们希望y^ 是y=1的概率,所以y^ 应该介于0和1之间,但是这很难实现,因为wTx+b的值可能比1大,也可能是负值,这样的概率是没有意义的 ,所以,在logistic回归中,我们对wTx+b这个量使用sigmoid函数,即:

​ y^ =σ(wTx+b)

sigmoid函数就是下图这样从0到1的平滑曲线:
在这里插入图片描述

我们用z来表示(wTx+b),上图的横坐标表示的就是z,则:y^ =σ(z),事实上σ(z)=1/(1+e-z),可观察得到,如果z很大,σ的值是很接近1的,与上图的表达是一致的。

通过sigmoid函数的处理,z值是个远大于1的数时,得到的概率就接近1,z值是个负数时,得到的概率就接近0,解决了上文的概率无意义的问题。


三、logistic回归损失函数

为了训练得出logistic回归函数的参数w和b,需要定义一个成本函数(也称代价函数)。

给定一个训练集,我们希望通过训练,得出w和b,来得到尽可能精确的模型。而通过定义损失函数L,可以用来衡量我们的预测单个样本的输出值y^ 和y(实际值)有多接近,在logistic回归中,我们通常使用这样的损失函数:
在这里插入图片描述

这个损失函数是怎么起作用的呢?

我们假设y=1时,要让L尽可能小,把1带进去就是让 -ylogy^ 尽可能小,也即让ylogy^ 尽可能大,也就是让y^ 尽可能大,但是因为y^ 是sigmoid函数得到的,永远不会比1大,所以只能让y^ 尽可能接近1。

假设y=0时,损失函数就变为了-log(1-y^ ),同理,想让该函数尽可能小,就需要(1-y^ )尽可能大,也即让y^ 尽可能小,也就是让y^ 尽可能接近0。

综上,y=1时,我们让y^ 尽可能接近1,y=0时,我们让y^ 尽可能接近0,这就是该损失函数所起的作用。

事实上,损失函数是在单个训练样本中定义的,它衡量了模型在单个训练样本上的表现,下面我们定义一个成本函数J,用来衡量模型在全体训练样本的表现:
在这里插入图片描述

也即是求取了所有样本的损失函数的值的平均。

也就是说损失函数只适用于单个训练样本,而成本函数,是基于参数的总成本,所以在训练logistic回归模型时,我们要找到合适的参数w和b,让成本函数J尽可能地小。


四、梯度下降法

​ 接下来我们学习如何使用梯度下降法,来训练或学习训练集上的参数w和b。

​ 回顾一下前面的内容:
在这里插入图片描述
根据前面所述,我们想要找到使得成本函数J尽可能小的w和b。在本节中我们将使用梯度下降法来寻找,如何理解梯度下降,首先看看下图所展示的三维图:
在这里插入图片描述
当然,w应该是更高维的数据,但是为了方便绘图,这里让w是一个实数,b也是一个实数,成本函数J(w,b)是在水平轴w和b上的曲面,曲面的高表示了J在某一点处的值,可以看到,J函数其实就是一个凸函数(注意凸函数的性质就是有且仅有一个最优解,如果有多个局部最优解,那就不是凸函数),我们所要做的就是,找到这样的w和b,使得上图对应的成本函数J是最小值,也就是图中的最低点。

那么,如何找到最好的参数值呢?

首先需要初始化w和b,因为成本函数是凸函数,所以不论选取上图中哪个点作为初始位置,最终都应该达到同一个最低点。梯度下降法要做的就是,从初始点开始,朝着当前最陡的下坡方向走一步,这就是梯度下降的一次迭代,再经过二次、三次…每次都朝着最快下降的方向前进一步,最终收敛到全局最优解(或是接近的解),如下图中的红点移动示意。这就是梯度下降法
在这里插入图片描述
为了更好地说明梯度下降法,我们接着看这个函数:
在这里插入图片描述
为了方便处理,暂且忽略掉b,只考虑w,然后梯度下降法就是重复执行以下的更新操作:
(我们用:=表示更新操作)
在这里插入图片描述
其中的α表示学习率(learning rate),它控制每一次迭代或者梯度下降法中的步长,上式中学习率后面乘的导数,就是参数w的变化量,注意导数的几何含义就是某一点的函数斜率。如上图,假设初始点是最右边的点,该点的导数是正的,所以用初始w减去导数和学习率的乘积,然后得到一个新的更低的点,如上图所示,就这样迭代下去,让w的值渐渐减小。当然,如果起始点是最左边的点,那起始点的斜率就是负的,那迭代下去,w的值会渐渐增大,总之不管初始点位于哪,梯度下降都会朝着全局最小值的方向移动

上一个例子只是考虑了一个参数w,如果现在把b也一起考虑进来,也是一样的处理方式,下面的第一个式子用于更新w,第二个用于更新b:
在这里插入图片描述


五、计算图和计算图的导数计算

一个神经网络的计算通常都是按照前向或反向传播的过程来实现的,首先计算出神经网络的输出, 紧接着进行一个反向传输操作,后者我们用来计算出对应的梯度,或者叫做导数。计算图解释了为什么用这样的方式来实现,简单来说,计算图就是为了阐明计算过程的

举一个简单的例子:J(a,b,c)=3×(a+b×c),计算b×c存储于u,a+u存储于v,最后得出J=3×v:
在这里插入图片描述
根据上面的计算过程就可以画出如下的计算图:
在这里插入图片描述
通过一个从左到右的过程,我们可以计算出J,接下来为了计算导数,我们要讨论一个与上图相反的从右到左的过程,也即是反向传播

在反向传播的术语中我们可以知道,如果你想计算最后输出变量的导数,就使用这个变量对v的导数,即dJ/dv=3,那么我们就做完了一步反向传播,在计算图中就是如下一条红线所表示的一个反向步。
在这里插入图片描述

接着计算dJ/da是多少(换个说法:如果我们提高a的数值,对J的数值有什么影响)

根据上图的计算可以知道,如果你让a增加0.001,J就增加了0.003,可以得知:如果改变a的值,那么a的改变量就会传递到计算图的最右边。

要解释这个计算过程其中一种方式就是:如果改变a那么也会改变v,如果v改变了,也会改变J。那么a增加了,v会增加多少呢,这取决于dv/da,v改变了也会影响J,这实际上就是微积分中的链式法则,所以J的变化量,即dJ/da就等于让a改变时J的变化量,也就是改变a时v的变化量乘以改变v时J的变化量:dJ/da=(dJ/dv)(dv/da)。


六、logistic回归中的梯度下降法

回忆之前的logistic回归的公式:
在这里插入图片描述
这只是计算单个样本的效果,现在来讨论该样本的偏导数计算:

假设该样本有两个特征x1和x2,为了计算z,我们需要输入参数w1、w2和b,则:
z=w1x1+w2x2+b
在这里插入图片描述
这是我们前面所说的计算损失函数的通常步骤,如果要计算偏导数就需要使用上一节所说的向后计算。
在这里插入图片描述
注意上图中,我们有一个符号约定,用da表示dL/da,依次类推。根据向后计算出来的这些导数,我们就可以得到更新w1、w2、b的式子,如上图中的右下角所示。

上面是单个训练 的应用,现在我们来讨论m个训练样本的例子。

这里我们需要使用表示全局的成本函数J,求出全局成本函数对w1的导数时,依然是使用各项损失函数对w1求导数的平均,这样得到的就是全局的梯度值。
在这里插入图片描述
以下是计算J和各偏导数的算法思路,使用一个for循环实现:
在这里插入图片描述
为了简便后面的计算,后文中我们引入向量化,可以做到不使用for循环也能实现上述的算法。


七、向量化

向量化的目的就是加快深度学习代码的运算速度,提高效率。

在logistic回归算法中,我们需要计算:z=wTx+b,这其中,w是一个列向量,x也是一个列向量,如果有很多特征,它们就是非常大的向量,所以w和x都是nx维向量(在很前面的前文解释过nx表示输入的特征向量的维度)。

所以我们去计算z时,如果用一个非向量化的方法来实现,需要使用for循环累加,你会发现这真的很慢,所以就需要向量化,这样将会直接计算wTx+b,在python或者numpy中,需要使用z=np.dot(w,x),这就是在直接计算wTx,然后只用再加上b就行,你会发现这计算非常快。
在这里插入图片描述
下面举一个代码实例进行比较:

import numpy as np
import time

a=np.random.rand(1000000) #随机创建一个百万维度的数组
b=np.random.rand(1000000)
tic=time.time()
c=np.dot(a,b)
toc=time.time()
print(c)
print("Vectorized version:" + str(1000*(toc-tic))+"ms")

c=0
tic=time.time()
for i in range(1000000):
​        c+=a[i]*b[i]
toc=time.time()
print(c)
print("for loop:" + str(1000*(toc-tic))+"ms")

我们得到的最终运行结果为:
在这里插入图片描述
可以看到,两种方法计算得到了相同的c值,但是向量化后运行的时间远远小于非向量的运行时间。从这个例子就可以看出使用向量化真的可以极大提升深度学习代码的运行速度。

经验法则:当你编写新的网络时,那么一定要尽量避免使用for循环,最好可以使用内置函数或其他方法来计算循环。

下面我们来看几个例子:

(1) 假设一个向量u,作为矩阵A和另一个向量v的乘积,非向量法需要用到两个for循环,向量化做法就是:u=np.dot(A,v)。

(2) 已知向量v,想要做指数运算,用u来表示运算后的向量,非向量的做法就是:

v=(v1,v2,…,vn)T——>u=(ev1,ev2,…,evn)T
在这里插入图片描述

如果使用numpy中的内置函数,也就是向量化做法,只需要调用单个函数:

import numpy as np
u=np.exp(v)

八、向量化logistic回归

回顾一下logistic回归的正向传播:
在这里插入图片描述
如果有m个样本,需要对m个训练样本都计算出预测结果。在向量化中,我们首先使用一个X数组表示所有的训练样本x,X=(x(1),x(2),…,x(m)),X是一个nx行m列的矩阵,接下来我们需要计算z(1)到z(m),向量化方法可以把z也向量化。表示为:

  • (z(1),z(2),…,z(m))=wTX+(b,b,…,b)

实际上向量化方法只需要一行代码即可:

Z=np.dot(w.T,X)+b

上面的代码中,b其实只是个实数,但是Python的方便之处就是,矩阵加上这个实数b,b就会被自动扩展成一个1×m的向量,这就是Python中的广播

然后需要计算存储所有a的矩阵:A=(a(1),a(2),…,a(m))=σ(Z)

以上就是在logistic回归中实现向量化。

接下来我们学习如何计算m个训练样本的梯度。

为了方便书写,我们用符号dz来表示dL/dz,根据第六节的内容,我们推算过dz=a-y,用Z表示所有的z,则有dZ=(dz(1),dz(2),…,dz(m)),又dZ=A-Y,则:

dZ=A-Y=(a(1)-y(1),…,a(m)-y(m))
在这里插入图片描述

也就是说:由dZ=(dz(1),dz(2),…,dz(m))可求出:

db=(1/m)Σdz(i)=(1/m)np.sum(dZ)

dw=(1/m)XdZT

现在我们来看看如何用代码具体实现一个向量化的logistic回归。首先回顾之前没有向量化的低效方法,然后右边是向量化的实现:
在这里插入图片描述
上图的右半部分,确实实现了对所有样本的预测,且没有使用一个for循环,然后梯度下降更新参数。 但是这只是一次迭代,如果要求1000次迭代进行梯度下降,那么仍不可避免的需要使用for循环,放在最外层。


九、python中的广播

前面也提到过,广播是一种让我们的python代码可执行得更快的手段,本节中我们将研究广播是如何运作的。

我们来看一个例子:
在这里插入图片描述
求四种食物中,来自碳水化合物、蛋白质和脂肪热量的百分比各占多少。

import numpy as np

A=np.array([56.0,0.0,4.4,68.0]
           [1.2,104.0,52.0,8.0]
           [1.8,135.0,99.0,0.9])
cal=A.sum(axis=0) 
#axis=0,意味着竖直相加,得到一个一行四列的数组,如果该值为1,则是水平相加
percentage=100*A/cal.reshape(1,4) #该行计算出了A中的每个元素,占所在列的和的比例
print(percentage)

运行得到的结果如下:
在这里插入图片描述

其实上述代码中,cal后面不用调用reshape方法也可,因为这已经是一个确定的1×4的矩阵,reshape方法可以用在那些确保我们的矩阵形状是我们想要的情况。

那么python是怎么让3×4的矩阵A,来除以一个1×4的矩阵呢?先来看下面的三个例子:
在这里插入图片描述
第一个例子中,一个列向量加上一个实数,python就会把这个实数扩展为同维度的列向量,再实现相加,后面两个例子也是同样,自动扩展会,再实现相应的运算。所以上面的问题也是同样的广播原理,可通过一样的处理得到除以后的矩阵。


十、关于python_numpy向量的说明

我们可以用下图的形式定义一个随机数组,第一行表示定义了一个秩为1的数组,它的行为和行向量或者是列向量并不一样,所以有些效果可能没有那么直观,不推荐使用。而第二三行的形式分别定义了一个5×1的列向量和一个1×5的行向量:
在这里插入图片描述

如果我们不确定一个向量的具体维度是多少,可以使用assert()方法,确保这是一个向量:

assert(a.shape==(5,1))

另外,如果我们还是使用了秩为1的数组,我们可以使用reshape把它转换成向量:
a=a.reshape((5,1))



第三周 浅层神经网络

一、神经网络概览

我们先用一个图回顾一下如何实现一个神经网络:
在这里插入图片描述
我们可以把很多sigmoid单元堆叠起来构成一个神经网络。
在这里插入图片描述
上图更为详细地展示了一个神经网络的计算过程,我们用上标[1]、[2]…来表示这是第几层的数据,首先我们用logistic回归的方法计算z[1],a[1],接着用另一个线性方程计算z[2],a[2],以此类推,在这个神经网络中,反复计算z和a,最后计算损失函数。
同样,与logistic回归中类似,在神经网络中也有反向传播的计算,从右到左计算出dz[2],dzz[1]等。


二、神经网络表示

下面是一张简单的神经网络图,我们来命名一下这张图的各部分。
在这里插入图片描述
我们有输入特征x1,x2,x3竖向堆叠起来,这就是神经网络的输入层,然后往左边走,那4个节点的堆叠我们称之为隐藏层,后面的只带一个节点的层就是输出层,负责输出,得到y^ 。

当我们用监督学习来训练一个神经网络时,训练集中包含了输入x和输出y,隐藏层的含义是:在训练集中,这些中间节点的真正数值我们是看不到的,但是你能看到输入值和输出值,这就是所谓的“隐藏层”,只是表示你在训练集中看不到

现在我们再引入几个符号,之前我们用向量x表示输入特征,现在还有另外一种表示方式:我们用a[0]来表示而这个a也表示激活的意思,它意味着网络中不同层的值会传递给后面的层,输入层将x的值传递给隐藏层,我们将输入层的激活值称为a[0],下一层即隐藏层也同样会产生一些激活值,我们将其记作a[1],其中的第一个节点我们把它表示为a[1]_1,所以上图中的a[1]表示的就是一个四维向量,最后的输出层会产生某个数值a[2],是个实数,等于y ^ ,所以这和logistic回归类似。
在这里插入图片描述
上图表示的其实就是一个两层的神经网络,隐藏层作为第一层,而输入层我们称为第零层。(这是大多数论文所使用的命名)
最后我们要知道隐藏层和最后的输出层是带有参数的,这里的隐藏层有两个相关的参数w和b,它们同样也使用了上标[1]表示这是第一层的,之后我们会看到w是一个4×3的矩阵,而b在这个例子中是一个4×1向量,之后会更详细讨论这些矩阵。
而对于输出层,和它有关的参数w[2],以及b[2],从维度上来看分别是1×4和1×1。

三、神经网络输出

在这里插入图片描述
如图上的一个两层神经网络,图的右边我们依次计算出每个隐藏单元执行的运算,下面要做的就是,把这四个等式向量化,向量化过程如下图所示:
在这里插入图片描述
我们再继续讨论,对于神经网络的第一层,我们给予一个输入x,我们得出z[1]=W[1]x+b[1],a[1]=σ(z[1]),z[2]=W[2]x+b[2],a[2]=σ(z[2]),如下图所示:
在这里插入图片描述
向量化实现的解释:
在这里插入图片描述

四、激活函数

要搭建一个神经网络,你可以选择在隐层里用哪一个激活函数,还有神经元的输出单元用什么激活函数,在这之前,我们用的都是sigmoid函数,不过有时候,其他激活函数的效果要更好一些。
在上述的两层神经网络中的正向传播步骤中,我们有下面箭头标记的这两步用到了σ激活函数:
在这里插入图片描述

tanh函数介绍

关于σ函数,在前面第二周第二节有详细介绍过,它介于0到1之间。其实有一个激活函数的表现在很多情况下都比σ函数表现好,就是tanh函数(双曲正切函数),这个函数介于-1和1之间:
在这里插入图片描述
实际上就是σ函数平移后的版本,为什么它通常比σ函数好用呢,因为如果使用σ函数,为了后面计算的方便,我们可能需要先对数据作中心化处理(平移所有的数据,让它们的平均值等于0),而使用tanh函数,本身就使得数据获得了中心化的效果。所以tanh在绝大多数情况下都是优于σ的,有一个例外是输出层的y如果是0或1,那么我们自然是希望y^ 介于0到1之间更为合理,也就是说在这种二分分类的输出层中,我们才考虑用σ函数
但是,σ函数和tanh函数都有的一个缺点是,当z的值非常大或非常小时,那么这个函数的导数梯度可能会很小,或者说会接近于0,这样就会拖慢梯度下降法。

ReLu函数介绍
在机器学习中还有一个很受欢迎的函数叫ReLu函数(修正线性单元),当z为负时,斜率为0,z为正时,斜率为1:
在这里插入图片描述

ReLu函数解决了上面两个激活函数关于梯度消失的问题,同时在z空间中的大部分,激活函数的斜率和0距离很远,所以神经网络的速度会快很多。但是它也有一个缺点:当z为负时,导数(也即斜率)等于0,这就导致负的梯度在ReLu中被置为0,而且这个神经元有可能再也不会被任何数据激活,导致该神经元坏死,当然如果我们使用一个合适的较小的learning rate,这个问题发生得也不会太频繁。

五、激活函数的导数

本节为后面的神经网络的梯度下降法做铺垫,讨论各个激活函数的导数计算:
(1)sigmoid函数
在这里插入图片描述
如果z非常大,比如z=10,则g(z)约等于1,所以此时g’(z)=1(1-1)=0,也就是说,当z很大时,斜率接近于0。
当z很小时,比如z=-10,则带入上式也得g’(z)约等于0。
在z=0处,g(z)=1/2,则g’(z)=1/4。
在神经网络中,a=g(z),则可得g’(z)=a(1-a)。
(2)tanh函数
在这里插入图片描述
当z很大时,比如z=10,tanh(z)约等于1,g’(z)=0。
当z很小时,比如z=-10,tanh(z)约等于-1,g’(z)=0。
由a=g(z),得g’(z)=1-a^2。

(3)ReLU函数和Leaky ReLU函数
在这里插入图片描述
在编程实现这个算法时,当z=0时,可令g’(z)=1或0,这其实无关紧要,以为这个概率时及其小的。
在这里插入图片描述
以上就是激活函数导数或是斜率的计算。

六、神经网络的梯度下降法

在这里插入图片描述
下面再总结一下正向传播和反向传播的方程:
在这里插入图片描述
实际上反向传播就是求梯度的过程。

七、随机初始化

对于逻辑回归,可以将权值初始化为0,但是在神经网络中这样做是无效的,如下所示:
在这里插入图片描述
如果把权值都初始化为0,上图中的a[1]_1和a[1]_2就是一样的了,而在做反向传播时的值也是一样的,意味着两个结点的计算时完全一样的,这样的话,每个训练迭代后,两个结点依然在计算一样的函数,所以在这种情况下,多个隐藏单元显得没有意义。
这个问题的解决方案就是随机初始化所有参数
在这里插入图片描述
上图就是随机初始化参数的过程,只把b值初始化为0是可以的,至于初始化W时为什么要乘上0.01,是因为我们在使用激活函数时,如果值过大,就可能使其导数很小,减慢梯度下降的速度。当然如果你的神经网络没有用到一个激活函数,那是不存在这个问题,但是如果在做二元分类时,输出值是sigmoid函数,那么初始参数就不能过大了。

第四周 深层神经网络

一、深层神经网络

在这里插入图片描述
我们用n[i]来表示第i层神经网络的神经元个数,如下图所示:
在这里插入图片描述
深层网络中的前向传播步骤和向量化计算如下图所示:
在这里插入图片描述
之前我们说过向量化计算可以避免在该层神经网络使用for循环,但是在层与层之间的迭代计算中,是无法避免使用显式的for循环的,比如上图中的第一层到第四层的计算,每一层都用到了前一层的结果。

二、核对矩阵的维数

来看下图的五层神经网络:
在这里插入图片描述
对于第一层隐藏层的计算:
z[1]=w[1]x+b[1]
上式中z是第一个隐层的激活函数向量。由图可知,x维度为(2,1),第一层Z维度为(3,1),根据矩阵乘法的法则,就要求W的维度为(3,2),如下图所述:
在这里插入图片描述
继续计算后面的层,可以得到一定的规律:
在这里插入图片描述
最终可得:w[l]的维度:(n[l],n[l-1])
至于如何计算b的维度,其实根据python的广播性,常数b会自动扩展为某行一列的矩阵来实现计算的合法性。
也可知:b[l]的维度:(n[l],1)

上面考虑的是单个样本的情况,下面我们考虑所有样本(多样本)时的向量化,其实就是把z[1] _(1) z[1] _(2)…堆叠在一起:
在这里插入图片描述

三、为什么用深层表示

以人脸识别为例,当你输入一张脸部的照片,你可以把深度神经网络的第一层当作一个特征探测器,或者边缘探测器,然后第二层我们把照片里组成边缘的像素们放在一起看,可以把被探测到的边缘组合成面部的不同部分,比如说,有一个神经元会去找眼睛的部分,另外还有别的在找鼻子的部分,然后把这许多的边缘结合在一起,就可以开始检测人脸的不同部分,最后第三层再把这些部分放在一起,就可以识别或是探测不同的人脸了:
在这里插入图片描述
所以神经网络的前几层能学习一些低层次的简单特征,等到后几层就能把简单的特征结合起来,去探测更加复杂的东西。

四、搭建深层神经网络块

正向和反向传播:
在这里插入图片描述
在这里插入图片描述
每一层的正向和反向传播:
在这里插入图片描述
在这里插入图片描述
比如一个三层神经网络的正向和反向传播是这样的:
在这里插入图片描述
在这里插入图片描述

五、参数和超参数

如果想提高你的神经网络效率,还需要规划好你的参数和超参数。超参数诸如下图所写的:学习率、梯度下降法循环的数量、隐藏层数L、隐藏单元数、激活函数等等。
在这里插入图片描述

这些参数都需要我们自己来设定,而这些参数的设定实际上影响了最后w和b的值,这种控制参数的参数就称为超参数。
超参数的设定一开始是需要我们通过不断的尝试,调整,不断进行下面的循环得到一个较好的值:
在这里插入图片描述
完结撒花~

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值