1. 神经网络
1.1 神经网络——是什么?
神经网络没有一个严格的正式定义。它的基本特点,是试图模仿大脑的神经元之间传递,处理信息的模式。还是有些抽象,那么看看下面这张图。
输入层和输出层之间有多个隐层hidden layer,输入层、输出层和隐层都有若干个节点。每一个节点是一个神经元,每个神经元,通过激励函数,计算处理来自其它相邻神经元的加权输入值;神经元之间的信息传递的强度,用所谓加权值来定义,算法会不断自我学习,调整这个加权值。
在逻辑回归中,我们知道回归函数中得到线性拟合
z=θ0+θ1x1+θ2x2
,输入到sigmoid函数中
a=g(z)=11+e−z
,这个过程可以看做一个没有隐层的神经元,g(z)就是激励函数:
如果在中间加上少量隐层,就是浅层神经网络,增多中间层,就是深层神经网络(DNN)。
1.2 神经网络——为什么?
神经网络为什么比其他的分类器有更好的效果呢?传统的逻辑斯特回归或者linear SVM来做简单的的分类,对于非线性可分的情况,可以设定核函数去把平面数据分隔开,但是样本很不规则的时候却难以分割。那么神经网络是怎么做的呢?举一个吴恩达老师课件里的例子:
当x1、x2相同时y=1,不同时y=0,对y的取值进行切分,很难用一条直线切分。如果有一个分类器,用两条线性分类的组合(逻辑与)判定正负样本,就可以完成。如图,给定一组权重可得到一条直线,由两组权重构造两条直线,再有这两条直线进行线性加权,得到切分函数。
除了“逻辑与”,神经元还可以完成“逻辑或”,这两个操作是神经网络的高明所在。例如对下图四种颜色分类,采用“抠图”的方式得到绿色:先对上面绿色的模块的7条变作线性切分,得到0、1的分类,再对这7条线性分类做与操作,得到上面的这个绿色。再和其他的绿色模块取或操作,得到全部的绿色区域。
我们已经了解了神经网络的结构,是全连接的,那么卷积神经网络又是什么呢?
2. 卷积神经网络的层级结构
卷积神经网络依旧是层级结构,但是层的功能和形式做了变化,主要的层次有数据输入层、卷积计算层、激励层、池化层和全连接层,这些层次穿插着组合在一起。
2.1 数据输入层——Input layer
有3种常见的图像数据处理方式:
1. 去均值:把输入数据各个维度都中心化到0。
2. 归一化:幅度归一化到同样的范围。
3. PCA/白化:用PCA降维,白化是对数据每个特征轴上的幅度归一化。
CNN里一般只做去训练集的均值。
2.2 卷积计算层——CONV layer
卷积计算层是卷积神经网络的核心,这个操作在物理上是可解释的。我们知道神经网络是全连接的,卷积网络不是,是局部关联的。过程是:每个神经元看做一个滤波器filter,filter对局部数据计算。取一个数据窗口,这个数据窗口不断地滑动,直到覆盖所有样本 。需要知道这几个参数:
a. 深度depth:神经元个数,决定输出的depth厚度。
b. 步长stride:决定滑动多少步可以到边缘
c. 填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。
举例分析:下面这张图中,有两个神经元,即depth=2;取3*3的窗口,每次移动两个步长,stride=2;zero-padding=1。分别以两个滤子为轴滑动数组,得到两组结果。
具体是怎么计算的呢?对应位置上是数字先乘后相加,中间滤波器filter与数据窗口做内积。以第一个结果-3为例:第0组
0∗0+0∗0+0∗(−1)+0∗1+1∗0+2∗0+0∗0+1∗0+0∗1=0
,第1组=-4,第2组=0,偏差bias=1,所以 0+(-4)+0+1=-3。整个计算过程的动态图如下,做的很直观明了!
之所以卷积神经网络的参数不会很大,有一个很重要的性质就是参数共享机制:同一个神经元,无论输入数据如何滑动变化,连接数据窗的权重是固定的。这样一来,有多少个神经元,就制定多少组参数,过程中不会再改变。
卷积神经网络在图像上的应用很广泛,下面这张图表示使用不同的滤子处理图像的差别。
2.3 激励层——ReLU
激励层有一个激励函数,把卷积层输出结果做非线性映射。非线性的映射有:Sigmoid、Tanh、ReLU、Leaky ReLU、ELU、Maxout等,大多数用的是ReLU。ReLU收敛快(比sigmoid函数至少提高6倍),求梯度简单,但是较脆弱,它的图像如下:
改进的有:
a. Leaky ReLU:不会“饱和” /挂掉,计算也很快。
b. 指数线性单元ELU:所有ReLU有的优点都有,不会挂,输出均值趋于0,因为指数存在,计算量略大。
c. Maxout:计算是线性的,不会饱和不会挂,多了好些参数;
max(ωT1x+b1,ωT2x+b2)
选择激励函数的一些实际经验:不要用sigmoid,太难以训练;首先试RELU,因为快,但要小心点,打印中间信息判断状态;如果RELU失效,请用Leaky ReLU或者Maxout;某些情况下tanh倒是有不错的结果,但是很少。
2.4 池化层——Pooling layer
池化层夹在连续的卷积层中间,用于压缩数据和参数的量、减小过拟合。如下图,在不影响图像内容的前提下,把224x224的图片压缩成 112x112,基于的理论是平移不变性。
池化层有 Max pooling 和 average pooling两种方式,工业界多用Max pooling。Max pooling每次把窗口中最大的值抽出来,如下图:
2.5 全连接层——FC layer
全连接层中,两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部,因为尾部的信息量没有开始那么大。
一般卷积神经网络的结构层次如下:
2.6 卷积神经网络的优缺点
优点:
a. 共享卷积核,对高维数据处理无压力
b. 无需手动选取特征,训练好权重,即得特征
c. 分类效果好
缺点:
a. 需要调参,需要大样本量,训练最好要用GPU
b. 物理含义不明确
3. 典型CNN
1. LeNet,这是最早用于数字识别的CNN
2. AlexNet, 2012 ILSVRC比赛远超第2名的CNN,比LeNet更深,用多层小卷积层叠加替换单大卷积层
3. ZF Net, 2013 ILSVRC比赛冠军
4. GoogLeNet, 2014 ILSVRC比赛冠军
5. VGGNet, 2014 ILSVRC比赛中的模型,图像识别略差于GoogLeNet,但是在很多图像转化学习问题(比如object detection)上效果奇好。
4. CNN常用框架
1. Caffe:源于Berkeley的主流CV工具包,支持C++,Python,matlab,Model Zoo中有大量预训练好的模型供使用。
prototxt是用命令行做训练时要用的,定义了cnn的层级结构。
2. Torch:Facebook用的卷积神经网络工具包,通过时域卷积的本地接口,使用非常直观,torch定义新网络层比较简单,可以做图像或者RNN。
3. TensorFlow:Google的深度学习框架,可视化很方便,数据和模型并行化好,速度快。开源后资源会更丰富。
CNN的应用:图像识别与检索、人脸识别、性别/年龄/情绪识别、物体检测、场景判定与危险监控等。