《动手实现深度学习》笔记(三)多层感知机

四. 多层感知机

4.1 简介及实现

4.1.1 简介

  1. [线性模型可能出错] 仿射变换中的线性是一个很强的假设,但实际上线性模型是可能会出错的,线性意味着单调,任何特征的增大都会导致模型输出的增大或减小(权重正负决定),对于图片倒置等操作也无法处理。
  2. [考虑特征间的作用] 实际上,任何像素的重要性都以复杂方式取决于该像素的上下文,这些数据可能会有一种表示,考虑到特征之间的相互作用,在这种表示的基础上建立一个线性模型可能是合适的,手动实现是没法进行的,在深度神经网络中,我们使用观测数据来联合学习隐藏层表示应用于该表示的线性预测器
  3. [引入隐藏层]在网络中加入一个或多个隐藏层处理更加更普遍的函数关系类型。最简单的方法是堆叠多个全连接层,这种架构通常称为多层感知机(multilayer perception),缩写为MLP。

一个单隐藏层的多层感知机,具有5个隐藏单元

  4. [参数开销] 然而这种全连接层的多层感知机的参数开销可能会非常非常高,需要在参数节约和模型有效性之间进行权衡 (Zhang et al., 2021)。

  5. [多层感知机可能退化为线性模型] 使用 X ∈ R n × d \mathbf{X}\in\mathbb{R}^{n\times d} XRn×d 来表示 n n n 个样本的小批量,每个样本有 d d d 个输入特征。用 X ∈ R n × h \mathbf{X}\in\mathbb{R}^{n\times h} XRn×h 表示具有 h h h 个隐藏单元单隐藏层多层感知机的隐藏层输出,也称隐藏表示,在数学/代码中也被称为隐藏层变量/隐藏变量,多层感知机的输出计算如下:
H = X W ( 1 ) + b ( 1 ) , O = H W ( 2 ) + b ( 2 ) . \begin{align} \mathbf{H}=\mathbf{X}\mathbf{W}^{(1)}+\mathbf{b}^{(1)},\\ \mathbf{O}=\mathbf{H}\mathbf{W}^{(2)}+\mathbf{b}^{(2)}. \end{align} H=XW(1)+b(1),O=HW(2)+b(2).
  6. [引入激活函数] 然而,上面这种定义方式很容易得到 O = X W ( 1 ) W ( 2 ) + b ( 1 ) W ( 2 ) + b ( 2 ) = X W + b \mathbf{O}=\mathbf{X}\mathbf{W}^{(1)}\mathbf{W}^{(2)}+\mathbf{b}^{(1)}\mathbf{W}^{(2)}+\mathbf{b}^{(2)}=\mathbf{X}\mathbf{W}+\mathbf{b} O=XW(1)W(2)+b(1)W(2)+b(2)=XW+b,又变回了前一章的仿射变换,没有从隐藏层中获得好处。因此,需要一个额外的关键要素:仿射变换后对每个隐藏单元应用非线性的激活函数 σ \sigma σ,激活函数的输出值 σ ( ⋅ ) \sigma(\cdot) σ() 被称为活性值,由此,多层感知机不会再退化为一线性模型。
H = σ ( X W ( 1 ) + b ( 1 ) ) , O = H W ( 2 ) + b ( 2 ) . \begin{align} \mathbf{H}&=\sigma(\mathbf{X}\mathbf{W}^{(1)}+\mathbf{b}^{(1)}),\\ \mathbf{O}&=\mathbf{H}\mathbf{W}^{(2)}+\mathbf{b}^{(2)}. \end{align} HO=σ(XW(1)+b(1)),=HW(2)+b(2).
  7. [通用化] 激活函数不仅按行操作,也按元素操作,在计算每一层的线性部分后计算每个活性值,而不需要查看其他隐藏单元的取值,堆叠这样的隐藏层,构建出更通用的多层感知机。
  8. [更深而非更广] 多层感知机能够通过隐藏层捕捉复输入之间复杂的相互作用,只要给定足够神经元和正确权重,可以对任意函数建模。然而事实上,通过使用更深(而不是更广)的网络,我们更容易逼近许多函数
  9. [激活函数] 激活函数通过加权和并加上偏置来确定神经元是否应该被激活,是深度学习的基础,下面介绍三种常见的激活函数:
