初始化
深度学习模型训练本质——参数
ω
的更新
深度学习模型训练本质——参数\omega的更新
深度学习模型训练本质——参数ω的更新
初始点选取影响算法收敛性和其收敛时所到达的代价高低,当初始化过大时,会造成梯度爆炸,相对应过小时会造成梯度消失
好的初始化要求两点,既要保证神经元各层激活值不会饱和,又要保证各层激活值不会为
0
0
0,接下来介绍几种初始化方法
全零初始化
顾名思义,全零初始化就是将参数全部初始化为
0
0
0,过程较为简单,无需考虑各种其他因素,但是同一层的神经元会学习到相同的特征,不能破坏不同神经元的对称性质,由此我们知道,将参数初始化为任意常数所造成的效果相同,即都无法解决相同层的不同神经元的对称性。我们可知,利用这种方法进行初始化,所有神经元的输出都是相同的,除了输出之外所有的中间层的节点都是
0
0
0,在第一次误差反向传播时,更新后的网络参数将会相同,在下一次更新时,相同的网络参数学习提取不到有用的特征,因此深度学习模型都不会使用
0
0
0初始化所有参数
随机初始化
将参数初始化为小的随机数。一般随机值从均值为 μ \mu μ,标准差是 σ \sigma σ的高斯分布中取样,最终参数的每个维度来自一个多维的高斯分布。
(一)
(一)
(一)若参数初始值取得太小,在反向传播时会导致小的梯度,对于深度网络来说,会产生梯度弥散问题,会降低参数的收敛速度,如下图所示
可看到,随着层数的增加,输出值迅速向0靠拢,以至于
x
x
x在后几层都接近于
0
0
0,导致梯度极小,参数难以更新
(二)
(二)
(二)若参数初始值取得太大,那么神经元会容易饱和
可看到,所有的
x
x
x值集中于
−
1
-1
−1和
1
1
1,即神经元饱和,梯度为0,参数难以更新
输入输出方差一致
为了使得在经过多层网络后,信号不被过分放大或过分减弱,我们尽可能保持每个神经元的输入和输出的方差一致
v
a
r
[
a
l
]
=
v
a
r
[
∑
i
=
0
n
(
l
−
1
)
w
i
l
a
i
(
l
−
1
)
]
var[a^l]=var[\sum^{n^{(l-1)}}_{i=0}w^l_ia^{(l-1)}_i]
var[al]=var[∑i=0n(l−1)wilai(l−1)]
=
∑
i
=
1
n
(
l
−
1
)
v
a
r
[
w
i
l
]
v
a
r
[
a
i
(
l
−
1
)
]
=\sum^{n^{(l-1)}}_{i=1}var[w^l_i]var[a^{(l-1)}_i]
=∑i=1n(l−1)var[wil]var[ai(l−1)]
=
n
(
l
−
1
)
v
a
r
[
w
i
l
]
v
a
r
[
a
i
(
l
−
1
)
]
=n^{(l-1)}var[w^l_i]var[a^{(l-1)}_i]
=n(l−1)var[wil]var[ai(l−1)]
其中,
a
(
l
−
1
)
a^{(l-1)}
a(l−1)为第
l
−
1
l-1
l−1层的输入,
a
l
a^l
al为第
l
l
l层的输出,因此
n
(
l
−
1
)
v
a
r
[
w
i
l
]
=
1
n^{(l-1)}var[w^l_i]=1
n(l−1)var[wil]=1,所以
v
a
r
[
w
i
l
]
=
1
n
(
l
−
1
)
var[w^l_i]={1 \over n^{(l-1)}}
var[wil]=n(l−1)1
Xavier初始化
保持每一层的输入和输出的方差一致,将参数初始化为
W
[
l
]
W^{[l]}
W[l]~
N
(
μ
=
0
,
σ
2
=
1
n
[
l
−
1
]
)
,
b
[
l
]
=
0
N(\mu=0,\sigma^2={1 \over n^{[l-1]}}),b^{[l]}=0
N(μ=0,σ2=n[l−1]1),b[l]=0
其中,
W
[
l
]
W^{[l]}
W[l]为
l
l
l层的所有权重,是从均值
μ
=
0
\mu=0
μ=0,方差
σ
2
=
1
n
[
l
−
1
]
\sigma^2={1 \over n^{[l-1]}}
σ2=n[l−1]1的正态分布中随机选取的,
n
[
l
−
1
]
n^{[l-1]}
n[l−1]是层
l
−
1
l-1
l−1中神经元的数量;偏置
b
b
b被初始化为
0
0
0
改方法适用于激活函数为
f
(
x
)
=
t
a
n
h
(
x
)
f(x)=tanh(x)
f(x)=tanh(x)时,缺点是没有考虑激活函数对数据分布的影响
He初始化
在
R
e
l
u
Relu
Relu网络中,假定每一层有一半的神经元被激活,另一半为
0
0
0,所以,要保持
v
a
r
var
var不变,只需要在
X
a
v
i
e
r
Xavier
Xavier的基础上再除以
2
2
2,即将参数初始化为:
W
[
l
]
W^{[l]}
W[l]~
N
(
μ
=
0
,
σ
2
=
2
n
[
l
−
1
]
)
,
b
[
l
]
=
0
N(\mu=0,\sigma^2={2 \over n^{[l-1]}}),b^{[l]}=0
N(μ=0,σ2=n[l−1]2),b[l]=0
其中,
W
[
l
]
W^{[l]}
W[l]为
l
l
l层的所有权重,是从均值
μ
=
0
\mu=0
μ=0,方差
σ
2
=
2
n
[
l
−
1
]
\sigma^2={2 \over n^{[l-1]}}
σ2=n[l−1]2的正态分布中随机选取的,
n
[
l
−
1
]
n^{[l-1]}
n[l−1]是层
l
−
1
l-1
l−1中神经元的数量;偏置
b
b
b被初始化为
0
0
0
考虑了
R
e
l
u
Relu
Relu对输出数据分布的影响,使得输入和输出的方差保持一致,适用于激活函数为
R
e
l
u
Relu
Relu
参数调节
常用超参数
- 学习率 α \alpha α
- 动量衰减参数 β \beta β
- 各隐藏层神经元个数
- m i n i − b a t c h mini-batch mini−batch的大小
- A d a m Adam Adam优化算法的超参数
- L a y e r s Layers Layers:神经网络层数
- d e c a y r a t e decay_rate decayrate:学习衰减率
学习率
学习率决定每次训练前进的步长大小,学习率过小则训练时间太长,学习率过大则导致训练结果发散,下图为学习率与损失值关系
m i n i − b a t c h mini-batch mini−batch
m
i
n
i
−
b
a
t
c
h
mini-batch
mini−batch过大导致训练时间太长,过小导致内部占用太大并影响准确率,由于计算机内部采用二进制,所以通常采用
2
,
4
,
8
,
16
,
(
32
,
64
,
128
,
256
)
,
512
,
1024
2,4,8,16,(32,64,128,256),512,1024
2,4,8,16,(32,64,128,256),512,1024,而一般情况下
(
32
,
64
,
128
,
256
)
(32,64,128,256)
(32,64,128,256)较为合适,下图为学习准确率
(
l
r
)
(lr)
(lr)与批量值大小
(
b
a
t
c
h
s
i
z
e
)
(batchsize)
(batchsize)之间的关系
训练技巧
- 梯度裁剪,防止梯度爆炸
- 迁移学习,原数据集所得迁移至目标数据集,加快训练速度
- 微调,原数据集预训练模型,创建新的神经网络模型后复制原模型中除输出层的模型设计和参数设置,并随机初始化输出层目标参数,训练目标模型,其余参数基于原模型进行微调
试错法
流程简单、经典,遵循学习过程的所有步骤(从数据收集到特征图映射的可视化),然后在超参数上依次迭代直到时间终止
网格搜索
三个或更少超参数时,常用超参数搜索方法为网格搜索。对于每个超参数,使用者选择一个较小的有限值集去探索。然后,这些超参数笛卡尔乘积得到一组组超参数,网格搜索使用每组超参数训练模型。挑选验证集误差最小的超参数作为最好的超参数
随机搜索
网格搜索和随机搜索之间唯一的区别在于策略周期的第一步:随机搜索在配置空间上随机选择点
网格搜索 | 随机搜索 | 两者缺点 |
---|---|---|
适用于三四个超参数计算 | 指数级更高效 | 每一次新猜测都独立于之前的训练 |
贝叶斯优化
构建一个代理模型,该模型试图从配置中预测实验关注目标
- 构建模型
- 选择超参数
- 训练评估
- 优化模型,返回第二步
以高斯过程为代理过程,学习参数设置到相关度量的映射,不仅将预测转换为值,还会提供不确定性范围(均值和方差)