前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习 学习笔记(20)深度前馈网络

机器学习 学习笔记(20)深度前馈网络

作者头像
发布2018-09-04 10:42:43
1.6K0
发布2018-09-04 10:42:43
举报
文章被收录于专栏:WD学习记录WD学习记录

深度前馈网络(deep feedforward network),也叫做前馈神经网络(feedforward neural network)或者多层感知机(multilayer perceptron,MLP),是典型的深度学习模型。前馈网络的目标是近似某个函数

f^*
f^*

,例如,对分类器

y=f^*(x)
y=f^*(x)

将输入x映射到一个类别y。前馈网络定义了一个映射

y=f(x;\theta )
y=f(x;\theta )

,并且学习参数

\theta
\theta

的值,使它能够得到最佳的函数近似。

这种模型被称为前向的,是因为信息流过x的函数,流经用于定义f的中间计算过程,最终到达输出y,在模型的输出和模型本身之间没有反馈链接。当前馈神经网络被扩展成包含反馈连接时,他们被称为循环神经网络(recurrent nural network)。

为了扩展线性模型来表示x的非线性函数,我们可以不把线性模型用于x本身,而是用在一个变换后的输入

\o (x)
\o (x)

上,这里

\o
\o

是一个非线性变化,同样也可以使用核技巧,来得到一个基于隐含地使用

\o
\o

映射的非线性学习算法。可以认为

\o
\o

提供了一组描述x的特征,或者认为它提供了x的一个新的表示,如何选择映射

\o
\o

(1)其中一种选择是使用一个通用的

\o
\o

,例如无限维的

\o
\o

,它隐含地用在基于RBF核的核机器上,如果

\o (x)
\o (x)

具有足够高的维数,我们总是有足够的能力来拟合训练集,但是对于测试集的泛化往往不佳。非常通用的特征映射常只基于局部光滑的原则,并且没有将足够的先验信息进行编码来解决高级问题。

(2)另一种选择使手动设计

\o
\o

(3)深度学习的策略是去学习

\o
\o

,在这种方法中,我们有一个模型

y=f(x;\theta ,w)=\o (x;\theta )^Tw
y=f(x;\theta ,w)=\o (x;\theta )^Tw

。现在有两种参数,用于从一大类函数中学习

\o
\o

的参数

\theta
\theta

,以及用于将

\o (x)
\o (x)

映射到所需的输出的参数w。这是深度前馈网络的一个例子,其中

\o
\o

定义了一个隐藏层,这是三种方法中唯一一种放弃训练问题的凸性方法,但是利大于弊。在这种方法中,我们将表示参数化为

\o (x;\theta )
\o (x;\theta )

,并且使用优化算法来寻找

\theta
\theta

,使它能够得到一个好的表示。如果想要的话,这种方法也可以通过使它变得高度通用以获得第一种方法的优点,只需要使用一个非常广泛的函数族

\o (x;\theta )
\o (x;\theta )

。这种方法也可以获得第二种方法的优点,人类专家可以将他们的知识编码进网络来帮助泛化,只需设计那些他们期望能够表现优异的函数族

\o (x;\theta )
\o (x;\theta )

即可,这种方法的优点是人类设计者只需要找到正确的函数族即可,而不需要去寻找精确的函数。

激活函数g通常为由

g(z)=max\{0,z\}
g(z)=max\{0,z\}

定义的整流线型单元(rectified linear unit)或者成为ReLU。

基于梯度的学习

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

代价函数

神经网络的代价函数或多或少是和其他的参数模型(如线性模型的代价函数)相同的。

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

大多数线代的神经网络使用最大似然来训练,这意味着代价函数就是负的对数似然,它与训练数据和模型分布间的交叉熵等价。这个代价函数表示为:

J(\theta )=-E_{x,y\sim \hat{p}_{data} }log p_{model}(y|x)
J(\theta )=-E_{x,y\sim \hat{p}_{data} }log p_{model}(y|x)

代价函数的具体形式随着模型而改变,取决于

log p_{model}
log p_{model}

的具体形式。如果

p_{model}(y|x)=N(y;f(x;\theta ),I)
p_{model}(y|x)=N(y;f(x;\theta ),I)

,那么重新得到了均方误差代价:

J(\theta )=\frac{1}{2}E_{x,y\sim \hat{p}_{data}}||y-f(x;\theta )||^2+const
J(\theta )=\frac{1}{2}E_{x,y\sim \hat{p}_{data}}||y-f(x;\theta )||^2+const

。系数

\frac{1}{2}
\frac{1}{2}

和常数项不依赖于

\theta
\theta

,舍弃的常数是基于高斯分布的方差,在这种情况下,我们选择不把它参数化。之前,看到了对输出分布的最大似然估计和对线性模型均方误差的最小化之间的等价性,事实上,这种等价性并不要求

f(x;\theta )
f(x;\theta )

用于预测高斯分布的均值。

使用最大似然来导出代价函数的方法的一个优势是,减轻了为每个模型设计代价函数的负担,明确一个模型

p(y|x)
p(y|x)

自动地确定一个代价函数

logp(y|x)
logp(y|x)

贯穿神经网络设计的一个反复出现的而主题是代价函数的梯度必须足够的大和具有足够的预测性,来为算法提供一个好的指引。饱和(变得非常平)的函数破坏了这一目标,因为它们把梯度变得很小。这在很多情况下都会发生,因为用于产生隐藏单元或者输出单元的输出的激活函数会饱和。负的对数似然帮助在很多模型中避免这个问题。很多输出单元都会包含一个指数函数,这在它的变量取绝对值非常大的负值时会造成饱和,负的对数似然代价函数中的对数函数消除了某些输出单元中的指数效果。

用于实现最大似然估计的交叉熵代价函数有一个不同寻常的特性,那就是当它被应用于实践中经常遇到的模型时,它通常没有最小值。对于离散型输出变量,大多数模型以一种特殊的形式来参数化,即它们不能表示概率零和一,但是可以无限接近。

学习条件统计量

有时候我们并不是想学习一个完整的概率分布

p(y|x;\theta )
p(y|x;\theta )

,而仅仅是想学习在给定x时y的某个条件统计量。

例如,我们可能有一个预测器

f(x;\theta )
f(x;\theta )

,想用它来预测y的均值。如果使用一个足够强大的神经网络,我们可以认为这个神经网络能够表示一大类函数中的任何一个函数f,这个类仅仅被一些特征所限制,例如连续性和有界,而不是具有特殊的参数形式。从这个角度看,可以把代价函数看做一个泛函,而不仅仅是一个函数。泛函是函数到实数的映射。因此我们可以将学习看做选择一个函数,而不仅仅是选择一组参数。可以设计代价泛函在我们想要的某些特殊函数出取得最小值。例如,我们可以设计一个代价泛函,使它的最小值处于一个特殊的函数上,这个函数将x映射到给定x时y的期望值。对函数的求解优化问题需要用到变分法。

使用变分法导出的第一个结果是解优化问题,

f^*=\arg \min \limits_{f} E_{x,y\sim p_{data}}||y-f(x)||^2
f^*=\arg \min \limits_{f} E_{x,y\sim p_{data}}||y-f(x)||^2

得到

f^*(x)=E_{y\sim p_{data}(y|x)}[y]
f^*(x)=E_{y\sim p_{data}(y|x)}[y]

要求这个函数处在我们要优化的类里。换句话说,如果我们能够用无穷多的,来源于真实的数据生成分布的样本进行训练,最小化均方误差代价函数将得到一个函数,它可以用来对每个x的值预测出y的均值。

不同的代价函数给出不同的统计量,第二个使用变分法得到的结果是:

f^*=\arg \min \limits_{f} E_{x,y\sim p_{data}}||y-f(x)||_1
f^*=\arg \min \limits_{f} E_{x,y\sim p_{data}}||y-f(x)||_1

将得到一个函数可以对每个x预测y取值的中位数,只要这个函数在我们要优化的函数族里。这个代价函数通常被称为平均绝对误差。

可惜的是,均方误差和平均绝对误差在使用基于梯度的优化方法是往往成效不佳。一些饱和的输出单元当结合这些代价函数时会产生非常小的梯度。这就是交叉熵代价函数比均方误差或者平均绝对误差更受欢迎的原因之一了,即使是在没有必要估计整个

p(y|x)
p(y|x)

分布时。

输出单元

代价函数的选择与输出单元的选择紧密相关。大多数时候,我们简单地使用数据分布和模型分布间的交叉熵。选择如何表示输出决定了交叉熵函数的形式。

假定前馈网络提供了一组定义为

h=f(x;\theta )
h=f(x;\theta )

的隐藏特征,输出层的作用是随后对这些特征进行一些额外的变化来完成整个网络必须完成的任务。

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

一种简单的输出单元是基于仿射变换的输出单元,仿射变换不具有非线性。这些单元往往被直接称为线性单元。

给定特征h,线性输出单元层产生一个向量

\hat{y}=W^Th+b
\hat{y}=W^Th+b

。线性输出层经常被用来产生条件高斯分布的均值:

p(y|x)=N(y;\hat{y},I)
p(y|x)=N(y;\hat{y},I)

。最大化其对数似然此时等价于最小化均方误差。

最大似然框架也使得学习高斯分布协方差矩阵更加容易,或更容易地是高斯分布的协方差矩阵作为输入的函数。然而,对于所有输入,协方差矩阵都必须被限定称一个正定矩阵,线性输出层很难满足这种限定,所以通常使用其他的输出单元来对协方差参数化。

