第三周的内容介绍了CNN,这里主要回顾CNN的基本概念。

Introduction to CNN

Convolutions

如果使用第二周的MLP来进行图像识别,那么结果会和物体在图像中的位置有关,如下图:

所以我们不能直接使用MLP,解决的办法是卷积(Convolutions):

Padding

在做卷积运算的时候,处于角落位置的像素进行卷积运算的次数很小,为了解决这个问题,我们可以使用Padding,在原图片周围填充一些像素:

Backpropagation for CNN

由于卷积运算会对许多像素进行重复运算,所以CNN中的反向传播和MLP中反向传播略有不同,需要进行累加:

Stride

Stride为步长,可以理解为kernel每次平移的像素数量,从一个例子中来看一下:

增加Stride主要是为了减少输出的维度。

Pooling

Pooling也是一种减少输出维度的方法,相当于直接把某些像素进行压缩,例如把每$2\times2$个像素取其中的最大值,来看一个例子:

Modern CNNs

由于当$x$很大时,$\frac{1}{1+e^{-x}}$和$\tanh(x)$的梯度很小,不利于训练,所以常常使用其他的激活函数。

ReLU activation

由于ReLU激活函数在小于$0$的地方导数为$0$,这依旧是一个不好的性质,所以还有Leaky ReLU激活函数。

Leaky ReLU activation

Weights initializations

对权重的初始化也非常重要。假设$x_i$同分布,$w_i$服从标准正态分布,且$E(x_i) =E(w_i)=0$,那么$E(\sum_{i=1}^n w_i x_i)=0$,我们来计算其方差:

我们希望输入和输出的方差尽量一致,所以会取$n \text{Var}( w) =1$,我们来计算$n \text{Var}( aw) $,注意$w$服从标准正态分布。

一般的,我们会取$a =\frac{\sqrt 2}{\sqrt{n_{in} + n_{out}}}$或者$a =\frac{\sqrt 2}{\sqrt{n_{in}}} $

Batch normalization

在输入数据之前,会做正规化处理:

Dropout

训练过程中,以一定的概率使得神经元无效,这种方法叫做Dropout:

在测试数据时,我们不对神经元采取Dropout,而是乘以Dropout的概率p:

Data augmentation

当图片数据不够时,可以对图片进行旋转,对称等处理来增加数据: