Deep Neural Network
本周课程涉及到的知识点有:
- Deep neural network 的架构
- Deep neural network 上的正向传播和反向传播
- Parameters 以及 Hyperparameters的概念
Deep neural network 的架构
终于我们开始进入了深度神经网络的世界。不过如果跟着前面的课程学下来会发现其实这没有什么更多的新知识,只是把单层神经网络扩展到多层而已。下图给出了一个典型的神经网络,有一个输入层,三个隐藏层以及一个输出层。
可以看到这个结构和之前一节课学的shallow network 没有什么本质的区别,只是多了几个隐藏层。问题是为何多用加几个隐藏层就可以显著的提高神经网络的性能呢?下图给出了一个例子,比如说我们要做一个人脸识别的应用。那么第一层网络一般会学习一些比较浅显的feature, 例如点,划,边线等等。然后第二层会把第一层的输出结合起来学习一些更加复杂的feature,比如鼻子眼睛的形状。然后第三层可以进一步把这些局部结构组合在一起形成人脸的整体判断。
总结一下就是多个隐藏层给予了神经网络从抽象到具体,从细节局部到整体的学习能力。这使得我们无需去深入研究如何构造复杂的feature, 直接采用raw feature往往就能取得很好的性能。
深度神经网络的计算过程也和之前的大同小异,下图给出了一个总结:
我们首先还是初始化每层的参数 W 和 b , 然后对每层先进行linear 计算, 随后通过activation function (通常选择ReLU)得到下一层的输入。通过最后一层的activation function为sigmoid函数我们得到一个最终的概率(比如图像是猫的概率)。我们通过把最终的输出和已经标记的ground truth比较得到当前神经网络的 cost 是多少。随后我们通过反向传播更新每层的参数 W 和 b 来最小化这个cost 。在多次循环之后我们最终收敛得到了一个最优化的 W 和 b,即可以输出和真实判断最接近的判断结果。
从这个总结可以看出,深度神经网络的关键概括起来还是正向传播计算输出,反向传播更新参数。下面我们来具体看一看这两个过程。
Deep neural network 上的正向传播和反向传播
下面这个草图给出了第L层的正向传播和反向传播的计算。
注意草图中采用了小写的 a 和 z 来代表一个training data, 然而在实际计算中我们通常同时处理 m 个training data,因此用大写的 A 和 Z 来表示。在下面的笔记中我们一律采用大写。
正向传播: 所谓的正向传播也就是拿前一层是输入 A[L-1] (其中 A[0] 即为原始输入数据), 乘以 W[L] 加上 b[L] 得到 Z[L],然后再把 Z[L] 丢到激活函数中计算得到 A[L] 的过程。计算如下所示:
[图片上传失败...(image-2ecb53-1511717398961)]
[图片上传失败...(image-9ada96-1511717398961)]%20=%20g(W{[l]}A{[l-1]}%20+b^{[l]})$)
注意g(*)也就是激活函数,一般Hidden layer我们用ReLU, 而最后的输出层用sigmoid (二元分类)或者softmax(多元分类)
反向传播: 反向传播用来计算最后cost function对每个参数的梯度,也就是 dW[L] 和 db[L] , 为了计算这个我们首先要计算cost function对每层计算出来的 z[L] 和 a[L] 的梯度,计算公式如下所示:
[图片上传失败...(image-69c1c9-1511717398961)]%20\tag{11}$$)
[图片上传失败...(image-6065ef-1511717398961)]
[图片上传失败...(image-c0a874-1511717398961)]
[图片上传失败...(image-6253f3-1511717398961)]}$$)
这个过程咋一看令人非常崩溃,我们来捋一下。
- 首先在计算出 A[L] 也就是最后输出之后,我们可以计算得到dA[L] 。如果采取sigmoid function 那么就是 dA[L] = -Y/A[L] - (1-Y)/(1-A[L])
- 通过 dA[L] 和 Z[L]计算 dZ[L]
- 通过 dZ[L] 和 W[L] 计算 dA[L-1]
- 通过 dZ[L] 和 A[L-1] 计算 dW[L]
- 通过 dZ[L] 计算 db[L]
注意这个过程中我们其实感兴趣的就是 dW[L] 和 db[L] , 而别的都是一些中间变量。注意加粗的 Z[L], W[L] 和 A[L-1] 都是forward propagation的中间结果。因此我们在计算forward propagation的时候需要把它们缓存下来来计算反向梯度。
下图给出了完整的正向传播和反向传播的流程:
再次强调一遍,其中 A[0] 对应原始输入,这也就是我们无需再计算 dA[0] 了-毕竟我们的目的是更新 dW 和 db. 更新公式也就是我们熟悉的gradient descent (底部的绿色公式)。
Parameters 以及 Hyperparameters的概念
所谓的Parameters 指的是每层的 W[L] 和 b[L], 这些参数是神经网络需要去不断更新优化来让最后的prediction结果逼近真实情况的。而Hyperparameters指的则是learning rate, 神经网络的Hidden layer的层数,每层的neuron 的个数等等。这些参数无需更新,然而需要我们初始化,并且往往初始化的结果决定了最后训练出来的Parameters (W[L] 和 b[L])的好坏。因此我们把它们称之为Hyperparameters。
最后,Hyperparameters的设置会对神经网络的结果产生不可估量的影响。因此如何调整合适的hyperparameters也是deep learning里一种非常重要的技能。在下一个系列的课程中,我们会深入看看如何一些让deep learning工作的更好的调整hyperparameters的经验方法。
总结
到这里其实最deep learning的基本原理就已经介绍完了。可以看出其中并没有什么特别玄妙高深的知识,其过程概括起来无非是利用正向传播计算cost,反向传播计算梯度, 以及梯度下降算法来优化网络参数。问题是在于现在还没有一个数学模型来概括在deep learning的过程中到底发生了什么,各个参数到底是如何变化的。因此获得良好的deep learning的性能我们需要不断的尝试各种不同的初始化参数。下面我们会介绍一些实际应用中能让deep learning效果更好的一些技巧以及更复杂的网络结构(CNN & RNN)。