(1)ReLU函数(Rectified linear unit,修正线性单元), ReLU ( x ) = max ⁡ ( x , 0 ) \text{ReLU}(x)=\max(x,0) ReLU(x)=max(x,0),相当于一个分段线性的函数,一般指定它在0处的导数为 0 。使用ReLU函数的原因在于,它要么让参数通过,要么让参数消失,求导表现好,也使得优化表现更好,减轻了困扰以往神经网络的梯度消失问题(后面会详细介绍)。
(2)sigmoid函数,也被称为挤压函数,将范围 ( − inf , inf ) (-\text{inf},\text{inf}) (inf,inf) 中的输入变换为区间 ( 0 , 1 ) (0,1) (0,1) 上的输出, sigmoid ( x ) = 1 1 + exp ⁡ ( − x ) \text{sigmoid}(x)=\frac{1}{1+\exp(-x)} sigmoid(x)=1+exp(x)1,sigmoid函数是一个平滑的、可微的阈值单元近似,广泛用作输出单元的激活函数;当输入接近与0时,sigmoid函数接近线性变换。
(3)tanh函数,双曲正切函数,将输入压缩到 ( − 1 , 1 ) (-1,1) (1,1) 上, tanh ( x ) = 1 − exp ⁡ ( − 2 x ) 1 + exp ⁡ ( − 2 x ) \text{tanh}(x)=\frac{1-\exp(-2x)}{1+\exp(-2x)} tanh(x)=1+exp(2x)1exp(2x)
  10. 以上,就了解了如何结合非线性函数来构建具有更强表达能力的多层神经网络架构,能够接近1990年左右深度学习从业者。

4.1.2 多层感知机的从零开始实现

4.1.3 多层感知机的简洁实现

4.2 模型选择、欠拟合和过拟合

  1. [发现模式而非记住数据]机器学习科学家的目标是让模型真正发现泛化的模式(pattern),而非简单的记住了数据,例如在患者基因数据与痴呆状态之间寻找模式时,不只做“那是鲍勃!我记得他!他有痴呆症!”这样的事情。更正式地说,就是希望捕捉训练集潜在总体的规律,以面对以前从未遇到过的个体

  2. [过拟合与正则化]将模型在训练数据上的拟合比潜在分布更接近的现象称为过拟合(overfitting),具体体现是,调整模型架构或超参数,拥有足够多神经元、层数和训练迭代周期后,模型最终在训练集达到完美精度,而在测试集的准确性却下降了;用于对抗过拟合的技术称为正则化(regulation)。

  3. 训练误差是指模型在训练数据集上计算得到的误差,泛化误差是指模型应用在同样从原始样本的分布中抽取的无限多数据样本时,模型误差的期望。然而后者是难以准确计算的,只能通过一个独立的测试集来估计

  4. 许多数学家毕生致力于研究泛化问题,格里文科和坎特利在同名定理(eponymous theorem)中推导出训练误差收敛到泛化误差的速率Vapnik和Chervonenkis 将这一理论扩展到更一般种类的函数,为统计学习理论奠定基础。
  我们先前探讨的场景中训练数据和测试数据从相同的分布中独立提取,这被称为独立同分布假设,这意味着对数据进行采样的过程没有进行“记忆”。而现实世界中地点、时间等因素会导致样本采集违背独立性假设,这种违背有时是轻微的,模型继续运行良好(如人脸识别、语音识别和语言翻译),有时过分违背,会带来麻烦。深度学习中的许多启发式技术旨在防止过拟合

  5. [影响模型泛化的原因]当模型更加复杂而样本更少时,预期训练误差会下降,而泛化误差会增大。如何判断模型复杂性呢?一般认为,具有更多参数的、参数有更大取值范围的、需要更多训练迭代的模型更复杂,另外,训练样本的数量也影响着模型泛化。

  6. [模型选择] 为了确定候选模型中的最佳模型,通常会使用测试集。但是不能依靠测试数据进行模型选择,理想情况下测试数据只使用一次,而现实中很少有足够数据对每一轮实验采用全新测试集。常见解决方法是,把数据分成三份——训练集、测试集和验证集。

  7. [K折交叉验证] 当训练集稀缺时,可能无法提供足够数据构成合适的验证集,K折交叉验证中,原始训练数据被分为K个不重叠的子集,然后执行K次模型训练和验证,每次在 K − 1 K-1 K1 个子集上训练,在剩余尚未用于训练的子集上验证,最后对 K K K 次实验结果取平均,估计训练和验证误差。

  8. [欠拟合还是过拟合] 比较训练和验证误差时,要注意两种常见情况:
(1)训练误差和验证误差都很严重,但两者之间仅有一点差距:这可能意味着模型过于简单,表达能力不足,是欠拟合
(2)训练误差明显低于验证误差:表明严重的过拟合,而这并不总是一件坏事,尤其在深度学习领域,最好的预测模型往往在训练集上的表面比在验证集上好,最终关心的是验证误差,而非训练误差与验证误差的差距。

  当数据样本包含了 x x x 的不同值时,函数阶数等于数据样本数量的多项式函数可以完美拟合训练集,下图就描述了多项式阶数和欠/过拟合之间的关系。

