卷积神经网络之AlexNet
卷积神经网络之AlexNet
Paper: ImageNet Classification with Deep Convolutional Neural Networks
Github: https://github.com/pytorch/vision/blob/master/torchvision/models/alexnet.py
AlexNet
模型有多伦多大学,
Geoff Hinton
实验室设计,夺得了
2012
年
ImageNet ILSVRC
比赛的冠军,并且错误率远低于第二名,使得卷积神经网络乃至深度学习重新引起了广泛的关注。在此之前,由于受到计算机性能的影响,虽然LeNet在图像分类中取得了较好的成绩,但是并没有引起很多的关注。
AlexNet的特点
AlexNet
是在LeNet
的基础上加深了网络的结构,学习更丰富更高维的图像特征。AlexNet
的特点:
- 更深的网络结构。
- 使用
ReLU
**函数加速收敛。 - 使用多
GPU
并行,加速训练。也为之后的分组卷积(group convolution
)理论奠定基础。 - 使用交叠池化(
Overlapping Pooling
)防止过拟合。 - 使用数据增强,提出
Dropout
抑制过拟合。
使用ReLU
**函数加速收敛
在最初的感知机模型中,输入和输出的关系如下:
y
=
∑
i
w
i
x
i
+
b
y=\sum_iw_ix_i+b
y=i∑wixi+b
只是单纯的线性关系,这样的网络结构有很大的局限性:即使用很多这样结构的网络层叠加,其输出和输入仍然是线性关系
,无法处理有非线性关系
的输入输出。因此,对每个神经元的输出做非线性变换(**函数
)就非常重要。
在此之前,**函数主要使用的是tanh
:
f
(
x
)
=
t
a
n
h
(
x
)
f(x)=tanh(x)
f(x)=tanh(x)以及sigmoid
:
f
(
x
)
=
1
1
+
(
e
−
x
)
−
1
f\left(x\right)=\frac1{1+\left(e^{-x}\right)^{-1}}
f(x)=1+(e−x)−11,但是这些都是饱和**函数
,如下图,输入值处于饱和区
时(x→∞时),其梯度几乎为0,因此收敛极慢!
针对这一问题,在AlexNet
中引入了线性整流单元(Rectified Linear Units, ReLU
)作为**函数,即:
f
(
x
)
=
max
(
0
,
x
)
f\left(x\right)=\max(0,x)
f(x)=max(0,x)。其不存在饱和区,导师始终为1,梯度更大,计算量也更少,因此收敛得更快。
如下图所示,为tanh
和`ReLU·的收敛速度对比:
如何理解ReLU
函数的非线性
这里有个问题,前面提到,**函数
要用非线性
的,是为了使网络结构有更强的表达能力。但这里使用的ReLU
本质上却是个线性的分段函数,那是如何使用ReLU
进行非线性变换的呢?
这里把神经网络看成一个巨大的线性变换,则所有的训练样本 A 进行了线性变换输出为 B 。
B
=
M
⋅
A
B=M·A
B=M⋅A
这里的M是一个线性变换的话,则所有的训练样本 A 进行了线性变换输出为 B 。
那么对于ReLU
来说,由于其是分段的,0的部分可以看作神经元没有**,不同的神经元**或者不**,其神经网络组成的变换矩阵是不一样的。
设有两个训练样本 a1 和 a2 ,其训练时神经网络组成的变换矩阵为 M1 和 M2 ,由于 M1 变换对应的神经网络中**神经元和 M2 是不一样的,这样 M1 和 M2 实际上是两个不同的线性变换。也就是说,每个训练样本使用的线性变换矩阵
M
i
M_i
Mi是不一样的,在整个训练样本空间来说,其经历的是非线性变换。
单个训练样本是线性变换,但是每个训练样本的线性变换是不一样的,这样对整个训练样本集来说,就是非线性变换。
多GPU并行
单个GTX 580 GPU
只有3GB
显存,浙江限制可训练网络的最大尺寸和batch size
大小。因此,将模型分为两部分,分不到两个 GPU
上进行训练。由于GPU
之间可以直接进行数据交换,而无需经过主机内存,因此可以很容易进行并行。
交叠池化(Overlapping Pooling
)
在一般的池化中,池化窗口 z 与滑动窗口 s 相等(如LeNet
)。而交叠池化指的就是
s
<
z
s<z
s<z的池化,此时相邻的滑窗之间会有重叠。在论文的实现中,使用
z
=
3
,
s
=
2
z=3,s=2
z=3,s=2,这时Overlapping Pooling
策略在top-1
和top-5
分别降低了0.4%
和0.3%
的错误率。与非重叠方案相比,输出的维度是相等的,并且能在一定程度上抑制过拟合。
抑制过拟合策略
Dropout
略
数据增强
略
AlexNet
模型结构
AlexNet
整体结构
AlexNet
的整体结构如下所示:
上图中的输入是 224 × 224 224×224 224×224,不过经过计算 ( 224 − 11 ) / 4 = 54.75 (224−11)/4=54.75 (224−11)/4=54.75并不是论文中的55×55,而使用 227 × 227 227×227 227×227作为输入,则 ( 227 − 11 ) / 4 = 55 (227−11)/4=55 (227−11)/4=55
如上图所示,AlexNet
共包含 8
个可学习的层,其中前 5
层为卷积层,后为全连接层,最后接一个 1000
路的 softmax
层,用于分类。
AlexNet参数具体变化过程:https://www.cnblogs.com/wangguchangqing/p/10333370.html
引入多GPU
同时,为了进行多 GPU
并行训练,我们将几乎所有层均分,分别放置于两个 GPU
上进行训练。其中,两个 GPU
之间仅在特定层上进行通信:
- 在第
3
层卷积层的时候,同时以前一层在两个GPU
上的输出进行联合输入,其他卷积层中,GPU
之间数据不互通。 - 在全连接层,
GPU
数据始终互通。
具体的结构和参数如下所示(结合上节链接学习
):