吴恩达.深度学习系列-C4卷积神经网络-W2深度卷积模型案例
(本笔记部分内容直接引用redstone的笔记http://redstonewill.com/1240/。原文整理的非常好,引入并添加我自己的理解。省了不少事儿啊。)
学习目标
- Understand multiple foundational papers of convolutional neural networks
- Analyze the dimensionality reduction of a volume in a very deep network
- Understand and Implement a Residual network
Build a deep neural network using Keras - Implement a skip-connection in your network
- Clone a repository from github and use transfer learning
1.为何关注经典案例
- LeNet-5
- AlexNet
- VGG
- ResNet (152 layers)
以上被认为是现代计算机视觉的基石。阅读经典对理论实践都十分有意义。
2.经典网络模型
LeNet-5
LeNet-5模型是Yann LeCun教授于1998年提出来的,它是第一个成功应用于数字识别问题的卷积神经网络,并商业应用于全美邮政系统的邮政编码识别。
在MNIST数据中,它的准确率达到大约99.2%。典型的LeNet-5结构包含CONV layer,POOL layer和FC layer,顺序一般是CONV layer->POOL layer->CONV layer->POOL layer->FC layer->FC layer->OUTPUT layer,即 y^ y ^ 。下图所示的是一个数字识别的LeNet-5的模型结构:
该LeNet模型总共包含了大约6万个参数。而现在在网络经常有上亿的参数。值得一提的是,当时Yann LeCun提出的LeNet-5模型池化层使用的是average pool,而且各层激活函数一般是Sigmoid和tanh。现在,我们可以根据需要,做出改进,使用max pool、激活函数ReLU、padding=“same”、softmax等后来出现的技术。
paper:Yann LeCun——Gradient-Based Learning Applied to Document Recognition
因为时间久远,论文涉及很多过去的技术,可能阅读起来比较难懂。可能关注论文第二,第三部分更简单些。
AlexNet
AlexNet模型是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同提出的,让整个计算机视觉社区开始认识到深度学习的成功。其结构如下所示:
AlexNet模型与LeNet-5模型类似,只是要复杂一些,总共包含了大约6千万个参数。AlexNet已经开始使用激活函数ReLU。原作者还提到了一种优化技巧,叫做Local Response Normalization(LRN)。 而在实际应用中,LRN的效果并不突出。
paper:Krizhevsky2012 ImageNet Classification with Deep Convolutional Neural
论文描述的方法为了将运算分担到多个gpu上,阐述比较复杂,现在基本无需这样。
VGG-16
VGG-16模型更加复杂一些,一般情况下,其CONV layer和POOL layer设置如下:
- CONV = 3×3 filters, s = 1, same
- MAX-POOL = 2×2, s = 2
VGG-16结构如下所示:
VGG-16的参数多达1亿3千万。网络在每次卷积时都对filter翻倍,而在池化时都将图像大小缩小1/4,这个规则保留至今。由于VGG-Nets具备良好的泛化性能,其在Imagenet 数据集上的预训练模型(pre-trained model)被广泛应用于除最常用
的特征抽取(feature extractor)外的诸多问题:如物体候选框(object proposal)生成、细粒度图像定位与检索(fine-grained object localization and image retrieval)、图像协同定位(co-localization) 等。
paper:Very deep convolutional networks for large-scale image recognition
3.ResNets
问题提出
理论和实验已经表明,神经网络的深度(depth)和宽度(width)是表征网络复杂度的两个核心因素,不过深度相比宽度在增加网络的复杂性方面更加有效,这也正是为何VGG网络想方设法增加网络深度的一个原因。
然而,随着深度的增加,训练会变得愈加困难。这主要因为在基于随机梯度下降的网络训练过程中,误差信号的多层反向传播非常容易引发梯度“弥散”(梯度过小会使回传的训练误差极其微弱)或者“爆炸”(梯度过大会导致模型训练出现“NaN”)现象。目前,一些特殊的权重初始化策略以及批规范化(batch normalization)策略等方法使这个问题得到极大的改善——网络可以正常训练了!但是,实际情形仍不容乐观。
当深度网络收敛时,另外的问题又随之而来:随着继续增加网络的深度,训练数据的训练误差没有降低反而升高。这一观察与直觉极其不符,因为如果一个浅层神经网络可以被训练优化求解到某一个很好的解,那么它对应的深层网络至少也可以,而不是更差。这一现象在一段时间内困扰着更深层卷积神经网络的设计、训练和应用。
解决的方法之一是人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为Residual Networks(ResNets)。
Residual Networks由许多隔层相连的神经元子模块组成,我们称之为Residual block。单个Residual block的结构如下图所示:
上图中红色部分就是skip connection,直接建立 a[l] a [ l ] 与 a[l+2] a [ l + 2 ] 之间的隔层联系。相应的表达式如下:
z[l+1]=W[l+1]a[l]+b[l+1] z [ l + 1 ] = W [ l + 1 ] a [ l ] + b [ l + 1 ]
a[l+1]=g(z[l+1]) a [ l + 1 ] = g ( z [ l + 1 ] )
z[l+2]=W[l+2]a[l+1]+b[l+2] z [ l + 2 ] = W [ l + 2 ] a [ l + 1 ] + b [ l + 2 ]