因为线性单元不会饱和,所以它们易于采用基于梯度的优化算法,甚至可以使用其他多种优化算法。

用于Bernoulli输出分数的Sigmoid单元

许多任务需要预测二值型变量y的值,具有两个类的分类问题可以归结为这种形式。

此时最大似然的方法是定义y在x条件下的Bernoulli分布。

Bernoulli分布仅需单个参数来定义,神经网络只需要预测

p(y=1|x)
p(y=1|x)

即可,为了使这个数是有效的概率。它必须处在区间[0,1]中。

假设使用线性单元,并通过阈值来限制它成为一个有效的概率:

P(y=1|x)=max\{0,min\{1,w^Th+b\}\}
P(y=1|x)=max\{0,min\{1,w^Th+b\}\}

,这的确定义了一个有效的条件概率分布,但是无法使用梯度下降来高效地训练它。当

w^Th+b
w^Th+b

处于区间外时,模型的输出对应其参数的梯度都为0.梯度为0通常是有问题的,因为学习算法对于如何改善相应的参数不再有指导意义。

最好是使用一种新的方法来保证无论何时模型给出了错误的答案时,总能有一个较大的梯度。这种方法是基于使用sigmoid输出单元集合最大似然来实现的。

可以认为sigmoid输出单元有两个部分,首先,使用一个线性层来计算

z=w^Th+b
z=w^Th+b

,其次使用sigmoid激活函数将z转换成概率。

在对数空间里预测概率的方法可以很自然地使用最大似然学习,因为用于最大似然的代价函数是

-logP(y|x)
-logP(y|x)

,代价函数中的log低效了sigmoid中的exp,如果没有这个效果,sigmoid的饱和性会阻止基于梯度的学习做出更好的改进。

当我们使用其他的损失函数,例如均方误差之类的,损失函数会在

\sigma (z)
\sigma (z)

饱和时饱和,sigmoid激活函数在z取非常小的负值时会饱和到0,z取非常大的正值时饱和到1,这种情况一旦发生,梯度会变得非常小以至于不能用来学习,无论此时模型给出的是正确还是错误的答案。因此最大似然几乎总是训练sigmoid输出单元的优选方法。

理论上sigmoid的对数总是确定和有限的,因为sigmoid的返回值总是被限制在开区间(0,1)上,而不是使用整个闭区间的[0,1]的有效概率。在软件实现时,为了避免数值问题,最好将负的对数似然写作z的函数,而不是

\hat{y}=\sigma (z)
\hat{y}=\sigma (z)

的函数。如果sigmoid函数下溢到0,那么只会对

\hat{y}
\hat{y}

取对数会得到负无穷。

用于Multinoulli输出分布的softmax单元

任何时候,当我们想要表示一个具有n个可能取值的离散型随机变量的分布时,都可以使用softmax函数。它可以看做是sigmoid函数的扩展,其中sigmoid函数用来表示二值型变量的分布。

softmax函数最常用作分类器的输出,来表示n个不同类上的概率分布。比较少见的是,softmax函数可以在模型内部使用,例如,如果我们想要在某个内部变量的n个不同选项中进行选择。

在二值型变量的情况下,我们希望计算一个单独的数

\hat{y}=P(y=1|x)
\hat{y}=P(y=1|x)

,因为这个数需要处在0和1之间,并且我们想要让这个数的对数可以很好地用于对数似然的基于梯度优化,因而我们选择去预测另外一个数

z=log\hat{P}(y=1|x)
z=log\hat{P}(y=1|x)

。对其指数化和归一化,就得到了一个由Bernoulli分布。

为了推广到具有n个值得离散型变量的情况,现在需要创造一个向量

\hat{y}
\hat{y}

,它的每个元素是

\hat{y}_i=P(y=i|x)
\hat{y}_i=P(y=i|x)

。我们不仅要求每个

\hat{y}_i
\hat{y}_i

介于0和1之间,还要使得整个向量的和为1,使得它表示一个有效的概率分布。

首先,线性层预测了未归一化的对数概率:

z=W^Th+b
z=W^Th+b

,其中

z_i=log\hat{P}(y=i|x)
z_i=log\hat{P}(y=i|x)

。softmax函数然后可以对z指数化和归一化来获得需要的

\hat{y}
\hat{y}

。最终,softmax函数的形式为:

softmax(z)_i=\frac{exp(z_i)}{\sum_jexp(z_j)}
softmax(z)_i=\frac{exp(z_i)}{\sum_jexp(z_j)}

和logistic sigmoid一样,当使用最大化对数似然训练softmax来输出目标值y时,使用指数函数工作地非常好。这种情况下,我们想要最大化

logP(y=i;z)=log softmax(z)_i
logP(y=i;z)=log softmax(z)_i

