深度前馈网络
1、概述
深度前馈网络(Deep Feedforward Networks)也叫做前馈神经网络或者多层感知机(MLP)。前馈神经网络克服了线性模型的局限性。线性模型,例如逻辑回归和线性回归,虽然能通过闭式解或者凸优化达到高效且可靠地拟合,但也有明显的缺陷,那就是该模型的能力被局限在线性函数中,无法理解任何两个输入变量的相互作用。神经网络引入非线性变换,将原始输入进行非线性变换的基础上再进行学习。
下面我们以一个简单的例子开始。
2、简单实例:学习XOR
本实例的学习任务是学习XOR函数,即二进制运算中异或操作。XOR函数提供了我们要学习的目标函数 y = f ∗ ( x ) y=f^*(\boldsymbol{x}) y=f∗(x)。我们的模型给出一个函数 y = f ( x ; θ ) y=f(\boldsymbol{x;\theta}) y=f(x;θ),并且我们的学习算法会不断调整参数 θ \boldsymbol{\theta} θ使得 f f f尽可能地接近 f ∗ f^* f∗。
在本例中我们不考虑统计泛化而只是能够在四个点上表现正确,
X
=
{
[
0
0
]
T
,
[
0
1
]
T
,
[
1
0
]
T
,
[
1
1
]
T
}
\mathbb{X}=\{\begin{bmatrix} 0 & 0 \end{bmatrix}^T,\begin{bmatrix} 0 & 1 \end{bmatrix}^T,\begin{bmatrix} 1 & 0 \end{bmatrix}^T,\begin{bmatrix} 1 & 1 \end{bmatrix}^T\}
X={[00]T,[01]T,[10]T,[11]T}。
这个问题可以被当作回归问题(regression),我们使用均方误差(MSE)损失函数。注意,选择MSE只是为了简化本例的数学计算,对于二进制数据的建模,MSE并不是合适的代价函数。MSE损失函数为
J
(
θ
)
=
1
4
∑
x
∈
X
(
f
∗
(
x
)
−
f
(
x
;
θ
)
)
2
J(\boldsymbol{\theta})=\frac{1}{4}\displaystyle\sum_{\boldsymbol{x}\in\mathbb{X}}(f^*(\boldsymbol{x})-f(\boldsymbol{x;\theta}))^2
J(θ)=41x∈X∑(f∗(x)−f(x;θ))2
假设我们选择线性模型,并且参数
θ
\boldsymbol{\theta}
θ由
ω
\boldsymbol{\omega}
ω 和
b
b
b 组成。则模型定义为,
f
(
x
;
ω
,
b
)
=
x
T
ω
+
b
f(\boldsymbol{x;\omega},b)=\boldsymbol{x}^T\boldsymbol{\omega}+b
f(x;ω,b)=xTω+b
我们能以闭式解的形式针对
ω
\boldsymbol{\omega}
ω 和
b
b
b来最小化
J
(
θ
)
J(\boldsymbol{\theta})
J(θ),可以得到
ω
=
0
\boldsymbol{\omega}=\boldsymbol{0}
ω=0、
b
=
1
2
b=\frac{1}{2}
b=21。即该线性模型在每一个点都输出
0.5
0.5
0.5。通过下图来描述此问题原因以及问题解决办法,
左图即为原始输入空间,已知线性模型关于某变量的变化率固定,但由XOR函数特性可知,在
x
1
=
0
x_1=0
x1=0处,模型输出随着
x
2
x_2
x2增加而增加,在
x
1
=
1
x_1=1
x1=1处,反而随着
x
2
x_2
x2增加而减少。所以针对原始输入的线性模型无法解决XOR问题。
右图为由神经网络提出的特征表示的变化空间。该变换空间中,有输出为1的两个点折叠到了该空间的单个点上,即非线性特征使得
x
=
[
1
,
0
]
T
\boldsymbol{x}=[1,0]^T
x=[1,0]T和
x
=
[
0
,
1
]
T
\boldsymbol{x}=[0,1]^T
x=[0,1]T映射到了
h
=
[
1
,
0
]
T
\boldsymbol{h}=[1,0]^T
h=[1,0]T。针对h空间可得到线性模型,且该模型可描述为在
h
1
h_1
h1中增大,在
h
2
h_2
h2中减小。
这里我们引入了一个非常简单的前馈神经网络,
该前馈神经网络有一个包含两个隐藏单元的向量
h
=
f
(
1
)
(
x
;
W
,
c
)
\boldsymbol{h}=f^{(1)}(\boldsymbol{x;W,c})
h=f(1)(x;W,c),隐藏单元的数值之后作为第二层的输入,在这里是输出层。输出层依然是一个线性回归模型,但该模型是应用于
h
\boldsymbol{h}
h而不是
x
\boldsymbol{x}
x,即
y
=
f
(
2
)
(
h
;
ω
,
b
)
y=f^{(2)}(\boldsymbol{h;\omega},b)
y=f(2)(h;ω,b)。最终得到一个完整模型,
f
(
x
;
W
,
c
,
ω
,
b
)
=
f
(
2
)
(
f
(
1
)
(
x
)
)
f(\boldsymbol{x;W,c,\omega},b)=f^{(2)}(f^{(1)(\boldsymbol{x})})
f(x;W,c,ω,b)=f(2)(f(1)(x))
这里,
f
(
1
)
f^{(1)}
f(1)必须是非线性模型,否则整个前馈网络依然是线性模型。大多数神经网络通过结合由学习参数控制的仿射变换和一个名为激活函数的固定非线性变换来做到这一点,即
h
=
g
(
W
T
x
+
c
)
\boldsymbol{h}=g(\boldsymbol{W}^T\boldsymbol{x+c})
h=g(WTx+c),其中
W
\boldsymbol{W}
W为线性变换的权重,
c
\boldsymbol{c}
c为偏置向量。激活函数通常是对每个元素分别起作用,即
h
i
=
g
(
x
T
W
:
i
+
c
i
)
h_i=g(\boldsymbol{x}^T\boldsymbol{W}_{:i}+c_i)
hi=g(xTW:i+ci)。现代神经网络默认的推荐是由激活函数
g
(
z
)
=
m
a
x
{
0
,
z
}
g(z)=max\{0,z\}
g(z)=max{0,z}定义的整流线性单元(rectified linear unit)。
现在,我们可以定义完整网络为
f
(
x
;
W
,
c
,
ω
,
b
)
=
ω
T
m
a
x
{
0
,
W
T
x
+
c
}
+
b
f(\boldsymbol{x;W,c,\omega},b)=\boldsymbol{\omega}^Tmax\{0, \boldsymbol{W}^T\boldsymbol{x+c}\}+b
f(x;W,c,ω,b)=ωTmax{0,WTx+c}+b接下来,我们直接给出XOR问题的一个解,令
W
=
[
1
1
1
1
]
\boldsymbol{W}=\begin{bmatrix} 1&1 \\ 1&1 \end{bmatrix}
W=[1111]
c
=
[
0
−
1
]
\boldsymbol{c}=\begin{bmatrix} 0 \\ -1 \end{bmatrix}
c=[0−1]
ω
=
[
1
−
2
]
\boldsymbol{\omega}=\begin{bmatrix} 1 \\ -2 \end{bmatrix}
ω=[1−2]
b
=
0
b=0
b=0现在,我们来了解这个模型如何处理一批输入。将数据集写为矩阵形式且每行一个样本:
X
=
[
0
0
0
1
1
0
1
1
]
\boldsymbol{X}=\begin{bmatrix} 0&0 \\ 0&1 \\ 1&0 \\ 1&1 \end{bmatrix}
X=⎣⎢⎢⎡00110101⎦⎥⎥⎤首先,这个输入矩阵乘以第一层的权重矩阵:
X
W
=
[
0
0
1
1
1
1
2
2
]
\boldsymbol{XW}=\begin{bmatrix} 0&0 \\ 1&1 \\ 1&1 \\ 2&2 \end{bmatrix}
XW=⎣⎢⎢⎡01120112⎦⎥⎥⎤接下来,加上偏置向量
c
\boldsymbol{c}
c,得到
[
0
−
1
1
0
1
0
2
1
]
\begin{bmatrix} 0&-1 \\ 1&0 \\ 1&0 \\ 2&1 \end{bmatrix}
⎣⎢⎢⎡0112−1001⎦⎥⎥⎤此时,变换后的样本都位于一条斜率为1的直线上。当我们沿着这条线运动时,输出值需要由0上升到1,再由1下降到0,这是线性模型做不到的。为了计算每个样本的
h
\boldsymbol{h}
h,我们应用整流形变换:
[
0
0
1
0
1
0
2
1
]
\begin{bmatrix} 0&0 \\ 1&0 \\ 1&0 \\ 2&1 \end{bmatrix}
⎣⎢⎢⎡01120001⎦⎥⎥⎤现在样本不再位于一条线上,即将样本转换到了
h
\boldsymbol{h}
h空间,我们可以在这个空间利用线性模型解决问题。
最后,我们乘以权重向量
ω
\boldsymbol{\omega}
ω得到样本的正确输出:
[
0
1
1
0
]
\begin{bmatrix} 0 \\ 1 \\ 1 \\ 0 \end{bmatrix}
⎣⎢⎢⎡0110⎦⎥⎥⎤本例中,我们直接指出解决方案。但现实中往往有数十亿的参数和数十亿的训练样本,则使用基于梯度的优化算法来找到一些参数。
总结,前馈神经网络模型两个关键字前馈与网络含义:
- 前馈:信息流过 x \boldsymbol{x} x的函数,流经用于定义 f f f的中间计算过程,最终到达输出 y \boldsymbol{y} y。在模型输出与模型之间没有反馈连接,当前馈神经网络被扩展为包含反馈连接时被称为循环神经网络(recurrent nural network)。
- 网络:模型通常由多个不同函数复合而成。通常每一层对应一个函数,例如 f ( x ) = f ( 3 ) ( f 2 ( f ( 1 ) ( x ) ) ) f(\boldsymbol{x})=f^{(3)}(f^{2}(f^{(1)}(\boldsymbol{x}))) f(x)=f(3)(f2(f(1)(x))), f ( 1 ) 、 f ( 2 ) 、 f ( 3 ) f^{(1)}、f^{(2)}、f^{(3)} f(1)、f(2)、f(3)分别对应第一、二、三层,其中第一层为输入层,最后一层为输出层,其他层为隐藏层。
3、基于梯度的学习
线性模型与神经网络之间的最大区别是神经网络的非线性导致大多数损失函数变得非凸。这也导致了另一个区别,训练线性模型的线性方程求解器,或者用于逻辑回归或SVM的凸优化算法能够全局收敛;而神经网络的训练通常使用迭代的、基于梯度的优化,仅使得代价函数达到一个非常小的值。针对非凸损失函数,我们使用随机梯度下降算法。
设计和训练神经网络和使用梯度下降训练其他机器学习模型并没有太大不同,机器学习算法通过指定一个优化过程、代价函数和一个模型族来构建。
3.1、代价函数
在大多数情况下,我们的参数模型定义一个分布 p ( y ∣ x ; θ ) p(\boldsymbol{y}|\boldsymbol{x;\theta}) p(y∣x;θ)并且我们简单使用最大似然原理。这意味着我们使用训练数据和模型预测之间的交叉熵作为代价函数。有时也会采取一个比预测 y \boldsymbol{y} y的完整概率分布更简单的方法,即我们仅仅预测在给定 x \boldsymbol{x} x的条件下, y \boldsymbol{y} y的某种统计量。专门的损失函数可以训练这些估计量的预测器。
用于训练神经网络的完整代价函数,通常这里描述的基本代价函数再加上一个正则化项,可参考正则化应用到线性模型的简单例子以及用于神经网络的更高级的正则化策略。
3.1.1、使用最大似然学习条件分布
大多数现代神经网络使用最大似然来训练,则代价函数就是负的对数似然,它与训练数据和模型分布间的交叉熵等价。代价函数为
J
(
θ
)
=
−
E
x
,
y
∼
p
^
d
a
t
a
l
o
g
p
m
o
d
e
l
(
y
∣
x
)
J(\boldsymbol{\theta})=-\mathbb{E}_{\boldsymbol{x,y}\thicksim{_p^\text{\textasciicircum}}_{data}}log\,p_{model}(\boldsymbol{y|x})
J(θ)=−Ex,y∼p^datalogpmodel(y∣x)代价函数的形式取决于
l
o
g
p
m
o
d
e
l
log\,p_{model}
logpmodel的具体形式。例如,令
p
m
o
d
e
l
(
y
∣
x
=
N
(
y
;
f
(
x
;
θ
)
,
I
)
)
p_{model}(\boldsymbol{y|x=\mathcal{N}}(\boldsymbol{y};f(\boldsymbol{x;\theta}),\boldsymbol{I}))
pmodel(y∣x=N(y;f(x;θ),I)),则代价函数恢复为均方误差函数,
J
(
θ
)
=
1
2
E
x
,
y
∼
p
^
d
a
t
a
∥
y
−
f
(
x
;
θ
)
∥
2
+
c
o
n
s
t
J(\boldsymbol{\theta})=\frac{1}{2}\mathbb{E}_{\boldsymbol{x,y}\thicksim{_p^\text{\textasciicircum}}_{data}}\text{\textbardbl}\boldsymbol{y}-f(\boldsymbol{x;\theta})\text{\textbardbl}^2+const
J(θ)=21Ex,y∼p^data∥y−f(x;θ)∥2+const至少系数
1
2
\frac{1}{2}
21和常数项不依赖于参数
θ
\theta
θ,可以舍去。其中常数项
c
o
n
s
t
const
const是基于高斯分布的方差,我们这里不把它参数化,可以从样本数据中计算得到。
使用最大似然导出代价函数的方法的一个优势是,它减轻了每个模型设计代价函数的负担。明确一个模型 p ( y ∣ x ) p(\boldsymbol{y|x}) p(y∣x)则自动确定了一个代价函数 l o g p ( y ∣ x ) log\,p(\boldsymbol{y|x}) logp(y∣x)。
代价函数的梯度必须足够大和具有足够的预测性,来为学习算法提供一个好的指引。饱和(变得非常平)的函数把梯度变得非常小,这在很多情况下都会发生,因为用于产生隐藏单元或者输出单元的输出的激活函数会饱和。负的对数似然在很多模型上帮我们避免这个问题。例如,很多输出单元都会包含一个指数函数,在它的变量取绝对值很大的负数时会造成饱和,而负的对数似然消除了指数效果。
3.1.2、学习条件统计量
我们可以认为一个足够强大的神经网络能够表示一大类函数中的任何一个函数 f f f,这个类仅仅被一些特征所限制,例如连续性和有界性,而不是具有特殊的参数形式。从这个角度看,我们可以把代价函数看作是一个泛函(functional)而不仅仅是一个函数。
泛函就是定义域是一个函数集,而值域是实数集或者实数集的一个子集,推广开来, 泛函就是从任意的向量空间到标量的映射。也就是说,它是从函数空间到数域的映射。
我们可以设计一个代价泛函在我们想要的某些函数处取得最小值,例如使它的最小值处于一个特殊的函数上,这个函数将 x \boldsymbol{x} x映射到给定 x \boldsymbol{x} x时 y \boldsymbol{y} y的期望值。
对函数求解优化问题需要用到变分法。在使用变分法时,采用不同的代价函数能够得到不同的统计量。例如,
-
解优化问题 f ∗ = a r g m i n f E x , y p d a t a ∥ y − f ( x ) ∥ 2 f^*=\underset{f} {arg\,min}\mathbb{E}_{\boldsymbol{x,y}\,{_p}_{data}}\text{\textbardbl}\boldsymbol{y}-f(\boldsymbol{x})\text{\textbardbl}^2 f∗=fargminEx,ypdata∥y−f(x)∥2得到 f ∗ ( x ) = E y ∼ p d a t a ( y ∣ x ) ( y ) f^*(\boldsymbol{x})=\mathbb{E}_{\boldsymbol{y}\thicksim{_p}_{data}(\boldsymbol{y|x})}(\boldsymbol{y}) f∗(x)=Ey∼pdata(y∣x)(y)即如果我们能够用无穷多的、来源于真实的数据分布的样本进行训练,最小化均方误差代价函数将得到可用于对每个 x \boldsymbol{x} x预测出 y \boldsymbol{y} y的均值的函数。
-
解优化问题 f ∗ = a r g m i n f E x , y p d a t a ∥ y − f ( x ) ∥ 1 f^*=\underset{f} {arg\,min}\mathbb{E}_{\boldsymbol{x,y}\,{_p}_{data}}\text{\textbardbl}\boldsymbol{y}-f(\boldsymbol{x})\text{\textbardbl}_1 f∗=fargminEx,ypdata∥y−f(x)∥1将得到一个函数可以对每个 x \boldsymbol{x} x预测 y \boldsymbol{y} y取值的中位数。这个代价函数通常被称为平均绝对误差(mean absolute error)
在使用基于梯度的优化方法时,均方误差和平均绝对误差成效往往不佳,一些饱和的输出单元在结合这些代价函数时会产生非常小的梯度。由于这个原因,交叉熵代价函数更受欢迎。
3.2 输出单元
代价函数的选择与输出单元的选择紧密相关。多数情况下,我们直接使用数据分布与模型分布之间的交叉熵。那么,选择如何表示输出决定了交叉熵函数的形式。
任何可用作输出的神经网络单元也可用作隐藏单元。这里,我们着重讨论这些单元用作输出的情况。在本节中,假设前馈网络提供了一组定义为 h = f ( x ; θ ) \boldsymbol{h}=f(\boldsymbol{x;\theta}) h=f(x;θ)的隐藏特征。输出层的作用是随后对这些特征进行一些额外的变换来完成整个网络必须完成的任务。
3.2.1 用于高斯输出分布的线性单元
一种简单的输出单元基于不具有非线性的仿射变换,通常被称为线性单元。已知特征 h \boldsymbol{h} h,线性输出单元层产生一个向量 y ^ = W T h + b \boldsymbol{\overset{\text{\textasciicircum}}{y}}=\boldsymbol{W}^T\boldsymbol{h+b} y^=WTh+b。线性输出层经常用于产生条件高斯分布的均值: p ( y ∣ x ) = N ( y ; y ^ , I ) p(\boldsymbol{y|x})=\mathcal N(\boldsymbol{y;\boldsymbol{\overset{\text{\textasciicircum}}{y}},I}) p(y∣x)=N(y;y^,I)此时,最大化对数似然等同于最小化均方误差。
最大似然框架也使得学习高斯分布的协方差矩阵更加容易,然而协方差矩阵必须为正定矩阵,线性输出很难满足这种限制,所以通常使用其他输出单元对协方差参数化。后续会讲解协方差的建模方法。
因为线性模型不会饱和(变得非常平),所以它们易于采用基于梯度的优化算法,甚至可以用其他多种优化算法。
3.2.2 用于 Bernoulli 输出分布的 sigmoid 单元
许多任务需要预测二值型变量 y 的值。具有两个类的分类问题可以归结为这种形式。此时最大似然的方法是定义 y y y 在 x x x 条件下的 Bernoulli 分布。
Bernoulli分布仅需单个参数来定义,神经网络只需要预测 P ( y = 1 ∣ x ) P(y=1|\boldsymbol{x}) P(y=1∣x) 。为使概率有效,这个数值必须在区间 [ 0 , 1 ] [0,1] [0,1] 中。假设我们使用一个线性单元并限制它的阈值来满足这一约束, P ( y = 1 ∣ x ) = m a x { 0 , m i n { 1 , ω T h + b } } P(y=1|\boldsymbol{x})=max\{0,min\{1,\boldsymbol{\omega}^T\boldsymbol{h}+b\}\} P(y=1∣x)=max{0,min{1,ωTh+b}}这样虽然定义一个有效的条件概率分布,但无法高效地使用梯度下降来训练它。因为当 ω T h + b \boldsymbol{\omega}^T\boldsymbol{h}+b ωTh+b 在单元区间 [ 0 , 1 ] [0,1] [0,1] 之外时,模型输出关于其参数地梯度为 0 \boldsymbol{0} 0 。此时学习算法无法指导进行改善相关参数。
相反,我们使用一种基于使用sigmoid输出单元并结合最大似然地方法。sigmoid输出单元定义为 y ^ = σ ( ω T h + b ) {\overset{\text{\textasciicircum}}{y}}=\sigma(\boldsymbol{\omega}^T\boldsymbol{h}+b) y^=σ(ωTh+b)其中 σ \sigma σ是logistic sigmoid 函数。我们可以认为sigmoid输出单元有两个组成成分,用于计算 z = ω T h + b z=\boldsymbol{\omega}^T\boldsymbol{h}+b z=ωTh+b 的线性层,以及将 z z z转换为概率的sigmoid激活函数。
我们暂时忽略条件 x \boldsymbol{x} x,只讨论如何用 z z z 定义 y y y 的概率分布。如果我们假定非归一化对数概率对 y y y 和 z z z 是线性的, l o g P ~ ( y ) = y z , log\,\overset{\text{\textasciitilde}}{P}(y)=yz, logP~(y)=yz, 取指数得到非归一化概率, P ~ ( y ) = e x p ( y z ) \textsf{取指数得到非归一化概率,}\overset{\text{\textasciitilde}}{P}(y)=exp(yz) 取指数得到非归一化概率,P~(y)=exp(yz) 进行归一化, P ( y ) = e x p ( y z ) ∑ y ′ = 0 1 e x p ( y ′ z ) \textsf{进行归一化,}P(y)=\frac{exp(yz)}{\textstyle\sum_{y^{'}=0}^1exp(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成为分对数(logit)。
这种在对数空间预测概率的方法很自然地想到使用最大似然学习。因为用于最大似然的代价函数 − l o g P ( y ∣ x ) -log \,P(y|\boldsymbol{x}) −logP(y∣x),抵消了sigmoid中的exp。如果没有这个效果,sigmoid的饱和性会阻止基于梯度的学习做出好的改进。损失函数为 J ( θ ) = − l o g P ( y ∣ x ) = − l o g σ ( ( 2 y − 1 ) z ) = ζ ( ( 1 − 2 y ) z ) J(\boldsymbol{\theta})=-log \,P(y|\boldsymbol{x})=-log\,\sigma((2y-1)z)=\zeta((1-2y)z) J(θ)=−logP(y∣x)=−logσ((2y−1)z)=ζ((1−2y)z)通过将损失函数写成softplus函数的形式,可以看到它仅仅在 ( 1 − 2 y ) z (1-2y)z (1−2y)z 取绝对值非常大的负值时才会饱和。由softplus函数性质可知,达到饱和时证明达到最小函数值,即损失函数达到最小。所以此时模型已经得到正确答案。
饱和情况:当 y = 1 y=1 y=1 且 z z z 取非常大的正值时,或者当 y = 0 y=0 y=0 且 z z z 取绝对值非常大的负值。
当 z z z的符号错误时,即不符合饱和情况中的符号。softplus函数的变量 ( 1 − 2 y ) z (1-2y)z (1−2y)z 可简化为 ∣ z ∣ |z| ∣z∣。
不符饱和情况:当 y = 1 y=1 y=1 且 z z z 取负值,有 ( 1 − 2 y ) z (1-2y)z (1−2y)z= ∣ z ∣ |z| ∣z∣;或者当 y = 0 y=0 y=0 且 z z z 取正值,有 ( 1 − 2 y ) z (1-2y)z (1−2y)z= ∣ z ∣ |z| ∣z∣。综上, ( 1 − 2 y ) z (1-2y)z (1−2y)z= ∣ z ∣ |z| ∣z∣。
有当 ∣ z ∣ |z| ∣z∣ 很大且 z z z 的符号错误时,即softplus函数的变量取很大的正值,由softplus函数的性质可知,softplus函数值趋向于 ∣ z ∣ |z| ∣z∣ 。所以对于极度不正确的 z z z,softplus函数的梯度完全不会收缩,即意味着基于梯度的学习能很快的改正错误的 z z z。最大似然几乎总是训练 sigmoid 输出单元的优选方法。
在软件实现时,为了避免数值问题,最好将负的对数似然写作 z z z 的函数,而不是 y ^ = σ ( z ) \overset{\text{\textasciicircum}}{y} = \sigma(z) y^=σ(z) 的函数。如果 sigmoid 函数下溢到零,那么之后对 y ^ \overset{\text{\textasciicircum}}{y} y^ 取对数会得到负无穷。
3.2.3 用于 Multinoulli 输出分布的 softmax 单元
softmax 函数可看作是 sigmoid 函数的扩展,前者可用于表示一个具有 n 个可能取值的变量的概率分布,而后者则用于表示二值变量的概率分布。softmax 函数经常用作分类器的输出,来表示 n 个不同类的概率分布。比较少见的是在模型内部使用,例如我们希望模型选择某个内部变量 n 个不同选项之一。
由二值变量推广到 n 个取值的离散变量,我们需要产生一个向量 y ^ \overset{\text{\textasciicircum}}{\boldsymbol{y}} y^,其中 y i ^ = P ( y = i ∣ x ) \overset{\text{\textasciicircum}}{y_i}=P(y=i|\boldsymbol{x}) yi^=P(y=i∣x)。为了表示一个正确的概率分布,不仅每个元素 y i ^ \overset{\text{\textasciicircum}}{y_i} yi^ 介于 0 和 1 之间,而且整个向量的元素之和为1。首先,一个线性层预测非归一化对数概率: z = W T + b , \boldsymbol{z}=\boldsymbol{W}^T+\boldsymbol{b}, z=WT+b,其中 z i = l o g P ~ ( y = i ∣ x ) z_i=log\thickspace \overset{\text{\textasciitilde}}{P}(y=i|\boldsymbol{x}) zi=logP~(y=i∣x)。非归一化概率为: P ~ ( y = i ∣ x ) = e x p ( z i ) \overset{\text{\textasciitilde}}{P}(y=i|\boldsymbol{x})=exp(z_i) P~(y=i∣x)=exp(zi)。借由softmax函数进行归一化,
softmax函数: s o f t m a x ( z ) i = e x p ( z i ) ∑ j . e x p ( z j ) softmax(\boldsymbol{z})_i=\frac{exp(z_i)}{\sum_{j.}exp(z_j)} softmax(z)i=∑j.exp(zj)exp(zi)
归一化概率为:
P
(
y
=
i
∣
x
)
=
s
o
f
t
m
a
x
(
z
)
i
=
e
x
p
(
z
i
)
∑
j
.
e
x
p
(
z
j
)
P(y=i|\boldsymbol{x})=softmax(\boldsymbol{z})_i=\frac{exp(z_i)}{\sum_{j.}exp(z_j)}
P(y=i∣x)=softmax(z)i=∑j.exp(zj)exp(zi)。
接下来,我们要最大化
l
o
g
P
(
y
=
i
;
z
)
=
l
o
g
s
o
f
t
m
a
x
(
z
)
i
log\,P(y=i;\boldsymbol{z})=log\,softmax(\boldsymbol{z})_i
logP(y=i;z)=logsoftmax(z)i 。将 softmax 函数定义为 exp 的形式很自然地是因为对数似然中的 log 可抵消 softmax 中的 exp:
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(\boldsymbol{z})_i=z_i-log\,\sum_jexp(z_j)
logsoftmax(z)i=zi−logj∑exp(zj)对上式进行讨论:
- 第一项 z i z_i zi 不会饱和,所以即使 z i z_i zi 对上式第二项贡献很小,学习依然可以进行。
- 考虑到任何明显小于 m a x j z j max_jz_j maxjzj 的 z k z_k zk , e x p ( z k ) exp(z_k) exp(zk)都是不重要的,我们可以将第二项近似为 m a x j z j max_jz_j maxjzj 。对于具有 softmax 的最大输入的样本,负对数似然代价函数中的 − z i -z_i −zi 和 l o g ∑ j e x p ( z j ) ≈ m a x j z j = z i log\thickspace \sum_jexp(z_j)\approx max_jz_j=z_i log∑jexp(zj)≈maxjzj=zi将大致抵消,即代价函数在此样本上取得很小值,对整体代价贡献很小,因此整体代价主要由其他未被正确分类的样本产生。
softmax的最大输入 z i z_i zi 意味着所处理样本被分为 i i i 类的概率且为所有分类中的最大概率,即为最小化负对数似然代价函数的目的,认为该样本被分类为 i i i 为正确答案。
总体来说,未正则化的最大似然会驱动模型去学习一些参数,而这些参数驱动softmax函数来预测在训练集中观察到每个结果的比率。除了对数似然之外的许多目标函数对softmax函数不起作用。具体来说,那些不使用对数来抵消softmax中的指数的目标函数,当指数的变量取非常小的负数时会造成梯度消失,从而无法学习。
softmax的一个重要性质:当对所有的输入都加上同一个常数时softmax的输出不变,即 s o f t m a x ( z ) = s o f t m a x ( z + c ) softmax(\boldsymbol{z})=softmax(\boldsymbol{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(\boldsymbol{z})=softmax(\boldsymbol{z}-\underset{i}{max}\,z_i) softmax(z)=softmax(z−imaxzi)变换后的形式允许我们在对 softmax 函数求值时只有很小的数值误差,即使是当 z z z 包含极正或者极负的数时。观察 softmax 数值稳定的变体,可以看到 softmax 函数由它的变量偏离 m a x i z i {max}_i\,z_i maxizi 的量来驱动。
当其中一个输入是最大( z i = m a x i z i z_i={max}_i\,z_i zi=maxizi)并且 z z z 远大于其他的输入时,相应的输出 s o f t m a x ( z ) i softmax(\boldsymbol{z})_i softmax(z)i 会饱和到 1。当 z z z 不是最大值并且最大值非常大时,相应的输出 s o f t m a x ( z ) i softmax(\boldsymbol{z})_i softmax(z)i 也会饱和到 0。这是 sigmoid 单元饱和方式的一般化,并且如果损失函数不被设计成对其补偿,也会造成类似的学习困难。
softmax函数可通过两种方式产生:
- 最简单的是简单地使神经网络较早的层输出 z \boldsymbol{z} z 的每个元素,如之前描述的 z = W T + b \boldsymbol{z}=\boldsymbol{W}^T+\boldsymbol{b} z=WT+b 。虽然很直观,但这种方法对分布过度参数化,因为忽略了 z \boldsymbol{z} z 的元素之和为1这一约束。
- 第 n 个概率值可通过 1 减去前面 n-1 个概率得到。因此,我们可以强制一个元素固定。例如,要求 z n = 0 z_n=0 zn=0。
3.2.4 其他的输出类型
总体上说,如果我们定义了一个条件分布 p ( y ∣ x ; θ ) p(\boldsymbol{y|x;\theta}) p(y∣x;θ),最大似然原则建议我们使用负对数似然 − l o g p ( y ∣ x ; θ ) -log\,p(\boldsymbol{y|x;\theta}) −logp(y∣x;θ) 作为代价函数。我们认为神经网络表示函数 f ( x ; θ ) f(\boldsymbol{x;\theta}) f(x;θ),这个函数的输出并不是 y \boldsymbol{y} y 值的直接预测。相反, f ( x ; θ ) = ω f(\boldsymbol{x;\theta}) = \boldsymbol{\omega} f(x;θ)=ω 提供了 y \boldsymbol{y} y 分布的参数。因此我们的损失函数就可以表示为 − l o g p ( y ; ω ( x ) ) -log\,p(\boldsymbol{y;\omega(x)}) −logp(y;ω(x))。
以给定 x \boldsymbol{x} x 学习 y \boldsymbol{y} y 的条件高斯分布的方差为例。
在标准差 σ \sigma σ 不依赖于输入的简单情况下,可根据方差的最大似然估计量是观测值 y \boldsymbol{y} y 与它们的期望值的差值的平方平均来计算方差 σ 2 \sigma^2 σ2。然后在网络中创建一个直接复制到 ω \boldsymbol{\omega} ω 的新参数。这个新参数可以三种形式:标准差本身 σ \sigma σ、表示 σ 2 \sigma^2 σ2 的参数 v v v、或表示 1 σ 2 \frac{1}{\sigma^2} σ21 的参数 β \beta β(精度)。
另一种希望模型对不同的输入 x \boldsymbol{x} x 预测出 y \boldsymbol{y} y 不同的方差的情况,该模型成为异方差(heteroscedastic)模型。此时采用计算代价上更高但不需要写特殊代码的方式是直接将方差作为分布 p ( y ∣ x ; θ ) p(\boldsymbol{y|x;\theta}) p(y∣x;θ) 的一个属性,且这个分布由 f ( x ; θ ) = ω f(\boldsymbol{x;\theta}) = \boldsymbol{\omega} f(x;θ)=ω 来控制,即将方差指定为 f ( x ; θ ) f(\boldsymbol{x;\theta}) f(x;θ) 的输出值。实现它的典型方法是使用精度而不是方差来表示高斯分布。在多维情况下,常使用一个对角精度矩阵 d i a g ( β ) diag(\boldsymbol{\beta}) diag(β)由 β \boldsymbol{\beta} β 参数化的高斯分布的对数似然的公式仅涉及 β i \beta_i βi 的乘法与 l o g β i log\,\beta_i logβi 的加法,因此该公式适用于梯度下降。
如果用方差来参数化输出,会涉及到除法。除法函数在零附近会变得任意陡峭,任意大的梯度通常导致不稳定。如果用标准差参数化输出,同样会涉及除法,并且还将涉及平方。通过平方运算的梯度可能在零附近消失,这使得学习被平方的参数变得困难。
我们必须确保高斯分布的协方差矩阵是正定的。因为精度矩阵的特征值是协方差矩阵特征值的倒数,所以等价于确保精度矩阵是正定的。当精度矩阵采用对角阵或一个标量乘以单位矩阵时,我们就需要确保对角线元素都为正。此时,我们可以借助 softplus 函数。假设 a \boldsymbol{a} a 是用于确定对角精度的模型的原始激活,则有 β = ζ ( a ) \boldsymbol{\beta=\zeta(a)} β=ζ(a)。
多峰回归(multimodal regression),即预测条件分布 p ( y ∣ x ) p(\boldsymbol{y|x}) p(y∣x) 的实值,该条件分布对于相同的 x \boldsymbol{x} x 值在 y \boldsymbol{y} y 空间有不同的峰值。在这种情况下,使用高斯混合来表示该分布。将高斯混合作为其输出的神经网络通常被称为混合密度网络(mixture density network)。具有 n 个分量的高斯混合输出由下面的条件分布定义: p ( y ∣ x ) = ∑ i = 1 n p ( c = i ∣ x ) N ( y ; μ ( i ) ( x ) , ∑ ( i ) ( x ) ) p(\boldsymbol{y|x})=\sum_{i=1}^np(c=i|\boldsymbol{x}) \boldsymbol{\mathcal{N}(y;\mu^{(i)}(x),\textstyle\boldsymbol{\sum^{(i)}(x))}} p(y∣x)=i=1∑np(c=i∣x)N(y;μ(i)(x),∑(i)(x))神经网络必须有三个输出:定义 p ( c = i ∣ x ) p(c=i|\boldsymbol{x}) p(c=i∣x) 的向量、对所有的 i i i 给出 μ ( i ) ( x ) \boldsymbol{\mu}^{(i)}(\boldsymbol{x}) μ(i)(x)的矩阵、对所有的 i i i 给出 ∑ ( i ) ( x ) \textstyle\boldsymbol{\sum^{(i)}(x)} ∑(i)(x) 的张量。这些输出必须满足不同的约束:
- 混合组件 p ( c = i ∣ x ) p(c=i|\boldsymbol{x}) p(c=i∣x) :它们由潜变量 c c c 关联,在 n n n 个不同组件上形成 Multinoulli 分布。这个分布通常由 n 维向量的 softmax 来获得,以确保这些输出是正的并且和为1.
- 均值 μ ( i ) ( x ) \boldsymbol{\mu}^{(i)}(\boldsymbol{x}) μ(i)(x):它们指明了与第 i i i 个高斯组件相关联的中心或者均值,并且是无约束的(通常对于这些输出单元完全没有非线性)。
- 协方差 ∑ ( i ) ( x ) \textstyle\boldsymbol{\sum^{(i)}(x)} ∑(i)(x):它们指明了每个组件 i i i 的协方差矩阵。和学习单个高斯组件时一样,我们通常使用对角矩阵来避免计算行列式。和学习混合均值时一样,最大似然是很复杂的,它需要将每个点的部分责任分配给每个混合组件。如果给定了混合模型的正确的负对数似然,梯度下降将自动地遵循正确的过程。
高斯混合输出在语音生成模型和物理运动。混合密度策略为网络提供了一种方法来表示多种输出模式,并且控制输出的方差,这对于在实数域中获得高质量结果至关重要。