《深度学习》 第6章 深度前馈网络

《深度学习》 第6章 深度前馈网络


深度前馈网络也叫做 前馈神经网络或者 多层感知机。其目的是近似某个函数 f f^*

信息流过 x x 的函数,流经用于定义 f f 的中间计算过程,最终到达输出 y y 。在模型的输出和模型本身之间没有反馈连接,所以被称为前向

为了扩展线性模型来表示 x x 的非线性函数,我们可以不把线性模型用于 x x 本身,而是用在一个变换后的输入 ϕ ( x ) \phi(x) ,这里 ϕ \phi 是非线性变换。如何选择映射 ϕ \phi

  1. 使用通用的 ϕ \phi ,如无限维的 ϕ \phi ,它隐含的用在基于RBF核的核机器上。
  2. 手动设计 ϕ \phi
  3. 深度学习的策略是学习 ϕ \phi 。使用一个非常广泛的函数族 ϕ ( x ; θ ) \phi(x;\theta) 可以得到第一种方法的优点(高度通用),设计人们期望能够表现优异的函数族 ϕ ( x ; θ ) \phi(x;\theta) ,得到第二种方法的优点(人类专家的知识)

实例:学习XOR

基于梯度的学习

用于非凸损失函数的随机梯度下降没有全局收敛保证,并且对参数的初始值敏感。对于前馈神经网络,将所有的权重值初始化为小随机数是很重要的。偏置可以初始化为零或者小的正值。

代价函数

使用最大似然学习条件分布

大多数现代的神经网络使用最大似然来训练。这意味这代价函数是负的对数似然,它与训练数据和模型分布间的交叉熵等价。代价函数的具体形式随着模型而改变,取悦于 log p mdoel \log p_{\text{mdoel}} 的具体形式。

使用最大似然来导出代价函数的一个优势是,减轻了为每个模型设计代价函数的复旦。明确一个模型 p ( y x ) p(y|x) 则自动确定了一个代价函数 log p ( y x ) \log p(y|x)

代价函数的梯度必须足够的大和具有足够的预测性,来为学习算法提供一个好的指引。

负对数似然代价函数中的对数函数消除了某些输出单元中的指数效果。且通常没有最小值。

学习条件统计量

有时候只想学习给定 x x y y 的某个条件统计量。

我们可以把代价函数看做是一个泛函(函数到实数的映射)。可以设计代价泛函在我们想要的某些特殊函数处取得最小值。对函数求解优化需要用到变分法

解优化问题
f = arg min f E x,y p d a t a y f ( x ) 2 f^* = \underset{f}{\arg\min} \mathbb E_{\text{x,y} \sim p_{data}||y-f(x)||^2}
得到
f ( x ) = E y p data ( y x ) [ y ] f^*(x) = \mathbb E_{\text{y} \sim p_{\text{data}(y|x)}}[y]

用于高斯输出分布的线性单元

线性输出层经常用来产生条件高斯分布的均值:
p ( y x ) = N ( y ; y ^ ; I ) p(y|x) = \mathcal N(y;\hat y;I)
最大化其对数似然此时等价于最小化均方误差。

线性模型不会饱和

用于Bernoulli输出分布的sigmoid单元

基于使用sigmoid输出单元结合最大似然来保证无论何时模型给出了错误的答案时,总能有一个较大的梯度。

sigmoid输出单元具有两个部分。首先使用一个线性层来计算 z = w h + b z=w^\top h + b 。接着使用sigmoid激活函数将 z z 转换为概率。

z z 的值来定义 y y 的概率分布。假定非归一化的对数概率对于 y y z z 是线性的,可以对其取指数来得到非归一化的概率。然后对其归一化,发现这服从Bernoulli分布,该分布受到sigmoid变换控制:
log P ~ ( y ) = y z \log \tilde P(y) = yz
P ~ ( y ) = exp ( y z ) \tilde P(y) = \exp(yz)
P ( y ) = exp ( y z ) y = 0 1 exp ( y z ) P(y) = \frac{\exp(yz)}{\sum_{y'=0}^{1}\exp(y'z)}
P ( y ) = σ ( ( 2 y 1 ) z ) P(y) = \sigma((2y-1)z)

