2.3.1 以层为核心定义神经网络
神经网络层包含构建机器学习网络结构的基本组件,如计算机视觉领域常用到卷积(Convolution)、池化(Pooling)、全连接(Fully Connected);自然语言处理常用到循环神经网络(Recurrent Neural Network,RNN);为了加速训练,防止过拟合通常用到批标准化(Batch-Norm)、丢弃(Dropout)等。
全连接是将当前层每个节点都和上一层节点一一连接,本质上是特征空间的线性变换;可以将数据从高维映射到低维,也能从低维映射到高维。图2.3展示了全连接的过程,对输入的n个数据变换到大小为m的特征空间,再从大小为m的特征空间变换到大小为p的特征空间;可见全连接层的参数量巨大,两次变换所需的参数大小为n×m和m×p。
图2.3 全连接层
卷积操作是卷积神经网络中常用的操作之一,卷积相当于对输入进行滑动滤波。根据卷积核(Kernel)、卷积步长(Stride)、填充(Padding)对输入数据从左到右,从上到下进行滑动,每一次滑动操作是矩阵的乘加运算得到的加权值。如图2.4卷积操作主要由输入、卷积核、输出组成,输出又被称为特征图(Feature Map)。
图2.4 卷积操作的组成
卷积的具体运算过程通过图2.5进行演示。该图输入为4×4的矩阵,卷积核大小为3×3,卷积步长为1,不填充,最终得到2×2的输出矩阵。计算过程为:将3×3的卷积核作用到左上角3×3大小的输入上;输出为1×1+2×0+2×1+3×0+2×1+3×0+4×1+1×0+3×1=12,同理对卷积核移动1个步长再次执行相同的计算步骤得到第二个输出为11;当再次移动将出界时,结束从左往右的移动,执行从上往下移动1步,再进行从左往右移动;依次操作直到从上往下再移动也出界时,结束整个卷积过程,得到输出结果。不难发现相比于全连接,卷积的优势是参数共享(同一个卷积核遍历整个输入)和参数量小(卷积核大小即是参数量)。
图2.5 卷积的具体运算过程
在卷积过程中,可以通过设置步长和填充控制输出矩阵大小。还是上面的输入矩阵,如需要得到和输入矩阵大小一样的输出矩阵,步长为1时,就需要对输出矩阵的上、下、左、右均填充一圈全为0的数。
在上述例子中介绍了一个输入一个卷积核的卷积操作。通常情况下输入是彩色图片,有三个输入,这三个输入称为通道(Channel),分别代表红、绿、蓝(RGB)。此时执行卷积则为多通道卷积,需要三个卷积核分别对RGB三个通道进行上述卷积过程,之后将结果加起来。图2.6描述了一个输入通道为3,输出通道为1,卷积核大小为3×3,卷积步长为1的多通道卷积过程。需要注意的是,每个通道都有各自的卷积核,同一个通道的卷积核参数共享。如果输出通道为outc,输入通道为inc,那么需要outc×inc个卷积核。
池化是常见的降维操作,有最大池化和平均池化。池化操作和卷积的执行类似,通过池化核、步长、填充决定输出;最大池化是在池化核区域范围内取最大值,平均池化则是在池化核范围内做平均。与卷积不同的是:池化核没有训练参数;池化层的填充方式也有所不同,平均池化填充的是0,最大池化填充的是−inf。图2.7是对4×4的输入进行2×2区域池化,步长为2,不填充;图左边是最大池化的结果,右边是平均池化的结果。
有了卷积、池化、全连接组件,就可以构建一个非常简单的卷积神经网络了,图2.8展示了一个卷积神经网络的模型结构。给定输入3×64×64的彩色图片,使用16个3×3大小的卷积核做卷积,得到大小为16×64×64的输出;再进行池化操作降维,得到大小为16×32×32的特征图;对特征图再卷积得到大小为32×32×32的特征图,再进行池化操作得到32×16×16大小的特征图;需要对特征图做全连接,此时需要把特征图平铺成一维向量,这步操作称为压平(Flatten),压平后特征大小为32×16×16=8192;之后做一次全连接,将大小为8192特征变换到大小为128的特征,再依次做两次全连接,分别得到64,10。这里最后的输出结果是依据自己的实际问题而定,假设输入是包含0~9的数字图片,做分类那输出对应是10个概率值,分别对应0~9的概率大小。
图2.6 多通道卷积
图2.7 池化操作
图2.8 卷积神经网络模型结构
有了上述基础知识,对卷积神经网络模型构建过程伪代码描述,如代码2.11所示。
代码2.11 构建卷积神经网络
深度神经网络应用领域的飞速发展,诞生出丰富的模型构建组件。在卷积神经网络的计算过程中,前后的输入是没有联系的,然而在很多任务中往往需要处理序列信息,如语句、语音、视频等,为了解决此类问题诞生出循环神经网络(RNN);循环神经网络解决了序列数据的时序关联问题,但是随着序列长度的增加,长序列导致了训练过程中梯度消失和梯度爆炸的问题,因此有了长短期记忆(Long Short-term Memory,LSTM);在语言任务中还有Seq2Seq(Sequence to Sequence,序列到序列)模型,它将RNN当成编解码(Encoder-Decoder)结构的编码器(Encoder)和解码器(Decoder);在解码器中常常使用注意力机制(Attention);基于编解码器和注意力机制诞生了Transformer模型;Transformer模型是BERT模型架构的重要组成。随着深度神经网络的发展,未来也会诞生各类模型架构,架构的创新可以通过各类神经网络基本组件的组合来实现。