没有合适的资源?快使用搜索试试~ 我知道了~
首页tensorflow使用L2 regularization正则化修正overfitting过拟合方式
L2正则化原理: 过拟合的原理:在loss下降,进行拟合的过程中(斜线),不同的batch数据样本造成红色曲线的波动大,图中低点也就是过拟合,得到的红线点低于真实的黑线,也就是泛化更差。 可见,要想减小过拟合,减小这个波动,减少w的数值就能办到。 L2正则化训练的原理:在Loss中加入(乘以系数λ的)参数w的平方和,这样训练过程中就会抑制w的值,w的(绝对)值小,模型复杂度低,曲线平滑,过拟合程度低(奥卡姆剃刀),参考公式如下图: (正则化是不阻碍你去拟合曲线的,并不是所有参数都会被无脑抑制,实际上这是一个动态过程,是loss(cross_entropy)和L2 loss博弈的一个过程。训
资源详情
资源评论
资源推荐

tensorflow使用使用L2 regularization正则化修正正则化修正overfitting过拟过拟
合方式合方式
L2正则化原理:正则化原理:
过拟合的原理:在loss下降,进行拟合的过程中(斜线),不同的batch数据样本造成红色曲线的波动大,图中低点也就是过
拟合,得到的红线点低于真实的黑线,也就是泛化更差。
可见,要想减小过拟合,减小这个波动,减少w的数值就能办到。
L2正则化训练的原理:在Loss中加入(乘以系数λ的)参数w的平方和,这样训练过程中就会抑制w的值,w的(绝对)值小,
模型复杂度低,曲线平滑,过拟合程度低(奥卡姆剃刀),参考公式如下图:
(正则化是不阻碍你去拟合曲线的,并不是所有参数都会被无脑抑制,实际上这是一个动态过程,是loss(cross_entropy)
和L2 loss博弈的一个过程。训练过程会去拟合一个合理的w,正则化又会去抑制w的变化,两项相抵消,无关的wi越变越小,
但是比零强一点(就是这一点,比没有要强,这也是L2的trade-off),有用的wi会被保留,处于一个“中庸”的范围,在拟合的
基础上更好的泛化。过多的道理和演算就不再赘述。)
那为什么L1不能办到呢?主要是L1有副作用,不太适合这个场景。
L1把L2公式中wi的平方换成wi的绝对值,根据数学特性,这种方式会导致wi不均衡的被减小,有些wi很大,有些wi很小,得到
稀疏解,属于特征提取。为什么L1的w衰减比L2的不均衡,这个很直觉的,同样都是让loss低,让w1从0.1降为0,和w2从1.0
降为0.9,对优化器和loss来说,是一样的。但是带上平方以后,前者是0.01-0=0.01,后者是1-0.81=0.19,这时候明显是减少
w2更划算。下图最能说明问题,横纵轴是w1、w2等高线是loss的值,左图的交点w1=0,w2=max(w2),典型的稀疏解,丢
弃了w1,而右图则是在w1和w2之间取得平衡。这就意味着,本来能得到一条曲线,现在w1丢了,得到一条直线,降低过拟合
的同时,拟合能力(表达能力)也下降了。
L1和L2有个别名:Lasso和ridge,经常记错,认为ridge岭回归因为比较“尖”,所以是L1,其实ridge对应的图片是这种,或者
翻译成“山脊”更合适一些,山脊的特点是一条曲线缓慢绵延下来的。
训练训练
进行MNIST分类训练,对比cross_entropy和加了l2正则的total_loss。
因为MNIST本来就不复杂,所以FC之前不能做太多CONV,会导致效果太好,不容易分出差距。为展示l2 regularization的效
果,我只留一层CONV(注意看FC1的输入是h_pool1,短路了conv2),两层conv可以作为对照组。
直接取train的前1000作为validation,test的前1000作为test。
代码说明,一个基础的CONV+FC结构,对图像进行label预测,通过cross_entropy衡量性能,进行训练。
对需要正则化的weight直接使用l2_loss处理,
把cross_entropy和L2 loss都扔进collection ‘losses’中。
wd其实就是公式中的λ,wd越大,惩罚越大,过拟合越小,拟合能力也会变差,所以不能太大不能太小,很多人默认设置成了
0.004,一般情况下这样做无所谓,毕竟是前人的经验。但是根据我的实际经验,这个值不是死的,尤其是你自己定制loss函
数的时候,假如你的权重交叉熵的数值变成了之前的十倍,如果wd保持不变,那wd就相当于之前的0.0004!就像loss如果用
reduce_sum,grad也用reduce_sum一样,很多东西要同步做出改变!
weight_decay = tf.multiply(tf.nn.l2_loss(initial), wd, name='weight_loss')
tf.add_to_collection('losses', weight_decay)
tf.add_to_collection('losses', cross_entropy)
total_loss = tf.add_n(tf.get_collection(‘losses’))提取所有loss,拿total_loss去训练,也就实现了图一中公式的效果。
完整代码如下:
from __future__ import print_function
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# number 1 to 10 data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
def compute_accuracy(v_xs, v_ys):

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0