深度学习学习笔记
2018-04-09 18:02:23 4 举报
AI智能生成
深度学习学习笔记
作者其他创作
大纲/内容
深度学习
激活函数
Sigmoid函数;y=1/(1+e^-x)
优点
便于求导的平滑函数;
缺点
容易出现梯度消失(gradient vanishing)的现象:优化神经网络的方法是Back Propagation,即导数的后向传递:先计算输出层对应的loss,然后将loss以导数的形式不断向上一层网络传递,修正相应的参数,达到降低loss的目的。 Sigmoid函数在深度网络中常常会导致导数逐渐变为0,使得参数无法被更新,神经网络无法被优化。 原因在于两点:(1) 在sigmoid曲线中容易看出,x较大或较小时,导数接近0,而后向传递的数学依据是微积分求导的链式法则,当前层的导数需要之前各层导数的乘积,几个小数的相乘,结果会很接近0 (2) Sigmoid导数的最大值是0.25(当x=0时),这意味着导数在每一层至少会被压缩为原来的1/4,通过两层后被变为1/16,…,通过10层后为1/1048576。请注意这里是“至少”,导数达到最大值这种情况还是很少见的,所以用sigmoid函数会让训练深层网络变得困难。
Sigmoid的输出不是0均值(zero-centered)的:Sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。对sigmoid(sum( w_i x_i + b)),如果所有x_i均为正数或负数,那么其对w_i的导数总是正数或负数,导致阶梯式更新
幂运算相对耗时
tanh函数;y=(e^x-e^-x)/(e^x+e^-x)
将输出值压缩到 -1~1 的范围,因此它是0均值的,解决了Sigmoid函数的非zero-centered问题
梯度消失
解决了梯度消失的问题
计算速度非常快,只需要判断输入是否大于0
收敛速度远快于Sigmoid和tanh
输出不是0均值
Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法
解决Dead ReLU Problem,提出了将ReLU的前半段设为0.01x而非0。另外一种直观的想法是基于参数的方法,也就是说前半段的斜率是学习得来的
在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。
ELU函数;
解决Dead ReLU问题
输出均值接近0
计算量稍大
实际用起来不能证明总是优于ReLU
调节过拟合欠拟合
调节欠拟合(高偏差)
使用更大的网络
训练更长时间
使用可能更合适的网络结构
解决过拟合(高方差)
获得更多的数据
收集更多数据
数据集扩增
正则化
普通正则化
随机失活正则化,在计算机视觉领域,这个算法应用非常广泛
使用可能更适合的网络结构
加速训练过程
输入归一化
归一化是非常常用的数据预处理操作。数据中常存在奇异样本数据,奇异样本数据存在所引起的网络训练时间增加,并可能引起网络无法收敛。为了避免出现这种情况及后面数据处理的方便,加快网络学习速度,可以对输入进行归一化,使得所有样本的输入信号其均值接近于0或与其均方差相比很小。
使用小随机数初始化或者Xavier 初始化
Xavier初始化可以对避免DeadReLU问题有帮助;对解决梯度消失与梯度爆炸也有帮助
使用不同的优化方法
小批量梯度下降(mini-batch gradient descent)
既可以通过向量化计算进行加速,也避免了批量梯度运算量太大的缺点。一般设为2的幂数,mini-batch的大小一定要是可以放入CPU/GPU内存的
选择合适的learning rate比较困难,如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。
这种方法是对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。
SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点。对于非凸函数,因为鞍点周围的error 是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。
动量梯度下降算法(Momentum)
计算梯度的指数加权平均,然后用这个梯度来更新参数,指数加权平均后,减少在非梯度下降方向的振荡;beta = 0.9比较普遍,一般不需要偏差修正;
解决了SGD的第一个缺点:momentum能够在梯度方向加速SGD,抑制振荡,从而加快收敛
相当于小球从山上滚下来时是在盲目地沿着坡滚,如果它能具备一些先知,例如快要上坡时,就知道需要减速了的话,适应性会更好。
NAG(Nesterov accelerated gradient)
NAG项在梯度更新时做一个校正,避免前进太快,同时提高灵敏度。NAG 会先在前一步的累积梯度上(brown vector)有一个大的跳跃,然后衡量一下梯度做一下修正(red vector),这种预期的更新可以避免我们走的太快。NAG 可以使 RNN 在很多任务上有更好的表现。
Adagrad
可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性,例如识别 Youtube 视频里面的猫,训练 GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。
前期g_t较小的时候,regularizer较大,能够放大梯度 后期g_t较大的时候,regularizer较小,能够约束梯度
适合处理稀疏梯度
仍依赖人工设置一个全局学习率
eta设置过大的话,会使regularizer过于敏感,对梯度的调节太大
中后期,分母上梯度平方的累加将会越来越大,使gradient趋于0,使得训练提前结束
Adadelta
RMSprop
RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的
Adam
这个算法是另一种计算每个参数的自适应学习率的方法。除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值。Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,
结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
对内存需求较小
为不同的参数计算不同的自适应学习率
适用于大多非凸优化
适用于大数据集和高维空间
学习速率衰减
策略1:无需使用固定的学习速率,并随着时间的推移而令它下降。如果训练不会改善损失,我们可根据一些周期函数 f 来改变每次迭代的学习速率。每个 Epoch 的迭代次数都是固定的。这种方法让学习速率在合理的边界值之间周期变化。这是有益的,因为如果我们卡在鞍点上,提高学习速率可以更快地穿越鞍点。
策略2:常用的方法是由 Loshchilov&Hutter [6] 提出的预热重启(Warm Restarts)随机梯度下降。这种方法使用余弦函数作为周期函数,并在每个周期最大值时重新开始学习速率。「预热」是因为学习率重新开始时并不是从头开始的,而是由模型在最后一步收敛的参数决定的 [7]。
差异学习(different learning)在训练期间为网络中的不同层设置不同的学习速率。这种方法与人们常用的学习速率配置方法相反,常用的方法是训练时在整个网络中使用相同的学习速率。
调节超参数
最重要
学习速率Alpha
次一级
mini-batch 尺寸
动量梯度下降的参数
Adam优化算法的参数
隐藏单元个数
再次一级
网络层数
使用学习速率衰减
Batch Normalization
对隐藏层的输入结果进行像之前那样的normalization 处理
0 条评论
回复 删除
下一页