1. 简介

CNN 是专门用于处理网格化数据的神经网络。CNN 中新增了 Convolution 层和 Pooling 层,CNN 的层的连接顺序是「Convolution-ReLU-(Pooling)」(Pooling层有时会被省略)。这可以理解为之前的“Affine-ReLU”连接被替换成了「Convolution-ReLU-(Pooling)」连接。

2. CNN 的优势

  • 全连接层(Affine 层)忽略了数据的形状。比如,输入数据是图像时,图像通常是高、长、通道方向上的 3 维形状。但是,向全连接层输入时,需要将 3 维数据拉平为 1 维数据。

图像是 3 维形状,这个形状中应该含有重要的空间信息。比如,空间上邻近的像素为相似的值、 RBG 的各个通道之间分别有密切的关联性、相距较远的像素之间没有什么关联等, 3维形状中可能隐藏有值得提取的本质模式。

  • 而卷积层可以保持形状不变。当输入数据是图像时,卷积层会以3维数据的形式接收输入数据,并同样以3维数据的形式输出至下一层。因此,在CNN中,可以(有可能)正确理解图像等具有形状的数据。

【注】把 3 维数据表示为多维数组时,书写顺序为(channel, height, width)。作为 4 维数据,滤波器的权重数据要按(output_channel, input_channel, height, width)的顺序书写。

3. 术语

  • 特征图(feature map):卷积层的输入输出数据。输入数据称为输入特征图,输出数据称为输出特征图。
  • 卷积(convolution):滤波器上的元素和输入的窗口数据对应元素进行相乘并累加求和。

  • 填充(padding):在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如 0 等)。「幅度为1的填充」是指用幅度为 1 像素的 0 填充周围。

使用填充主要是为了调整输出的大小(防止每次进行卷积运算后空间缩小以至最终空间缩小为 1 ),可以在保持空间大小不变的情况下将数据传给下一层。

  • 步幅(stride):应用滤波器的位置间隔称为步幅。

【注】增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。

设输入大小为 (H,W)(H,W),滤波器大小为 (FH,FW)(FH,FW),输出大小为 (OH,OW)(OH,OW),填充为 PP,步幅为 SS,则有如下等式:

OH=H+2PFHS+1OW=W+2PFWS+1\begin{array}{c} OH = \frac{H + 2P - FH}{S} + 1 \\ OW = \frac{W + 2P - FW}{S} + 1 \end{array}

  • 池化(pooling):(也称为汇聚)池化是缩小高、长方向上的空间的运算。一般来说,池化的窗口大小会和步幅设定成相同的值。池化是指对每个区域进行下采样(Down Sampling)得到一个值,作为这个区域的概括。

常见池化方法

  1. Max 池化
  2. Average 池化

4. 卷积层

4.1 一维卷积

假设信号发生器每个时刻 tt 产生一个信号 xtx_t,齐信息的衰减率为 wkw_k,即在 k1k-1 个时间步长后,信息为原来的 wkw_k 倍。则在 tt 时刻接收到的信号 yty_t 为当前时刻产生的信息和以前时刻延迟信息的叠加:

yt=k=1Kwkxtk+1\begin{array}{c} y_t = \sum_{k=1}^K w_k x_{t-k+1} \end{array}

记作

y=wx\begin{array}{c} \boldsymbol{y} = \boldsymbol{w} * \boldsymbol{x} \end{array}

其中,* 表示卷积操作,把 w1,w2,,wK w_1,w_2,\cdots,w_K 称作滤波器或卷积核。

4.2 二维卷积

给定一个图像 XRM×N \boldsymbol{X} \in \mathbb{R}^{M \times N} 和一个滤波器 WWU×V \boldsymbol{W} \in \mathbb{W}^{U \times V} (一般 UM,VNU \ll M, V \ll N),其卷积为

yij=u=1Uv=1Vwuvxiu+1,jv+1\begin{array}{c} y_{ij} = \sum_{u=1}^U \sum_{v=1}^V w_{uv} x_{i-u+1,j-v+1} \end{array}

记作

Y=WX\begin{array}{c} \boldsymbol{Y} = \boldsymbol{W} * \boldsymbol{X} \end{array}

4.3 互相关

互相关和卷积的区别仅仅在于卷积核是否进行翻转,互相关公式为:

yij=u=1Uv=1Vwuvxi+u1,j+v1\begin{array}{c} y_{ij} = \sum_{u=1}^U \sum_{v=1}^V w_{uv} x_{i+u-1,j+v-1} \end{array}

记作

