深度卷积神经网络——Deep Convolutional Neural Networks

本文是对深度学习大牛Hinton于2012年发表在NIPS上面的论文《ImageNet Classification with Deep Convolutional Neural Networks》进行学习的笔记。

1.关于对数据集ImageNet的处理:

研究者将图片down-sample到固定像素256*256。对于一个矩形图片,先放缩图片使短边长度为256,才取此时图片中间的256*256的patch作为结果图片。除了将训练集中的每个像素都减去mean activity外,再没有对图片作其它的预处理了。Hinton直接使用RGB值来训练网络。


2.数据集:暂不作翻译和解析。


3.框架:包括5个卷积神经网络层和3个全连接层。


3.1. ReLU Nonlinearity.

一个神经元的输出函数(或者称为激活函数)分为两种,一种是saturating nonlinearities,例如f(x) = tanh(x),另一种是non-saturating nonlinearity,例如f(x) = max(0,x)。Hinton将符合后者nonlinearity的神经元称作Rectified Linear Units(ReLUs)。后者速度比前者快了六倍以上。原因是对于max(0,x)函数,若x小于0,则该神经元不被激活,也无须进行梯度计算和向后传播。


3.2.多GPU训练

由于一个GTX580GPU只有3GB内存,120万训练样本无法放在一个GPU上,所以Hinton采用cross-GPU parallelization。一个GPU能对另一个GPU的内存进行直接的读写操作。Hinton将一半的kernel(或者神经元)放到一个GPU上。再使用一个技巧:GPU只在特定的layer通信。比如,layer 3的kernel将layer 2所有kernel maps都作为输入。


3.3.局部响应归一化

ReLU具有一个好的特性:不需要输入归一化来避免饱和(saturating)。(这里谈一下饱和,当一个神经元的输出对于大多数的输入都是一个常数时,称为饱和。神经元饱和的原因一般是因为输入过大,超过了激活函数的线性部分,比如反正切函数就会存在这种情况。如果对于大多数输入,都是相同的常数输出,那么这大多数输入都等价于一个输入了,没有区别了,所以会造成神经网络层与层之间信息的丢失。为了避免信息丢失,饱和现象应避免。max(0,x)能避免饱和的原因是,即使x很大,但只要输入x不同,输出的也会不同,不会是同一个常数。)如果至少一些训练样本产生了大于0的输入,那么学习过程就会发生在那个神经元上。但是,Hinton仍然发现了一个trick——局部归一化可以提升泛化能力(泛化能力强,就是没有过拟合,就是对于训练数据以外的各种分布的数据测试效果都不错)。这个局部归一化方法就是当前卷积核的激活值除以它附近n个卷积核的激活值的平方和的若干倍和若干次方。

公式暂不给出,下面是局部归一化方法的意义。卷积核图(kernel map)的顺序是任意随机的,顺序在训练开始前就决定好。这个局部归一化是在模仿生物学中的侧抑制现象(当一个神经元很兴奋时,会抑制它周边的神经元的兴奋,比如提高它周围的神经元的兴奋阈值)。但需要注意的是,这个局部归一化方法并不是用同一层神经网络中,空间上相邻的神经元来归一化。神经元始终保持是同一个神经元,但有许多个卷积核施加到这个神经元上做卷积操作,而对于每个卷积核,用附近n个卷积核来归一化当前核的激活值。(这里谈一下多个卷积核的意义。在底层神经网络,一个核往往负责一种特征,可能是边缘检测,角点检测。为了特征丰富,需要多个卷积核。每个卷积核由同一层神经网络共享,这是卷积神经网络的重要特性,sparse connectivity,稀疏连接性)


3.4.重合池化

池化本来是将一个矩形的特征图(feature map)分割成不相交的小矩形(通常是同样长宽的),然后每个矩形只保留其中的最大值,然后得到新的特征图。池化的意义一是减少计算量,二是让特征具备一定程度的平移不变性,图片经过小量的位移后,得到的新特征和原特征还是有较大的相似性。而这一小节说的重合池化,就是原本池化所要划分成的不相交的小矩形,现在允许它们相交(overlap)了。Hinton发现使用重合池化可以降低错误率,并且稍微没那么容易过拟合。就是一个trick。

你可能感兴趣的:(计算机视觉,机器学习)