正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

正则化方法:L1和L2 regularization、数据集扩增、dropout

大家好,又见面了,我是全栈君。

本文是《Neural networks and deep learning》概览 中第三章的一部分。讲机器学习/深度学习算法中经常使用的正则化方法。(本文会不断补充)



正则化方法:防止过拟合,提高泛化能力

在训练数据不够多时,或者overtraining时,经常会导致overfitting(过拟合)。其直观的表现例如以下图所看到的。随着训练过程的进行,模型复杂度添加,在training data上的error渐渐减小。可是在验证集上的error却反而渐渐增大——由于训练出来的网络过拟合了训练集,对训练集外的数据却不work。

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

为了防止overfitting。能够用的方法有非常多,下文就将以此展开。有一个概念须要先说明,在机器学习算法中,我们经常将原始数据集分为三部分:training data、validation data。testing data。这个validation data是什么?它事实上就是用来避免过拟合的。在训练过程中。我们通经常使用它来确定一些超參数(比方依据validation data上的accuracy来确定early stopping的epoch大小、依据validation data确定learning rate等等)。那为啥不直接在testing data上做这些呢?由于假设在testing data做这些,那么随着训练的进行,我们的网络实际上就是在一点一点地overfitting我们的testing data,导致最后得到的testing accuracy没有不论什么參考意义。因此,training data的作用是计算梯度更新权重,validation data如上所述。testing data则给出一个accuracy以推断网络的好坏。

避免过拟合的方法有非常多:early stopping、数据集扩增(Data augmentation)、正则化(Regularization)包含L1、L2(L2 regularization也叫weight decay),dropout。



L2 regularization(权重衰减)

L2正则化就是在代价函数后面再加上一个正则化项:

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

C0代表原始的代价函数,后面那一项就是L2正则化项。它是这样来的:全部參数w的平方的和,除以训练集的样本大小n。

λ就是正则项系数,权衡正则项与C0项的比重。另外另一个系数1/2,1/2经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2。与1/2相乘刚好凑整。

L2正则化项是怎么避免overfitting的呢?我们推导一下看看,先求导:

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

能够发现L2正则化项对b的更新没有影响,可是对于w的更新有影响:

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

在不使用L2正则化时。求导结果中w前系数为1,如今w前面系数为 1−ηλ/n ,由于η、λ、n都是正的。所以 1−ηλ/n小于1,它的效果是减小w。这也就是权重衰减(weight decay)的由来。

当然考虑到后面的导数项,w终于的值可能增大也可能减小。

另外。须要提一下,对于基于mini-batch的随机梯度下降,w和b更新的公式跟上面给出的有点不同:

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

对照上面w的更新公式。能够发现后面那一项变了,变成全部导数加和,乘以η再除以m,m是一个mini-batch中样本的个数。

到眼下为止,我们仅仅是解释了L2正则化项有让w“变小”的效果,可是还没解释为什么w“变小”能够防止overfitting?一个所谓“显而易见”的解释就是:更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀),而在实际应用中,也验证了这一点。L2正则化的效果往往好于未经正则化的效果。当然,对于非常多人(包含我)来说,这个解释似乎不那么显而易见,所以这里加入一个略微数学一点的解释(引自知乎):

过拟合的时候,拟合函数的系数往往非常大,为什么?例如以下图所看到的,过拟合。就是拟合函数须要顾忌每个点。终于形成的拟合函数波动非常大。在某些非常小的区间里,函数值的变化非常剧烈。

这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以仅仅有系数足够大,才干保证导数值非常大。

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

而正则化是通过约束參数的范数使其不要太大,所以能够在一定程度上降低过拟合情况。



L1 regularization

在原始的代价函数后面加上一个L1正则化项。即全部权重w的绝对值的和。乘以λ/n(这里不像L2正则化项那样,须要再乘以1/2。详细原因上面已经说过。)

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

相同先计算导数:

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

上式中sgn(w)表示w的符号。那么权重w的更新规则为:

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

比原始的更新规则多出了η * λ * sgn(w)/n这一项。

当w为正时,更新后的w变小。

当w为负时。更新后的w变大——因此它的效果就是让w往0靠。使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。

另外,上面没有提到一个问题,当w为0时怎么办?当w等于0时,|W|是不可导的。所以我们仅仅能依照原始的未经正则化的方法去更新w,这就相当于去掉η*λ*sgn(w)/n这一项,所以我们能够规定sgn(0)=0,这样就把w=0的情况也统一进来了。

(在编程的时候,令sgn(0)=0,sgn(w>0)=1,sgn(w<0)=-1)



Dropout

L1、L2正则化是通过改动代价函数来实现的,而Dropout则是通过改动神经网络本身来实现的,它是在训练网络时用的一种技巧(trike)。它的流程例如以下:

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

假设我们要训练上图这个网络,在训练開始时,我们随机地“删除”一半的隐层单元,视它们为不存在,得到例如以下的网络:

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]

