cs231n 笔记 --- 训练配置细节

cs231n Stanford

包含:交叉验证,梯度弥散与梯度爆炸,激活函数,数据预处理,权重初始化,Batch Normalization ,最优化算法,dropout。


交叉验证

一般将数据划分成训练集,验证集和测试集三部分。测试集只有在训练完成后才能动,用来评估模型的泛化能力。而验证集是用来选择最优超参数 ( 如:学习率,正则化系数等 ) ,即利用训练集,并以一系列的超参数组合配置模型,训练出多个模型,用验证集评估模型的好坏,选取最优模型对应的超参数组合用于后续的训练。但是这种方法不能充分利用验证集,因此就有了交叉验证。

交叉验证

交叉验证就是将训练数据 ( 训练集 + 验证集 ) 切分成 n 份,以 n-1 份作为训练集,剩下的 1 份作为验证集,然后对某组超参数配置进行训练,迭代而不重复地更换验证集,训练出 n 份结果,对这 n 份结果取平均,就得到这组超参数配置的训练结果。最后取平均值最好的那组超参数配置,对所有训练数据进行训练就行。


梯度弥散与梯度爆炸

反向传播时,某一权值的梯度一般等于:输入 * 激励导数 * 上一层梯度,并且根据 chain rule 多层间的梯度是要累乘的,小于 1 的数垒乘将趋于 0 ,大于 1 的数垒乘将趋于 ∞ 。因此 输入 * 激励导数 过大时会导致梯度很大,即梯度爆炸,网络无法收敛;输入 * 激励导数 过小时会导致梯度很小,即梯度弥散,网络收敛极慢或无法收敛。


激活函数

sigmoid

sigmoid

该激活函数有三个不好的特性:

  • 当输入 x 过大或过小时 ( 曲线的左右两端 ) 梯度几乎等于 0 ,在反向传播时,由 chain rule 可知,反向传播的梯度也将等于 0 ,从而出现梯度弥散。
  • 其输出不是 0 中心的,全大于 0 ,后面的神经元的输入将全为正数,那么其反向传播过程中,权重的梯度也将全为正数或全为负数。出现锯齿形步进式收敛,收敛速度慢。
  • exp() 的计算速度较慢。

tanh

tanh

相对于 sigmoid 解决了输出不是 0 中心化的问题,不会出现锯齿形收敛问题。但其他问题仍然存在。

ReLu

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

作用:对输入的每个特征进行近似高斯化处理。

Batch Normalization 过程

其中的 γ 和 β 都是可学习的,当学习到的 γ 和 β 分别为输入的方差和均值时,能抵消 BN 的作用。并且 BN 是可微的,能反向传播,可查看 BN 反向传播推导。在测试阶段,BN 中的均值和方差不再改变,可取训练时记录的平均,即能近似得到全部数据的均值和方差。

一般在 FC 或 CONV 与 激励函数之间插入 BN 层,形如 FC–BN–ReLu 或 Conv–BN–ReLu 。

BN能发挥的作用:

  • 增加了梯度的流动,能同时解决梯度弥散和梯度爆炸问题
  • 支持更高的学习率
  • 对初始化要求小
  • 能起到正则化的左右,可减少 Dropout 的使用 ( 可能是因为 BN 把 batch 中的样本融合了,能有效防止过拟合 )

最优化算法
zhihu
1. 梯度下降 SGD
x+=learning_ratedx x + = − l e a r n i n g _ r a t e ∗ d x
缺点:会来回跳动。在某个方向上梯度较陡峭,导致跟新过大而抖动;而在另一个方向上梯度较平滑,导致更新过小而收敛慢。

  1. 动量更新 momentum update
    v=muvlearning_ratedx 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.9

  2. Nesterov 动量更新
    计算 x += momentum 点处的梯度,而不是原始点的梯度;将新梯度与动量一起更新权重
    vt=muvt1learning_rated(xt1+muvt1) 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=xt1+muvt1 x t = x t − 1 + m u ∗ v t − 1
    vprev=v v p r e v = v
    v=muvlearning_ratedxt v = m u ∗ v − l e a r n i n g _ r a t e ∗ d x t
    x+=muvprev+(1+mu)v x + = − m u ∗ v p r e v + ( 1 + m u ) ∗ v

  3. Adagrad 更新
    二阶动量更新
    cache+=dx2 c a c h e + = d x ∗ ∗ 2
    x+=learning_ratedx/(sqrt(cache)+1e7) 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 .

  4. RMSProp
    cache=decay_ratecache+(1decay_rate)(dx2) 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_ratedx/(sqrt(cache)+1e7) 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 的问题。

  5. Adam
    动量更新 + RMSProp
    m=beta1m+(1beta1)dx m = b e t a 1 ∗ m + ( 1 − b e t a 1 ) ∗ d x
    v=beta2v+(1beta2)(dx2) v = b e t a 2 ∗ v + ( 1 − b e t a 2 ) ∗ ( d x ∗ ∗ 2 )
    x+=learning_ratem/(sqrt(v)+1e7) 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

  6. 学习率主动衰减 learning rate decay
    指数衰减: α=α0ekt α = α 0 e − k t
    1/t 衰减: α=α0/(1+kt) α = α 0 / ( 1 + k t )
    k 为超参数,t 为迭代次数。

  7. 二阶优化–牛顿法
    直观理解上,Hessian矩阵描述了损失函数的局部曲率,从而使得可以进行更高效的参数更新。具体来说,就是乘以Hessian转置矩阵可以让最优化过程在曲率小的时候大步前进,在曲率大的时候小步前进。需要重点注意的是,在这个公式中是没有学习率这个超参数的,这相较于一阶方法是一个巨大的优势。


dropout
随机使部分神经元输出 0 (前向+后向);使结果以来更多特征,而不是某几个特征。
测试时:
1. 使用 dropout ,每次都不一样,测试出不同的结果,取平均,与 monta carlor 近似,效率低;
2. 不使用 dropout,在训练时,将不失活的神经元输出乘以一定的系数,如 1/(1dropout_rate) 1 / ( 1 − d r o p o u t _ r a t e ) ,或者在测试是乘以 dropout_rate 。从而使测试时神经元的预期输出与训练时一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值