模型复杂度对欠拟合/过拟合的影响

  训练数据集中的样本越少,越可能出现(更严重的)过拟合,而随着训练数据量增加,泛化误差通常会减小。

  9. [多项式回归] 一个使用三阶多项式来生成和测试数据标签的例子,最后的结果表明:当尝试使用一个阶数过高的多项式来训练模型时,没有足够的数据用于学习高阶项的系数使其接近于零,因此容易受到训练数据中噪声的影响,虽然训练损失有效降低,但是测试损失仍然很高,复杂模型对数据造成了过拟合,下一节将讨论如何处理过拟合问题,如权重衰减暂退法dropout

4.3 权重衰减

  1. [从阶数调整到权重衰减] 假设已经拥有了尽可能多的高质量数据,下面就可以把重点放在正则化技术上了。回顾前面的例子,限制特征数量是一种缓解过拟合的常用技术,多项式对多变量的自然扩展称为单项式,也可以说是变量幂的乘积,阶数即为幂和,如 x 1 2 x 2 x_1^2x_2 x12x2 x 3 x 5 2 x_3x_5^2 x3x52 都是3次单项式,即使是阶数上的微小变化也会显著增加/降低模型复杂度,使模型在过简单和过复杂中徘徊,因此需要更细粒度的工具来调整模型复杂度——权重衰减。

  2. 权重衰减是最广泛使用的正则化技术之一,通常被称为 L 2 L_2 L2 正则化,它通过函数与零的距离来衡量函数的复杂度,那么应该如何精确测量一个函数和零之间的距离呢?一种简单方法是通过线性函数 f ( x ) = w ⊤ x f(\mathbf{x})=\mathbf{w^\top x} f(x)=wx 中权重向量的范数来度量复杂性,如 ∥ w ∥ 2 \Vert\mathbf{w}\Vert^2 w2,由此,将权重向量的范数本身作为惩罚项加入优化,由此限制权重向量增长太大。使用正则化常数 λ \lambda λ 平衡这个新的惩罚损失,得到的损失如下:
L ( w , b ) + λ 2 ∥ w ∥ 2 L(\mathbf{w},b)+\frac{\lambda}{2}\Vert\mathbf{w}\Vert^2 L(w,b)+2λw2

  3. [不同范数正则化的比较] L 2 L_2 L2 正则化线性模型构成了经典的岭回归(ridge regression)算法,使用它的一个原因是它对权重向量的大分量施加了巨大的惩罚,使得学习算法偏向于在大量特征上均匀分布权重的模型。相比之下, L 1 L_1 L1 正则化线性模型构成的套索回归下的惩罚会导致模型将权重集中在一小部分特征上,而将其他权重清除为零,这被称为特征选择,在其他场景可能需要。

  4. [ L 2 L_2 L2正则化回归的小批量随机梯度下降更新]
w ← ( 1 − η λ ) w − η ∣ B ∣ ∑ i ∈ B x ( i ) ( w ⊤ x ( i ) + b − y ( i ) ) \mathbf{w}\leftarrow(1-\eta\lambda)\mathbf{w}-\frac{\eta}{\vert\mathcal{B}\vert}\sum_{i\in\mathcal{B}}\mathbf{x}^{(i)}(\mathbf{w^\top\mathbf{x}}^{(i)}+b-y^{(i)}) w(1ηλ)wBηiBx(i)(wx(i)+by(i))
  由此,权重衰减提供了一种连续机制调整函数复杂度;另外,是否对相应的偏置 b 2 b^2 b2 进行惩罚需要根据不同应用而定,通常而言,在网络输出层不会被正则化。

  5. [权重衰减实例] 使用以下公式生成数据:
y = 0.05 + ∑ i = 1 d 0.01 x i + ϵ  where  ϵ ∼ N ( 0 , 0.0 1 2 ) . y=0.05+\sum_{i=1}^{d}0.01x_i+\epsilon\ \text{where}\ \epsilon\sim\mathcal{N}(0,0.01^2). y=0.05+i=1d0.01xi+ϵ where ϵN(0,0.012).

本书中将默认是使用简单的启发式算法,即在深层网络的所有层上应用权重衰减

4.4 暂退法、丢弃法

  我们希望模型深入挖掘特征,即将其权重分散到许多特征中,而不是过于依赖少数潜在的虚假关联
  [泛化性与灵活性] 当给出更多样本而不是特征时,线性模型通常不会过拟合,但是这种模型泛化的可靠性是有代价的,就是没有考虑到特征之间的交互作用,对每个特征,必须指定正的或负的权重,而忽略其他特征。泛化性与灵活性之间的这种基本权衡被描述为偏差-方差权衡
