元学习:基础与应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.1 神经网络

神经网络模拟的是人类大脑中的信号传播和神经元的激活过程,每个神经元收到来自周围其他神经元传递过来的信号,被激活后将信号传递给其他神经元。神经网络的组成部分是权重(Weight)、偏差(Bias)、神经元(Neuron)、激活函数(Activation),权重和偏差作用于神经元之间的信号传递过程,激活函数决定了神经元收到信号之后的输出。实际上,大脑中的信号常常都是尖峰(Spiking)信号,一个神经元被激活之后会同时激活周围的许多神经元,而神经网络模型中的信号是光滑可导的,为误差的反向传播提供便利。

3.1.1 神经元

Michael Nielsen于2019年在他的电子书籍Neural Networks and Deep Learning[4]中详细介绍了神经网络模型中的权重、偏差、激活函数和误差反向传播。图3.1给出了简单的神经网络模型示意图,它说明了神经网络模型中的基本概念,为后面介绍元学习中对神经网络模型的改造打下基础。

img

图3.1 神经网络模型的示意图

神经网络模型的深度是指网络中的层数,神经网络模型的宽度是指每个隐藏层中神经元的个数。最左边的是输入层(Input Layer),输入层神经元的个数和输入数据的维度通常是一样的。中间是隐藏层(Hidden Layer),深度神经网络中有许多隐藏层,这里进行了简化,画成一个隐藏层,隐藏层收到输入数据之后进行一系列的处理,例如,卷积层(Convolutional Layer)、最大值池化层(Max-Pooling Layer)等。最右边是输出层(Output Layer),对隐藏层传递出来的信号进行处理,形成与问题目标对应的输出,例如,对于分类问题,输出层神经元的个数常常是分类问题的类别总数。

3.1.2 权重、偏差和激活函数

图3.2给出的是神经网络模型中参数的示意图。

img

图3.2 神经网络模型的参数示意图

神经元之间连接的参数是权重,记为img。神经元本身的参数包括偏差(Bias),记为b,神经元收到上一层神经元的信号被激活后的激活函数值是a。最左侧是输入层,输入层的神经元个数常常等于输入数据的维度,输入层对应的激活函数值等于输入的值,示意图中的这些参数之间有如下的函数关系:

img

其中,img是上一层神经元按照权重参数加权求和后得到的输入,img是神经元对应的偏差参数,img是神经元收到输入被激活后的输出值。img代表激活函数,选用的激活函数常常是Sigmoid函数,得到的激活函数值在0到1之间,激活函数要求是光滑函数且求导得到的值不易消失,Sigmoid函数是

img

其中,参数θ是正数,参数θ的值常常是1。另一种常用的激活函数是Tanh激活函数:

img

其中,参数θ是正数,参数θ的值常常是1。还有一种常用的激活函数,其是ReLU(Rectified Linear Unit)激活函数:

img

其中,参数θ是正数,参数θ的值常常是1。类似地,其他神经元参数之间的函数关系是

img

最后,输出层和隐藏层输出之间的函数关系是

img

其中,φ是将隐藏层输出映射到神经网络目标输出的函数。例如,在分类问题中,φ根据输入数据给出相应的分类结果,常用的分类函数是Softmax函数。图3.2给出了只有一个输出层神经元的简化情况,深度神经网络的输出层中会有很多个神经元,这些神经元根据隐藏层输出常用Softmax函数解决分类问题。Softmax函数的具体形式如下,N代表类别总数,φi代表输入样本属于类别i的概率:

img

其中,参数θ是正数,参数θ的值常常是1;N是输出层中神经元的个数,对应的是分类问题中最终分类的类别总数;w是输出层神经元在分类中的权重值;xk是神经网络输出层中第k个神经元收到的来自隐藏层的输入,在图3.2中对应的是img。本节介绍了神经网络模型中的参数——权重和偏差,以及神经网络模型中参数之间的联系——激活函数,接下来介绍神经网络模型中参数的估计方法。

3.1.3 网络反向传播算法