使用最大似然来学习一个由sigmoid参数化的Bernoulli分布,其中的log抵消了sigmoid的exp,它的损失函数为:
J ( θ ) = 0 log P ( y x ) = log σ ( ( 2 y 1 ) z ) = ζ ( ( 1 2 y ) z ) J(\theta) = 0\log P(y|x) = -\log \sigma((2y-1)z) = \zeta((1-2y)z)
将损失函数写成softplus函数的形式,可以看到它仅仅在 ( 1 2 y ) z (1-2y)z 取绝对值非常大的负值时才会饱和。对于极限情况下极度不正确的 z z ,softplus函数完全不会收缩梯度,这意味着基于梯度的学习可以很快更正错误的 z z

用于Multinoulli输出分布的softmax单元

softmax函数最常用于分类器的输出,来表示 n n 个不同类上的概率分布。比较少见的是,其也可用于模型内部。

首先,线性层预测了未归一化的对数概率:
z = W h + b z=W^\top h+b
其中 z i = log P ^ ( y = i x ) z_i = \log \hat P(y=i|x) 。softmax函数然后对 z z 指数化和归一化来获得需要的 y ^ \hat y ,最终形式为:
softmax ( z ) i = exp ( z i ) j exp ( z j ) \text{softmax}(z)_i = \frac{\exp(z_i)}{\sum_j\exp(z_j)}
使用最大对数似然训练softmax来输出目标值 y \text{y}
log softmax ( z ) i = z i log j exp ( z j ) \log \text{softmax}(z)_i = z_i-\log\sum_j\exp(z_j)
对于第二项 log j exp ( z j ) \log\sum_j\exp(z_j) 有个直观理解,这一项可以近似为 max j z j \max_jz_j 。当预测正确时,代价函数约为零,对整体贡献很小。负对数似然代价函数总是强烈惩罚最活跃的不正确预测。

softmax函数由它的变量偏离 max i z i \max_iz_i 来驱动:
softmax ( z ) = softmax ( z + c ) = softmax ( z max i z i ) \text{softmax}(z) =\text{softmax}(z+c) = \text{softmax}(z- \underset{i}{\max}z_i)

softmax函数的变量 z z 可以通过两种方法产生。最常用的是简单地使神经网络较早层输出 z z 的每个元素,但这种方法是对分布的过度参数化。另外我们可以强制要求 z z 的一个元素是固定的

从神经科学的角度看,softmax是一种在参与其中的单元之间形成竞争的方式。

最好将softmax函数称为“softargmax”

其他的输出类型

神经网络可以推广到我们希望的几乎任何种类的输出层。最大似然原则给如何为几乎任何种类的输出层设计一个好的代价函数提供了指导。

高斯混合模型在语音生成模型和物理运动中特别有效。混合密度策略为网络提供了一种方法来表示多种输出模式,并且控制输出的方差,这对于在这些实数域中获得高质量的结果是至关重要的。

隐藏单元

整流线性单元是隐藏单元极好的默认选择。先直觉认为某种隐藏单元可能表现良好,然后用它组成神经网络进行训练,最后用验证集来评估它的性能。

神经网络训练算法通常不会达到代价函数的局部最小值,而是仅仅显著减小它的值。

整流线性单元及其扩展

relu易于优化,缺陷是不能通过基于梯度的方法学习那些使它们激活为零的样本。

maxout单元将 z z 划分每组具有 k k 个值的组,每个maxout单元输出每组的最大元素:
g ( z ) = max j G z j g(z) = \underset{j \in \mathbb G}{\max} z_j

maxout单元可以学习具有多大 k k 段的分段线性的凸函数。maxout单元可以视为学习激活函数本身而不仅仅是单元之间的关系。使用足够大的 k k ,maxout单元可以以任意精度来近似任何凸函数。

因为每个单元由多个过滤器驱动,maxout单元具有一些冗余来帮助它们抵抗被称为灾难遗忘的现象。

整流线性单元和它们的这些扩展都是基于一个原则,行为更接近线性,模型更容易优化。

logistic sigmoid与双曲正切函数

g ( z ) = σ ( z ) = tanh ( z ) = 2 σ ( 2 z ) 1 g(z) = \sigma(z) = \tanh(z) = 2\sigma(2z)-1
当必须要用sigmoid激活函数时,双曲正切激活函数通常要比logistics sigmoid函数表现要好。