(1)线性模型:偏差高,方差低,在不同的随机数据样本上可以得到相似的结果。
(2)深度神经网络:方差高,偏差低。
  这一节着重对实际工具的研究,这些工具倾向于改进深层网络的泛化性。
  经典泛化理论认为,为了缩小训练和测试性能之间的差距,应该以简单的模型为目标。参数的范数代表了一种有用的简单性度量,简单性的另一个角度是平滑性,即函数不应该对其输入的微小变化敏感,比如图像分类时图像的噪声。2014年,斯里瓦斯塔瓦等人 (Srivastava et al., 2014) 提出了一个想法:在训练过程中,在计算后续层之前向网络的每一层以无偏的方式注入噪声,增强平滑性,这个想法被称为暂退法/丢弃法(dropout),每个中间活性值 h h h 以暂退概率 p p p 由随机变量 h ′ h' h 替换,替换完成后期望值保持不变,看上去是在训练过程中丢弃了一些神经元…
h ′ = { 0 概率为 p h 1 − p 其他情况 h'=\begin{cases}0&概率为p\\\frac{h}{1-p}&其他情况\end{cases} h={ 01ph概率为p其他情况

  [实践中的暂退法] 如图所示的带有1个隐藏层和5个隐藏单元的多层感知机,应用暂退法,以 p p p 的概率将隐藏单元置于零,相当于在输出过程和反向传播过程中删除了部分单元。如此一来,输出层的计算不能过度依赖于隐藏单元中的任何一个,使网络发挥更加稳定

dropout前后的多层感知机

从零开始实现…

4.5 正向传播、反向传播和计算图

  本节将通过一些基本的数学和计算图,深入探讨反向传播的细节。

  1. [前向传播] 按顺序(从输入层到输出层)计算和存储神经网络中的每层的结果。
  中间变量: z = W ( 1 ) x \mathbf{z}=\mathbf{W}^{(1)}\mathbf{x} z=W(1)x,激活向量: h = ϕ ( z ) \mathbf{h}=\phi(\mathbf{z}) h=ϕ(z),输出层向量: o = W ( 2 ) h \mathbf{o}=\mathbf{W}^{(2)}\mathbf{h} o=W(2)h,单个数据样本损失项: L = l ( o , y ) L=l(\mathbf{o},y) L=l(o,y) L 2 L_2 L2 正则化项: s = λ 2 ( ∥ W ( 1 ) ∥ F 2 + ∥ W ( 2 ) ∥ F 2 ) s=\frac{\lambda}{2}(\Vert\mathbf{W}^{(1)}\Vert^2_F+\Vert\mathbf{W}^{(2)}\Vert^2_F) s=2λ(W(1)F2+W(2)F2),最终的正则化损失/目标函数: J = L + s J=L+s J=L+s。整个正向传播过程可以使用以下计算图可视化说明:

前向传播的计算图

  1. [反向传播] 计算神经网络参数梯度的方法,该方法根据链式规则相反的顺序从输出层到输入层遍历网络。假设有函数 Y = f ( X ) Y=f(X) Y=f(X) Z = g ( Y ) Z=g(Y) Z=g(Y),其中输入X,Y,Z是任意形状的张量,可以通过链式法则计算Z关于X的导数:
∂ Z ∂ X = prod ( ∂ Z ∂ Y , ∂ Y ∂ X ) \frac{\partial Z}{\partial X}=\text{prod}(\frac{\partial Z}{\partial Y},\frac{\partial Y}{\partial X}) XZ=prod(YZ,XY)
反向传播的目的是各个输入相对于网络参数 W ( 1 ) \mathbf{W}^{(1)} W(1) W ( 2 ) \mathbf{W}^{(2)} W(2) 的梯度 ∂ J / ∂ W ( 1 ) \partial J/\partial \mathbf{W}^{(1)} J/W(1) ∂ J / ∂ W ( 2 ) \partial J/\partial \mathbf{W}^{(2)} J/W(2) 。计算顺序与前向传播相反,应用链式法则从计算图的结果开始,第一步是计算目标函数 J = L + s J=L+s J=L+s 相对与损失项 L L L 和正则项目 s s s 的梯度:
∂ J ∂ L = 1  and  ∂ J ∂ s = 1 \frac{\partial J}{\partial L}=1\ \text{and}\ \frac{\partial J}{\partial s}=1 LJ=1 and sJ=1
接下来,计算目标函数关于输出层变量 o \mathbf{o} o 的梯度:
∂ J ∂ o = prod ( ∂ J ∂ L , ∂ L ∂ o ) = ∂ L ∂ o ∈ R q \frac{\partial J}{\partial\mathbf{o}}=\text{prod}(\frac{\partial J}{\partial L},\frac{\partial L}{\partial\mathbf{o}})=\frac{\partial L}{\partial\mathbf{o}}\in\mathbb{R}^q oJ=prod(LJ,oL)=oLRq
接下来计算正则化项相对于两个参数的梯度:
∂ s ∂ W ( 1 ) = λ W ( 1 ) and  ∂ s ∂ W ( 2 ) = λ W ( 2 ) \frac{\partial s}{\partial\mathbf{W}^{(1)}}=\lambda\mathbf{W}^{(1)}\text{and}\ \frac{\partial s}{\partial\mathbf{W}^{(2)}}=\lambda\mathbf{W}^{(2)} W(1)s=λW(1)and W(2)s=λW(2)
现在可以计算接近输出层的模型参数的梯度:
∂ J ∂ W ( 2 ) = prod ( ∂ J ∂ o , ∂ o ∂ W ( 2 ) ) + prod ( ∂ J ∂ s , ∂ s ∂ W ( 2 ) ) = ∂ J ∂ o h ⊤ + λ W ( 2 ) \frac{\partial J}{\partial\mathbf{W}^{(2)}} =\text{prod}(\frac{\partial J}{\partial\mathbf{o}},\frac{\partial \mathbf{o}}{\partial\mathbf{W}^{(2)}})+ \text{prod}(\frac{\partial J}{\partial s},\frac{\partial s}{\partial\mathbf{W}^{(2)}}) =\frac{\partial J}{\partial\mathbf{o}}\mathbf{h}^\top+\lambda\mathbf{W}^{(2)} W(2)J=prod(oJ,W(2)o)+prod(sJ,W(2)s)=oJh+λW(2)
而关于模型参数 W ( 1 ) \mathbf{W}^{(1)} W(1) 的梯度,需要沿着输出层到隐藏层反向传播,关于隐藏层输出的梯度计算如下:
∂ J ∂ h = prod ( ∂ J ∂ o , ∂ o ∂ h ) = W ( 2 ) ⊤ ∂ J ∂ o \frac{\partial J}{\partial\mathbf{h}}=\text{prod}(\frac{\partial J}{\partial\mathbf{o}},\frac{\partial\mathbf{o}}{\partial\mathbf{h}})=\mathbf{W}^{(2)^\top}\frac{\partial J}{\partial\mathbf{o}} hJ=prod(oJ,ho)=W(2)oJ
中间变量 z \mathbf{z} z 的梯度 ∂ J / ∂ z ∈ R h \partial J/\partial\mathbf{z}\in\mathbb{R}^h J/zRh 需要使用按元素乘法运算符号,用 ⊙ \odot 表示:
∂ J ∂ z = prod ( ∂ J ∂ h , ∂ h ∂ z ) = ∂ J ∂ h ⊙ ϕ ′ ( z ) \frac{\partial J}{\partial\mathbf{z}}=\text{prod}(\frac{\partial J}{\partial\mathbf{h}},\frac{\partial\mathbf{h}}{\partial\mathbf{z}})=\frac{\partial J}{\partial\mathbf{h}}\odot\phi'(\mathbf{z}) zJ=prod(hJ,zh)=hJϕ(z)
最终得到最接近输入层的模型参数的梯度 ∂ J / ∂ W ( 1 ) ∈ R h × d \partial J/\partial\mathbf{W}^{(1)}\in\mathbb{R}^{h\times d} J/W(1)Rh×d
∂ J ∂ W ( 1 ) = prod ( ∂ J ∂ z , ∂ z ∂ W ( 1 ) ) + prod ( ∂ J ∂ s , ∂ s ∂ W ( 1 ) ) = ∂ J ∂ z x ⊤ + λ W ( 1 ) \frac{\partial J}{\partial\mathbf{W}^{(1)}} =\text{prod}(\frac{\partial J}{\partial\mathbf{z}},\frac{\partial \mathbf{z}}{\partial\mathbf{W}^{(1)}})+ \text{prod}(\frac{\partial J}{\partial s},\frac{\partial s}{\partial\mathbf{W}^{(1)}}) =\frac{\partial J}{\partial\mathbf{z}}\mathbf{x}^\top+\lambda\mathbf{W}^{(1)} W(1)J=prod(zJ,W(1)z)+prod(sJ,W(1)s)=zJx+λW(1)

训练神经网络时,前向传播与反向传播相互依赖,如:
(1)前向传播期间计算正则项取决于模型参数 W ( 1 ) \mathbf{W}^{(1)} W(1) W ( 2 ) \mathbf{W}^{(2)} W(2) 的当前值,而它们是由优化算法根据最近迭代的反向传播给出的。
(2)反向传播期间梯度 ∂ J / ∂ h \partial J/\partial\mathbf{h} J/h 的计算取决于由前向传播给出的隐藏变量 h \mathbf{h} h 的当前值。
因此,在初始化模型参数后,交替使用前向传播和反向传播:利用反向传播给出的梯度来更新模型参数,而反向传播也要重复利用前向传播存储的中间值(避免重复计算),由此,保留中间值比单纯的预测需要更多内存(显存),中间值大小与网络层数量、批量成正比。

4.6 数值稳定性和模型初始化

  前面的模型都以预设的分布来初始化模型参数,然而初始化方案的选择在神经网络学习中其实起到了举足轻重的作用,它对保持数值稳定性至关重要。我们选择哪个激活函数以及如何初始化参数可以决定优化算法收敛的速度有多快。如果选择糟糕,会在训练时引发梯度爆炸或梯度消失等问题,这一节将详细讨论这一主题,包括一些启发式方法。

  1.[梯度消失和梯度爆炸] 考虑一个具有 L L L 层、输入 x \mathbf{x} x 和输出 o \mathbf{o} o的深层网络。每层 l l l 由变换 f l f_l fl 定义,该变换的参数为权重 W ( l ) \mathbf{W}^{(l)} W(l),其隐藏层变量为 h ( l ) \mathbf{h}^{(l)} h(l) (令 h ( 0 ) = x \mathbf{h}^{(0)}=\mathbf{x} h(0)=x),网络可以表示为:
h = f l ( h ( l − 1 ) )  因此  o = f L ∘ ⋯ ∘ f 1 ( x ) \mathbf{h}=f_l(\mathbf{h}^{(l-1)})\text{ 因此 }\mathbf{o}=f_L\circ\dots\circ f_1(\mathbf{x}) h=fl(h(l1)) 因此 o=fLf1(x)
  可以将 o \mathbf{o} o 关于任何一组参数 W ( l ) \mathbf{W}^{(l)} W(l) 的梯度写为:
∂ W ( l ) o = . . . \partial_{\mathbf{W}^{(l)}}\mathbf{o}=... W(l)o=...
  该梯度是 L − 1 L-1 L1 个矩阵 M ( 1 ) ⋅ ⋯ ⋅ M ( l + 1 ) \mathbf{M}^{(1)}\cdot\dots\cdot\mathbf{M}^{(l+1)} M(1)M(l+1) 与梯度向量 v ( l ) \mathbf{v}^{(l)} v(l) 的乘积,这容易受到数值下溢的影响,一个常见的技巧是切换到对数空间,由此将压力从尾数转移到指数,不幸的是,矩阵 M ( l ) \mathbf{M}^{(l)} M(l) 可能具有各种各样的特征值,可能很大或很小,造成成乘积得出的梯度也很大或很小。参数更新过大,破块模型的稳定收敛,造成梯度爆炸(gradient exploding)问题;参数更新过小,每次更新时几乎不移动,导致模型无法学习,造成梯度消失(gradient vanishing)问题。

  sigmoid函数是导致梯度消失的一个常见原因,因为其在输入很大或很小时梯度都会接近于0。因此,更稳定的ReLU系列函数已经成为从业者的默认选择。而随机生成的高斯随机矩阵可能导致矩阵乘积发生爆炸,这是由深度网络的初始化导致的,没有机会让梯度下降优化器收敛。

  2. [对称性]神经网络设计中的另一个问题是参数化所固有的对称性,假设一个简单的多层感知机,具有一个隐藏层和两个隐藏单元,对第一层的权重 W ( 1 ) \mathbf{W}^{(1)} W(1) 进行重排列,并且同样对输出层权重进行重排列,可以获得相同的函数。也就是说,每一层的隐藏单元之间具有排列对称性,如果迭代不能打破这种对称性,就无法实现网络的表达能力。解决这个问题的一种方法是进行参数初始化,并且在优化期间适当正则化以进一步提高稳定性

  3. [参数初始化] 在前面的章节中,一般默认使用正态分布初始化权重值,这种方法对于中等难度的问题通常很有效。下面介绍 Xavier初始化 方法:
  某些没非线性的全连接层输出由下式给出:
o i = ∑ j = 1 n in w i j x j {o}_i=\sum^{n_{\text{in}}}_{j=1}w_{ij}x_j oi=j=1ninwijxj
  权重从同一分布中独立抽取,假设该分布具有零均值和方差 σ 2 \sigma^2 σ2(不必须是高斯),假设层 x j x_j xj 的输入也具有零均值和方差 γ 2 \gamma^2 γ2,也与 w i j w_{ij} wij 彼此独立,由此可以计算出 o i {o}_i oi 的平均值和方差。
E [ o i ] = . . . = 0   Var [ o i ] = . . . = n in σ 2 γ 2 E[o_i]=...=0\\\ \\ \text{Var}[o_i]=...=n_{\text{in}}\sigma^2\gamma^2 E[oi]=...=0 Var[oi]=...=ninσ2γ2
  保持方差不变的一种方法是设置 n in σ 2 = 1 n_{\text{in}}\sigma^2=1 ninσ2=1,考虑反向传播过程也面临类似的问题,需要 n out σ 2 = 1 n_{\text{out}}\sigma^2=1 noutσ2=1 ,然而不可能同时满足这两个条件,仅需满足
1 2 ( n in + n out ) σ 2 = 1  或等价于  σ = 2 n in + n out \frac{1}{2}(n_{\text{in}}+n_{\text{out}})\sigma^2=1\text{ 或等价于 }\sigma=\sqrt{\frac{2}{n_{\text{in}}+n_{\text{out}}}} 21(nin+nout)σ2=1 或等价于 σ=nin+nout2
  这就是标准且实用的Xavier初始化的基础(Glorot and Bengio, 2010),从均值为0、方差 σ 2 = 2 n in + n out \sigma^2=\frac{2}{n_{\text{in}}+n_{\text{out}}} σ2=nin+nout2 的高斯分布中采样权重,也可以选择从均匀分布中抽取权重:注意均匀分布 U ( − a , a ) U(-a,a) U(a,a) 的方差为 a 2 3 \frac{a^2}{3} 3a2,将其带入 σ 2 \sigma^2 σ2 条件,可以得到初始化值域:
U ( − 6 n in + n out , 6 n in + n out ) U\left(-\sqrt{\frac{6}{n_{\text{in}}+n_{\text{out}}}},\sqrt{\frac{6}{n_{\text{in}}+n_{\text{out}}}}\right) U(nin+nout6 ,nin+nout6 )
  尽管"不存在非线性"的假设在神经网络中很容易被违反,但是Xavier初始化方法在实践中被证明是有效的

  4. [补充内容] 以上内容仍然是现在参数初始化方法的皮毛,深度学习框架通常实现十几种启发式方法,参数初始化方法包括专门用于参数绑定(共享)、超分辨率、序列模型和其他情况的启发式算法。如果有兴趣可以专门研究分析各种启发式方法的论文。

4.7 环境与分布偏移

  数据从哪里来,以及最终如何处理模型的输出,是需要关注的基本问题。很多失败的机器学习部署都可以追究出这方面的问题,如根据测试集精度衡量模型出色,但是当数据分布突然改变时出现灾难性失败,又或者模型部署本身就扰乱了数据分布,例如:
  训练一个申请人违约风险模型,用来预测谁将偿还贷款或违约,这个模型发现申请者违约与否与其鞋子相关(穿皮鞋者偿还,而穿运动鞋者违约),之后模型可能倾向于向所有穿皮鞋申请者发放贷款而拒绝穿运动鞋申请者,而一旦模型开始根据鞋类作出决定、顾客开始理解并改变他们的行为,不久之后所有申请者都会穿皮鞋,而信用度却不会相应地提高,也即:通过将模型的决策引入环境,可能会破坏模型
  本节重在揭示这些常见问题,激发思考,早发现风险,减轻损失:有的解决方案很简单(要求正确的数据),有的很困难(实施强化学习系统),还有一些解决方案要求完全跳出统计预测,解决一些棘手的、与算法伦理应用有关的问题。
  五个方面内容:
  - 分布偏移的类型
  - 分布偏移示例
  - 分布偏移纠正
  - 学习问题的分类法
  - 机器学习中的公平、责任和透明度

4.7.1 分布偏移类型

  考虑一个二元分类问题:区分猫和狗
  1. 协变量偏移,输入分布随时间改变,而标签函数没有变化,如:训练集由真实照片组成,而测试集只包含卡通图片,如果没有方法来适应新领域,就可能有麻烦。
  2. 标签偏移,与协变量偏移相反,标签边缘概率可以改变。如:预测患者疾病,可能根据症状来判断,即使疾病相对流行率随时间改变,标签偏移依然是恰当的假设,因为疾病会引起症状。
  3. 概念偏移,如:所在的地理位置改变数据来源,发现“软饮”名称的分布发生了相当大的概念偏移,所以最好可以利用时间或空间上逐渐发生偏移的知识。

4.7.2 分布偏移示例

  讨论一些协变量偏移或概念偏移并不明显的具体情况。

  1. 医学诊断,收集训练数据的分布和在实际中遇到的数据分布可能有很大的不同,比如有一架公司研究一种血液检测方法,主要针对一种影响老年男性的疾病,希望利用他们身上采集的血液样本进行研究,然而从健康男性身上获取血样要比从已有患者获取困难得多,于是这家公司向一所大学的学生有偿征集献血,可以想见,这些抽样可能会遇到极端的协变量偏移,且难以通过常规方法加以纠正。

  2. 自动驾驶汽车,一架自动驾驶公司想利用机器学习开发“路沿检测器”,由于真实注释数据获取成本很高,于是想出一个方法是将游戏引擎的合成数据用作额外的训练数据,然而,这在真实汽车上的应用是一场灾难,因为路沿都被渲染出一种简单的纹理,且所有路沿都被渲染乘相同的纹理,势必导致路沿检测器很快学习到这个“特征”。

  3. 非平稳分布,在分布变化缓慢并且没有得到充分更新时会出现,如:(1)建立一个垃圾邮件过滤器,能很好地检测所有垃圾邮件,但是垃圾邮件的发送者会聪明起来,制造出新的信息,看起来不像以往的垃圾邮件;(2)建立一个产品推荐系统,在整个冬天都很有效,但是圣诞节过后仍然推荐圣诞帽。

  4. 更多:(1)人脸检测器,在所有基准测试中都能很好地工作,但是在测试数据上失败了,有问题的例子是人脸充满了整个图像的特写镜头;(2)图像分类器,每个大类的数量在数据集近乎平均,但是真实世界中照片的实际标签分布显然是不平均的。

4.7.3 分布偏移纠正

  一些情况下,可以通过运动策略因对这些偏移,从而做得更好。
  1. [经验风险与实际风险] ,为了近似真实风险…
  2. [协变量偏移纠正]
  3. [标签偏移纠正]
  4. [概念偏移纠正]

4.7.4 学习问题的分类方法

  1. [批量学习] 访问一组训练特征和标签,使用这些特性和标签序连 f ( x ) f(\mathbf{x}) f(x),然后部署此模型对来自同一分布的新数据进行评分,系统被部署后基本不会再更新。
  2. [在线学习] 除了“批量”地学习,还可以单个“在线”学习。首先观测到 x i \mathbf{x}_i xi ,得出一个估计值 f ( x i ) f(\mathbf{x}_i) f(xi) ,并且得到奖励或损失,很多实际问题都属于此类,如:股票预测,预测明天的股价,根据这个预测进行交易,一天结束时评估预测是否盈利,也就是说,在线学习通过以下的循环不断改进模型:
model  f t → data  x t → estimate  f t ( x t ) → observation  y t → loss  l ( y t , f t ( x t ) ) → model  f t + 1 \text{model }f_t\rightarrow\text{data }\mathbf{x}_t\rightarrow\text{estimate }f_t(\mathbf{x}_t)\rightarrow\text{observation }y_t\rightarrow\text{loss }l(y_t,f_t(\mathbf{x}_t))\rightarrow\text{model }f_{t+1} model ftdata xtestimate ft(xt)observation ytloss l(yt,ft(xt))model ft+1
  3. [老虎机] 是上述问题的特例,大多数学习问题有一个连续参数化的函数 f f f,但是老虎机问题中,只有有限手柄可以拉动,也就是可以采取的行动是有限的,可以获得更强的最优性理论保证。
  4. [控制] 很多情况下环境会记住模型之前做过的事情,但是不一定以一种对抗的方式,如:咖啡锅炉控制器根据之前是否加热锅炉来观测到不同的温度,PID(比例-积分-微分)控制器算法是一个流行的选择,如,一个用户在新闻网站上的行为取决于之前向她展示的内容(大多数新闻只阅读一次等)。
  5. [强化学习] 强调如何基于环境而行动,以取得最大化的预期利益。国际象棋、围棋、西洋双陆棋、星际争霸都是强化学习的应用实例。

4.7.5 机器学习中的公平、责任和透明度

  当我们部署机器学习时,往往不仅仅是优化一个预测模型,而是提供一个被(部分或完全)用来进行自动化决策的工具,这种从预测到决策的飞跃,不仅提出新的技术问题,也必须考虑伦理问题:(1)模型适用于哪些群体,对哪些群体无效;(2)模型将预测转化为行动时,各种方式犯错的潜在成本敏感性,影响到什么社会价值;(3)注意预测模型如何导致反馈循环。
  如:个人看到的新闻应该由他们喜欢的Facebook页面决定吗?这是机器学习职业生涯需要面对的道德困境的一个案例。

4.8 实战Kaggle比赛:房价预测

猜你喜欢

转载自blog.csdn.net/lj164567487/article/details/129188151
今日推荐