【深度学习(deep learning)】花书第六章 深度前馈网络 读书笔记
第六章 深度前馈网络
前言
打基础,阅读花书,感觉一次性啃不动。看一点算一点,写一点笔记留作纪念。以便日后查看与回顾。前面一部分基本在啃西瓜书的过程中看过了,直接从前馈网络开始再次记笔记。2020.11.18-2020.11.21以下是正式内容。
一、基本概念
1.深度前馈网络(DFN) = 前馈神经网络(FNN)= 多层感知机(MLP)
2.目标:对于样本x,有函数 f* 将输入x映射到类别y,前馈网络定义了函数f(x,θ),通过学习参数θ,尽可能地去近似最佳得映射函数 f* 。
前向/前馈(feedforward):信息通过x输入,流经中间计算过程,最终到达输出y(有向),输出与模型间没有反馈链接(无环)。如果存在反馈,则称为循环神经网络。
4.网络:有向无环图,通过层间的连接,使得函数复合在一起。复合链的长度就是深度。输入层(第一层)+ 隐层 + 输出层(输出函数,产生标签)。
5.神经:受神经科学启发,每个层由许多单元(神经元)组成。神经元接受输入,包含参数/阈值/激活函数,产生输出,传递给其他单元。
二、设计神经网络
一般地,机器学习算法(包含深度学习)可以描述为:特定的数据集+代价函数+优化过程+模型。
代价函数在网络设计中影响两个方面:代价函数的选择,输出单元的选择。
优化过程是网络的训练过程,基本上也是基于梯度的学习过程。
网络设计中独有的关键环节是隐藏单元的选择与架构设计。
2.1 输出单元
输出单元决定了输出的表示形式,也决定了代价函数的形式。理论上,输出单元的函数都可以用于隐藏单元。输出单元接受的输入为h,可以看作数据x经过多层处理之后得到的隐藏特征。
2.1.1 线性单元
用于高斯分布,基于仿射变换(也就是一种线性的变换)。拟合的是高斯分布的均值。线性单元对于协方差不易满足正定的条件。
仿射变换 通俗理解就是 线性变换+平移 ,线性变换即矩阵W,平移即偏置项b
https://www.zhihu.com/question/20666664
对于给定的h,产生输出:
y
^
=
W
T
h
+
b
\boldsymbol{\hat{y}\ }=\ \boldsymbol{W}^{T}\boldsymbol{h}+\boldsymbol{b}
y^ = WTh+b
2.1.2 sigmoid单元(二分类)
用于Bernoulli分布,即二元分类(只有一个参数控制)。拟合的是正类的概率 P(y=1|x)。包含线性计算单元与sigmoid激活函数σ(将结果转化成概率)。
y
^
=
σ
(
w
T
h
+
b
)
\boldsymbol{\hat{y}\ }=\ \sigma(\boldsymbol{w}^{T}\boldsymbol{h}+\boldsymbol{b})
y^ = σ(wTh+b)
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z)= \frac {1}{1+e^{-z}}
σ(z)=1+e−z1
图来自百度百科
https://baike.baidu.com/item/Sigmoid%E5%87%BD%E6%95%B0/7981407
则:
P
(
y
=
1
)
=
σ
(
z
)
P(y = 1) = \sigma (z)
P(y=1)=σ(z)
P
(
y
=
0
)
=
1
−
σ
(
z
)
=
σ
(
−
z
)
P(y = 0) = 1-\sigma (z) = \sigma (-z)
P(y=0)=1−σ(z)=σ(−z)
整合为:
P
(
y
)
=
σ
(
(
2
y
−
1
)
z
)
P(y) = \sigma ((2y-1)z)
P(y)=σ((2y−1)z)
2.1.3 softmax单元(多分类)
用于multibouli分布(多分类任务),使用softmax函数,是sigmoid函数的扩展,相当于一个软性的argmax函数。这一单元可以在模型内部使用(隐层中)。使用一个向量y表示,yi = P(y = i | x),y的每一个分量都在0-1之间,且和为1.
线性层计算一个对数概率(一种带有概率的意义的变量,又不符合概率定义,但是可以利用指数进行归一化):
z
=
W
T
h
+
b
\boldsymbol{z }=\ \boldsymbol{W}^{T}\boldsymbol{h}+\boldsymbol{b}
z= WTh+b
z
i
=
l
o
g
P
^
(
y
=
i
∣
x
)
z_i=log\hat{P}(y =i|\boldsymbol{x})
zi=logP^(y=i∣x)
使用softmax函数进行归一化
s
o
f
t
m
a
x
(
z
)
i
=
e
z
i
∑
j
e
z
j
softmax(\boldsymbol z)_i =\frac {e^{z_i}} {\sum_j{e^{z_j}}}
softmax(z)i=∑jezjezi
2.2 代价函数
2.2.1 均方误差
最小化均方误差:
J
(
θ
)
=
1
2
m
∑
m
(
g
(
z
)
−
y
)
2
J\left( \theta \right) =\ \frac{1}{2m}\sum_m{\left( g\left( z \right) -y \right)}^2
J(θ)= 2m1m∑(g(z)−y)2
梯度(单个样本):
∂
J
(
θ
)
∂
z
=
(
g
(
z
)
−
y
)
g
′
(
z
)
\frac{\partial J\left( \theta \right)}{\partial z}=\left( g\left( z \right) -y \right) g'\left( z \right)
∂z∂J(θ)=(g(z)−y)g′(z)
sigmiod函数在z趋于无穷的时候(导数)饱和到0.
softmax函数具有多个输出值,在输入值之间的差异变得极端时,会饱和。
如果是线性函数(线性单元/relu),就不会产生饱和。
2.2.2 最大似然函数代价
当参数模型定义为概率分布时,可以使用最大似然估计(最大化),代价函数就是负的对数似然(最小化),且与训练数据与模型分布间的交叉熵等价。根据输出形式的不同,代价函数由不同的形式。
使用负对数的形式,可以消除输出单元/激活函数中的指数形式带来的饱和问题(趋于无穷时,导数变化很小)。
一般形式(最小化):
J
(
θ
)
=
−
E
x
,
y
∼
p
^
d
a
t
a
log
p
m
o
d
e
l
(
y
∣
x
)
J\left( \theta \right) =-\mathbb{E}_{\mathbf{x,y}\sim \hat{p}_{data}}\log\text{\,\,}p_{model}\left( \boldsymbol{y|x} \right)
J(θ)=−Ex,y∼p^datalogpmodel(y∣x)
2.2.2.1 线性输出
模型为高斯分布,最大似然估计等价于均方误差代价。
J
(
θ
)
=
E
x
,
y
∼
p
^
d
a
t
a
∥
y
−
f
(
x
;
θ
)
∥
2
J\left( \theta \right) =\mathbb{E}_{\mathbf{x,y}\sim \hat{p}_{data}}\lVert \boldsymbol{y}-f\left( \boldsymbol{x\ ;\theta } \right) \rVert ^2
J(θ)=Ex,y∼p^data∥y−f(x ;θ)∥2
线性单元不会饱和,易于使用基于梯度的优化算法。
2.2.2.2 sigmoid输出
模型为:(Bernoulli 分布)
P
(
y
)
=
σ
(
(
2
y
−
1
)
z
)
P(y) = \sigma ((2y-1)z)
P(y)=σ((2y−1)z)
则代价函数为:
J
(
θ
)
=
−
log
P
(
y
∣
x
)
=
−
log
σ
(
(
2
y
−
1
)
z
)
=
ζ
(
(
1
−
2
y
)
z
)
J\left( \theta \right) =-\log\text{\ }P\left( y|\boldsymbol{x} \right) \ =-\log\text{\ }\sigma \left( \left( 2y-1 \right) z \right) =\zeta \left( \left( 1-2y \right) z \right)
J(θ)=−log P(y∣x) =−log σ((2y−1)z)=ζ((1−2y)z)
其中,softplus函数为:
ζ
(
x
)
=
log
(
1
+
e
x
)
\zeta(x)=\log (1+e^x)
ζ(x)=log(1+ex)满足性质(花书3.10节,公式3.36)
log
σ
(
x
)
=
−
ζ
(
−
x
)
\log \sigma(x)=-\zeta(-x)
logσ(x)=−ζ(−x)
这一形式只有在(1-2y)z取绝对值特别大的负数(特别小的负数)时才会饱和(导数趋于0).softplus函数图像如下(来自花书):
这种饱和的趋势,只有在趋近“正确”答案时才会出现。当y=1(正类),z为非常大的正值(正向预测)。当y=0(负类),z为非常小的负值(负向预测)。
当预测错误时,softplus约等于|z|,导数为z的符号,梯度不会消失。
2.2.2.3 softmax输出
最小化目标:
log
P
(
y
=
i
;
z
)
=
log
soft
max
(
z
)
i
\log\text{\ }P\left( y=i;\boldsymbol{z} \right) =\ \log\text{\ soft}\max \left( \boldsymbol{z} \right) _i
log P(y=i;z)= log softmax(z)i
log
s
o
f
t
m
a
x
(
z
)
i
=
z
i
−
log
∑
j
e
z
j
\log softmax(\boldsymbol z)_i =z_i-\log {\sum_j{e^{z_j}}}
logsoftmax(z)i=zi−logj∑ezj第一项不会饱和,第二项近似为max zj。
关于第二项:如果正确预测具有最大的输入(j=i),那么前后会抵消,这个样本产生的代价就很小。如果最大输入项为错误项,那么代价可以看作当前一项与最大项之间的差,会产生代价(惩罚最活跃的不正确项)。
2.2.3 平均绝对误差
2.3 隐藏单元
一般来说,整流线性单元(reLU)是很好的默认选择。
输入为向量x,进行仿射变换得到z,再使用一个非线性函数g(z)。隐藏单元的区别在于激活函数g(z)不同。
增加激活函数,添加非线性变化,是为了增强模型处理非线性问题的能力。不然不论线性函数复合多少层,依旧是线性函数。
2.3.1 整流线性单元(ReLU)
ReLU
(
z
)
=
max
{
0
,
z
}
=
max
{
0
,
w
T
x
+
b
}
\text{ReLU}\left( z \right) =\max \left\{ 0,z \right\} =\max \left\{ 0,\boldsymbol{w}^{T}\boldsymbol{x}+b \right\}
ReLU(z)=max{0,z}=max{0,wTx+b}
图片来自花书
位于z部分属于激活状态,梯度保持为1.但是对于无法激活的样本,无法产生梯度。
初始阶段,可以将b设置为一个较小的正值,使得大多数输入时激活状态。
ReLU的扩展:对于不激活的部分使用一个非零的斜率α。
ReLU
(
z
,
α
)
=
max
{
0
,
z
}
+
α
min
{
0
,
z
}
\text{ReLU}\left( z,\alpha \right) =\max \left\{ 0,z \right\} +\alpha \min \left\{ 0,z \right\}
ReLU(z,α)=max{0,z}+αmin{0,z}
- 绝对值整流:α=1,则relu = |z|。
- 渗漏整流线性单元:α固定为一个很小的值,如0.001。
- 参数化整流线性单元 PReLU:将α设置成学习的参数。
2.3.2 maxout 单元
整流线性单元的进一步扩展。
将z分成多个组,每组具有k个值,G表示分组的索引,maxout单元返回每组中的最大元素。第i组:
g
(
z
)
i
=
max
j
∈
G
(
i
)
z
j
g\left( \boldsymbol{z} \right) _i=\underset{j\in \mathbb{G}^{\left( i \right)}}{\max}\ z_j
g(z)i=j∈G(i)max zj
k是人为设定的,利用k可以使用maxout分段拟合任何凸函数。每个maxout单元需要k个权重向量,所以需要更强的正则化。
2.3.3 sigmoid函数
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z)= \frac {1}{1+e^{-z}}
σ(z)=1+e−z1
sigmoid函数在大部分定义域内都是饱和的,只有在0附近才是敏感的。这种饱和特性会使梯度消失。所以这种函数在隐藏单元不再常用。
sigmoid函数在一些不能使用分段激活函数的网络(循环网络/概率模型/自编码器等)中还是常见的。
2.3.4 双曲正切函数(tanh)
g
(
z
)
=
tan
h
(
z
)
g\left( z \right) =\ \tan\text{h}\left( z \right)
g(z)= tanh(z)
图与公式来自百度百科。https://baike.baidu.com/item/%E5%8F%8C%E6%9B%B2%E6%AD%A3%E5%88%87/3194837?fromtitle=tanh&fromid=19711736
tanh函数与sigmoid函数有关系:
tan
h
(
z
)
=
2
σ
(
2
z
)
−
1
\tan\text{h}\left( z \right) =2\sigma \left( 2z \right) -1
tanh(z)=2σ(2z)−1
tanh比sigmoid表现得更好一点。tanh(0)=0,tanh是过原点的,且在原点附近时与单位函数类似,所以在激活区间保持在0附近时,tanh训练比较容易。但是tanh同样存在严重的饱和问题。
一开始,我也不知道单位函数是什么。但是在介绍其他隐藏单元时作者提到了,不加激活函数相当于使用单位函数当作激活函数。那么应该单位函数就是x本身,即 y=x。
2.3.5 其他隐藏单元
还有其他隐藏单元,但是不常用(不好用)。
理论上,可微函数都可以用作激活函数,且表现很好。介绍的都是一些特别有用和特别特别的。
2.3.5.1 没有激活函数(线性激活函数/单位函数)
直接将仿射变换当作激活函数,或者时经过仿射变换后将单位函数当作激活函数。可以在局部使用,以减少参数。
2.3.5.2 softmax函数
有时候可以用。10.12节。
2.3.5.3 径向基函数(RBF)
大部分情况会饱和,很难优化。
h
i
=
e
−
1
σ
i
2
∥
W
:
,
i
−
x
∥
2
h_i=e^{-\frac{1}{\sigma _{i}^{2}}\lVert \boldsymbol{W}_{:,i}-\boldsymbol{x} \rVert ^2}
hi=e−σi21∥W:,i−x∥2
2.3.5.4 softplus函数
软化的relu函数。但是表现并不如relu。
2.3.5.5 硬双曲正切函数
g ( a ) = max ( − 1 , min ( 1 , a ) ) g\left( a \right) =\max \left( -1,\min \left( 1,a \right) \right) g(a)=max(−1,min(1,a))
2.4 架构设计
架构指网络的整体结构:神经元的数量与拓扑链接等。将单元组成层,大多数网络又是将层按照链式结构排列。
2.4.1 链式结构
在链式结构中,要考虑到网络的深度(链的长度)与每一层的宽度。深度越深,拟合能力越强,泛化能力也越强,每一层的宽度越小/参数越少,但是约难以训练。
万能近似定理:包含一层具有足够多神经元(带激活函数)的隐层的神经网络可以以任意精度模拟任何一个连续函数。即MLP可以表示任何函数,但是不能保证训练算法能学到这个函数。而且网络层通常会很大(指数级)。
2.4.2 其他架构
- 不同特定的任务可能需要不同的架构。
比如:在主链中添加跳跃链接。 - 另一个考虑是,层间的链接。默认情况下,层间的链接是线性变化,层间链接上附带一个权重系数,这种链接一般情况下是全连接。但是在特殊结构中可以使用局部全连接,或者系数链接。
三、反向传播训练算法
信息由输入的x到最终的预测y的传递过程是前向传播。反向传播指代价函数的信息通过网络向后流动,以梯度的形式。梯度是可以通过解析表达式获得的,但是按照解析表达式计算开销大。反向传播是计算梯度的算法,而基于梯度的随机梯度下降等算法是用于训练网络的算法。
3.1 计算图
用图形表示一个网络。
- 节点:表示一个变量(标量/向量/矩阵/张量/其他变量)
- 操作:一个或多个变量的简单函数。通过将多个操作复合在一起描述更复杂的函数。一个操作仅返回单个输出变量。
- 边:用一条边从输入节点指向输出节点,边上写明操作。
- a: z = xy
- H=relu(WX+b),u1代表WX这个中间结果,u2代表WX+b的中间结果
3.2 链式法则与反向传播
反向传播的本质是链式法则下导数的计算。
链式法则:
d
z
d
x
=
d
z
d
y
d
y
d
x
\frac{dz}{dx}=\frac{dz}{dy}\frac{dy}{dx}
dxdz=dydzdxdy
在计算张量/向量形式的梯度时,简单的链式法则会导致重复的表达式计算,造成计算的浪费。反向传播结合动态规划的思想,对链式法则的计算过程进行了改进,以一定量的存储提升速度。
正向传播与反向传播的图示:
3.3 全连接MLP中的反向传播
符号定义:每一层接收的输入hk-1,权重矩阵W,偏置项b,中间变量a,这一层的输出hk,输出预测y,代价函数J,正则化Ω,上一轮保留的梯度g
正向过程:
h
(
k
−
1
)
→
a
(
k
)
(
a
(
k
)
=
W
(
k
)
h
(
k
−
1
)
+
b
(
k
)
)
\boldsymbol{h}^{\left( k-1 \right)}\rightarrow \boldsymbol{a}^{\left( k \right)}\left( \boldsymbol{a}^{\left( k \right)}=\boldsymbol{W}^{\left( k \right)}\boldsymbol{h}^{\left( k-1 \right)}+\boldsymbol{b}^{\left( k \right)} \right)
h(k−1)→a(k)(a(k)=W(k)h(k−1)+b(k))
a
(
k
)
→
h
(
k
)
(
h
(
k
)
=
f
(
a
(
k
)
)
)
\boldsymbol{a}^{\left( k \right)} \rightarrow \boldsymbol{h}^{\left( k \right)}\left( \boldsymbol{h}^{\left( k \right)}=f\left( \boldsymbol{a}^{\left( k \right)} \right) \right)
a(k)→h(k)(h(k)=f(a(k)))
→
y
^
→
J
(
J
=
L
(
y
^
,
y
)
+
λ
Ω
(
θ
)
)
\rightarrow \boldsymbol{\hat{y}}\rightarrow J\left( J=L\left( \boldsymbol{\hat{y},y} \right) +\lambda \varOmega \left( \theta \right) \right)
→y^→J(J=L(y^,y)+λΩ(θ))
反向传播:
J
→
y
^
,
g
=
∂
J
∂
y
^
=
∂
L
(
y
^
,
y
)
∂
y
^
J\rightarrow \hat{y}\ ,\ g=\frac{\partial J}{\partial \hat{y}}=\frac{\partial L(\hat{y},y)}{\partial \hat{y}}
J→y^ , g=∂y^∂J=∂y^∂L(y^,y)
y
^
(
h
(
l
)
)
→
a
,
g
=
∂
J
∂
a
←
g
⊙
∂
h
∂
a
=
g
⊙
f
′
(
a
)
\hat{y}\left( h^{\left( l \right)} \right) \rightarrow a,\,\,g=\frac{\partial J}{\partial a}\gets g\odot \frac{\partial h}{\partial a}=g\odot f'\left( a \right)
y^(h(l))→a,g=∂a∂J←g⊙∂a∂h=g⊙f′(a)
a由三个变量组成,分别传播
a
→
W
,
∂
J
∂
W
=
∂
L
∂
W
+
λ
∂
Ω
∂
W
=
g
∂
a
∂
W
+
λ
∂
Ω
∂
W
=
g
h
(
k
−
1
)
T
+
λ
∂
Ω
∂
W
a\rightarrow W,\,\,\frac{\partial J}{\partial W}=\frac{\partial L}{\partial W}+\lambda \frac{\partial \varOmega}{\partial W}=g\frac{\partial a}{\partial W}+\lambda \frac{\partial \varOmega}{\partial W} =gh^{\left( k-1 \right)T}+\lambda \frac{\partial \varOmega}{\partial W}
a→W,∂W∂J=∂W∂L+λ∂W∂Ω=g∂W∂a+λ∂W∂Ω=gh(k−1)T+λ∂W∂Ω
a
→
b
,
∂
J
∂
b
=
∂
L
∂
b
+
λ
∂
Ω
∂
b
=
g
∂
a
∂
b
+
λ
∂
Ω
∂
b
=
g
+
λ
∂
Ω
∂
b
a\rightarrow b,\,\,\frac{\partial J}{\partial b}=\frac{\partial L}{\partial b}+\lambda \frac{\partial \varOmega}{\partial b}=g\frac{\partial a}{\partial b}+\lambda \frac{\partial \varOmega}{\partial b} =g+\lambda \frac{\partial \varOmega}{\partial b}
a→b,∂b∂J=∂b∂L+λ∂b∂Ω=g∂b∂a+λ∂b∂Ω=g+λ∂b∂Ω
a
→
h
,
g
=
∂
J
∂
h
=
∂
L
∂
h
←
g
∂
a
∂
h
=
W
(
k
)
T
g
a\rightarrow h,\,\,g=\frac{\partial J}{\partial h}=\frac{\partial L}{\partial h}\ \gets g\frac{\partial a}{\partial h}=W^{\left( k \right) T}g
a→h,g=∂h∂J=∂h∂L ←g∂h∂a=W(k)Tg
注意到,只有在传播的主干路径上,g才会被更新(y,h,a,h,a……),而枝干路径上,只是利用g计算,不更新g(W,b)。
构造导数的计算图(图来自花书):
参考资料
1.机器学习,周志华
2.统计学习方法,第二版,李航
3.https://zhuanlan.zhihu.com/p/38431213
4.https://github.com/MingchaoZhu/DeepLearning
5.https://www.bilibili.com/video/BV1kE4119726?p=5&t=1340
6.https://blog.csdn.net/a790209714/article/details/78440223
7.https://www.cnblogs.com/missidiot/p/9378079.html