DeepLearing.AI 神经网络与深度学习 Week4 5-8
目录
搭建神经网络块
前向传播与反向传播
超参数
神经网络与大脑的关系
搭建神经网络块
概述:
我们知道一个基本的神经网络是由前向传播和反向传播构成的,本节主要讲述的是如何运用前向传播和反向传播构建一个深度神经网络。
对于某一层的前向传播与后向传播
- 前向传播
对于第l层的前向传播是这样的, ω l \omega ^{l} ωl和 b l b^{l} bl是第l层从的参数,是需要被训练的部分,是需要被计算机存储的,第l层的输入是 a l − 1 a^{l-1} al−1,输出是 a l a^{l} al。解释一下这里的上标的含义,上标的值l代表这些参数对应的是第l层神经网络的数据,所以根据我们之前所学有如下公式:
z l z^{l} zl= ω l \omega^{l} ωl a l − 1 a^{l-1} al−1+ b l b^{l} bl
a l a^{l} al= g l g^{l} gl( z l z^{l} zl)
此外需要指明的是:在前向传播过程中 z l z^{l} zl需要被存储下来以便反向传播使用。 - 反向传播
对于第l层的反向传播, ω l \omega ^{l} ωl, b l b^{l} bl和 z l z^{l} zl是第l层的参数,注意这里的 z l z^{l} zl来自于前向传播。输入是 d a l da^{l} dal,输出是 d a l − 1 da^{l-1} dal−1, d ω l d\omega^{l} dωl和 d b l db^{l} dbl。
在之前的课我们介绍过反向传播的公式,在下一节中我们会详细介绍。在此,我们暂且把它当成一个黑盒,只关心它的输入与输出,完成这个黑盒外部的拼接。如下图所示,这是第l层神经网络的正反向神经网络构成。
对于深层神经网络的正反向神经网络搭建
我们现在已经完成了对于单一层神经网络的搭建,现在考虑的就是如何把不同层的连在一起,我们举个例子,如下图:
其实我们很容易想到的,因为在前向传播过程中,前一层的输出就是下一层的输入,而第一层的输入来自于数据,依照这种关系我们可以把前向传播连接在一起,并且前向传播的输出为y帽,用于计算成本函数。在反向传播过程中,前一层的输入来自于后一层的输出,而最后一层的输入是对于成本函数求导数得到的,这样我们就把反向传播连接在一起,最终用成本函数把正反向传播再联系起来,我们的神经网络就是一个完整的链了
前向传播与反向传播
摘要
本节主要是介绍在神经网络中正反向传播的具体实现,相信在之前学过浅层神经网络的朋友一定不会感到陌生,因为这部分知识只是对于浅层神经网络隐藏层的多次重复,话不多说一起来看看吧!
前向传播
在上一节我们已经给出了单一数据前向传播的参数、输入、输出以及两个公式,并对于他们给出相应解释,下面我们要将把它推广,推广成多条数据的前向传播公式,这里面我们假设我们有m条这样的数据,我们要将这m条数据输入神经网络,对模型进行训练。我们把数据都写成列向量的形式,把m条数据一次排列在一起形成一个
a
0
a^{0}
a0*m的。还记得我们上一部分的约定吗?这里的0代表的是第0层的参数,也就是输入层的参数,也就是我们的输入数据。如下图,我们先给出m个数据的正向传播公式并对其进行解释以便理解:
如上图所示,对比之前给出单一数据的前向传播公式,公式中的
Z
l
Z^{l}
Zl是由之前的
z
l
z^{l}
zl列向量组合而成的,假设
z
l
z^{l}
zl是一个n1的列向量,那么
Z
l
Z^{l}
Zl则是一个nm的矩阵;
W
l
W^{l}
Wl是由之前的
ω
l
\omega^{l}
ωl变化而成的,之所以不能说他是前者组合而成的是因为,它其实是受到每一组数据的训练,同时也作用于每一组数据。
A
l
−
1
A^{l-1}
Al−1由之前的
a
l
−
1
a^{l-1}
al−1组合而成的,
b
l
b^{l}
bl和之前的
b
l
b^{l}
bl是一样的,可以通过python的broadcast扩展成n*m的矩阵。
第二个公式还是激活函数,它其实是对于每个列向量单独作用的,不同列的数据互不影响。
反向传播
- 在上一节我们也介绍 过反向传播的参数、输入以及输出。对于第l层的反向传播,
ω
l
\omega ^{l}
ωl,
b
l
b^{l}
bl和
z
l
z^{l}
zl是第l层的参数,注意这里的
z
l
z^{l}
zl来自于前向传播。输入是
d
a
l
da^{l}
dal,输出是
d
a
l
−
1
da^{l-1}
dal−1,
d
ω
l
d\omega^{l}
dωl和
d
b
l
db^{l}
dbl。反向传播有如下公式:
d z l dz^{l} dzl= d a l da^{l} dal * g l ′ {g^{l}}' gl′( z l z^{l} zl)
d w l dw^{l} dwl= d z l dz^{l} dzl ( a l − 1 ) T (a^{l-1})^{T} (al−1)T
d b l db^{l} dbl= d z l dz^{l} dzl
d a l − 1 da^{l-1} dal−1= ( w l ) T (w^{l})^{T} (wl)T d z l dz^{l} dzl
这几个公式都是运用数学中的链导法则得到的,这是数学的部分在这里并不赘述。不过我们还是贴出来前向传播的公式以便读者自行推导:
z l z^{l} zl= ω l \omega^{l} ωl a l − 1 a^{l-1} al−1+ b l b^{l} bl
a l a^{l} al= g l g^{l} gl( z l z^{l} zl) - 对于m组数据的反向传播公式:
d Z l dZ^{l} dZl= A l A^{l} Al * g l ′ {g^{l}}' gl′( Z l Z^{l} Zl)
d W l dW^{l} dWl= 1 m \frac{1}{m} m1 d Z l dZ^{l} dZl ( A l − 1 ) T (A^{l-1})^{T} (Al−1)T
d b l db^{l} dbl= 1 m \frac{1}{m} m1np.sum( d z l dz^{l} dzl,axis=1,keepdims=True)
d A l − 1 dA^{l-1} dAl−1= ( W l ) T (W^{l})^{T} (Wl)T d Z l dZ^{l} dZl
对于上述公式,我们在前向传播中已经详细介绍了每个变量的意义。
超参数
什么是超参数?
在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。
以上是来源于百度百科的一段对于超参数的定义,下面我们来举几个超参数的例子:
比如:在梯度下降中我们的步频
α
\alpha
α就是一个超参数,它不是一个通过训练得到的参数,却会直接影响训练结果。
再比如:在神经网络中隐藏层的个数L,还有每个隐藏层里神经元的数目,这些都是超参数;此外还有一些我们没有学习到的超参数,比如:moment(矩),还有mini-batch,这些都是以后会用到的超参数。
如何调参
吴恩达老师说下一门课会介绍一些系统的调参方法,但是它也说到现在的研发工作往往是,你想到了一个很好的模型或者idea,你去尝试这些参数下,模型的运行效果。改变参数再次运行,比较在不同超参数下模型好坏并确定一个很好的参数。
但是他又说道,一些参数在一个时期内效果良好不意味着永远良好,参数对于学习的好坏实际也是受其他因素影响,比如说数据,CPU和GPU等等,所以一个模型的参数可能需要在一段时间内重新调整,当然这也是很让人头疼的一个问题吧。
这只是调参的现状,不排除之后会与一些方法使人们摆脱复杂的调参过程。
神经网络与人脑的关系
类比
深度学习和人脑的关系简单来说就是一种类比,本质上说它的机理与人脑的工作机理不是相同的,我们先看一下这种类比,如下图:
左图神经网络,三个输入经过一些变换得到了隐藏层数据,并通过激活函数输出预测值或者其他。右图神经细胞,突出接受电信号,经过神经元一系列不为人知的过程,输出兴奋或者不兴奋,两者用来这样的类比,从表面上来说都是一种输入经过一系列变化到输出的过程
但是从本质上来说,其实作用机理不是相同的,神经网络运用激活函数,但是神经元的作用机理至今也没有人弄得清楚,人们喜欢做这种类比,因为觉得这样的类比很cool但是,实际上我觉得两者关系不大