深度学习的训练技巧总结--台大李宏毅机器学习课程笔记

主要记录一些学习过程,以后查阅也方便,来源:李宏毅机器学习课程

Early Stopping 

此时提前停止的testing set是有label的data,一般是自己划分出来的Val验证集数据或类似kaggle的public set 

Regularization

 \eta \lambda都是很小的值,因此每次update之前就相当于乘上一个接近1的数,比如0.99,这相当于前面越来越接近0,相当于在做weight decay。但是深度学习中正则化(Regularization)一般并没有SVM那样明显有帮助。正则化与early stopping所做的事是比较接近的,都是使参数不要离零太远。

 每一次update参数时,如果w为正,就是减去一个值让参数变大。如果w是特别大的正值,对于L2正则化减去的也很大,但对于L1减去的都差不多,因此L1可能会保留很多很大的值。如果考虑很小的值比如0.1,0.001,L2下降的就会很慢,因此会保留很多很小的值,而L1减去的值都是固定的值(+1或-1),因此L1的结果比较稀疏。

Dropout

training阶段每一个神经元被丢掉的概率都是p%,每一次update前都进行上图所示的dropout。 在testing时,不进行dropout,如果训练的dropout是p%,那么测试时weights都会乘上(1-p)%,这些不需要自己操作,pytorch、tensorflow等工具都已经做好了。

 上图所示,如果不乘一个值,那么就会不匹配z' = 2z,而都乘0.5时就基本相同了。

 其实dropout也相当于一种ensemble方法

上面两幅图就是典型的ensemble思想,dropout与此十分相似。 

每次都只用一个minibatch去train网络,每次都随机使用dropout,因此实际相当于训练了很多个network,如下图所示:

 注意:每层的weight是共享的

ensmeble思想如上图,将所有networks每个都丢一个minibatch然后输出结果进行平均,但上述实际运算太复杂,而神奇的是做测试时不做dropout,而给整个网络乘上(1-p)%效果是和ensmeble完全一样的。

New activation function

如果使用sigmoid函数,当layer越来越多时,准确率会大幅下降(在手写体数字数据集上)。这并不是由于过拟合造成,主要是因为梯度消失问题。靠近input层的梯度很小,学习也很慢;但靠近output的梯度已经很大,学习非常快,甚至已经收敛(这时候会进入local min);而且此时参数可能时random的,输出就已经收敛,这种结果是非常差的。

如何改变上述这种情况呢?可能你会想到增大输入的\Delta \omega\partial C/\partial w = ?\Delta C/\Delta w  C:cost、w:参数),那么Sigmoid函数(上图)即使input变化很大,output变化也很小,即会衰减,而通过的sigmoid越多(即network越深),衰减的也越多,所以可以看出即使\Delta \omega变化很大,造成sigmoid的input变化很大,但经过sigmoid的output变化很小,最终对输出的影响与cost也很小 ,即很难改变上述情况。

后来人们发现改一下激活函数就能有比较好的效果(即能处理梯度消失这个问题,另外它的计算速度也比sigmoid快得多),比较有代表性的就是ReLU(目前很多深度神经网络都采用ReLU)。RuLU激活函数如下图所示:

当input>0时,input= output, 即此时是线性的

当input<0时,output=0,此时这个neuron即可删掉

假设我们有下图全是ReLU激活函数的神经网络,我们将output=0的拿掉后就可以得到下图二所示的网络。

此时剩下的都是input=output的,而且是线性的,那么此时就不会出现前面sigmoid出现的衰减的问题。

注意:此时整个网络并不是线性的。

ReLU的变体:Leaky ReLU

使input<0时依旧有微分值

ReLU的变体:Parametric ReLU

参数\alpha可以通过训练数据可以学出来

Maxout(ReLU是Maxout的一种特殊情况)

是一种学习的激活函数,如下图所示,红色框圈出来就是它的形式,它实际是将经过神经元的值分成group,然后选择每个group里的最大值。

从上图可以看出,当element=2时,某一个输入对应的w和b都是0的时候,取max(z1,z2)即可得到和ReLU相同的激活函数。而element不同,其形式也会不同,如下图所示。

Adaptive Learning Rate

Adagard

其思想就是平坦的方向上给大的学习率,陡峭的方向上给小的学习率。

RMSProp

Adagrad进阶版、可更动态的调整同一方向的学习率,不像上述Adagrad一个方向只能大或小

调整\alpha,其值越小,就相当于越相信新的梯度提供的陡峭或平滑的信息,相比Adagrad加入了新看到的梯度和旧梯度的权重。

Momentum

尽可能避免落入local minimum

红色实线是梯度方向,虚线是梯度告诉我们要更新的方向,而绿色虚线是上一个动量惯性告诉我们要走的方向,如果不加动量我们就会走红色虚线的方向,但加了动量则会走蓝线的方向。

Adam(RMSProp + Momentum)

------------------------------------------------------------------------------------------------------------------------

2019年4月2日   沙坡村职业技术学院 

猜你喜欢

转载自blog.csdn.net/YDC123458/article/details/88954180