在图3.2所示的简化的神经网络模型中,权重和偏差决定了输入数据在整个神经网络模型中的传播过程,求解权重和偏差即可确定整个神经网络模型中输入数据的传播过程。输入数据在神经网络模型中传播,得到的输出是img,深度神经网络模型是有监督学习模型,输入数据是有标注的数据,数据标签是y,模型根据输入数据得到的输出img和实际数据标签y之间的距离是损失函数(Loss Function)。通过最小化损失函数可以计算出模型中的权重和偏差参数。深度神经网络有很多层,对应很多权重和偏差参数,因此估计这些参数依赖于大量的有标注数据,而获取数据标注是有成本的。

常用的损失函数有L2损失函数:

img

其代表了模型输出和实际标注之间的平方距离。常用的损失函数还有L1损失函数:

img

其代表了模型输出和实际标注之间的绝对值距离。常常和Softmax输出层函数配合使用的是交叉熵损失函数(Cross Entropy Loss Function),交叉熵损失函数的常用形式如下:

img

其中,N代表分类问题中所有类别的总数,M代表输入数据的样本数,img代表真实分布,即第j个输入样本属于第i个类别的真实概率,是根据数据标签计算得到的各类别上的真实概率分布:

img

这里的img取值为0或者1,img取值为1代表第j个输入样本属于第i个类别,img取值为0代表第j个输入样本不属于第i个类别。

此外,img代表预测概率分布,即神经网络模型计算得到的第j个输入样本属于第i个类别的预测概率,是根据模型输出计算得到的各类别上的预测概率分布:

img

其中,img代表第j个输入样本对应的第i个输出神经元收到的来自隐藏层的输入。在实际应用中也可以设计新的损失函数来满足神经网络模型训练的需求。当损失函数光滑可导时,最小化损失函数可通过梯度下降法实现;当损失函数不可导时,最小化损失函数可以采用遗传演化算法。

在深度神经网络模型中,最小化损失函数常常通过梯度下降法来实现。需要将损失函数对神经网络模型中所有的参数求导数,这些参数之间存在函数关系,根据求导的链式法则,可以依次计算出损失函数对最后一层参数的导数、对倒数第二层参数的导数,一直到对输入层参数的导数。

图3.3所示的是简化的神经网络模型中误差反向传播的示意图。从损失函数对最后一层的参数求导开始,通过求导的链式法则,计算链式法则中的所有导数值,从而计算出损失函数对输入层参数的导数。例如,对于L2损失函数:

img

对于权重参数的导数:

img

对于更早一些层的权重参数的导数:

img
img

图3.3 神经网络模型中误差反向传播示意图

可见,离输出层越远的层,导数中相乘的项就越多,神经网络模型中的隐藏层的数目越多,导数中相乘的项也越多,越容易出现很多较小的项相乘导致梯度接近于零,或者很多较大的项相乘导致梯度爆炸,然而隐藏层的数目越多越有利于模型精度的提升。因此,神经网络模型的改进思路常常在于提升链式法则中导数的稳定性。类似地,损失函数对于偏差参数的导数是

img

于是可以求出损失函数对神经网络模型中所有参数的导数,进而使用随机梯度下降法,求解最小化损失函数时所有参数的值。

3.1.4 学习率、批尺寸、动量和权值衰减

下面介绍深度神经网络训练过程中重要的超参数定义,包括学习率(Learning Rate)、批尺寸(Batch Size)、动量(Momentum)、权值衰减(Weight Decay)。在计算损失函数对参数的导数之后,通过迭代对参数进行更新,例如,权重参数img的更新如下:

img

其中,η是学习率参数,学习率参数的设置在深度神经网络模型的训练中很重要。学习率参数较大时,训练较快,但是训练不稳定;学习率参数较小时,训练较慢,但是训练很稳定。一般情况下,随着训练的进行,学习率相应地逐渐减小。Leslie Smith于2017年在论文“Cyclical Learning Rates for Training Neural Networks”[5]中提出了学习率的周期性设置方法(Cyclical Learning Rate)。在训练过程中,学习率周期性地在上下界之间波动,在初始的几轮训练中,学习率线性增加,以此来确定学习率波动的上下界。

深度神经网络使用随机梯度下降法进行优化求解,估计梯度值img时使用一个批次中的m个训练数据来计算梯度平均值img。这里的m就是批尺寸参数,例如,权重参数img的更新变为如下形式[4]

img

此处使用批次中的训练数据估计损失函数对权重参数的导数值,批尺寸越大,估计的导数值越准确和稳定,批尺寸的大小受到有标注数据量和算力的限制。

