一、什么是正则化,用来干嘛的?

正则化(regularization),是指在线性代数理论中,不适定问题通常是由一组线性代数方程定义的,而且这组方程组通常来源于有着很大的条件数的不适定反问题。大条件数意味着舍入误差或其它误差会严重地影响问题的结果。

因为机器学习的理论来源于数学,正则化的概念被很好的引用到机器学习模型中,主要作用是防止模型过拟合。

我们的模型训练时,比如常见的深度学习模型,可能往往会因为神经元的数目和网络的层数过于庞大,模型具有非常强大的学习能力,但是能力过强不是一件好事,因为过分学习了训练集的数据特点,能在训练集上取得一个非常好的结果,但是在测试集可能会随着训练误差反而不断变大,这就是常说的过拟合问题。

通常出现过拟合要么是数据集本身的质量问题,比如数据集内容分布不均匀,导致划分的训练集和测试集数据内容差别过大,特别是数据集本身数据量很少的时候,往往容易导致分布不均,所以后面又提出了很多数据增强的方法。再者是模型的问题,之前提到,如果模型过于复杂,拥有太过强大的学习能力,在训练集上表现很好但是测试集却越来越差,就是模型结构过于复杂导致的过拟合问题了,这个时候的解决方法就是减弱模型的复杂度,要么我们直接修改神经网络模型的层数或者每层神经元的个数,当然这样的方法很多时候不一定能带来好的效果,因为就是当我们的模型不能在训练集取得很好的拟合效果才考虑增大模型的复杂度,结果又导致过拟合问题,随着模型神经网络层数的增加,模型往往能够更好的学习到某些潜在的数据特征,所以最好是保证在原始的模型的结构基础不变的情况下做一定的修改,于是正则化被提出来使用。

正则化最直白的理解就是通过添加一些系数削弱深度学习模型中某些神经元输出的数据权重,因为神经网络就是靠这些神经元不断的拟合数据集,从而使得模型不会过分拟合训练集,而同时保证在验证集和训练集都有较好的效果。

二、L1正则化,L2正则化和Dropout正则化

2.1 L1正则化,L2正则化

L1正则化和L2正则化差别不大,先抛出公式如下:

(L1正则化公式)


(L2正则化公式)

模型的目标是优化损失函数,上面的正则化公式就是在损失函数后面加上了所谓的正则项,可以看到L2仅仅是L1的正则项取平方,所以两者在结构上差别不大。C为一个常数系数,需要人为设置,w为和损失函数中的wT一样都是神经网络的权重参数。

直观理解为:因为模型的目标是优化损失函数,使得损失函数尽可能降低趋近于0,因为后面添加了这么一个正则项,于是损失函数被干扰,可以理解为,如果模型的学习能力过于强大(也就是容易出现过拟合问题),那么||w||也会增大,就会间接导致现在的损失函数变大(现在的损失函数是原来的损失函数的基础上加了正则项),那么模型又需要反复调节,使得不断训练达到一个w不会过分大和损失函数也尽可能小的平衡点,此时的话就有效的使得模型不会轻易过拟合。

但是在后来的发展中,L1和L2正则化不仅仅是对目标损失函数作用,也被利用作用在神经网络中每个神经元的权重参数w和b,或者激活函数中,其实现也是对这些参数添加一个正则项用来影响对数据集的拟合能力,这样一来L1和L2正则化方式和Dropout正则化方式有点相似了。

如果要想具体实现比较麻烦,不过keras里面已经封装好了具体的使用,后面会具体说明。

2.2 Dropout正则化

Dropout正则化相比L1和L2正则化方式比较简单粗暴,我们上面提到模型过于复杂(层数太多或者每层神经元太多),那么最直接的方式就是直接减少某些神经元的存在不就行了吗。Dropout的方式就是在模型训练中在某些神经元的输出部分随机产生一个很小权重系数并乘上这个输出,其作用是削弱这个神经元对整个模型拟合能力的作用,如果这个权重系数很小甚至趋近于0,那么就相当于这个神经元在神经网络中没有出现过,效果如下图所示。

同样的Dropout在keras框架中也被进行了封装,甚至说,Dropout在神经网络中的使用频率比L1和L2正则化常见,可能是使用比较简单,效果也较好。

三、keras框架使用L1、L2和Dropout正则化

3.1 L1和L2正则化的添加使用

之前提高L1和L2后来被作用于神经元的权重w和偏置向量b或者激活函数部分,于是keras中也分别进行了封装如下:

    kernel_regularizer:施加在神经元权重w上的正则项,为keras.regularizer.Regularizer对象。bias_regularizer:施加在神经元偏置向量b上的正则项,为keras.regularizer.Regularizer对象。activity_regularizer:施加在输出(激活函数)上的正则项,为keras.regularizer.Regularizer对象。

上面3个分别表示正则化的作用对象,keras中封装的可使用的正则项如下:

 #其中0.01为上面2.1小节提到的常数系数C,自己设置keras.regularizers.l1(0.01)#L1正则项keras.regularizers.l2(0.01)#L2正则项keras.regularizers.l1_l2(0.01)#结合了L1和L2的正则项

使用例子