。将softmax定义成指数的形式时很自然的,

log softmax(z)_i=z_i-log\sum_j exp(z_j)
log softmax(z)_i=z_i-log\sum_j exp(z_j)

。上式中的第一项表示输入

z_i
z_i

总是对代价函数有直接的贡献,因为这一项不会饱和,所以即使

z_i
z_i

对第二项的贡献很小,学习仍然可以进行。当最大化对数似然时,第一项估计

z_i
z_i

被推高,而第二项则鼓励所有的z被压低。为了对第二项

log\sum_jexp(z_j)
log\sum_jexp(z_j)

有一个直观的理解,注意到这一项可以大致近似为

max_j z_j
max_j z_j

。这种近似是基于对任何明显小于

max_j z_j
max_j z_j

z_k
z_k

exp(z_k)
exp(z_k)

都是不重要的。负对数似然代价函数总是强烈的惩罚最活跃的不正确预测。如果正确答案已经具有了softmax的最大输入,那么

-z_i
-z_i

项和

log\sum_jexp(z_j)\approx max_jz_j=z_i
log\sum_jexp(z_j)\approx max_jz_j=z_i

项将大致抵消。这个样本对于整体训练代价贡献很小,这个代价主要由其他未被正确分类的样本产生。

未正则化的最大似然会驱动模型去学习一些参数,而这些参数会驱动softmax函数来预测在训练集中观察到的每个结果的比率:

softmax(z(x;\theta ))_i\approx \frac{\sum_{j=1}^m 1_{y^{(j)}=i,x{(j)}=x}}{\sum_{j=1}^m1_{x^{(j)}=x}}
softmax(z(x;\theta ))_i\approx \frac{\sum_{j=1}^m 1_{y^{(j)}=i,x{(j)}=x}}{\sum_{j=1}^m1_{x^{(j)}=x}}

因为最大似然是一致的估计量,所以只要模型族能够表示训练的分布,这就能保证发生,在实践中,有限的模型能力和不完美的优化意味着模型只能近似这些比率。

对数似然函数之外的许多目标函数对于softmax函数不起作用,具体来说,哪些不适用对数来抵消softmax中的指数的目标函数,当指数的函数变量取非常小的负值时会造成梯度消失,从而无法学习。

像sigmoid一样,softmax激活函数可能会饱和,对于softmax的情况,它有镀铬输出值,当输入值之间的差异变得极端时,这些输出值可能饱和。当softmax饱和时,基于softmax的许多代价函数也饱和,除非他们能够转化饱和的激活函数。

为了说明softmax函数对于输入之间差异的响应,观察到当对所有的输入都家伙是哪个一个相同常数时,softmax的输出不变:

softmax(z)=softmax(z+c)
softmax(z)=softmax(z+c)

使用这个性质,可以导出一个数值方法稳定的softmax函数的变体:

softmax(z)=softmax(z-\max \limits_{i}z_i)
softmax(z)=softmax(z-\max \limits_{i}z_i)

变换后的形式允许我们在对softmax函数求值时只有很小的数值误差,即使当z包含极正或极负的数时,观察softmax数值稳定的变体,可以看到softmax函数由它的变量偏离

\max \limits_{i} z_i
\max \limits_{i} z_i

的量来驱动。

当其中一个输入是最大

(z_i=max_iz_i)
(z_i=max_iz_i)

并且

z_i
z_i

远大于其他的输入时,相应的输出

softmax(z)_i
softmax(z)_i

会饱和到1。当

z_i
z_i

不是最大值并且最大值非常大时,相应的输出

softmax(z)_i
softmax(z)_i

会饱和到0.这是sigmoid单元饱和方式的一般化,并且如果损失函数不被设计成对其进行补偿,那么也会造成类似的学困难。

softmax函数的变量z可以通过两种方式产生。最常见的是简单地使用神经网络较早的层输出z的每个元素,就像先前描述得使用线性层

z=W^Th+b
z=W^Th+b

。虽然很直观,但这种方法是对分布的过度参数化,n个输出总和必须为1的约束意味着只有n-1个参数时必要的。第n个概率值可以通过1减去前面n-1个概率来获得。因此,我们可以强制要求z的一个元素是固定的。无论是n-1个变量还是n个变量的方法,都描述了相同的概率分布,但会产生不同的学习机制。在实践中,无论是过度参数化的版本还是限制的版本,都很少有差别,并且实现过度参数化的版本更加简单。

从神经科学的角度看,有趣的是认为softmax是一种在参与其中的单元之间形成竞争的方式:softmax输出总是和为1,所以一个单元的值增加必然对应着其他单元值得减少。这与被认为存在于皮质中相邻神经元间的侧抑制类似。在极端情况下(当最大的

a_i
a_i

和其它的在幅度上差异很大时),它变成了赢者通吃的形式,其中一个输出接近1,其他都接近0。

