神经网络和深度学习-第四周-吴恩达 Deep Learning
深度神经网络的符号表示
随着网络的层次的增加,用精炼且统一的符号来确定的表示网络的不同的层以及各个层之间独立单元的情况就变得十分重要,正如在矩阵中我们用 aij 表示第 i 行第 j 列元素一样。
在实际的神经网络构建中,很难一开始就清楚的需要多少层、每个层级之间的单元数量以及选择哪一种激活函数,这些都要经过多次的训练和调整来确定,也被称为“调参”。
以下面这个神经网络为例,相关约定如下:
3 hidden layers neural network-
由于在描述神经网络的层级的时候,我们会去掉输入层,所以上图是一个 4 层的神经网络,3 个隐藏层,1 个输出层。层数用大写的 L 表示,即 L = 4,输入层可以被称为 0 层,后续每一个新的层都依次递增
-
每一层的单元的数量则可以简单的根据其在图中的圆形数量来确定,并用 n[ l ] 表示,对应图中 n[1] = 5, n[2] = 5, n[3] = 3,n[4] = 1,输入特征的数量可以用 n[0] = nx = 3 来表示
-
每一层的激活函数可以用 a[ l ] 来表示,即 a[ l ] = g[ l ](z[ l ]) , 而相应的 z[ l ] 的参数则可以用 w[ l ] 和 b[ l ] 来表示
-
特别地,输入特征 x 可以看作是输入层的激活因素,因此可以用 a[ 0 ] 来表示,而输出 ŷ 可以看作是输出层的激活因素,所以用 a[ L ] 来表示。这一处理的好处是后续可以通过将 a[ 0 ] 代入第一层的线性方程来使得各个层之间的线性方程可以用同一个公式表示: z[ l ] = w[ l ]a[ l-1 ] + b[ l ]
神经网络中的前向和后向传播
这一部分 Andrew 讲的很详细,可以考虑把这几个公式的推导过程尝试几遍,仔细体会一下。
- 前向传播
- 后向传播
神经网络中矩阵的维数确认
在神经网络计算中,为了避免出现低级的矩阵维度的错误,Andrew 讲到自己在做计算的时候都会单独拿一张纸出来逐个确认各个矩阵的维数是否正确。一个最基本的检查项是矩阵乘法中,如矩阵 A 和矩阵 B 相乘, 则首先一定要满足的是 A 的列的维数等于 B 的行的维数,即 [m x n] x [n x l] = [m x l],并且我个人觉得在这个操作过程中会更加清晰直观的理解神经网络的实际运算过程,而不再将其看作是一个抽象的符号运算过程。
经过课程中的推导可知,单个样本时各个常用参数的维度为:
- w[ l ] 的维度:( n[ l ] ,n[ l -1 ] )
- b[ l ] 的维度:( n[ l ] ,1 )
- dw[ l ] 的维度:( n[ l ] ,n[ l -1 ] )
- db[ l ] 的维度:( n[ l ] ,1 )
- z[ l ] 和 a[ l ] 的维度:( n[ l ] ,1 )
m 个训练样本时 :
- Z[ l ] 和 A[ l ] 的维度是(n[ l ] ,m )
- dZ[ l ] 和 dA[ l ] 的维度是( n[ l ] ,m )
为什么采用深层次的神经网络
采用多个层级的神经网络的原因是可以将问题分解:第一层解决基本元素的组成问题,如人脸识别问题中的一个很小的区域的图像的线条朝向及位置;第二层在第一层的基础上扩大观察的范围,并将第一层得到的结果组合成可能的面部各个器官的形状;第三层再在第二层的基础上扩大观察范围,对于合成的不同面貌的人脸进行分辨。以此类推,深层神经网络之所以通常情况下越“深”处理能力越强就是源于此。注意这里的三层只是为了说明问题,而不是真实应用中人脸识别只需要三层神经网络就可以解决。
另外很多人也常用电路设计原理来解释深度神经网络“深”的意义:
There are functions you can compute with a "small" L-layer deep neural network that shallower networks require exponentially more hidden unites to compute.
上面这句话里的 small 指代的是每一层的单元的数量,更直观的理解就是说当采用更多层的神经网络来描述复杂的函数关系时,可以减少每一层的计算单元的数量。但由于 90% 的人对于电路设计中的“门”的概念都是陌生的,因此这里没有必要非要去理解 Andrew 举的这个例子,包括他本人也觉得这个解释并不利于大多数人能够对于深层的优势进行直观的理解。
最后 Andrew 也讲到大家把“多层次神经网络”改成“深度神经网络”是因为 deep 这个词本身就具有一定的宣传效果,也成功吸引到了更多的关注,就像很多人逢人就提 Big Data, 别管我懂不懂,听起来就能吓住你。
参数和超参数
为了使得深度神经网络的训练更加有效的工作,在寻求参数的过程中要用到一些超参数(Hyperparameter),之所以称它们为超参数是因为这些参数的选择在较大程度上会决定神经网络的学习速度,以及最终获得的参数的值和质量。典型的超参数有以下几个:
- 学习速率(learning rate) α
- 迭代次数(number of iterations)
- 神经网络的层数 L
- 每一层的单元的数量 n[ l ]
- 激活函数
这些参数实际上很难在一开始的时候就知道如何设置更加合理,所以需要通过不断的调整超参数并获得迭代次数和成本函数之间的关系,最终确定选定某一组超参数,这一过程就是常说的“调参”。同时,即便是针对同一个应用场景,随着时间的推移,计算能力、数据数量以及网络结构都会发生不同程度的变化,因此之前选定的超参数也可能并不总是最佳的选择,需要定期的考虑尝试新的参数。
神经网络和大脑的关系
简单说就是并没有什么关系,尽管 sigmoid 函数的激活可以简单的类比一个神经元接受不同神经元的递质并最终激活将信号传递到下一个神经元的过程,但实际上现在人们对于人类大脑中的单个神经元的工作机制仍然不是特别了解,也并没有清楚揭示人类大脑的认知和学习过程。
Human neuron之所以经常看到这样的类比是历史上计算机神经网络的研究确实是希望可以模拟人脑,但今天仍然沿用这个说法是因为它可以使非专业的人士也能有一个具体的实例来大致的了解计算机神经网络想要实现的功能,使得其更加亲民。如果你已经学习到这里,那么应该可以更清楚的知道(监督学习中的)深度神经网络实际上提供了一个可以描述复杂的函数关系的能力,使得我们给定的输入得到预期的输出。