04 DL经验

158 阅读5分钟

Tips for Deep Learning

1 训练好网络后,先检验train set上的performance,再检验test set上的performance。

2 不要总是归因于overfitting。比如更复杂的网络虽然在test set上比较差,但在train set上一样比较差,那就不是overfitting

3 只有在train set好但test set不好的时候才考虑dropbox,如果train set不好,再dropbox只会更差

4 sigmoid容易产生梯度消失,越往前梯度越小,导致后半部分网络几乎训练好了,前面还几乎是随机的。这是因为sigmoid每次都会把数据压缩到[0,1]大的变化会变小。解决方法,使用ReLU。因为输出的线性,所以梯度不会消失。

Q:激活函数变成线性会不会让网络变弱?A:不会,还是非线性的,因为不同的取值空间网络中活跃的神经元不同

Q:不可导?A:不用管。因为几乎不可能恰好是0

其他的变种of ReLU

  • Leaky ReLU z = a > 0?a:0.01a
  • paramaric ReLU z = a > 0?a:ka
  • Maxout, learnable 把一层的神经元分组,每一组选最大的(在一个layer上的maxPooling)ReLu是他的一种特殊情况,考虑为每个神经元添加一个跟他在一组,这个新增的神经元和前面连线的参数都是0。如果新增神经元的权重发生改变,那么组合起来就变了。

leakyRelu.png

不可导?把没有取的那些神经元都去掉,激活函数就是线性的,在这个小网络上求梯度

5 Early Stopping,使用validation set 验证他的loss,随着epoch增加,train set上的loss在降低,但validation上的loss可能增加,增加到话就停止训练

6 Regularization。loss function增加 12λθ2\frac{1}{2}\lambda ||\theta||_2。又叫做weight decay,因为求梯度以后发现,和原来的loss相比,体现在参数的那一项前面的系数变成了(1λη)(1 - \lambda \eta)。如果是绝对值,求梯度会发现,对于正参数,会减小一块,对负参数会增加一块

7 dropout 每个神经元有一定概率直接不work了。每个minibatch dropout的都是不一样的,因此其实在训练不一样的网络。train set好但test set差的时候引入dropout

why deep?

​ 深度网络nb并不是因为参数多,因为如果你换成参数相同但是一层的网络,他的效果也不好。所以深度网络好其实是因为deep了以后实现了modularization。这种模块化实现了共用。那么在图像识别的时候,可能就能够分离出一些小的部分,比如人头、人身子一类,这些都是可以公用的。其实每一层可以看作是在做一个小的任务,这种共用也减少了他需要的数据,这就是避免了维度爆炸。这个理论在语音转文字的模型上得到了验证。

universeilty theorem:三层网络可以拟合任何网络,但hidden layer需要足够宽,deep往往更有效。

一个有趣的研究,既然一层hidden layer就足够了,难道训不出来?怎么训?先训练一个三层hidden layer的,然后把3层的输出当作label去训1层的,发现训练的比真实的0-1 label更好。说明1hidden确实可以训出来。。。

优化器性质

SGD

​ 取一条数据,然后算梯度

Mini Batch

​ 取一批数据,然后算梯度

SGD with Momentum

v=λvηv = \lambda v - \eta \nabla θ=θ+v\theta = \theta + v

AdaGrad

η=η/t+1\eta=\eta/\sqrt{t+1}

adagrad对每个参数设置不同的learning rate,wi=wiησgw_i=w_i - \frac{\eta}{\sigma}g σ\sigma 之前所有梯度的平方平均数 η\eta是上一行那个 这样如果化简一下,分子是固定的η\eta 分母是平方和开根号

​ 直觉的解释,关心反差,即从一个较大的梯度突然变小了,说明这里变平缓了需要处理。

​ 理论的解释,更大的梯度并不意味着应该走更快,在参数多的时候,他其实是和一阶导成正比,和二阶导成反比。分母近似了二次微分,为什么?因为一阶导比较小的位置往往二阶导比较小,考虑二次函数

RMSProp

w1=w0ησ0g0w^1 = w^0 - \frac{\eta}{\sigma^0}g^0 σ0=g0\sigma^0 = g^0

w2=w1ησ1g1w^2 = w^1 - \frac{\eta}{\sigma^1}g^1 σ1=α(σ0)2+(1α(g2)2)\sigma^1 = \sqrt{\alpha(\sigma^0)^2 + (1 - \alpha(g^2)^2)}

​ 参数化你有多相信当前的梯度

Adam

​ RMSProp + Momentum

θ=θηmv+ϵ\theta = \theta - \eta \frac{m}{\sqrt{v} + \epsilon} m按momentum去算 v按照RMSProp去算

SGDm与Adam基本包打天下了,特别是Adam2014年提出以后,就没有能打的了。

Adam:训练快,但泛化能力弱一些,不稳定。SGDm稳定,泛化能力强,训练慢。

直观解释:如果local minima是一个比较sharp的位置,那进入到测试集就容易不好,因为很容易就偏离最优了。但是如果比较平坦,那在测试集上就不容易偏离。

SWATS 结合adam和SGDm,利用前者的熟练速度和后者的收敛能力,切换点经验设置。

提高Adam的思路提出的改进思路

Adam的主要问题,就是面对一些没太有意义的minibatch也走了相当多,遇到了有意义的minibatch虽然一步走的多,但是其他的无意义的gradient太多了,所以拉不回来。解决方法AMSGrad,vt=max(vt,vt1)v_t = \max(v_t, v_{t-1}),强调有意义的gradient。

另一种方法AdaBound,AMSGrad只能处理大的梯度,这个能同时应对大梯度和小梯度,都是经验设置,这就限制了adam的adaptive的特性

提高SGDm的思路提出的改进思路

​ 调整learning rate一会变大一会变小。cyclical LR、one-cycle LR

结论:还是老老实实用Adam和SGDm吧