在训练过程中,损失函数对参数导数的估计值不仅由当前批次的训练数据决定,还受到之前批次训练数据的影响。动量参数的引入考虑了之前批次训练数据对当前导数估计值的影响,例如,权重参数img的更新变为如下形式[4]

img

其中μ是动量参数,img是这个批次之前所有批次参数更新时损失函数对权重参数的梯度累积值,img是当前更新后的梯度值,这个梯度值和权重值相加,得到更新后的权重值。

常用的损失函数还有带正则项的损失函数,即前面的损失函数img加上惩罚项,惩罚项是对神经网络模型复杂度的惩罚,例子中惩罚项是权重的L2函数[4]

img

使用这个带有惩罚项的损失函数来进行参数更新时,例如,权重参数img的更新变为如下形式[4]

img

其中,img是权值衰减参数。

Leslie Smith于2018年在论文“A Disciplined Approach to Neural Network Hyper-Parameters: Part 1--Learning Rate, Batch Size, Momentum, and Weight Decay”[6]中给出了对深度神经网络的超参数学习率、批尺寸、动量、权值衰减的设置方法,训练深度神经网络模型时常常需要实时观察训练集误差和验证集误差,以判断模型是否处于欠拟合或者过拟合状态。适当增加学习率或者动量参数可以加速模型的训练,权值衰减是学习率和正则项系数的函数,这些超参数的最优值之间是相互关联的,超参数的最优值往往是同时确定的。论文中给出了如下经验:

(1)超参数的设置和具体的神经网络结构有关。例如,对于三层的神经网络模型,0.01的学习率已经很大了,但是对于ResNet来说,3.0的学习率才算大。一般可以使用学习率区间测试(Learning Rate Range Test)来确定最大的学习率参数,最小的学习率是最大学习率的十分之一,学习率可以在最大值和最小值之间波动。为了训练的稳定,学习率增大的速率不宜太快。

(2)批尺寸的大小受GPU内存空间的限制。如果训练中使用了多个GPU,那么总的批尺寸是单个GPU上的批尺寸乘以GPU的个数。小的批尺寸等价于大的正则项,有利于提高模型的泛化能力,大的批尺寸和大的学习率常常搭配使用。

(3)动量参数也可以用类似的周期性方法来设置。训练过程中让动量参数在最大值和最小值之间周期性波动,动量参数常常取值为0.99、0.97、0.95、0.9、0.85、0.8。

(4)权值衰减需要通过网格搜索法来确定。权值衰减的具体取值范围和训练数据集的大小、深度神经网络结构的复杂程度有关,训练数据集越小、模型参数越多,权值衰减程度越大。

3.1.5 神经网络模型的正则化

深度神经网络模型中有许多提高模型泛化能力的方法,Ian Goodfellow等作者于2016年在书籍Deep Learning[5]中讲述了许多提高深度神经网络模型泛化能力的方法,并将这些方法统称为正则化(Regularization)方法。前面提到过,元学习方法MAML的主要目的之一是提高深度神经网络模型的泛化能力,可以认为提高深度神经网络模型泛化能力的方法都是正则化方法,也可以认为所有正则化方法都可以实现元学习的目的,即提高深度模型的泛化能力。Deep Learning一书中介绍的这些正则化方法包括:

(1)在最小化损失函数的过程中,对权重参数加上约束条件(Constrained Optimization),可以限制非零权重参数的大小和个数,这等价于求解带有惩罚项的损失函数最小化问题,惩罚项可以是权重的L1函数、L2函数或者其他常用惩罚项函数。

(2)数据增强(Dataset Augmentation)通过对观测数据进行已知的变换,例如,图像扭曲(Distortion)、加入随机偏差、变形、变色、镜像变换、随机转换背景内容等,将变换后的图片用来训练模型,提高模型的泛化能力。

(3)多任务学习(Multi-Task Learning)类似元学习方法,将多个任务进行训练,发现任务之间的共性,用于模型的泛化。

(4)训练早停(Early Stopping)需要观察神经网络训练过程中验证集精度的变化。在一般情况下,随着训练迭代次数变多,验证集精度会先下降后上升,验证集精度最小的位置就是最优的模型停止训练的位置。早停可以避免深度模型过拟合,早停得到的结果与第一种带有权重参数正则项的损失函数优化方法是等价的。

