09_2_Regularization&动量与学习率&Early Stopping&Dropout
Regularization
如何防止或减轻Overfitting
Occam’s Razor
奥卡姆剃刀原理
Reduce Overfitting
- 提供更多数据
- 模型复杂度降低
- 浅的模型
- regularization
- Dropout
- 数据增强
- 提前终结
Regularization(weigh decay-权值衰减)
公式为 左边是二分类问题的cross entropy loss。 θ \theta θ表示w1, b1…,这里取一范数,累加,再乘以因子 λ \lambda λ,权衡左右两个参数的配比。成为新的loss, J ( θ ) J(\theta) J(θ)。
loss会minimize左式使得预测值与真实值分布更加接近;同时使右式 θ \theta θ的范数接近于0,即迫使参数的范数的值接近于0,减少模型的复杂度。
2种解释:
- 参数变小会使得函数变得平滑
- 参数小且表达能力足够用,出现 β 0 , β 1 . . . \beta_0, \beta_1... β0,β1...前面的参数不会很小,因为要有表达能力;但是后面的参数会变小,使范数小。
Intuition
左边的曲面(分割面)复杂,不光滑,网络表达能力比较强,受噪声影响大,泛化能力弱;
右边使表达能力不这么强,不会学习到噪声的样本,约束表达能力,学习到平滑的分割面。
How
常用的2种:加一范数;加二范数(常用)。
lambda( λ \lambda λ)为超参数,需要自己调整。
One-by-one regularization
kernel_regularizer=keras.regularizers.l2(0.001)
对参数添加约束(loss),0.001为上式的 λ \lambda λ(权值),修改为0.01会增大对参数的惩罚。
Flexible regularization
- 图为对每一个w或b,求和
- 也可以求前2层,也就是[:4]
- 前3层是[:6]
- 挑选出w,是[::2]
新的loss为regularization的loss。
下面是4个小技巧
动量与学习率
Tricks(技巧)
- momentum 动量
- 惯性
- learning rate decay 学习率
- 与上面的weigh decay类似,迫使lr慢慢接近为0
Momentum(动量)
图中为梯度下降公式, Δ f ( w k ) \Delta f(w^k) Δf(wk)为梯度。
在这里多了 β z k \beta z^k βzk, z k z^k zk代表的是上一次梯度的方向,为 Δ w k − 1 \Delta w^{k-1} Δwk−1,结果为两个梯度的向量和。
β \beta β参数决定偏向当前梯度还是历史梯度。
实际上是当前的梯度方向+历史惯性方向的结合。
No momentum
With appr. momentum
- 图左边的梯度方向不会非常跳动,考虑历史因素会更缓和。
- 图右边过去的solution会停在局部的最低点,但是有了历史梯度加成,点可能在惯性的驱动下冲出去,发现更广阔的天空,滑到山底而不是山腰中间。
代码实现
动量一般是直接加到optimizer里(作为1个参数),会自动更新相应的梯度,如果不指定momentum则默认不使用动量,为0。使用的话建议为0.9……
- SGD、RMSprop等优化器可以指定momentum
- 但是对于Adam……本身已经把momentum考虑在内,内部实现,不需要指定momentum。相反有beta_1、beta_2的参数
Learning rate tunning
Learning rate decay
刚开始大一些,增加速度,后面小一些,有利于收敛
Drop Learning Rate
在突然设小learning rate后,有可能会出现loss快速下降。
Adaptive learning rate
代码实现。仅仅修改optimizer.learning_rate
可以线性减少,也可以阶梯式减小,也可以用指数e减少
Early Stopping&Dropout&Stochastic Gradient Descent
Tricks
- early stopping
- dropout
- stochastic gradient descent
Early Stopping
利用validation set,停止。
How-To
Dropout
迫使学习的时候不全部使用w参数,要求有效的w数量( ∑ ∣ w ∣ \sum |w| ∑∣w∣)(Connection)越小越好。
如何实现:对每个w有prop,有一定的概率会暂时地输出为0的状态(把这条连接断掉)。
这样会使得 用到的(有效的)参数量会少一些,虽然总参数量不变。
代码实现
layers.Dropout(0.8)
表示有0.8的概率扔掉这条线。
Behaviour between train and test
network(x,training=False)
告知是否是training,这样会关闭的dropout、batch normalization。在validation的时候也设置为False。
Stochastic Gradient Descent
区别:
- Stochastic是符合某个分布的,而不是随机的
- 例如给出x,返回f(x)~N(0,x)分布
- Deterministic(给出x,有对应的f(x) - 一一对应)
Gradient Descent
Stochastic:
这里的分布是指从一个数据集上面取随机的sample到batch上来。例如从60K的数据batch 128个数据。
最开始是 δ L δ W = 1 60 K ∑ i = 0 i = 60 K δ L δ W \frac{\delta L}{\delta W}=\frac{1}{60K} \sum_{i=0}^{i=60K}\frac{\delta L}{\delta W} δWδL=60K1∑i=0i=60KδWδL,求出所有的梯度信息,再累加平均。这样的缺点是数据太大,GPU容量不够,不可能加载所有数据
为了节省显存, δ L δ W = 1 B a t c h ∑ i = 0 i = B A T C H δ L δ W \frac{\delta L}{\delta W}=\frac{1}{Batch} \sum_{i=0}^{i=BATCH}\frac{\delta L}{\delta W} δWδL=Batch1∑i=0i=BATCHδWδL,取一个batch,求梯度。
最开始的Stochastic方法是1个,后面变成Batch=16,32,64,128…
为了节省显存, δ L δ W = 1 B a t c h ∑ i = 0 i = B A T C H δ L δ W \frac{\delta L}{\delta W}=\frac{1}{Batch} \sum_{i=0}^{i=BATCH}\frac{\delta L}{\delta W} δWδL=Batch1∑i=0i=BATCHδWδL,取一个batch,求梯度。
[外链图片转存中…(img-Y63BS4d5-1618309031670)]
最开始的Stochastic方法是1个,后面变成Batch=16,32,64,128…