其他的输出类型

一般而言,如果我们定义了一个条件分布

p(y|x;\theta )
p(y|x;\theta )

。最大似然原则建议我们使用

-logp(y|x;\theta )
-logp(y|x;\theta )

作为代价函数。

我们可以认为神经网络表示函数

f(x;\theta )
f(x;\theta )

。这个函数的输出不是对y值得直接预测,相反,

f(x;\theta )=w
f(x;\theta )=w

提供了y分布的参数。我们的损失函数就可以表示成

-logp(y;w(x))
-logp(y;w(x))

多峰回归(multimodal regression),即预测条件分布

p(y|x)
p(y|x)

的实值,该条件分布对于相同的x值在y空间中又多个不同的峰值。在这种情况下,高斯混合是输出的自然表示,将高斯混合作为其输出的神经网络通常被称为混合密度网络。具有n个分量的高斯混合输出由下面的条件分布定义:

p(y|x)=\sum_{i=1}^n p(c=i|x)N(y;\mu^{(i)}(x),\Sigma ^{(i)}(x))
p(y|x)=\sum_{i=1}^n p(c=i|x)N(y;\mu^{(i)}(x),\Sigma ^{(i)}(x))

神经网络必须有三个输出:定义

p(c=i|x)
p(c=i|x)

的向量,对所有的i给出

\mu^{(i)}(x)
\mu^{(i)}(x)

的矩阵,以及对所有的i给出

\Sigma ^{(i)}(x)
\Sigma ^{(i)}(x)

的张量,这些输出必须满足不同的约束:

(1)混合组件

p(c=i|x)
p(c=i|x)

:由潜变量c关联着,在n个不同组件上形成Multinoulli分布,这个分布通过可以由n维向量的softmax来获得,以确保这些输出时正的并且和为1.

(2)均值

\mu^{(i)}(x)
\mu^{(i)}(x)

:指明了与第i个高斯组件相关联的中心或者均值,并且是无约束的(通常对于这些输出单元完全没有非线性)。如果y是个d维向量,那么网络必须输出一个由n个这种d维向量组成的

n \times d
n \times d

的矩阵。用最大似然来学习这些均值要比学习只有一个输出模式的分布的均值稍微复杂一些。我们只想更新那个真正产生观测数据的组件的均值。在实践中,我们并不知道是那个组件产生了观测数据,负对数似然表达式将每个样本对每个组件的贡献进行赋权,权重的大小由相应的组件产生这个样本的概率来决定。

(3)协方差

\Sigma ^{(i)}(x)
\Sigma ^{(i)}(x)

:它们指明了每个组件i的协方差矩阵。和学习单个高斯组件时一样,我们通常使用对角矩阵来避免计算行列式。和学习混合均值一样,最大似然是很复杂的,它需要将每个点的部分责任分配给每个混合组件。如果给定了混合模型的正确的负对数似然,梯度下降将自动地遵循正确的过程。

基于梯度的优化方法对于混合条件高斯(作为神经网络的输出)可能是不可靠的,部分是因为涉及除法(除以方差)可能是数值不稳定的(当某个方差对于特定的实例变得非常小时,会导致非常大的梯度)。一种解决方法是梯度截断(clip gradient),另一种是启发式缩放梯度。

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

隐藏单元

隐藏单元的设计是一个非常活跃的研究领域,并且还没有许多明确的指导性理论原则。

整流线性单元是隐藏单元极好的默认选择。许多其他类型的隐藏单元也是可用的。决定何时使用哪种类型的隐藏单元是困难的事,尽管整流线性单元通常是一个可接受的选择。

这里列出的一些隐藏单元可能并不是在所有的输入点上都是可微的。例如,整流线性单元

g(z)=max\{0,z\}
g(z)=max\{0,z\}

z=0
z=0

处不可微。这似乎使得g对于基于梯度的学习算法无效。在实践中,梯度下降对这些机器学习模型仍然表现的足够好。部分原因是神经网络训练算法通常不会达到代价函数的局部最小值,而是仅仅显著地减小它的值。我们不再期望训练能够实际到达梯度为0的点,所以代价函数的最小值对应于梯度未定义的点是可以接受的。不可微的隐藏单元通常只在少数点上不可微。一般来说,函数

g(z)
g(z)

具有左导数和右导数,只有当函数左导数右导数都有定义时,且相等时,函数在z点处才是可微的。神经网络中函数通常对左导数和右导数都有定义。神经网络训练的软件实现通常返回左导数或右导数中的一个,而不是报告导数未定义或产生的一个错误。这可以通过观察到在数字计算机上基于梯度的优化总是会受到数值误差的影响来启发式地给出理由。当一个函数被要求计算

g(0)
g(0)

时,底层值真正为0是不太可能的,相对的,它可能是被舍入为0的一个小量