(5)将稠密的参数转换成稀疏表达(Sparse Representation),参数稀疏的模型常常具有更好的泛化能力。

(6)集成算法(Bagging)通过对训练数据进行重新有放回抽样(Resampling),然后重新训练机器学习模型。通过在多个抽样数据集上训练一个精度不高的弱学习器,对结果进行组合,可形成一个精度很高且不会过拟合的强学习器。

(7)随机失活(Dropout)随机地删除深度神经网络模型中的一些神经元以及连接它们的权重参数,将权重参数的值强制设为0。在神经网络模型逐层的信息传递过程中引入随机性,可以减少模型中参数的数目,降低模型过拟合的风险。

(8)在对抗样本(Adversarial Example)上训练神经网络模型。对抗样本是对训练数据进行小扰动之后生成的样本,深度神经网络模型在对抗样本上的误差急剧增加,在对抗样本上训练深度神经网络模型,有利于提高深度神经网络模型的泛化能力。

(9)切线传播(Tangent Propagation)使输入数据沿着变换的切线方向进行变换,保证模型对于输入数据的变换具有不变性。

(10)批归一化也是神经网络模型的正则项,批归一化的使用会抵消随机失活的效果,因此两者常常不同时使用。

下面主要介绍批归一化和随机失活这两种为深度神经网络模型提供正则项的方法,它们在深度学习的编程框架中被广泛使用,影响深远。

3.1.6 批归一化

Sergey Ioffe和Christian Szegedy于2015年在论文“Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”[8]中提出,在神经网络训练过程中,层与层之间会产生内部协变量偏移(Internal Covariate Shift),导致神经网络的梯度爆炸或者消失。为了解决这个问题,文中提出了批归一化方法,将神经网络模型每一层输入值的均值和方差进行标准化和归一化,这个切实可行且简单的操作可以有效地提高神经网络模型训练过程中导数的稳定性,允许使用更大的学习率参数,以使训练深度神经网络模型变得更加容易。

批归一化方法在深度神经网络模型中得到了广泛的应用,关于批归一化方法有许多讨论,典型的案例有如下两篇论文。

(1)Li Xiang等作者于2019年在论文“Understanding the Disharmony between Dropout and Batch Normalization by Variance Shift”[9]中指出,批归一化的效果和随机失活的效果是相互抵消的,两者同时使用时会带来更差的模型表现。在神经网络模型从训练到测试的过程中,随机失活会导致神经元激活值的方差发生变化,但是批归一化会保持神经元激活值的方差不变,而且方差是训练过程中累积更新得到的。由于在神经元激活值方差上的不同作用效果,在批归一化之前使用随机失活会导致训练过程中出现数值不稳定,进而导致更多错误的预测值。

(2)Shibani Santurkar等作者于2018年在论文“How Does Batch Normalization Help Optimization”[10]中指出,批归一化的改进效果并不是来自解决了内部协变量偏移,而是改进了优化问题的求解,使得寻优过程中的寻优表面更加光滑,进而导致梯度的估计值更加稳定且更容易预测,从而带来了更快更稳定的训练过程。

上一层神经元的激活函数到下一层神经元的激活函数之间需要经过三个步骤。第一步通过权重将上一层神经元的激活值进行线性组合;第二步是对这个线性组合进行非线性变换,即非线性的激活函数,前面提到过,常用的非线性激活函数有Sigmoid、Tanh和ReLU函数;第三步是将非线性变换后的值作为神经元的激活值,例如,具体步骤如下面的公式所示:

img

批归一化发生在第二步,即线性组合之后、非线性激活函数之前,在每一个批次的训练数据上,对线性组合进行标准化和归一化。非线性激活函数的导数只在特定的范围内取值较大,在这个范围之外,导数较小。如果很多较小的导数相乘,就会导致训练时误差反向传播中梯度消失,因此批归一化将上一层激活值的线性组合进行归一化和标准化之后,正好处于激活函数导数值较大的区间内,这样梯度就不易消失了。

在批归一化中,在每一个批次B中,有m个输入数据,计算每一层输入的均值和方差[8]

img

每一层的输入img需要进行标准化和归一化[8]

img

为了保持神经网络模型的表示力,需要在通过神经网络模型形成输出达成结论时将归一化后的输入转变回与归一化前可比的结果[8]