其他隐藏单元

  • g ( x ) g(x)
  • softmax
  • 径向基函数
  • softplus函数 g ( a ) = ζ ( a ) = log ( 1 + e a ) g(a) = \zeta(a) = \log(1+e^a)
  • 硬双曲正切函数

架构设计

万能近似性质和深度

万能近似定理表明,一个前馈神经网络如果具有线性输出层和至少一层具有一种“挤压”性质的激活函数的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意精度来近似任何从一个有限维空间到另一个有限维空间的Borel可测函数.

学习可能因为两个不同的原因失败。

  1. 用于训练的优化算法可能找不到用于期望函数的参数值。
  2. 训练算法可能由于过拟合而选择错误的函数

在很多情况下,使用更深的模型能减少表示期望函数所需的单元的数量,并且可以减少泛化误差。

浅层模型所需要的隐藏单元的数量是 n n 的指数级

分段线性网络(可以通过整流非线性或maxout单元获得)可以表示区域的数量是网络深度的指数级的函数。

Montufar的主要定理指数,具有 d d 个输出、深度为 l l 、每个隐藏层具有 n n 个单元的深度整流网络可以描述的线性区域的数量是
O ( ( n d ) d ( l 1 ) n d ) O\left({n \choose d}^{d(l-1)} n^d \right)
意味着,这是深度 l l 的指数级。在每个单元具有 k k 个过滤器的maxout网络中,线性区域的数量是
O ( k ( l 1 ) + d ) O(k^{(l-1)+d})
选择深度模型默认一个非常普遍的信念,要学得的函数应该涉及几个更为简单的函数的组合。

其他架构上的考虑

一般的,层不需要连接在链中,尽管这是最常见的做法。

另外一个关键点是如何将层与层之间连接起来。

反向传播和其他的微分算法

反向传播仅指用于计算梯度的方法,另外一种算法(随机梯度下降等)使用该梯度来进行学习。

计算图

微积分中的链式法则

z = f ( g ( x ) ) = f ( y ) x z = ( y x y z ) z=f(g(x)) = f(y) \to \nabla_xz = \left(\frac{\partial y}{\partial x}^\top \nabla_yz \right)

递归地使用链式法则来实现反向传播

执行反向传播所需的计算量与 G \mathcal G 中的边的数量成比例。

全连接MLP中的反向传播计算

符号到符号的导数

符号到数值的微分:采用计算图和一组用于图的输入的数值,然后返回在这些输入值处梯度的一组数值。
符号到符号的微分:采用计算图以及添加一些额外的节点(提供了所需导数的描述)到计算图中

一般化的反向传播

  • get_operation( V V )
  • get_consumers( V V , G \mathcal G )
  • get_inputs( V V , G \mathcal G )
  • op.bprop(inputs, X, G)
    i ( X op.f ( inputs ) i ) G i \sum_i(\nabla_X \text{op.f}(\text{inputs})_i)G_i
    反向传播算法的软件实现通常提供操作和其bprop方法。使用反向传播作为一种策略来避免多次计算链式法则中的相同子表达式(需要指数级别的运算)。计算梯度至多需要 O ( n 2 ) O(n^2) 的操作。大多数神经网络大致是链式结构,使得反向传播只有 O ( n ) O(n) 的成本。这种表填充的策略有时被称为动态规划

实例:用于MLP训练的反向传播

复杂化

深度学习界以外的微分

自动微分领域关心如何以算法方式计算导数。这里描述的反向传播算法知识自动微分的一种方法。是被称为反向模式累加的更广泛的技术的特殊类型。其他方法以不同的顺序计算链式法则的子表达式。但找到计算梯度的最优操作序列是NP完全问题。

当图的输出数目大于输入的数目时,有时更偏向于使用另外一种形式的自动微分,称为前向模式累加,已被用于循环神经网络梯度的实时计算吗。

高阶微分

典型的深度学习使用Krylov方法,而不是显式计算Hessian矩阵。

历史小记

猜你喜欢

转载自blog.csdn.net/Tifa_Best/article/details/83720372
今日推荐