\epsilon
\epsilon

。在某些情况下,理论上有更好地理由,但这些通常对神经网络并不适用。重要的是,在时间中,我们可以放心地忽略下面描述得隐藏单元激活函数的不可微性。

整流线性单元及其扩展

整流线性单元使用激活函数

g(z)=max\{0,z\}
g(z)=max\{0,z\}

整流线性单元易于优化,因为它们和线性单元非常相似。线性单元和整流线性单元的唯一区别在于整流线性单元在其一半的定义域上输出为零。这使得只要整流线性单元处于激活状态,它的导数都能保持较大。它的梯度不但大而且一致。整流操作的二阶导数几乎处处为0,并且在整流线性单元处于激活状态时,它的一阶导数处处为1。这意味着相比于引入二阶效应的激活函数来说,它的梯度方向对于学习来说更加有用。

整流线性单元通常作用于仿射变换之上:

h=g(W^Tx+b)
h=g(W^Tx+b)

当初始化仿射变换的参数时,可以将b的所有元素设置成一个小的正值,例如0.1。这使得整流线性单元很可能初始时就对训练集中的大多数输入呈现激活状态,并且允许导数通过。

有很多整流线性单元的扩展存在,大多数这些扩展的表现比得上整流线性单元,并且偶尔表现的更好。

整流线性单元的一个缺陷是它们不能通过基于梯度的方法学习那些使它们激活为0的样本。整流线性单元的各种扩展保证了它们能在各个位置都接收到梯度。

整流线性单元的3个扩展基于当

z_i<0
z_i<0

时使用一个非0的斜率

\alpha _i
\alpha _i

h_i=g(z,\alpha )_i=max(0,z_i)+\alpha_i min(0,z_i)
h_i=g(z,\alpha )_i=max(0,z_i)+\alpha_i min(0,z_i)

。绝对值整流(absolute value rectification)固定

\alpha _i=-1
\alpha _i=-1

来得到

g(z)=|z|
g(z)=|z|

。它用于图像中的对象识别,其中寻找在照明极性反转下不变的特征是有意义的。整流线性单元的其它扩展比这应用得更广泛。渗漏整流线性单元(Leaky ReLU)将

\alpha _i
\alpha _i

固定成一个类似0.001的小值,参数化整流线性单元(parametric ReLU)或者PReLU将

\alpha _i
\alpha _i

作为学习的参数。

maxout单元进一步扩展了整流线性单元。maxout单元将z划分为每组具有k个值组,而不是使用作用于每个元素的函数g(z)。每个maxout单元则输出每组中的最大元素:

g(z)_i=\max \limits_{j\in G^{(i)}}z_j
g(z)_i=\max \limits_{j\in G^{(i)}}z_j

这里

G^{(i)}
G^{(i)}

是组i的输入索引集

\{(i-1)k+1,...,ik\}
\{(i-1)k+1,...,ik\}

,这提供了一种方法来学习对输入x空间中多个方向响应的分段线性函数。

maxout单元可以学习具有多达k段的分段线性的凸函数。maxout单元因此可以视为学习激活函数本身,而不仅仅是单元之间的关系。使用足够大的k,maxout可以以任意的精确度来近似任何凸函数。特别的,具有两块的maxout层可以学习实现和传统层相同输入x的函数,这些传统层可以使用整流线性激活函数、绝对值整流、渗漏整流线性单元或参数化整流线性单元,或者可以学习实现与这些都不同的函数,maxout层的参数化当然也将于这些层不同。所以即使是maxout学习去实现和其他种类的层相同的x的函数这种情况下,学习的机理也是不一样的。

每个maxout单元现在由k个权重向量来参数化,而不仅仅是一个,所以maxout单元通常比整流线性单元需要更多的正则化。如果训练集很大并且每个单元的块数保持很低的话,它们可以在没有正则化的情况下工作的不错。

maxout单元还有一些其他的优点,在某些情况下,要求更少的参数可以获得一些统计和计算上的优点,具体来说,如果由n个不同的线性过滤器描述得特征可以在不损失信息的情况下,用每一组k个特征的最大值来概括的下,那么下一层可以获得k倍更少的权重数。

因为每个单元由多个过滤器驱动,maxout单元具有一些冗余来帮助它们地块一种被称为灾难遗忘(catastrophic forgetting)的现象,这个现象是说神经网络忘记了如何执行它们过去训练的任务。

整流线性单元和它们的这些扩展都是基于一个原则,那就是如果他们的行为更接近线性,那么模型更容易优化。使用线性行为更容易优化的一般性原则同意适用于除深度线性网络意外的情景。循环网络可以从序列中学习并产生状态和输出的序列。当训练它们时,需要通过一些时间步来传播信息,当其中包含一些线性计算(具有大小接近1的某些方向导数)时,这会更容易。

