隐藏层
在线性神经网络中,我们使用带有偏置的线性仿射变换将输入直接映射到输出。线性意味着单调假设:任何特征的增⼤都会导致模型输出的增⼤(如果对应的权重为正),或者导致模型输出的减⼩(如果对应的权重为负)。然而对于违反单调性的数据,线性模型难以进行正确拟合。
我们可以通过在⽹络中加⼊⼀个或多个隐藏层来克服线性模型的限制,使其能处理更普遍的函数关系类型。要做到这⼀点,最简单的⽅法是将许多全连接层堆叠在⼀起。每⼀层都输出到上⾯的层,直到⽣成最后的输出。我们可以把前L-1层看作表⽰,把最后⼀层看作线性预测器。这种架构通常称为多层感知机(multilayerperceptron),通常缩写为MLP。
为了发挥多层架构的潜⼒,我们还需要⼀个额外的关键要素:在仿射变换之后对每个隐藏单元应⽤⾮线性的激活函数(activation function)。激活函数的输出(例如,)被称为活性值(activations)。⼀般来说,有了激活函数,就不可能再将我们的多层感知机退化成线性模型:
W为权重,b为偏置,H表⽰隐藏层的输出,O表示输出,X表示输入。为了构建更通⽤的多层感知机,我们可以继续堆叠这样的隐藏层,⼀层叠⼀层,从⽽产⽣更有表达能⼒的模型。
激活函数
激活函数(activation function)通过计算加权和并加上偏置来确定神经元是否应该被激活,它们将输⼊信号转换为输出的可微运算。⼤多数激活函数都是⾮线性的。简要介绍⼀些常⻅的激活函数。
ReLU函数
最受欢迎的激活函数是修正线性单元(Rectified linear unit,ReLU),因为它实现简单,同时在各种预测任务中表现良好。ReLU提供了⼀种⾮常简单的⾮线性变换。给定元素x,ReLU函数被定义为该元素与0的最⼤值:
ReLU函数通过将相应的活性值设为0,仅保留正元素并丢弃所有负元素。当输⼊为负时,ReLU函数的导数为0,⽽当输⼊为正时,ReLU函数的导数为1。注意,当输⼊值精确等于0时,我们默认使⽤左侧的导数,即当输⼊为0时导数为0。
使⽤ReLU的原因是,它求导表现得特别好:要么让参数消失,要么让参数通过。这使得优化表现得更好,并且ReLU减轻了困扰以往神经⽹络的梯度消失问题。
sigmoid函数
对于⼀个定义域在R中的输⼊,sigmoid函数将输⼊变换为区间(0, 1)上的输出。因此,sigmoid通常称为挤压函数(squashing function):它将范围(-inf, inf)中的任意输⼊压缩到区间(0, 1)中的某个值:
阈值单元在其输⼊低于某个阈值时取值0,当输⼊超过阈值时取值1。当关注到到基于梯度的学习时,sigmoid函数是⼀个⾃然的选择,因为它是⼀个平滑的、可微的阈值单元近似。然⽽,sigmoid在隐藏层中已经较少使⽤,它在⼤部分时候被更简单、更容易训练的ReLU所取代。
sigmoid函数的导数为下⾯的公式:
当输⼊为0时,sigmoid函数的导数达到最⼤值0.25;⽽输⼊在任⼀⽅向上越远离0点时,导数越接近0。
欠拟合和过拟合
将模型在训练数据上拟合的⽐在潜在分布中更接近的现象称为过拟合(overfitting),⽤于对抗过拟合的技术称为正则化(regularization)。在实验中调整模型架构或超参数时会发现:如果有⾜够多的神经元、层数和训练迭代周期,模型最终可以在训练集上达到完美的精度,此时测试集的准确性却下降了。
训练误差(training error)是指,模型在训练数据集上计算得到的误差。泛化误差(generalization error)是指,模型应⽤在同样从原始样本的分布中抽取的⽆限多数据样本时,模型误差的期望。当我们逐渐增加数据量,我们的训练误差将与泛化误差相匹配。
⼏个倾向于影响模型泛化的因素:
1. 可调整参数的数量。当可调整参数的数量(有时称为⾃由度)很⼤时,模型往往更容易过拟合。
2. 参数采⽤的值。当权重的取值范围较⼤时,模型可能更容易过拟合。
3. 训练样本的数量。即使模型很简单,也很容易过拟合只包含⼀两个样本的数据集。
训练误差和验证误差都很严重,但它们之间仅有⼀点差距。如果模型不能降低训练误差,这可能意味着模型过于简单(即表达能⼒不⾜),⽆法捕获试图学习的模式。此外,由于我们的训练和验证误差之间的泛化误差很⼩,我们有理由相信可以⽤⼀个更复杂的模型降低训练误差。这种现象被称为⽋拟合(underfitting)。另⼀⽅⾯,当我们的训练误差明显低于验证误差时要⼩⼼,这表明严重的过拟合(overfitting)
给定由单个特征x和对应实数标签y组成的训练数据,我们试图找到下⾯的d阶多项式来估计标签y:
当数据样本包含了x的不同值时,函数阶数等于数据样本数量的多项式函数可以完美拟合训练集。如图所示,我们直观地描述了多项式的阶数和⽋拟合与过拟合之间的关系。
正则化
权重衰减
在训练参数化机器学习模型时,权重衰减(weight decay)是最⼴泛使⽤的正则化的技术之⼀,它通常也被称为L2正则化。这项技术通过函数与零的距离来衡量函数的复杂度,因为在所有函数f中,函数f = 0(所有输⼊都得到值0)在某种意义上是最简单的。
⼀种简单的⽅法是通过线性函数 中的权重向量的某个范数来度量其复杂性,例如。要保证权重向量⽐较⼩,最常⽤⽅法是将其范数作为惩罚项加到最⼩化损失的问题中。将原来的训练⽬标最⼩化训练标签上的预测损失,调整为最⼩化预测损失和惩罚项之和。现在,如果我们的权重向量增⻓的太⼤,我们的学习算法可能会更集中于最⼩化权重范数。这正是我们想要的。
为了惩罚权重向量的⼤⼩,我们必须以某种⽅式在损失函数中添加,但是模型应该如何平衡这个新的额外惩罚的损失?实际上,我们通过正则化常数来描述这种权衡,这是⼀个⾮负超参数,我们使⽤验证数据拟合:
使⽤L2范数的⼀个原因是它对权重向量的⼤分量施加了巨⼤的惩罚。这使得我们的学习算法偏向于在⼤量特征上均匀分布权重的模型。在实践中,这可能使它们对单个变量中的观测误差更为稳定。相⽐之下,L1惩罚会导致模型将权重集中在⼀⼩部分特征上,⽽将其他权重清除为零。这称为特征选择(feature selection),这在某些场景下需要的。
我们根据估计值与观测值之间的差异来更新。然⽽,我们同时也在试图将的⼤⼩缩⼩到零。这就是为什么这种⽅法有时被称为权重衰减。我们仅考虑惩罚项,优化算法在训练的每⼀步衰减权重。与特征选择相⽐,权重衰减为我们提供了⼀种连续的机制来调整函数的复杂度。
暂退法(Dropout)
暂退法在前向传播过程中,计算每⼀内部层的同时注⼊噪声,这已经成为训练神经⽹络的常⽤技术。这种⽅法之所以被称为暂退法,因为我们从表⾯上看是在训练过程中丢弃(dropout)⼀些神经元。在整个训练过程的每⼀次迭代中,标准暂退法包括在计算下⼀层之前将当前层中的⼀些节点置零。
那么关键的挑战就是如何注⼊这种噪声。⼀种想法是以⼀种⽆偏向(unbiased)的⽅式注⼊噪声。这样在固定住其他层时,每⼀层的期望值等于没有噪⾳时的值。在标准暂退法正则化中,通过按保留(未丢弃)的节点的分数进⾏规范化来消除每⼀层的偏差。换⾔之,每个中间活性值h以暂退概率p由随机变量h′替换,如下所⽰:
根据此模型的设计,其期望值保持不变,即E[h′] = h。
当我们将暂退法应⽤到隐藏层,以p的概率将隐藏单元置为零时,结果可以看作⼀个只包含原始神经元⼦集的⽹络。⽐如在图中,删除了h2和h5,因此输出的计算不再依赖于h2或h5,并且它们各⾃的梯度在执⾏反向传播时也会消失。这样,输出层的计算不能过度依赖于h1, ..., h5的任何⼀个元素。
通常,我们在测试时不⽤暂退法。给定⼀个训练好的模型和⼀个新的样本,我们不会丢弃任何节点,因此不需要标准化。