6. 深度前馈网络
6.0 序言
前馈网络
- 目标:近似某个函数 f ∗ f^{*} f∗
- 组成模块:输入层、隐藏层、输出层
- 模型输出和模型本身之间没有反馈连接
产生背景
传统的线性模型如逻辑回归、线性回归的表达能力有限。为了扩展线性模型来表示
x
x
x的非线性函数,我们可以不把线性函数直接作用在
x
x
x本身,而是作用到
x
x
x的非线性函数
ϕ
(
x
)
\phi(x)
ϕ(x)上。我们可以认为
ϕ
\phi
ϕ代表了
x
x
x的一系列特征。为了找到映射
ϕ
\phi
ϕ,有三种方式:
- 选择一个通用的 ϕ \phi ϕ,如无线维的 ϕ \phi ϕ,它隐含地用在基于RBF核的核机器上。如果 ϕ ( x ) \phi(x) ϕ(x)具有足够高的维度,训练集容易拟合,但是测试集泛化不太容易。
- 手动设计 ϕ \phi ϕ。寻找困难,不容易迁移。
- 主动学习 ϕ \phi ϕ(深度学习要干的事情)。放弃训练问题的凸性。
深度学习要干的事情
首先我们定义一个模型
y
=
f
(
x
;
θ
,
ω
)
=
ϕ
(
x
)
T
ω
y=f(x;\theta, \omega)=\phi(x)^T\omega
y=f(x;θ,ω)=ϕ(x)Tω。在这个模型中,我们有两种参数需要学习。一种是
ϕ
\phi
ϕ,相当于一个隐藏层;另一种是
ϕ
\phi
ϕ,用于控制模型输出。
6.1 实例:学习XOR
样本空间:
{
(
0
,
0
∣
0
)
,
(
0
,
1
∣
1
)
,
(
1
,
0
∣
1
)
,
(
1
,
1
∣
0
)
}
\{(0,0|0),(0,1|1),(1,0|1),(1,1|0)\}
{(0,0∣0),(0,1∣1),(1,0∣1),(1,1∣0)}
目标函数:
f
∗
(
0
,
0
)
=
0
,
f
∗
(
0
,
1
)
=
1
,
f
∗
(
1
,
0
)
=
1
,
f
∗
(
1
,
1
)
=
0
f^*(0,0)=0,f^*(0,1)=1,f^*(1,0)=1,f^*(1,1)=0
f∗(0,0)=0,f∗(0,1)=1,f∗(1,0)=1,f∗(1,1)=0
模型函数:
f
(
x
;
θ
)
f(x;\theta)
f(x;θ),通过不断学习
θ
\theta
θ来靠近
f
∗
f^*
f∗
在学习中我们能够确定整个样本空间,因此神经网络的目的是拟合训练集,不用考虑过拟合的问题。
评价指标:使用
M
S
E
MSE
MSE。
J
(
θ
)
=
1
4
∑
x
∈
X
(
f
∗
(
x
)
−
f
(
x
;
θ
)
)
2
J(\theta)=\frac{1}{4}\sum_{x \in X}(f^*(x)-f(x;\theta))^2
J(θ)=41∑x∈X(f∗(x)−f(x;θ))2
现在我们必须选择模型 f ( x ; θ ) f(x;\theta) f(x;θ)的形式。如果选用线性模型,无法拟合样本空间。因此需要选用一个非线性模型。如: R E L U RELU RELU。 R E L U RELU RELU是具有两个线性部分的分段函数,它保留了线性模型易于使用梯度进行优化的属性(求导简单)。
6.2 基于梯度的学习
目前我们看到的线性模型和神经网络的最大区别是神经网络的非线性导致大多数我们感兴趣的代价函数都变得非凸。
凸优化可以保证全局收敛,无论初始值在哪里,算法最后总会收敛;用于解决非凸问题的随机梯度下降无法保证算法全局收敛,而且对初始值十分敏感。
6.2.1 代价函数
- 参数模型定义了一个分布
p
(
y
∣
x
;
θ
)
p(y|x;\theta)
p(y∣x;θ)
使用参数模型和训练数据之间的交叉熵(负对数似然)作为代价函数
J ( θ ) = − E x , y ∼ p d a t a l o g p m o d e l ( y ∣ x ) J(\theta)=-E_{x,y_\sim p_{data}}log p_{model}(y|x) J(θ)=−Ex,y∼pdatalogpmodel(y∣x) - 学习条件统计量
例如:我们可能有一个预测期 f ( x ; θ ) f(x;\theta) f(x;θ),用它来预测 y y y的均值。我们可以把代价函数看成一个泛函,而不仅仅是选择一组函数。可以设计代价泛函在我们想要的某些特殊函数处取得最小值。问题的求解需要用到变分法,下面是两个结果:
第一个结果是解优化问题:
f
∗
=
a
r
g
m
i
n
f
E
x
,
y
∼
p
d
a
t
a
∣
∣
y
−
f
(
x
)
∣
∣
2
f^* = argmin_fE_{x,y \sim p_{data}}||y-f(x)||^2
f∗=argminfEx,y∼pdata∣∣y−f(x)∣∣2
得到
f
∗
(
x
)
=
E
x
,
y
∼
p
d
a
t
a
(
y
∣
x
)
[
y
]
f^*(x)=E_{x,y \sim p_{data}(y|x)}[y]
f∗(x)=Ex,y∼pdata(y∣x)[y]
如果我们能够用无穷多的、来源于真实的数据生成分布的样本进行训练,最小化均方误差代价函数将得到一个函数,对于每一个
x
x
x预测出
y
y
y 的均值。
第二个结果:
f
∗
=
a
r
g
m
i
n
f
E
x
,
y
∼
p
d
a
t
a
∣
∣
y
−
f
(
x
)
∣
∣
1
f^*=argmin_f E_{x,y \sim p_{data}}||y-f(x)||_1
f∗=argminfEx,y∼pdata∣∣y−f(x)∣∣1
对于每一个
x
x
x预测出
y
y
y的中位数。这个代价函数通常称为平均绝对误差。
一些饱和的输出单元结合这些代价函数时会产生非常小的梯度,使得交叉熵误差更加受到欢迎。
l o g log log函数不会产生过小的梯度,二次函数在最小值附近梯度会变得非常小,学习过程很缓慢。
6.2.2 输出单元
- 用于高斯输出分布的线性单元
给定特征 h h h,线性输出单元层产生一个向量 y ^ = W T h + b \hat{y}=W^Th+b y^=WTh+b。
关于正态分布的资料: https://zhuanlan.zhihu.com/p/26504917
线性输出层常用来产生条件高斯分布的均值:
p
(
y
∣
x
)
=
N
(
y
;
y
^
,
I
)
p(y|x)=N(y;\hat{y},I)
p(y∣x)=N(y;y^,I)
最大化其对数似然等价于最小化均方误差。
- 用于
Bernoulli
分布的sigmoid
单元
给定特征 h h h,sigmoid
输出单元为 y ^ = σ ( w T h + b ) \hat{y}=\sigma(w^Th+b) y^=σ(wTh+b),其中令 z = w T h + b z=w^Th+b z=wTh+b。
假定非归一化的对数概率对 y y y和 z z z是线性的,则:
l o g P ( y ) ^ = y z log\hat{P(y)}=yz logP(y)^=yz, P ( y ) ^ = e x p ( y z ) \hat{P(y)}=exp(yz) P(y)^=exp(yz), P ( y ) = e x p ( y z ) ∑ y ′ = 0 1 e x p ( y ′ z ) P(y)=\frac{exp(yz)}{\sum_{y'=0}^{1}exp{(y'z)}} P(y)=∑y′=01exp(y′z)exp(yz), P ( y ) = σ ( ( 2 y − 1 ) z ) P(y)=\sigma((2y-1)z) P(y)=σ((2y−1)z)。 z z z被称为分对数( l o g i t logit logit)。
这种在对数空间里预测概率的方法可以很自然地使用最大似然学习。因为最大似然函数的代价函数是 − l o g P ( y ∣ x ) -logP(y|x) −logP(y∣x),代价函数中的 l o g log log抵消了 s i g m o i d sigmoid sigmoid里面的 e x p exp exp。如果没有这个效果,sigmoid
的饱和性会阻止基于梯度的学习做出更好地改进。
输出为sigmoid
时,损失函数变为:
J ( θ ) = − l o g P ( y ∣ x ) = − l o g σ ( ( 2 y − 1 ) z ) J(\theta)=-logP(y|x)=-log\sigma((2y-1)z) J(θ)=−logP(y∣x)=−logσ((2y−1)z)
y = 1 y=1 y=1时, J ( θ ) = − l o g σ ( z ) = l o g ( 1 + e x p ( − z ) ) J(\theta)=-log\sigma(z)=log(1+exp(-z)) J(θ)=−logσ(z)=log(1+exp(−z))
y = 0 y=0 y=0时, J ( θ ) = − l o g σ ( − z ) = l o g ( 1 + e x p ( z ) ) J(\theta)=-log\sigma(-z)=log(1+exp(z)) J(θ)=−logσ(−z)=log(1+exp(z))
当 y y y取0时, z z z取值应该趋向于小于0,当 z > 0 z>0 z>0时, J ′ ( θ ) = e x p ( z ) 1 + e x p ( z ) > 0 J'(\theta)=\frac{exp(z)}{1+exp(z)}>0 J′(θ)=1+exp(z)exp(z)>0,梯度下降算法会使 z z z值减小,将 z z z拉回正确的方向。尤其当 ∣ z ∣ |z| ∣z∣趋向于无穷大时, J ′ ( θ ) = s i g n ( z ) J'(\theta)=sign(z) J′(θ)=sign(z),此时梯度绝对值最大,完全不会收缩。 M S E MSE MSE在这种情况下就会发生饱和。
例如:当 y = 1 y=1 y=1时, M S E = ( 1 − 1 1 + e x p ( − z ) ) 2 MSE=(1-\frac{1}{1+exp(-z)})^2 MSE=(1−1+exp(−z)1)2, M S E ′ = − 2 e x p ( z ) ( e x p ( z ) + 1 ) 3 MSE'=-2\frac{exp(z)}{(exp(z)+1)^3} MSE′=−2(exp(z)+1)3exp(z), ∣ z ∣ |z| ∣z∣趋向于无穷大时, M S E ′ = 0 MSE'=0 MSE′=0,此时代价函数饱和,模型很难训练。 - 用于
Multinoulli
输出分布的softmax
单元
softmax
最常用作分类器的输出,来表示 n n n个不同类上的概率分布。比较少见的是,softmax
可以在函数内部使用。
在二分类情况下,我们希望计算一个单独的数 y ^ = P ( y = 1 ∣ x ) \hat{y}=P(y=1|x) y^=P(y=1∣x),因为这个数需要在0和1之间,并且我们想要让这个数的对数可以很好地用于对数似然的基于梯度的优化,因而我们选择去预测另外一个数 z = l o g P ^ ( y = 1 ∣ x ) z=log\hat{P}(y=1|x) z=logP^(y=1∣x)。对其指数化和归一化,就得到了一个由sigmoid
函数控制的Bernoulli
分布。
现在对其推广,我们假设现在 z z z是一个向量且 z = W T h + b z=W^Th+b z=WTh+b,其中 z i = l o g P ^ ( y = i ∣ x ) z_i=log\hat{P}(y=i|x) zi=logP^(y=i∣x)。softmax
可以对 z z z指数化和归一化获取 y ^ \hat{y} y^。最终 s o f t m a x softmax softmax的形式为
s o f t m a x ( z ) i = e x p ( z i ) ∑ i e x p ( z j ) softmax(z)_i=\frac{exp(z_i)}{\sum_iexp(z_j)} softmax(z)i=∑iexp(zj)exp(zi)
l
o
g
s
o
f
t
m
a
x
(
z
)
i
=
z
i
−
l
o
g
∑
j
e
x
p
(
z
j
)
log softmax(z)_i=z_i-log\sum_jexp(z_j)
logsoftmax(z)i=zi−log∑jexp(zj)。对于第一项输入
z
i
z_i
zi对代价函数有直接贡献,因为这一项不会饱和,所以即使
z
i
z_i
zi对第二项贡献很小,学习仍然可以进行。对于第二项可以近似为
m
a
x
j
z
j
max_j z_j
maxjzj,我们能从这种近似得到的直觉是,负对数似然代价函数总是强烈地惩罚最活跃的不正确预测。
像sigmoid
函数一样,softmax
函数也会饱和。当softmax
函数饱和时许多基于softmax
的代价函数也会饱和,除非它们能够转化饱和的激活函数。
softmax
满足性质
s
o
f
t
m
a
x
(
z
)
=
s
o
f
t
m
a
x
(
z
+
c
)
softmax(\mathbf{z})=softmax(\mathbf{z}+c)
softmax(z)=softmax(z+c),使用这个性质,我们可以得到softmax
的数值稳定的一个变体:
s
o
f
t
m
a
x
(
z
)
=
s
o
f
t
m
a
x
(
z
−
m
a
x
i
z
i
)
softmax(\mathbf{z})=softmax(\mathbf{z}-max_{i}z_i)
softmax(z)=softmax(z−maxizi)
当z等于一个常数c时,c是很大的正数时容易出现上溢,c是很小的负数时,容易出现下溢
上溢:当大量级的数被近似为 ∞ \infty ∞或 − ∞ -\infty −∞时发生上溢
下溢:当接近0的数被四舍五入为0时发生下溢
- 其他输出类型
之前描述的线性、sigmoid
和softmax
输出单元是最常见的。神经网络可以推广到我们希望的几乎任何种类的输出层。最大似然原则给如何为几乎任何种类的输出层设计一个好的代价函数提供了指导。
一般而言,如果我们定义了一个条件分布 p ( y ∣ x ; θ ) p(y|x;\theta) p(y∣x;θ),最大似然原则建议我们使用 − l o g p ( y ∣ x ; θ ) -logp(y|x;\theta) −logp(y∣x;θ)作为代价函数。
6.3 隐藏单元
大多数隐藏单元都可以描述为接受输入向量 x \mathbf{x} x,经过一个仿射变换 z = W T x + b \mathbf{z}=\mathbf{W}^T\mathbf{x}+\mathbf{b} z=WTx+b,然后使用一个逐元素的非线性函数 g ( z ) g(\mathbf{z}) g(z)。大多数隐藏单元仅仅只是在 g ( z ) g(\mathbf{z}) g(z)上有区别。
6.3.1 整流线性单元及其扩展
激活函数
g
(
z
)
=
m
a
x
{
0
,
z
}
g(z)=max\{0,z\}
g(z)=max{0,z}。可以在初始化时将
b
\mathbf{b}
b设置成一个小的正值,这使得整流线性单元很可能初始时就对大多数输入呈现激活状态,并允许导数通过。
整流线性单元一个缺陷是它们不能通过基于梯度的方法学习那些使它们激活为零的样本。因此产生了若干扩展。
整流线性单元的三个扩展基于当
z
i
<
0
z_i<0
zi<0时使用一个非零的斜率
α
i
\alpha_i
αi:
h
i
=
g
(
z
,
α
)
i
=
m
a
x
(
0
,
z
i
)
+
α
i
m
i
n
(
0
,
z
i
)
h_i=g(z,\mathbf{\alpha})_i=max(0,z_i)+\alpha_imin(0,z_i)
hi=g(z,α)i=max(0,zi)+αimin(0,zi)。
- 绝对值整流
固定 α i = 1 \alpha_i=1 αi=1来得到 g ( z ) = ∣ z ∣ g(z)=|z| g(z)=∣z∣。它用于图像中的对象识别,其中寻找在输入照明极性反转下不变的特征是有意义的。其它两个应用更加广泛。 - 渗漏整流线性单元(
Leaky RELU
)
将 α i \alpha_i αi固定成一个类似0.01的小值。 - 参数化整流线性单元(
PReLU
)
将 α i \alpha_i αi作为一个学习的参数。
m
a
x
o
u
t
\mathbf{maxout}
maxout单元将
z
\mathbf{z}
z划分为每组具有k个值得组,而不是使用作用于每个元素的函数
g
(
z
)
g(z)
g(z),每个
m
a
x
o
u
t
maxout
maxout单元输出每组的最大元素:
g
(
z
)
i
=
m
a
x
j
∈
G
(
i
)
z
j
g(z)_i=max_{j \in G^{(i)}}z_j
g(z)i=maxj∈G(i)zj
这里
G
(
i
)
G^{(i)}
G(i)是组
i
i
i的输入索引集
{
(
i
−
1
)
k
,
.
.
.
,
i
k
}
\{(i-1)k,...,ik\}
{(i−1)k,...,ik}。这提供了一种方法来学习对输入
x
x
x空间中多个方向响应的分段函数。
m
a
x
o
u
t
maxout
maxout可以学习多达k段的分段线性凸函数。maxout单元因此可以视为学习激活函数本身。使用足够大的k,maxout单元可以以任意的精确度来近似任何凸函数。
每个maxout单元现在由k个权重向量来参数化,而不是一个,所以maxout单元通常比整流线性单元需要更多的正则化。如果训练集合很大且每个单元的块数保持很低的话,它们可以在没有正则化的情况下工作的不错。
6.3.2 sigmoid
函数和tanh
函数
sigmoid
函数
g
(
z
)
=
σ
(
z
)
g(z)=\sigma(z)
g(z)=σ(z)
tanh
函数
g
(
z
)
=
2
σ
(
2
z
)
−
1
g(z)=2\sigma(2z)-1
g(z)=2σ(2z)−1
sigmoid
函数在定义域的大部分区域都饱和,使得训练十分的困难。当要使用sigmoid
函数时,tanh
是一个更好的选择。
t
a
n
h
(
0
)
=
0
tanh(0)=0
tanh(0)=0,而且tanh
在0处导数为1,使得在网络的激活很小时,训练深层神经网络
y
^
=
w
T
t
a
n
h
(
U
T
t
a
n
h
(
V
T
x
)
)
\hat{y}=\mathbf{w}^Ttanh(\mathbf{U}^Ttanh(\mathbf{V}^T\mathbf{x}))
y^=wTtanh(UTtanh(VTx))类似于训练一个线性模型
y
^
=
w
T
U
T
V
T
x
\hat{y}=\mathbf{w}^T\mathbf{U}^T\mathbf{V}^T\mathbf{x}
y^=wTUTVTx。
sigmoid
激活函数在除了前馈网络以外的场景中更为常见。循环网络、许多概率模型以及一些自编码器有一些额外的要求使得它们不能使用分段线性激活函数,并且使得sigmoid
单元更具有吸引力,尽管它存在饱和性问题。
6.3.3 其他隐藏单元
- 径向基函数(
RBF
)
h i = e x p ( − 1 σ i 2 ∣ ∣ W : , i − x ∣ ∣ 2 ) h_i=exp(-\frac{1}{\sigma_i^2}||\mathbf{W}_{:,i}-x||^2) hi=exp(−σi21∣∣W:,i−x∣∣2)
这个函数在 x x x接近模板 W : , i \mathbf{W}_{:,i} W:,i时更加活跃。因为它对大部分 x x x都饱和为0,因此很难进行优化。
softplus
函数
g ( a ) = l o g ( 1 + e a ) g(a)=log(1+e^a) g(a)=log(1+ea)。这是整流线性单元的平滑版本。通常不鼓励使用这个函数。- 硬双曲正切函数
它的形状和tanh
以及整流线性单元类似,但是不同于后者,它是有界的, g ( a ) = m a x ( − 1 , m i n ( 1 , a ) ) g(a)=max(-1,min(1,a)) g(a)=max(−1,min(1,a))。
隐藏单元的设计仍然是一个活跃的研究领域,许多有用的隐藏单元类型仍有待发现。
6.4 架构设计
大多数神经网络被组织成称为层的单元组。大多数神经网络架构将这些层布置成链式结构,其中每一层都是前一层的函数。在这种结构中,第一层由下面给出:
h
(
1
)
=
g
(
1
)
(
W
(
1
)
T
x
+
b
(
1
)
)
h^{(1)}=g^{(1)}(W^{(1)T}x+b^{(1)})
h(1)=g(1)(W(1)Tx+b(1))
第二层由
h
(
2
)
=
g
(
2
)
(
W
(
2
)
T
h
(
1
)
+
b
(
2
)
)
h^{(2)}=g^{(2)}(W^{(2)T}h^{(1)}+b^{(2)})
h(2)=g(2)(W(2)Th(1)+b(2))
给出,以此类推。
在这些链式架构中,主要的架构考虑是选择网络的深度和每一层的宽度。我们将会看到,即使只有一个隐藏层的网络也足够适应训练集。更深层的网络通畅能够对每一层使用更少的单元数和更少的参数,并且经常容易泛化到测试集,但是通常也难以进行优化。理想的网络架构必须通过实验,观测在验证集上的误差来找到。
6.4.1万能近似性质和深度
万能近似定理表明,一个前馈神经网络如果具有线性输出层和至少一层具有任何一种“挤压”性质的激活函数的隐藏层,只要给与网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的Borel
可测函数。前馈网络的导数也可以任意好地近似函数的导数。
定义在 R n R^n Rn的有界闭集上的任意连续函数是
Borel
可测的,因此可以用神经网络来近似。神经网络也可以近似从任意有限维离散空间映射到另一个任意函数。
万能近似定理意味着无论我们试图学习什么函数,我们知道一个大的MLP
一定能够表示这个函数。然而,我们无法保证训练算法能够学习到这个函数。尽管MLP
能够表示该函数,学习也可能因为两个不同的原因而失败。
- 用于优化的算法可能找不到用于期望函数的参数值
- 训练算法过拟合
“免费午餐定理”说明没有普遍优越的机器学习算法。前馈网络提供了表示函数的万能系统,但不存在万能过程既能验证训练集上的特殊样本,又能够选择一个函数来扩展的训练集上没有的点。
具有d
个输入、深度为l
、每个隐藏层具有n
个单元的深度整流网络可以描述的线性区域的数量是
O
(
(
n
m
)
d
(
l
−
1
)
n
d
)
O(\tbinom{n}{m}^{d(l-1)}n^d)
O((mn)d(l−1)nd)
意味着,这是深度l
的指数级。在每个单元具有k
个过滤器的maxout
网络中,线性区域的数量是
O
(
k
(
l
−
1
)
+
d
)
O(k^{(l-1)+d})
O(k(l−1)+d)
任何时候,当选择一个特定的机器学习算法时,我们隐含地陈述了一些先验,这些先验是关于算法应该学得什么样的函数。选择深度模型默许了一个非常普遍的信念,那就是我们想要学得的函数应该涉及几个更加简单的函数的组合。