logistic sigmoid与双曲正切函数

logistic sigmoid激活函数

g(z)=\sigma (z)=\frac{1}{1+exp(-z)}
g(z)=\sigma (z)=\frac{1}{1+exp(-z)}

双曲正切激活函数

g(z)=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}
g(z)=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}
tanh(z)=z\sigma (2z)-1
tanh(z)=z\sigma (2z)-1

sigmoid单元在其大部分定义域内都饱和,广泛的饱和性会使得基于梯度的学习变得非常困难,因为这个原因,现在不鼓励将它们用作前馈网络中的隐藏单元。当使用一个合适的代价函数来抵消sigmoid的饱和性时,它们作为输出单元可以与基于梯度的学习相兼容。

当必须要使用sigmoid激活函数时,双曲正切激活函数通常要比sigmoid函数表现更好,在

tanh(0)=0
tanh(0)=0

\sigma (0)=\frac{1}{2}
\sigma (0)=\frac{1}{2}

的意义上,它更像是单位函数。因为tanh在0附近与单位函数类似,训练深层神经网络

\hat{y}=w^T tanh(U^Ttanh(V^Tx))
\hat{y}=w^T tanh(U^Ttanh(V^Tx))

类似于

\hat{y}=w^TU^TV^Tx
\hat{y}=w^TU^TV^Tx

,只有网络的激活能够被保持的很小,这使得训练tanh网络更加容易。

sigmoid激活函在除了前馈网络以外的情景中更为常见。循环网络、许多概率模型以及一些自编码器有一些额外的要求使得他们不能使用分段线性激活函数,并且使得sigmoid单元更具有吸引力,尽管它存在饱和性问题。

其他隐藏单元

如果神经网络的每一层都仅由线性变换组成,那么网络作为一个整体也将是线性的。然而神经网络的一些层是纯线性的也是可以接受的。考虑具有n个输入和p个输出的神经网络层

h=g(W^Tx+b)
h=g(W^Tx+b)

,我们可以用两层来代替它,一层是使用权重矩阵U,另一层是使用权证矩阵V,如果第一层没有激活函数,那么我们对基于W的原始层的权重矩阵进行因式分解,分解方法是计算

h=g(V^TU^Tx+b)
h=g(V^TU^Tx+b)

。如果U产生了q个输出,那么U和V一起仅包含(n+p)q个参数。而W包含np个参数,如果q很小,这可以在很大程度上节省参数。这是将线性变化约束为低秩的代价来实现的,但这些低秩关系往往是足够的。线性隐藏单元因此提供了一种减少网络中参数数量的有效方法。

softmax单元是另外一种经常用作输出的单元,但有时也可以用作隐藏单元。softmax单元很自然地表示具有k个可能值得离散型随机变量的概率分布,所以它们可以用作一种开关,这些类型的隐藏单元通常仅用于明确地学习操作内存的高级结构中。

其他一些常见的隐藏单元类型包括:

  • 径向基函数(radial basis function,RBF):
h_i=exp(-\frac{1}{\sigma ^2_i||W_{:,i}-x||^2})
h_i=exp(-\frac{1}{\sigma ^2_i||W_{:,i}-x||^2})

。这个函数在x接近模板

W_{:,i}
W_{:,i}

时更加活跃。因为它对大部分x都饱和到0,因此很难优化。

  • softplus函数:
g(a)=\zeta (a) =log(1+e^a)
g(a)=\zeta (a) =log(1+e^a)

,这是整流线性单元的额平滑版本,引入用于函数近似,和无向概率模型的条件分布。softplus和整流线性单元相比较,后者结果更好,通常不鼓励使用softplus函数。softplus表明隐藏单元类型的性能可能是非常反直觉的,因为它处处可到或者因为它不完全饱和。

  • 硬双曲正切函数(hard tanh):它的形状和tanh以及整流线性单元类似,但是不同于后者,它是有界的,
g(a)=max(-1,min(1,a))
g(a)=max(-1,min(1,a))

架构设计

神经网络设计的另一个关键点是确定它的架构。架构一词是指网络的整体结构:它应该具有多少单元,以及这些单元应该如何连接。

在链式架构中,主要的架构的考虑是选择网络的深度和每一层的宽度。

万能近似性质和深度

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

R^n
R^n

的有界闭集上的任意连续函数是Borel可测的,因此可以用神经网络来近似。神经网络也可以近似从任何有限维离散空间映射到另一个的任意函数。

万能近似定义意味着无论我们试图学习什么函数,我们知道一个大的MLP一定能够表示这个函数。然而,我们不能保证训练算法能够学得这个函数。即使MLP能够表示该函数,学习也可能因为两个不同的原因而失败。首先,用于选了的优化算法可能找不到用于期望函数的参数值。其次,训练算法可能由于过拟合而选择了错误的函数。