保持输入输出层不变,依照BP算法更新上图神经网络中的权值(虚线连接的单元不更新,由于它们被“暂时删除”了)。

以上就是一次迭代的过程,在第二次迭代中,也用相同的方法,仅仅只是这次删除的那一半隐层单元,跟上一次删除掉的肯定是不一样的。由于我们每一次迭代都是“随机”地去删掉一半。

第三次、第四次……都是这样,直至训练结束。

以上就是Dropout,它为什么有助于防止过拟合呢?能够简单地这样解释。运用了dropout的训练过程,相当于训练了非常多个仅仅有半数隐层单元的神经网络(后面简称为“半数网络”),每个这种半数网络,都能够给出一个分类结果,这些结果有的是正确的,有的是错误的。

随着训练的进行,大部分半数网络都能够给出正确的分类结果。那么少数的错误分类结果就不会对终于结果造成大的影响。

更加深入地理解。能够看看Hinton和Alex两牛2012的论文《ImageNet Classification with Deep Convolutional Neural Networks》



数据集扩增(data augmentation)

“有时候不是由于算法好赢了。而是由于拥有很多其它的数据才赢了。”

不记得原话是哪位大牛说的了,hinton?从中可见训练数据有多么重要,特别是在深度学习方法中。很多其它的训练数据。意味着能够用更深的网络,训练出更好的模型。

既然这样,收集很多其它的数据不即可啦?假设能够收集很多其它能够用的数据,当然好。可是非常多时候,收集很多其它的数据意味着须要耗费很多其它的人力物力。有弄过人工标注的同学就知道。效率特别低,简直是粗活。

所以。能够在原始数据上做些改动,得到很多其它的数据,以图片数据集举例,能够做各种变换,如:

  • 将原始图片旋转一个小角度

  • 加入随机噪声

  • 一些有弹性的畸变(elastic distortions)。论文《Best practices for convolutional neural networks applied to visual document analysis》对MNIST做了各种变种扩增。

  • 截取(crop)原始图片的一部分。

    比方DeepID中,从一副人脸图中,截取出了100个小patch作为训练数据,极大地添加了数据集。

    感兴趣的能够看《Deep learning face representation from predicting 10,000 classes》.

    很多其它数据意味着什么?

用50000个MNIST的样本训练SVM得出的accuracy94.48%,用5000个MNIST的样本训练NN得出accuracy为93.24%,所以很多其它的数据能够使算法表现得更好。

在机器学习中,算法本身并不能决出胜负。不能武断地说这些算法谁优谁劣,由于数据对算法性能的影响非常大。

正则化方法:L1和L2 regularization、数据集扩增、dropout[通俗易懂]



转载请注明出处:http://blog.csdn.net/u012162613/article/details/44261657

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115700.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 详述 IntelliJ IDEA 插件的安装及使用方法「建议收藏」

    详述 IntelliJ IDEA 插件的安装及使用方法「建议收藏」温馨提示:IntelliJIDEA支持非常多的插件,熟练的使用插件,能够有效提高我们的开发效率以及用户体验。正文首先,进入插件安装界面:Mac:IntelliJIDEA->Preferences->Plugins;Windows:File->Settings->Plugins.标注1:显示IntelliJIDEA的插件分类,Allplugins:显示In

  • Charles抓包显示乱码解决方法

    Charles抓包显示乱码解决方法

  • linux抓包查看请求接口源ip,linux 抓包「建议收藏」

    linux抓包查看请求接口源ip,linux 抓包「建议收藏」tcpdumphost172.16.29.40andport4600-X-s500tcpdump采用命令行方式,它的命令格式为:tcpdump[-adeflnNOpqStvx][-c数量][-F文件名][-i网络接口][-r文件名][-ssnaplen][-T类型][-w文件名][表达式]1.tcpdump的选项介绍-a…

    2022年10月14日
  • javatype和jdbctype作用_javatype

    javatype和jdbctype作用_javatypeJDBCType JavaTypeCHAR StringVARCHAR StringLONGVARCHAR StringNUMERIC java.math.BigDecimalDECIMAL java.math.BigDecimalBIT booleanBOOLEAN booleanTINYINT byte

    2022年10月20日
  • 模电笔记(按知识点整理版)

    模电笔记(按知识点整理版) 这是个人整理的一份个人模电学习笔记,文档中所有未标明的链接均为CSDN电子版笔记,对应章节的网课学习教程会在对应章节进行附录。模拟电子线路 这是一门很离谱的学科,因此即使是绪论我们也不能放过,以此来有助于我们更好地去了解这门学科究竟是什么以及应该怎么学习。一、基础知识 绪论与学习方法 常用半导体及其器件关键词:本征半导体PN结P型半导体与N型半导体基础知识对应网课: 绪论二、常用器件 对于模拟电路的学习归根结底就是对于器件的学习。坦白来讲就是玩管子。所有的管子我们都可以

  • 进程间通信方式——消息队列

    进程间通信方式——消息队列与消息队列的三个数据结构;和消息队列相关的函数;消息队列的工作模式。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号