Ch6 深度前馈神经网络
深度前馈神经网络,也叫多层感知机,(以下以MLP指代深度前馈神经网络)目标是近似某个函数 f ∗ f^* f∗.
⭐️ 基本概念
-
网络深度(depth)
-
输出层(output layer)
-
隐藏层(hidden layer)
-
宽度(width)
从线性模型理解MLP
线性模型的缺陷:模型的能力被局限在线性线性函数里,无法理解任何两个输出变量之间的相互作用。
为了扩展线性模型成为非线性,可以将线性模型作用在一个变换后的输出 ϕ ( x ) \phi(x) ϕ(x), ϕ \phi ϕ为非线性变换。在这里可以认为 ϕ \phi ϕ提供了一组描述 x x x的特征。
剩下的问题就是如何选择映射 ϕ \phi ϕ
- 选择一个通用的 ϕ \phi ϕ. 非常通用的特征映射通常只基于局部光滑的原则,并且没有将足够的先验信息进行编码来解决高级问题。
- 手动设计 ϕ \phi ϕ。 传统的手工设计特征提取过程。
- 深度学习策略:学习 ϕ \phi ϕ。类似于卷积网络学习backbone。将学习到的表示参数化为 ϕ ( x ; θ ) \phi(x;\theta) ϕ(x;θ),并且使用优化算法来寻找 θ \theta θ。
训练一个MLP需要的设计决策
- 选择优化模型
- 选择代价函数
- 选择输出单元的形式
6.1 实例:学习XOR
这章内容比较简单,大致理解一下如何使用带ReLU的线性模型解决异或问题
6.2 基于梯度的学习
构建一个机器学习算法:指定优化过程、代价函数和一个模型族。
神经网络的非线性导致大部分的代价函数变得非凸,因此神经网络的训练通常使用迭代的、基于梯度的优化。使用非凸损失函数的随机梯度下降没有收敛性的保证,并且对参数的初始值很敏感。
6.2.1 代价函数
📑 总结:通常采用模型输出与训练数据之间的交叉熵损失
神经网络设计中的一个重要方面就是代价函数的选择。
大多数情况下,参数模型定义了一个分布 p ( y ∣ x ; θ ) p(\bf y|\bf x;\bf \theta) p(y∣x;θ)并且使用最大似然原理,即使用训练数据和模型预测之间的交叉熵作为代价函数。
训练神经网络的完整代价函数通常要加上一个正则化项,用于线性模型的权重衰减的方法也直接适用于深度神经网络。
6.2.1.1 使用最大似然学习条件分布
大多数神经网络使用最大似然训练,它与训练数据和模型分布间的交叉熵等价,代价函数表示为:
J
(
θ
)
=
−
E
x
,
y
∼
p
^
d
a
t
a
log
p
model
(
y
∣
x
)
J(\theta)=-\mathbb{E}_{\mathrm{x}, \mathrm{y} \sim \hat{p}_{\mathrm{data}}} \log p_{\text {model }}(y \mid 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}(y|x) = \mathcal N(y;f(x;\theta),I)
pmodel(y∣x)=N(y;f(x;θ),I),那我们就会得到均方误差的代价函数:
J
(
θ
)
=
1
2
E
x
,
y
∼
p
^
data
∥
y
−
f
(
x
;
θ
)
∥
2
+
c
o
n
s
t
J(\theta)=\frac{1}{2} \mathbb{E}_{\mathrm{x}, \mathrm{y} \sim \hat{p}_{\text {data }}}\|y-f(x ; \theta)\|^{2}+\mathrm{const}
J(θ)=21Ex,y∼p^data ∥y−f(x;θ)∥2+const
代价函数的梯度必须足够带和具有足够的预测性,负对数似然代价函数中的对数函数消除了某些输出单元的指数效果,避免了激活函数饱和的问题(softmax中的指数项容易饱和).
用于实现最大似然估计的交叉熵损失,被用于实践当中时通常没有最小值。(log 函数没有最小值,趋向于负无穷)
6.2.1.2 学习条件统计量
模型不学习一个完整的概率分布 p ( y ∣ x ; θ ) p(y|x;\theta) p(y∣x;θ),仅学习在给定 x x x时 y y y的某个条件统计量。
😢 这部分看不太明白,感觉也不是很重要,摘录几句比较重要的话
可以将代价函数看作是一个泛函,即将神经网络的学习过程看作是选择一个函数。
均方误差和平均绝对误差在使用基于梯度优化的方法时效果往往不好,因为一些饱和的输出单元使用这些代价函数的时候会产生非常小的梯度。
🙉 ReLU应该是解决这个问题了?
6.2.2 输出单元
📑 总结一下就是:二分类使用sigmoid函数、多分类使用softmax函数(损失函数采用最大似然损失)
代价函数的选择与输出单元的选择紧密相关,大多数我们使用数据分布和模型分布之间的交叉熵。输出单元的形式决定了交叉熵函数的形式。
本节假设前馈网络提供了 h = f ( x ; θ ) h=f(x;\theta) h=f(x;θ)作为隐藏特征,输出层即对这些隐藏特征进行一些额外的变换。
🔖 6.2.2.1 用于高斯输出分布的线性单元
给定特征 h h h,线性输出层产生一个向量 y ^ = W T h + b \hat y = W^T h + b y^=WTh+b
线性输出层常被用来产生条件高斯分布的均值,最大其对数似然等价于最小化均方误差
p
(
y
∣
x
)
=
N
(
y
;
y
^
,
I
)
p(y|x) = \mathcal N(y;\hat y ,I)
p(y∣x)=N(y;y^,I)
线性模型不会饱和,易于采用基于梯度的优化算法。
🔖 6.2.2.2 用于Bernoulli 输出分布的sigmoid 单元
预测二值型变量 y y y的值。具有两个类的分类问题可以归结为这种形式。二分类问题都是假定其是服从伯努利分布。
最大似然的方法是定义 y y y在 x x x条件下的Bernoulli 分布。
使用输出单元的方法保证模型给出错误答案时,总能有一个较大的梯度。可以基于使用sigmoid输出单元结合最大似然来实现。
sigmoid输出单元定义为:
y
^
=
σ
(
w
T
h
+
b
)
\hat y = \sigma(w^Th+b)
y^=σ(wTh+b)
对公式(6.20 - 6.23)的理解:link
⚠️ 注意二分类问题, y y y的取值只有0和1
使用最大似然来学习一个由sigmoid参数化的Bernoulli 分布,它的代价函数为:
J
(
θ
)
=
−
log
P
(
y
∣
x
)
=
−
log
σ
(
(
2
y
−
1
)
z
)
=
ζ
(
(
1
−
2
y
)
z
)
\begin{aligned} J(\theta) &=-\log P(y \mid x) \\ &=-\log \sigma((2 y-1) z) \\ &=\zeta ((1-2 y) z) \end{aligned}
J(θ)=−logP(y∣x)=−logσ((2y−1)z)=ζ((1−2y)z)
其中
ζ
\zeta
ζ是softplus函数,
ζ
(
x
)
=
l
o
g
(
1
+
e
x
)
\zeta (x) = log(1+e^x)
ζ(x)=log(1+ex)
从上面的函数曲线我们可以看到,网络饱和出现在模型得到正确答案时:当 y = 1 y=1 y=1且 z z z取非常大的正值,或者 y = 0 y=0 y=0且 z z z取非常小的负值,这可以使得我们可以使用基于梯度的学习来改正错误的 z z z。
当我们使用其他的损失函数,损失函数会在 σ ( z ) \sigma(z) σ(z)饱和时饱和。因此,最大似然几乎时训练sigmoid输出的优选方法。
🔖 6.2.2.3 用于Multinoulli 输出分布的softmax 单元
描述多个类别的概率分布,即对于多元问题常用的softmax函数
为了从二分类推广到具有n个值的离散型变量,我们首先需要一个向量 y ^ \hat y y^,其中的每个元素是 y ^ i = P ( y = i ∣ x ) \hat y_i = P(y=i|x) y^i=P(y=i∣x)。用于Bernoulli 分布的方法同样可以推广到Multinoulli 分布。
首先,线性层预测了未归一化的对数概率:
z
=
W
T
h
+
b
z = W^T h + 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
(
z
)
i
=
e
x
p
(
z
i
)
∑
j
e
x
p
(
z
j
)
softmax(z)_i = \frac {exp(z_i)} {\sum_j exp(z_j)}
softmax(z)i=∑jexp(zj)exp(zi)
使用最大似然来训练softmax输出目标值
y
y
y,则有:
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_j exp(z_j)
logsoftmax(z)i=zi−logj∑exp(zj)
最大化上面的似然函数时,第一项
z
i
z_i
zi鼓励被推高,第二项鼓励所有的
z
z
z被压低。注意第二项的
l
o
g
∑
j
e
x
p
(
z
j
)
≈
m
a
x
j
z
j
log \sum_jexp(z_j) \approx max_j z_j
log∑jexp(zj)≈maxjzj,即负对数损失总是强烈地惩罚最活跃地不正确预测项。
未正则化的最大似然会使得模型去学习一些参数,这些参数会使得softmax函数来预测在训练集中观察到的每个结果的比率:
softmax
(
z
(
x
;
θ
)
)
i
≈
∑
j
=
1
m
1
y
(
j
)
=
i
,
x
(
j
)
=
x
∑
j
=
1
m
1
x
(
j
)
=
x
\operatorname{softmax}(z(x ; \theta))_{i} \approx \frac{\sum_{j=1}^{m} 1_{y^{(j)}=i, x^{(j)}=x}}{\sum_{j=1}^{m} 1_{x^{(j)}=x}}
softmax(z(x;θ))i≈∑j=1m1x(j)=x∑j=1m1y(j)=i,x(j)=x
除了对数似然之外的许多目标函数对softmax不起作用。
softmax数值稳定方法: s o f t m a x ( z ) = s o f t m a x ( z − m a x i z i ) softmax(z) = softmax(z-max_i \, z_i) softmax(z)=softmax(z−maxizi)
🔖 6.2.2.4 其他的输出类型
一般,我们定义了条件分布 p ( y ∣ x ; θ ) p(y|x;\theta) p(y∣x;θ),最大似然建议我们使用 − l o g p ( y ∣ x ; θ ) -log \, p(y|x;\theta) −logp(y∣x;θ)作为损失函数
😢 看不懂23333
6.3 隐藏单元
📑 这部分主要介绍几个常用的激活函数
ReLU是隐藏单元的默认选择
不可微的隐藏单元只在少数点不可微,计算机总有误差的影响(计算到这些不可微的点的概率是0)
大多数隐藏单元可以描述为:
- 接受输入向量 x x x
- 计算仿射变换 z = W T x + b z = W^T x + b z=WTx+b
- 使用一个非线性激活函数 g ( z ) g(z) g(z)
6.3.1 整流线性单元及其扩展
介绍ReLU及其扩展
ReLU通常作用在仿射变换之上,初始化时可以将 b b b中的所有元素设置为一个小的正数
因为每个单元由多个过滤器驱动,maxout 单元具有一些冗余来帮助它们抵抗一种被称为灾难遗忘的现象。
整流线性单元和它们的这些扩展都是基于一个原则:那就是如果它们的行为更接近线性,那么模型更容易优化。
6.3.2 logistic sigmoid与双曲正切函数
现在都不怎么用这个啦~
sigmoid 激活函数在除了前馈网络以外的情景中更为常见。
循环网络、许多概率模型以及一些自编码器有一些额外的要求使得它们不能使用分段线性激活函数,并且使得sigmoid 单元更具有吸引力,尽管它存在饱和性的问题。
6.3.3 其他隐藏单元
结论就是:ReLU yyds 👍
6.4 架构设计
考虑选择网络的深度和每一层的宽度,更深层的网络对每一层使用更少的单元数和更少的参数,并且更容易泛化到测试集,但是也更难优化。
6.4.1 万能近似性质和深度
这部分主要说明:网络越深表达能力越强,但同时也更难优化
万能近似定理
- 一个前馈神经网络如果具有线性输出层和至少一层具有任何一种“挤压”性质的激活函数(例如sigmoid),只要给予网络足够数量的隐藏单元,它可以以任意精度来近似任何从一个有限维空间到另一个有限维空间的Borel可测函数
万能近似定理表明,一个MLP一定能够 表示 我们要学习的函数,但是不能保证训练算法能够学到这个函数,原因如下:
- 用于训练的优化算法可能找不到基于期望函数的参数值;
- 训练算法可能由于过拟合而选择了错误的函数。
Montufar 指出:分段线性网络可以表示区域的数量是网络深度的指数级的函数(网络越深表达能力越强)
6.4.2 其他架构上的考虑
不同的任务需要设计不同的网络架构,例如计算机视觉的卷积网络以及序列处理中的循环神经网络
架构设计考虑的两个关键点
- 层不需要连接在链中。如ResNet的跳跃连接
- 如何将层与层之间连接起来。如CNN的卷积层
6.5 反向传播和其他的微分算法
反向传播:允许来自代价函数的信息通过网络向后流动,以便计算梯度。
我们需要计算一个任意函数 f f f的梯度 ∇ x f ( x , y ) \nabla_x f(x,y) ∇xf(x,y),其中 x x x我们需要它们的导数,而 y y y是另一组输入的变量,我们不需要它的导数。在学习算法中,我们经常要计算代价函数关于参数的梯度,即 ∇ θ J ( θ ) \nabla_\theta J(\theta) ∇θJ(θ)
这章主要讲的是反向传播的推导,过于基础理论了(看不懂主要是),有需要的可以自己找资料研究,这里略过了。
6.6 历史小记
1986 年至2015 年神经网络性能的大部分改进可归因于以下几个因素:
- 较大的数据即减少了统计泛化对神经网络的挑战;
- 神经网络由于更强大的计算机和更好的软件基础设施已经变得更大;
- 少量算法上的变化也显著改善了神经网络的性能
算法上的变化:
- 使用交叉熵族损失函数代替均方误差损失函数;
- 使用ReLU层替代sigmoid层。