包含:交叉验证,梯度弥散与梯度爆炸,激活函数,数据预处理,权重初始化,Batch Normalization ,最优化算法,dropout。
交叉验证
一般将数据划分成训练集,验证集和测试集三部分。测试集只有在训练完成后才能动,用来评估模型的泛化能力。而验证集是用来选择最优超参数 ( 如:学习率,正则化系数等 ) ,即利用训练集,并以一系列的超参数组合配置模型,训练出多个模型,用验证集评估模型的好坏,选取最优模型对应的超参数组合用于后续的训练。但是这种方法不能充分利用验证集,因此就有了交叉验证。
交叉验证就是将训练数据 ( 训练集 + 验证集 ) 切分成 n 份,以 n-1 份作为训练集,剩下的 1 份作为验证集,然后对某组超参数配置进行训练,迭代而不重复地更换验证集,训练出 n 份结果,对这 n 份结果取平均,就得到这组超参数配置的训练结果。最后取平均值最好的那组超参数配置,对所有训练数据进行训练就行。
梯度弥散与梯度爆炸
反向传播时,某一权值的梯度一般等于:输入 * 激励导数 * 上一层梯度,并且根据 chain rule 多层间的梯度是要累乘的,小于 1 的数垒乘将趋于 0 ,大于 1 的数垒乘将趋于 ∞ 。因此 输入 * 激励导数 过大时会导致梯度很大,即梯度爆炸,网络无法收敛;输入 * 激励导数 过小时会导致梯度很小,即梯度弥散,网络收敛极慢或无法收敛。
激活函数
sigmoid
该激活函数有三个不好的特性:
- 当输入 x 过大或过小时 ( 曲线的左右两端 ) 梯度几乎等于 0 ,在反向传播时,由 chain rule 可知,反向传播的梯度也将等于 0 ,从而出现梯度弥散。
- 其输出不是 0 中心的,全大于 0 ,后面的神经元的输入将全为正数,那么其反向传播过程中,权重的梯度也将全为正数或全为负数。出现锯齿形步进式收敛,收敛速度慢。
- exp() 的计算速度较慢。
tanh
相对于 sigmoid 解决了输出不是 0 中心化的问题,不会出现锯齿形收敛问题。但其他问题仍然存在。
ReLu
表达式:max(0, x) ,x 为输入。
特点:
- 不限制 x > 0 的梯度,但当 x < 0 时,梯度等于 0 ,即出现部分梯度弥散。
- 输出不是 0 中心化。
因为当 x < 0 时,梯度等于 0 ,所以可能出现对于某部分数据,ReLu 将不被激活,也就不再更新权重,即 Dead ReLu 问题。可以通过调低学习率,重新初始化,并把神经元的 bias 初始化为一个小的正值,如 0.01 。
Leaky ReLu
表达式:max(0.01*x, x) 。改善了 dead ReLu 问题。
Parame ReLu
表达式:max(α*x, x) 。α 可学习。
ELU Exp Linear Unit
表达式:max(α(exp(x)-1), x) 。接近 0 中心输出。
Maxout Neuron
表达式: max(WT1x+b1,WT2x+b2) m a x ( W 1 T x + b 1 , W 2 T x + b 2 ) 。一个神经元有两套权重。没有梯度弥散和 Dead ReLu ,但有两倍的参数量。
数据预处理
0 中心化
减去训练集求得的均值。AlexNet:减去平均 image ( [32, 32, 3] ) ;VGGNet:减去平均 channel ( [3] ) 。
标准化
减去均值后,除以标准差。图像中不常用。
PCA
PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。CodingLabs
图像处理中不常用
白化处理
举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的。白化的目的就是降低输入的冗余性;更正式的说,我们希望通过白化过程使得学习算法的输入具有如下性质:(i)特征之间相关性较低;(ii)所有特征具有相同的方差。ufldl
权重初始化
初始化为 0
若所有权重都初始化为 0 ,那么所有的神经元的数值运算将完全一样。
初始化为小随机值
W = 0.01 * np.random.randn()
这种初始化对于较浅的网络 ( 2~3 层 ) 可以工作,但对于深层网络,其输出将趋于 0 ,从而导致梯度趋于 0 。
初始化为大的随机值
W = 1 * np.random.randn()
将导致 tanh 或 sigmoid 输出饱和,从而梯度也为 0 。
Xavier初始化
目的:使所有神经元的的输出近似同分布。
w = np.random.randn(n) / sqrt(n) # n is the shape of input
在使用 tanh 作为激励函数效果较好,方差下降较慢 ( 由于 tanh 的非线性变换,方差下降即输出趋于 0 ) 。但是使用 ReLu 时,方差下降较快 ( 由于 ReLu 截断负值输出,使输出标准差减半 ) ,初始化可修改为:
w = np.random.randn(n) * sqrt(2.0/n)
可以看出,我们希望神经元的输出接近高斯分布,才能让网络有效地学习。
Batch Normalization
作用:对输入的每个特征进行近似高斯化处理。
其中的 γ 和 β 都是可学习的,当学习到的 γ 和 β 分别为输入的方差和均值时,能抵消 BN 的作用。并且 BN 是可微的,能反向传播,可查看 BN 反向传播推导。在测试阶段,BN 中的均值和方差不再改变,可取训练时记录的平均,即能近似得到全部数据的均值和方差。
一般在 FC 或 CONV 与 激励函数之间插入 BN 层,形如 FC–BN–ReLu 或 Conv–BN–ReLu 。
BN能发挥的作用:
- 增加了梯度的流动,能同时解决梯度弥散和梯度爆炸问题
- 支持更高的学习率
- 对初始化要求小
- 能起到正则化的左右,可减少 Dropout 的使用 ( 可能是因为 BN 把 batch 中的样本融合了,能有效防止过拟合 )
最优化算法
zhihu
1. 梯度下降 SGD
x+=−learning_rate∗dx
x
+
=
−
l
e
a
r
n
i
n
g
_
r
a
t
e
∗
d
x
缺点:会来回跳动。在某个方向上梯度较陡峭,导致跟新过大而抖动;而在另一个方向上梯度较平滑,导致更新过小而收敛慢。
动量更新 momentum update
v=mu∗v−learning_rate∗dx v = m u ∗ v − l e a r n i n g _ r a t e ∗ d x
x+=v x + = v
特点:v 以一定比例 mu 融合了各次梯度。由于 v 与 dx 符号相同时累加,能加快平滑区的更新;当 v 与 dx 符号相反时,能减小陡峭区的抖动。
mu 一般设为 0.9Nesterov 动量更新
计算 x += momentum 点处的梯度,而不是原始点的梯度;将新梯度与动量一起更新权重
vt=mu∗vt−1−learning_rate∗d(xt−1+mu∗vt−1) v t = m u ∗ v t − 1 − l e a r n i n g _ r a t e ∗ d ( x t − 1 + m u ∗ v t − 1 )
xt+=vt x t + = v t
可以重写成与 SGD 和 momentum update 一致的形式:
xt=xt−1+mu∗vt−1 x t = x t − 1 + m u ∗ v t − 1
vprev=v v p r e v = v
v=mu∗v−learning_rate∗dxt v = m u ∗ v − l e a r n i n g _ r a t e ∗ d x t
x+=−mu∗vprev+(1+mu)∗v x + = − m u ∗ v p r e v + ( 1 + m u ) ∗ vAdagrad 更新
二阶动量更新
cache+=dx∗∗2 c a c h e + = d x ∗ ∗ 2
x+=−learning_rate∗dx/(sqrt(cache)+1e−7) x + = − l e a r n i n g _ r a t e ∗ d x / ( s q r t ( c a c h e ) + 1 e − 7 )
特点:自适应学习率,每个参数都有不一样的学习率。梯度大的方向,学习率会变小;梯度小的方向,学习率会变大。但越往后学习率趋于 0 .RMSProp
cache=decay_rate∗cache+(1−decay_rate)∗(dx∗∗2) c a c h e = d e c a y _ r a t e ∗ c a c h e + ( 1 − d e c a y _ r a t e ) ∗ ( d x ∗ ∗ 2 )
x+=−learning_rate∗dx/(sqrt(cache)+1e−7) x + = − l e a r n i n g _ r a t e ∗ d x / ( s q r t ( c a c h e ) + 1 e − 7 )
特点:cache 第一部分更新能衰减,第二部分能“泄露”。能改善学习率趋于 0 的问题。Adam
动量更新 + RMSProp
m=beta1∗m+(1−beta1)∗dx m = b e t a 1 ∗ m + ( 1 − b e t a 1 ) ∗ d x
v=beta2∗v+(1−beta2)∗(dx∗∗2) v = b e t a 2 ∗ v + ( 1 − b e t a 2 ) ∗ ( d x ∗ ∗ 2 )
x+=−learning_rate∗m/(sqrt(v)+1e−7) x + = − l e a r n i n g _ r a t e ∗ m / ( s q r t ( v ) + 1 e − 7 )
m:同符号累加,能加速;不同符号累加,能减速
v:对不同方向有不同的减速
超参数 beta1 和 beta2 通常设为 0.9 和 0.995学习率主动衰减 learning rate decay
指数衰减: α=α0e−kt α = α 0 e − k t
1/t 衰减: α=α0/(1+kt) α = α 0 / ( 1 + k t )
k 为超参数,t 为迭代次数。二阶优化–牛顿法
直观理解上,Hessian矩阵描述了损失函数的局部曲率,从而使得可以进行更高效的参数更新。具体来说,就是乘以Hessian转置矩阵可以让最优化过程在曲率小的时候大步前进,在曲率大的时候小步前进。需要重点注意的是,在这个公式中是没有学习率这个超参数的,这相较于一阶方法是一个巨大的优势。
dropout
随机使部分神经元输出 0 (前向+后向);使结果以来更多特征,而不是某几个特征。
测试时:
1. 使用 dropout ,每次都不一样,测试出不同的结果,取平均,与 monta carlor 近似,效率低;
2. 不使用 dropout,在训练时,将不失活的神经元输出乘以一定的系数,如
1/(1−dropout_rate)
1
/
(
1
−
d
r
o
p
o
u
t
_
r
a
t
e
)
,或者在测试是乘以 dropout_rate 。从而使测试时神经元的预期输出与训练时一致。