第二种办法 adaptive learning rate(在train data上训练结果不好)
1.比如,adagrad
计算方法:
每个parameter都有不同的learning rate。用固定的learning rate n除以过去的所有gradient descent的平方值和,并开根号。
一个经验:
如果考虑两个参数w1,w2。若图中w1在‘’横方向‘’(等值线浓密)上变化比较平坦,则就给他一个比较大的learning rate 而在竖方向(等值线稀疏),则给他一个比较小的learnin rate。可以让Network收敛的更快。
可是呢,有的时候,error surface不一定是山丘形状,w1改变的方向,在某一个区域,很平台,在另一个区域,很陡峭,则就需要一个动态变化的调整learning rate。就要用到用RMSProp
3.RMSProp
3.1计算方法:
将固定的learning rate η除以σ,σ0就是第一次gradient的值g0。第二次,算出一个新的gradien g1,此时,新的σ1就是原来的σ0的平方乘以α,再加上(1-α)乘以g1的平方。最后开根方。α可以自己调整。
3.2相比较adagrad的好处:
原来的adagrade,是固定的,这里添加了α的σ,和(1-α)的gradient,即倾向于新的gradient,还是旧的gradient。类似于先验与后验的区别:
3.3 local minima问题
做DeepLearning可能卡在很多个地方,local minima问题
处理local minima的问题,momentum(下滑球的惯性导致走出local minima)
4 .momentum
4.1复习一下一般的gradient,往梯度的反方向走
选择初始值,计算权重θ0处的gradient ▽L(θ0),结合learning rate,计算并更新得到的权重θ1。直到gradient趋近于0的时候,停止更新参数θ。
4.2momentum呢
计算方法:
利用momentum的时候,每一次移动的方向,不仅仅考虑gradient,而是现在的gradient加上再前一个时间点移动的方向(类似于加速度?速度?惯性)
初始化:初始点θ0,初始movement值为0.,先算出初始点θ0处的梯度。移动的方向:前一个时间点的movement的一定比例值,再加上negative 梯度,得到真正的移动方向。
这使得移动比原先的gradient方法,有一定的改变,但不会完全转向,然后移动θ0到θ1. move to θ1= θ0 + v1
计算出θ1,再进行下一次移动。结合原先的gradient方法(红色箭头),加上上一次移动的惯性方向(绿色箭头)的λ倍(惯性影响大小),可以得到真实的带惯性方向。
直觉上理解momentum(理解为惯性),如果momentum比较强的话,有一定的可能性,借助惯性力量(momentum),跳出local minima
5.Adam :RMSProp方法+Momentum方法
5.1 计算方法:
先初始m0,即momentum,v0就是adagrade的RMSProp中的σ(可动态变化的gradient的平方和之类的式子),算出新的gradient,基于mt,vt的变种(1-β),最后 update 用learning rate α, mt, vt,以及一个小的e参数来更新gradient。
二:前面讲的都是training data就已经不好的了,下面讲在trainning data上训练的结果好,在test data上效果不好的处理方法
1.early stopping(典型)
2.regurization
3.dropout(DeepLearning特色)
1.early stopping是指:
1.1 随着training,如果learning rate调的好,则在trainingset上,total loss会慢慢变下。由于trainingset和testset上的数据的distribution不太一样,有可能导致当trainingset上的total loss减少的时候,在test set上回变大。所以,假如可以知道test set上的total loss 的变化,则在traing的时候应该停在test set上total loss最小的地方。epoch为训练的次数?但是实际上不知道teset及其error,所以,切除一个validation set。这样validation set的totalloss最小的时候,就找到early stpping 的epoch的值,停止训练,得到参数
2 Regularization
重新定义需要minimize的loss function.加入regularization是为了让objective function更加平滑,防止过拟合,防止方差太大,而不是biases更加小,和bias无关。注意θ2代表权重的平方和,θ1则代表绝对值和
对新的objective loss function作微分求gradient,则得到下面加上带λ的部分值的新的gradient1,之后再利用gradient1和学习率更新下一次权重w(t+1)(此时多了λw(t))。
其实在update参数之前,每次都是把参数w先乘以(1-nλ),n是learning rate,值要设置很小,正则化权重λ一般值设置的也很小,nλ倾向于0,比如0.01,相当于调整了上一次的w,使其w不断地接近于0。因为后面的一项的存在,会平衡参数不会使得w变为0。
用L2正则化方法,每次回让weight少一点,就叫做weight deacay,但不会为0
其实就像,1婴儿神经,6岁神经最多。14神经越来越少。neutron跟人脑神经一样,如果有些权重参数很小,一直没有update(不加入正则项1或L2来做update,只使用学习率和损失函数的的的权重衰减),则会接近为0,最后不见了
3.dropout
DropOut原理:在training的时候,每次update参数之前,对每一个Neuron(包括input_layer)做sampling,决定这个Neuron按一定几率p丢掉,跟它相连的weight也被丢掉,结果得到一个细长的Network。
每一次update参数之前,都做一次resampling,每一次update一个mini-batch之前,拿来traing的Network structure是不一样的。在training时,用dropout的时候,performance会变差。该方法,目的就是让training性能稍微差一点,而testing性能变好。自动变差,以免有落差。
在testing的时候,注意
1 不做dropout
2.假设training时的删除神经元的概率为p%,则在testing时,所有的weight都要乘以(1-p)%
3.为什么要乘0.5
为什么要testing的weight和training的weight不一样?
保证两边的加权和基本上相同,然后再做**函数。
4.为什么dropout有用?
每次拿一个mini-batch时,拿出了不同的Network。可能有2的n次方个Network,但是不同的network中的参数w是shared,也就是说,会按照bagging或者boosting的方法来求得最终的模型,一个Network可能只用一个batch来train,但一个weight可能用很多个batch来train,最后做平均(bagging)或者增量叠加。合在一起效率很高。
形象比喻:
1.学武功时设置障碍从难的学起,会了之后就会更容易
2.teamwork,工作时,有一些被删除,但是在最终真实考试时,没有没删除,都会努力。
神奇的地方,只有在linear activation function的情况下,ensemble的,在testingdata中,做dropout,与不做dropout而是乘以1-p%,得到的结果大致近似。不同的structure做dropout和乘以1-p,得到的结果是一致。