在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。
机器学习模型应关注降低泛化误差。
从严格意义上讲,测试集只能在所有超参数和模型参数选定后使用一次。不可以使用测试数据选择模型,如调参。由于无法从训练误差估计泛化误差,因此也不应只依赖训练数据选择模型。鉴于此,我们可以预留一部分在训练数据集和测试数据集以外的数据来进行模型选择。这部分数据被称为验证数据集,简称验证集(validation set)。例如,我们可以从给定的训练集中随机选取一小部分作为验证集,而将剩余部分作为真正的训练集。
为了得到更为稳健可靠的模型,对模型的泛化误差进⾏评估,得到模型泛化误差的近似值。当有多个模型可以选择时,我们通常选择“泛化误差”最⼩的模型。
由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈。一种改善的方法是K折交叉验证(K-fold cross-validation)。在K折交叉验证中,我们把原始训练数据集分割成K个不重合的子数据集,然后我们做K次模型训练和验证。每一次,我们使用一个子数据集验证模型,并使用其他K-1个子数据集来训练模型。在这K次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这K次训练误差和验证误差分别求平均。
过拟合和欠拟合接下来,我们将探究模型训练中经常出现的两类典型问题:
一类是模型无法得到较低的训练误差,我们将这一现象称作欠拟合(underfitting); 另一类是模型的训练误差远小于它在测试数据集上的误差,我们称该现象为过拟合(overfitting)。为了解释模型复杂度,我们以多项式函数拟合为例。给定一个由标量数据特征xxx和对应的标量标签yyy组成的训练数据集,多项式函数拟合的目标是找一个KKK阶多项式函数
y^=b+∑k=1Kxkwk \hat{y} = b + \sum_{k=1}^K x^k w_k y^=b+k=1∑Kxkwk
来近似 yyy。在上式中,wkw_kwk是模型的权重参数,bbb是偏差参数。与线性回归相同,多项式函数拟合也使用平方损失函数。特别地,一阶多项式函数拟合又叫线性函数拟合。
给定训练数据集,模型复杂度和误差之间的关系:
训练数据集大小影响欠拟合和过拟合的另一个重要因素是训练数据集的大小。一般来说,如果训练数据集中样本数过少,特别是比模型参数数量(按元素计)更少时,过拟合更容易发生。此外,泛化误差不会随训练数据集里样本数量增加而增大。因此,在计算资源允许的范围之内,我们通常希望训练数据集大一些,特别是在模型复杂度较高时,例如层数较多的深度学习模型。
如何解决欠拟合: 添加其他特征项。组合、泛化、相关性、上下⽂特征、平台特征等特征是特征添加的重要⼿段,有时候特征项不够会导 致模型⽋拟合。 添加多项式特征。例如将线性模型添加⼆次项或三次项使模型泛化能⼒更强。例如,FM(Factorizat ion Machine)模 型、FFM(Field-aware Factorizat ion Machine)模型,其实就是线性模型,增加了⼆阶多项式,保证了模型⼀定的拟 合程度。 可以增加模型的复杂程度。 减⼩正则化系数。正则化的⽬的是⽤来防⽌过拟合的,但是现在模型出现了⽋拟合,则需要减少正则化参数。 如何解决过拟合: 重新清洗数据,数据不纯会导致过拟合,此类情况需要重新清洗数据。 增加训练样本数量。 降低模型复杂程度。 增⼤正则项系数。 采⽤dropout⽅法,dropout⽅法,通俗的讲就是在训练的时候让神经元以⼀定的概率不⼯作。 early stopping。 减少迭代次数。 增⼤学习率。 添加噪声数据。 树结构中,可以对树进⾏剪枝。 减少特征项,进行特征选择。梯度消失是指通过隐藏层从后向前看,梯度会变的越来越⼩,说明前⾯层的学习会显著慢于后⾯层的学习,所以学习会 卡住,除⾮梯度变⼤。 梯度消失的原因受到多种因素影响,例如学习率的⼤⼩,⽹络参数的初始化,激活函数的边缘效应等。在深层神经⽹络
中,每⼀个神经元计算得到的梯度都会传递给前⼀层,较浅层的神经元接收到的梯度受到之前所有层梯度的影响。如果 计算得到的梯度值⾮常⼩,随着层数增多,求出的梯度更新信息将会以指数形式衰减,就会发⽣梯度消失。下图是不同 隐含层的学习速率:
在深度⽹络或循环神经⽹络(Recurrent Neural Network, RNN)等⽹络结构中,梯度可在⽹络更新的过程中不断累 积,变成⾮常⼤的梯度,导致⽹络权重值的⼤幅更新,使得⽹络不稳定;在极端情况下,权重值甚⾄会溢出,变为NAN 值,再也⽆法更新。
##2.3 解决方法
梯度消失问题:换用Relu、LeakyRelu、Elu等激活函数,批量归一化BatchNormalization,ResNet残差结构,LSTM结构。
梯度爆炸问题:权重初始化,梯度裁剪,预训练加finetunning,减小学习率。
RNN在处理长期依赖(时间序列上距离较远的节点)时会遇到巨⼤的困难,因为计算距离较远的节点之间的联系时会涉及雅可⽐矩阵(目标函数一阶偏导矩阵)的多次相乘,会造成梯度消失或者梯度膨胀的现象。为了解决该问题,研究⼈员提出了许多解决办法,例如 ESN(Echo State Network),增加有漏单元(Leaky Unit s)等等。其中最成功应⽤最⼴泛的就是门限RNN(Gated RNN),⽽LSTM就是门限RNN中最著名的⼀种。有漏单元通过设计连接间的权重系数,从⽽允许RNN累积距离较远节点间的 长期联系;⽽门限RNN则泛化了这样的思想,允许在不同时刻改变该系数,且允许⽹络忘记当前已经累积的信息
3.1.2 图解标准RNN和LSTM的区别所有 RNN 都具有⼀种重复神经⽹络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有⼀个⾮常简单的结构,例如⼀个 tanh 层,如下图所⽰:
LSTM 同样是这样的结构,但是重复的模块拥有⼀个不同的结构。不同于单⼀神经⽹络层,这⾥是有四个,以⼀种⾮常特殊 的⽅式进⾏交互。
上图中,每⼀条⿊线传输着⼀整个向量,从⼀个节点的输出到其他节点的输⼊。粉⾊的圈代表 pointwise 的操作,诸如向量的和,⽽黄⾊的矩阵就是学习到的神经⽹络层。合在⼀起的线表⽰向量的连接,分开的线表示内容被复制,然后分发到不同 的位置。
### 3.1.3 LSTM核⼼思想图解
LSTM 的关键就是细胞状态,⽔平线在图上⽅贯穿运⾏。细胞状态类似于传送带。直接在整个链上运⾏,只有⼀些少量的线性交互。信息在上⾯流传保持不变会很容易。⽰意图如下所⽰:
LSTM 有通过精⼼设计的称作为“门”的结构来去除或者增加信息到细胞状态的能⼒。门是⼀种让信息选择式通过的⽅法。他们 包含⼀个 sigmoid 神经⽹络层和⼀个 pointwise 乘法操作。⽰意图如下:
LSTM 拥有三个门,分别是忘记层门,输入层门和输出层门,来保护和控制细胞状态。
忘记层门
作用对象:细胞状态 。
作用:将细胞状态中的信息选择性的遗忘。
操作步骤:该门会读取ht−1h_{t-1}ht−1和xtx_txt,输出一个在 0 到 1 之间的数值给每个在细胞状态Ct−1C_{t-1}Ct−1中的数字。1 表示“完全保留”,0 表示“完全舍弃”。示意图如下:
输入层门
作用对象:细胞状态
作用:将新的信息选择性的记录到细胞状态中。
操作步骤:
步骤一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。
步骤二,tanh 层创建一个新的候选值向量C~t\tilde{C}_tC~t加入到状态中。其示意图如下:
步骤三:将ct−1c_{t-1}ct−1更新为ctc_{t}ct。将旧状态与ftf_tft相乘,丢弃掉我们确定需要丢弃的信息。接着加上it∗C~ti_t * \tilde{C}_tit∗C~t得到新的候选值,根据我们决定更新每个状态的程度进行变化。其示意图如下:
输出层门
作用对象:隐层hth_tht
作用:确定输出什么值。
操作步骤:
步骤一:通过sigmoid 层来确定细胞状态的哪个部分将输出。
步骤二:把细胞状态通过 tanh 进行处理,并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
其示意图如下所示:
Gated Recurrent Unit
由Kyunghyun Cho等人提出的Gated Recurrent Unit (GRU),其将忘记门和输入门合成了一个单一的更新门,同样还混合了细胞状态和隐藏状态,和其他一些改动。其示意图如下:
最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。
LSTMs与GRUs的区别如图所示:
从上图可以看出,二者结构十分相似,不同在于:
new memory都是根据之前state及input进行计算,但是GRUs中有一个reset gate控制之前state的进入量,而在LSTMs里没有类似gate;
产生新的state的方式不同,LSTMs有两个不同的gate,分别是forget gate (f gate)和input gate(i gate),而GRUs只有一种update gate(z gate);
LSTMs对新产生的state可以通过output gate(o gate)进行调节,而GRUs对输出无任何调节。
Simple RNNs(SRNs)
SRNs是一个三层网络,其在隐藏层增加了上下文单元。下图中的y是隐藏层,u是上下文单元。上下文单元节点与隐藏层中节点的连接是固定的,并且权值也是固定的。上下文节点与隐藏层节点一一对应,并且值是确定的。
在每一步中,使用标准的前向反馈进行传播,然后使用学习算法进行学习。上下文每一个节点保存其连接隐藏层节点上一步输出,即保存上文,并作用于当前步对应的隐藏层节点状态,即隐藏层的输入由输入层的输出与上一步的自身状态所决定。因此SRNs能够解决标准多层感知机(MLP)无法解决的对序列数据进行预测的问题。 SRNs网络结构如下图所示:
Bidirectional RNNs
Bidirectional RNNs(双向网络)将两层RNNs叠加在一起,当前时刻输出(第t步的输出)不仅仅与之前序列有关,还与之后序列有关。例如:为了预测一个语句中的缺失词语,就需要该词汇的上下文信息。Bidirectional RNNs是一个相对较简单的RNNs,是由两个RNNs上下叠加在一起组成的。输出由前向RNNs和后向RNNs共同决定。如下图所示:
Deep RNNs
Deep RNNs与Bidirectional RNNs相似,其也是又多层RNNs叠加,因此每一步的输入有了多层网络。该网络具有更强大的表达与学习能力,但是复杂性也随之提高,同时需要更多的训练数据。Deep RNNs的结构如下图所示:
Echo State Networks(ESNs)
ESNs特点:
它的核心结构为一个随机生成、且保持不变的储备池(Reservoir)。储备池是大规模随机生成稀疏连接(SD通常保持1%~5%,SD表示储备池中互相连接的神经元占总神经元个数N的比例)的循环结构;
从储备池到输出层的权值矩阵是唯一需要调整的部分;
简单的线性回归便能够完成网络训练;
ESNs基本思想:
使用大规模随机连接的循环网络取代经典神经网络中的中间层,从而简化网络的训练过程。 网络中的参数包括:
(1)W - 储备池中节点间连接权值矩阵;
(2)Win - 输入层到储备池之间连接权值矩阵,表明储备池中的神经元之间是相互连接;
(3)Wback - 输出层到储备池之间的反馈连接权值矩阵,表明储备池会有输出层来的反馈;
(4)Wout - 输入层、储备池、输出层到输出层的连接权值矩阵,表明输出层不仅与储备池连接,还与输入层和自己连接。
(5)Woutbias - 输出层的偏置项。
ESNs的结构如下图所示:
Gated Recurrent Unit Recurrent Neural Networks
GRUs是一般的RNNs的变型版本,其主要是从以下两个方面进行改进。
以语句为例,序列中不同单词处的数据对当前隐藏层状态的影响不同,越前面的影响越小,即每个之前状态对当前的影响进行了距离加权,距离越远,权值越小。
在产生误差error时,其可能是由之前某一个或者几个单词共同造成,所以应当对对应的单词weight进行更新。GRUs的结构如下图所示。GRUs首先根据当前输入单词向量word vector以及前一个隐藏层状态hidden state计算出update gate和reset gate。再根据reset gate、当前word vector以及前一个hidden state计算新的记忆单元内容(new memory content)。当reset gate为1的时候,new memory content忽略之前所有memory content,最终的memory是由之前的hidden state与new memory content一起决定。
Bidirectional LSTMs
与bidirectional RNNs 类似,bidirectional LSTMs有两层LSTMs。一层处理过去的训练信息,另一层处理将来的训练信息。
在bidirectional LSTMs中,通过前向LSTMs获得前向隐藏状态,后向LSTMs获得后向隐藏状态,当前隐藏状态是前向隐藏状态与后向隐藏状态的组合。
Stacked LSTMs
与deep rnns 类似,stacked LSTMs 通过将多层LSTMs叠加起来得到一个更加复杂的模型。
不同于bidirectional LSTMs,stacked LSTMs只利用之前步骤的训练信息。
Clockwork RNNs(CW-RNNs)
CW-RNNs是RNNs的改良版本,其使用时钟频率来驱动。它将隐藏层分为几个块(组,Group/Module),每一组按照自己规定的时钟频率对输入进行处理。为了降低RNNs的复杂度,CW-RNNs减少了参数数量,并且提高了网络性能,加速网络训练。CW-RNNs通过不同隐藏层模块在不同时钟频率下工作来解决长时依赖问题。将时钟时间进行离散化,不同的隐藏层组将在不同时刻进行工作。因此,所有的隐藏层组在每一步不会全部同时工作,这样便会加快网络的训练。并且,时钟周期小组的神经元不会连接到时钟周期大组的神经元,只允许周期大的神经元连接到周期小的(组与组之间的连接以及信息传递是有向的)。周期大的速度慢,周期小的速度快,因此是速度慢的神经元连速度快的神经元,反之则不成立。
CW-RNNs与SRNs网络结构类似,也包括输入层(Input)、隐藏层(Hidden)、输出层(Output),它们之间存在前向连接,输入层到隐藏层连接,隐藏层到输出层连接。但是与SRN不同的是,隐藏层中的神经元会被划分为若干个组,设为ggg,每一组中的神经元个数相同,设为kkk,并为每一个组分配一个时钟周期TiϵT1,T2,...,TgT_i\epsilon{T_1,T_2,...,T_g}TiϵT1,T2,...,Tg,每一组中的所有神经元都是全连接,但是组jjj到组iii的循环连接则需要满足TjT_jTj大于TiT_iTi。如下图所示,将这些组按照时钟周期递增从左到右进行排序,即T1<T2<...<TgT_1<T_2<...<T_gT1<T2<...<Tg,那么连接便是从右到左。例如:隐藏层共有256个节点,分为四组,周期分别是[1,2,4,8],那么每个隐藏层组256/4=64个节点,第一组隐藏层与隐藏层的连接矩阵为64 ×\times× 64的矩阵,第二层的矩阵则为64 ×\times× 128矩阵,第三组为64×\times× (3 ×\times× 64)=64×\times× 92矩阵,第四组为64 ×\times× (4 ×\times× 64)=64 ×\times× 256矩阵。这就解释了上一段中速度慢的组连接到速度快的组,反之则不成立。
CW-RNNs的网络结构如下图所示:
CNN-LSTMs
为了同时利用CNN以及LSTMs的优点,CNN-LSTMs被提出。在该模型中,CNN用于提取对象特征,LSTMs用于预测。CNN由于卷积特性,其能够快速而且准确地捕捉对象特征。LSTMs的优点在于能够捕捉数据间的长时依赖性。