from keras import regularizers
model.add(Dense(2, input_dim=10,#输入数据唯独10,输出唯独为2kernel_regularizer=regularizers.l1(0.01),#在权重参数w添加L1正则化bias_regularizer=regularizers.l2(0.01),#在偏置向量b添加L2正则化activity_regularizer=regularizers.l1_l2(0.01),#在输出部分添加L1和L2结合的正则化activation='relu'#激活函数采用ReLU))

3.2 Dropout正则化的添加使用

这个就很简单了,相比L1和L2比较简洁。

from keras.layers import Dropout
model.add(Dense(2, input_dim=10,#输入数据唯独10,输出唯独为2activation='relu'#激活函数采用ReLU))
model.add(Dropout(0.5))#直接在每层神经元后面添加,一般数值取0.5,也有取0.3,这个为Dropout率,可以理解为每个神经元被处理的概率。

希望我的分享对你的学习有所帮助,如果有问题请及时指出,谢谢~

keras添加L1正则化,L2正则化和Dropout正则化及其原理相关推荐

  1. 深度学习正则化(L1 norm/L2 norm)以及dropout理解

    正则化知识其实是深度学习领域较为基础的知识点,初入此门的时候受限于正则化三个字的逼格,一直不求甚解:后期虽然了解但也仅限于L1和L2范数而已.恰巧上周在谢毅博士的课上旁听,讲到过拟合相关知识,后续和捷 ...

  2. 【Keras】减少过拟合的秘诀——Dropout正则化

    摘要: Dropout正则化是最简单的神经网络正则化方法.阅读完本文,你就学会了在Keras框架中,如何将深度学习神经网络Dropout正则化添加到深度学习神经网络模型里. Dropout正则化是最简 ...

  3. L1和L2:损失函数和正则化

    作为损失函数 L1范数损失函数 L1范数损失函数,也被称之为最小绝对值误差.总的来说,它把目标值$Y_i$与估计值$f(x_i)$的绝对差值的总和最小化. $$S=\sum_{i=1}^n|Y_i-f ...

  4. 损失函数中正则化项L1和L2的理解

    正则化(Regularization) 机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1-norm和ℓ2-norm,中文称作L1正则化和L2正则化,或者L ...

  5. [机器学习]正则化项L1和L2的学习与理解

    正则化项L1和L2的学习与理解 一,正则化(Regularization) 稀疏模型与特征选择的关系 二, 为什么L1产生稀疏模型而L2可以防止过拟合 1, L1和L2正则化的直观理解 正则化和特征选 ...

  6. 深入理解L0,L1和L2正则化

    正则化技术是机器学习中常用的技术,一般是用来解决过拟合问题的.为什么范数可以作为机器学习的正则化项?为什么L1正则化可以用来进行特征选择的工作?为什么正则化可以解决过拟合问题?本篇博客从机器学习中为什 ...

  7. 机器学习中正则化项L1和L2的直观理解

    文章目录 正则化(Regularization) 稀疏模型与特征选择的关系 L1和L2正则化的直观理解 正则化和特征选择的关系 为什么梯度下降的等值线与正则化函数第一次交点是最优解? L2正则化和过拟 ...

  8. 范数规则化(一):L0、L1与L2范数

    目录 0 范数 1  L0 范数 2  L1 范数 2.1 L1 2.2 L1正则化和特征选择 2.3 拉普拉斯先验与L1正则化 2.3.1 拉普拉斯分布 2.3.2 拉普拉斯先验 3 L2 范数 3 ...

  9. 机器学习中的范数规则化之L0、L1、L2范数

    我的博客中参考了大量的文章或者别的作者的博客,有时候疏忽了并未一一标注,本着分享交流知识的目的,如果侵犯您的权利,这并非我的本意,如果您提出来,我会及时改正. 本篇博客主要是为了解决机器学习中的过拟合 ...

最新文章

  1. .net完整的图文验证
  2. 201521123079 《Java程序设计》第1周学习总结
  3. 深入理解JVM虚拟机(七):虚拟机字节码执行引擎
  4. DCMTK:I2DBmpSource类的测试程序
  5. 关于报错stale element reference: element is not attach
  6. PYTHON如何在内存中生成ZIP文件
  7. jsonp react 获取返回值_Django+React全栈开发:文章列表
  8. 如何将一个目录下的所有文件,合并成一个文件
  9. android工程中的软件,通过Android Studio创建Android应用程序(附带解析)
  10. linux改分区名字,修改分区的label
  11. wxPython + PyOpenGL 打造三维数据分析的利器!| CSDN 博文精选
  12. Trie图的学习过程
  13. 微信小程序使用组件实现移动端软键盘
  14. 用python画科赫雪花
  15. 干货丨绝地求生—PUBG游戏模型合集
  16. linux 两块硬盘合并成一块
  17. yd什么意思_yd是什么意思是什么
  18. spring boot 2.5.5 reference chapter 5 生词
  19. “重塑”—— 与ISV同行
  20. 基于java基于javaweb的管理系统设计与实现怎样选题思路分享

热门文章

  1. 代码覆盖率 ——语句覆盖 Statement Coverage、分支覆盖 Branch Coverage、 路径覆盖 Path Coverage的区别
  2. [原创]TenJi Game-线下玩法技巧
  3. 云开发谁是卧底线下小游戏发牌助手微信小程序源码-亲测可用
  4. 如何手搭Hadoop集群
  5. 人脸识别——FaceBook的DeepFace、Google的FaceNet、DeepID
  6. forward 和 redirect 有什么区别 区别是什么?
  7. C#中命名参数和可选参数
  8. 1 华为南研所软件研发校园优招面试经历
  9. mybatis的example
  10. D2大会资源分享(解决了GitHub下载限速)