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。如果新增神经元的权重发生改变,那么组合起来就变了。
不可导?把没有取的那些神经元都去掉,激活函数就是线性的,在这个小网络上求梯度
5 Early Stopping,使用validation set 验证他的loss,随着epoch增加,train set上的loss在降低,但validation上的loss可能增加,增加到话就停止训练
6 Regularization。loss function增加 。又叫做weight decay,因为求梯度以后发现,和原来的loss相比,体现在参数的那一项前面的系数变成了。如果是绝对值,求梯度会发现,对于正参数,会减小一块,对负参数会增加一块
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
AdaGrad
adagrad对每个参数设置不同的learning rate, 之前所有梯度的平方平均数 是上一行那个 这样如果化简一下,分子是固定的 分母是平方和开根号
直觉的解释,关心反差,即从一个较大的梯度突然变小了,说明这里变平缓了需要处理。
理论的解释,更大的梯度并不意味着应该走更快,在参数多的时候,他其实是和一阶导成正比,和二阶导成反比。分母近似了二次微分,为什么?因为一阶导比较小的位置往往二阶导比较小,考虑二次函数
RMSProp
参数化你有多相信当前的梯度
Adam
RMSProp + Momentum
m按momentum去算 v按照RMSProp去算
SGDm与Adam基本包打天下了,特别是Adam2014年提出以后,就没有能打的了。
Adam:训练快,但泛化能力弱一些,不稳定。SGDm稳定,泛化能力强,训练慢。
直观解释:如果local minima是一个比较sharp的位置,那进入到测试集就容易不好,因为很容易就偏离最优了。但是如果比较平坦,那在测试集上就不容易偏离。
SWATS 结合adam和SGDm,利用前者的熟练速度和后者的收敛能力,切换点经验设置。
提高Adam的思路提出的改进思路
Adam的主要问题,就是面对一些没太有意义的minibatch也走了相当多,遇到了有意义的minibatch虽然一步走的多,但是其他的无意义的gradient太多了,所以拉不回来。解决方法AMSGrad,,强调有意义的gradient。
另一种方法AdaBound,AMSGrad只能处理大的梯度,这个能同时应对大梯度和小梯度,都是经验设置,这就限制了adam的adaptive的特性
提高SGDm的思路提出的改进思路
调整learning rate一会变大一会变小。cyclical LR、one-cycle LR
结论:还是老老实实用Adam和SGDm吧