Y=WX=rotate180(W)X\begin{array}{c} \boldsymbol{Y} = \boldsymbol{W} \otimes \boldsymbol{X} = rotate_{180^\circ}(\boldsymbol{W}) * \boldsymbol{X} \end{array}

  • 在神经网络中使用卷积是为了进行特征抽取,卷积核是否进行翻转和其特征抽取的能力无关。

  • 特别是当卷积核是可学习的参数时,卷积和互相关在能力上是等价的。

  • 在具体实现上,一般会以互相关操作来代替卷积,从而会减少一些不必要的操作或开销。

4.4 常用卷积

  • 窄卷积:S=1,P=0 S = 1, P = 0 ,卷积后输出长度为 MK+1M - K + 1

  • 宽卷积:S=1,P=K1 S = 1, P = K - 1 ,卷积后输出长度为 M+K1M + K - 1。宽卷积运算符号为:~\tilde{\otimes}

  • 等宽卷积:S=1,P=(K1)/2 S = 1, P = (K-1)/2 ,卷积后输出长度为 MM

4.5 导数

假设 Y=WX \boldsymbol{Y} = \boldsymbol{W} \otimes \boldsymbol{X} ,其中 XRM×N,WRU×V,YR(MU+1)×(NV+1) \boldsymbol{X} \in \mathbb{R}^{M \times N}, \boldsymbol{W} \in \mathbb{R}^{U \times V}, Y \in \mathbb{R}^{(M-U+1)\times(N-V+1)} ,函数 f(Y)R f(\boldsymbol{Y}) \in \mathbb{R} 为一个标量函数,则:

f(Y)W=f(Y)YXf(Y)X=rotate180(W)~f(Y)Y\begin{array}{c} \frac{\partial f(\boldsymbol{Y})}{\partial \boldsymbol{W}} = \frac{\partial f(\boldsymbol{Y})}{\partial \boldsymbol{Y}} \otimes \boldsymbol{X} \\ \frac{\partial f(\boldsymbol{Y})}{\partial \boldsymbol{X}} = rotate_{180^\circ}(W) \tilde{\otimes} \frac{\partial f(\boldsymbol{Y})}{\partial \boldsymbol{Y}} \end{array}

5. 反卷积(转置卷积)层

卷积操作用来实现高维特征到低维特征的转换,而反卷积(转置卷积)用来将低维特征映射到高维特征。

5.1 转置关系

对于一个高维向量 xRd \boldsymbol{x} \in \mathbb{R}^d 和一个低维向量 zRp \boldsymbol{z} \in \mathbb{R}^p ,其中 p<d p \lt d 。如果用仿射变换实现高维到低维的映射:

z=Wx\begin{array}{c} \boldsymbol{z} = \boldsymbol{W} \boldsymbol{x} \end{array}

其中,WRp×d \boldsymbol{W} \in \mathbb{R}^{p \times d} 为转换矩阵。则可以通过转置 W\boldsymbol{W} 来实现低维到高维的反向映射:

x=WTz\begin{array}{c} \boldsymbol{x} = \boldsymbol{W}^T \boldsymbol{z} \end{array}

这两个映射之间不是逆关系,只是形式上的转置关系。

【注】在全连接网络中,忽略激活函数,前向计算和反向传播就是一种转置关系。

  • 前向计算:第 l+1l + 1 层净输入:

z(l+1)=W(l+1)z(l)\begin{array}{c} \boldsymbol{z}^{(l+1)} = \boldsymbol{W}^{(l+1)} \boldsymbol{z}^{(l)} \end{array}

  • 反向传播:第 ll 层的误差项:

δ(l)=(W(l+1))Tδ(l+1)\begin{array}{c} \delta^{(l)} = (\boldsymbol{W}^{(l+1)})^T \delta^{(l+1)} \end{array}

5.2 反卷积(转置卷积)

对于输入为 (Hin,Win)(H_{in}, W_{in}),步长为 stridestride,填充为 paddingpadding,卷积核大小为 kernel_sizekernel\_size,输出补偿填充为 output_paddingoutput\_padding,转置卷积输出的结果为:

Hout=(Hin1)stride[0]2padding[0]+kernel_size[0]+output_padding[0]\begin{array}{c} H_{out}=(H_{in}-1)stride[0]-2padding[0]+kernel\_size[0]+output\_padding[0] \end{array}

Wout=(Win1)stride[1]2padding[1]+kernel_size[1]+output_padding[1]\begin{array}{c} W_{out}=(W_{in}-1)stride[1]-2padding[1]+kernel\_size[1]+output\_padding[1] \end{array}

6. 池化层

池化层有以下特征:

  • 没有要学习的参数
  • 通道数不发生变化
  • 对微小的位置变化具有鲁棒性(健壮)