img

其中,γ是尺度(Scale)参数,β是位置(Shift)参数。在每个批次的训练数据中,都计算输入数据的均值和方差。一种常见的设置尺度和位置参数的方法是,计算所有批次的输入数据均值的平均值作为位置参数,计算所有批次的输入数据方差的平均值作为尺度参数。

2015年提出的批归一化又发展出许多变体:

(1)2016年的层归一化(Layer Normalization)[11]对所有批次上的输入数据进行了归一化处理,相对于批归一化而言,其在不同维度上进行了归一化处理。

(2)2016年的权重归一化(Weight Normalization)[12]对权重参数进行归一化处理。

(3)2016年的实例归一化(Instance Normalization)[13]仅对单个训练数据集的输入进行归一化处理,在图片风格传递上可以提高图片生成网络的效果。

(4)递归神经网络的批归一化(Recurrent Batch Normalization)[14]将归一化应用到包含递归自连接神经元的长短期记忆网络,在输入层到隐藏层之间,以及隐藏层之间都使用了批归一化,带来了LSTM更快收敛和更好泛化能力的效果。

(5)余弦距离归一化(Cosine Normalization)[15]考虑了用余弦距离替代点乘的距离,余弦距离下的归一化将每一层的输入变换到更狭窄的区间,带来了神经网络训练过程更加稳定的效果。

(6)互换式归一化(Switchable Normalization)[16]考虑让神经网络模型学会自行归一化。对于深度模型不同层自动采用合适的归一化方法,互换式归一化供选择的归一化方法包括批归一化、层归一化等。

(7)组归一化(Group Normalization)[17]解决了批归一化的结果对批尺寸的变化非常敏感的问题。随着批尺寸的减小,批归一化的结果急剧变差,组归一化考虑对不同批次的训练数据进行分组,在每个组内进行标准化和归一化。

3.1.7 随机失活

Nitish Srivastava等作者于2014年在论文“Dropout: A Simple Way to Prevent Neural Networks from Overfitting”[18]中提出,可使用随机失活方法来解决深度神经网络模型中的过拟合问题。随机失活方法在深度神经网络模型中随机地删除一些神经元以及这些神经元的所有连接,在每一层设定不同的失活概率(Dropout Probability),每层内的神经元有失活概率这么大的可能性会失活。神经元删除与否的决定服从伯努利分布(Bernoulli Distribution),由于随机性,随机失活生成了很多不同的变稀疏之后的神经网络模型,使用这些稀疏的神经网络模型进行集成学习(Ensemble Learning),降低了过拟合的可能性。失活概率越大,过拟合可能性的降低程度越大,对深度神经网络模型的正则化作用越大。随机失活会增加模型训练的时间,在一般情况下,加入随机失活来训练同样的模型需要2~3倍的训练时间。

批归一化并不会和随机失活方法同时使用,原因有如下几个。

(1)随机失活具有随机性,如与批归一化同时使用,会提高误差反向传播公式推导的难度。此时每一层输入的上一层激活值具有随机性,因此求出的输入值均值和输入值方差都具有随机性。

(2)随机失活在深度神经网络中随机删除神经元,改变了网络结构,此时批归一化计算每层输入的均值和方差不稳定。每层中对均值和方差影响较大的神经元可能随机被删除了,导致均值和方差发生较大改变。

(3)随机失活单独使用时已经达到了很好的效果,批归一化方法单独使用时也已经达到了很好的效果,没有必要将二者同时使用,二者同时使用的效果不会更好。

Li Wan等作者于2013年在论文“Regularization of Neural Networks Using DropConnect”[19]中提出了权重随机失活方法(DropConnect)。DropConnect也可用来解决深度神经网络模型中的过拟合问题,但与随机失活方法不同的是,DropConnect随机地删除一些神经元之间的连接,而不是随机地删除一些神经元。在Dropout中,每层的一些激活值被设置成0;在DropConnect中,每层之间的一些权重值被设置成0。加入DropConnect后的模型训练时间比加入Dropout后的模型训练时间更长,但是加入DropConnect后的模型测试集误差比加入Dropout后的模型测试集误差低,可以在DropConnect之前使用实例归一化来对每个输入的初始训练数据进行归一化处理。