前馈网络提供了表示函数的万能系统,给定一个函数,存在一个前馈网络能够近似该函数。不存在万能的过程既能够验证训练集上的特殊样本,又能够选择一个函数来扩展到训练集上没有的点。

万能近似定理说明,存在一个足够大的网络能够达到我们所希望的任意精度,但是定理并没有说明这个网络有多大。在最坏的情况下,可能需要指数数量的隐藏单元,

总之,具有单层的前馈网络足以表示任何函数,但网络层可能大得不可实现,并且可能无法正确地学习和泛化。在很多情况下,使用更深的模型能够减少表示期望函数所需的单元的数量,并且可以减少泛化误差。

具有d个输入、深度为l,每个隐藏层具有n个单元的深度整流网络可以描述得线性区域的数量是:

O(\begin{pmatrix} n\\ d \end{pmatrix} ^{d(l-1)} d^d)
O(\begin{pmatrix} n\\ d \end{pmatrix} ^{d(l-1)} d^d)

意味着这是深度l的指数级。在每个单元具有k个过滤器的maxout网络中,线性区域的数量是:

O(k^{(l-1)+d})
O(k^{(l-1)+d})

选择深度模型默许了一个非常普遍的信念,那就我我想要学得的函数应该涉及几个更加简单的函数的组合。

其他架构上的考虑

架构设计考虑的另一个关键点是如何将层与层之间联系起来。默认的升级网络层采用矩阵W描述得线性变换,每个输出单元连接到每个输出单元。

反向传播和其他微分算法

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

以下算法给出了前向传播,将单数映射到与单个训练样本相关的监督损失函数

L(\hat{y},y)
L(\hat{y},y)

Require: 网络深度;

Require:

W^{(i)},i\in \{1,...,l\}
W^{(i)},i\in \{1,...,l\}

,模型权重矩阵

Require:

b^{(i)},i \in \{1,...,l\}
b^{(i)},i \in \{1,...,l\}

,模型的偏置参数

Require:x,程序的输入,y,目标输出

h^{(0)}=x
h^{(0)}=x

   for k=1,...,l do

a^{(k)}=b^{(k)}+W^{(k)}h^{(k-1)}
a^{(k)}=b^{(k)}+W^{(k)}h^{(k-1)}
h^{(k)}=f(a^{(k)})
h^{(k)}=f(a^{(k)})

    end for

\hat{y}=h^{(l)}
\hat{y}=h^{(l)}
J=L(\hat{y},y)+\lambda \Omega(\theta)
J=L(\hat{y},y)+\lambda \Omega(\theta)

下面的算法说明了反向传播应用的相关计算:

在前向计算完成后,计算顶层的梯度

g\leftarrow \nabla_{\hat{y}}J=\nabla _{\hat{y}}L(\hat{y},y)
g\leftarrow \nabla_{\hat{y}}J=\nabla _{\hat{y}}L(\hat{y},y)

for k=l,l-1,...,1 do

    将关于层输出的梯度转换为非线性激活输入前的梯度(如果f是逐元素的,则逐元素地相乘)

g\leftarrow \nabla_{a^{(k)}}J=g \odot f'(a^{(k)})
g\leftarrow \nabla_{a^{(k)}}J=g \odot f'(a^{(k)})

    计算关于权重和偏置的梯度(如果需要的话,还包括正则项)

\nabla_{b^{(k)}}J=g+\lambda\nabla_{b^{(k)}}\Omega(\theta)
\nabla_{b^{(k)}}J=g+\lambda\nabla_{b^{(k)}}\Omega(\theta)
\nabla_{W^{(k)}}J=gh^{(k-1)T}+\lambda\nabla_{W^{(k)}}\Omega(\theta)
\nabla_{W^{(k)}}J=gh^{(k-1)T}+\lambda\nabla_{W^{(k)}}\Omega(\theta)

    关于下一更低层的隐藏层传播梯度

g\leftarrow \nabla_{h{(k-1)}}=W^{(k)T}g
g\leftarrow \nabla_{h{(k-1)}}=W^{(k)T}g

end for   

参考

  1. 《深度学习》
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年08月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于梯度的学习
    • 代价函数
      • 使用最大似然学习条件分布
      • 学习条件统计量
    • 输出单元
      • 用于高斯输出分布的线性单元
      • 用于Bernoulli输出分数的Sigmoid单元
      • 用于Multinoulli输出分布的softmax单元
      • 其他的输出类型
  • 隐藏单元
    • 整流线性单元及其扩展
      • logistic sigmoid与双曲正切函数
        • 其他隐藏单元
        • 架构设计
          • 万能近似性质和深度
            • 其他架构上的考虑
            • 反向传播和其他微分算法
              • 全连接MLP中的反向传播计算
              • 参考
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档