一文概述深度学习中的正则化(含Python代码)

作者: 论智 2018-07-03 09:12:23

编者按:在日常工作、学习中,数据科学家最常遇到的问题之一就是过拟合。你是否曾有过这样一个模型,它在训练集上表现优秀,在测试集上却一塌糊涂。你是否也曾有过这样的经历,当你参加建模竞赛时,从跑分上看你的模型明明应该高居榜首,但在赛方公布的成绩榜上,它却名落孙山,远在几百名之后。如果你有过类似经历,那本文就是专为写的——它会告诉你如何避免过拟合来提高模型性能。

在这篇文章中,我们将详细讲述过拟合的概念和用几种用于解决过拟合问题的正则化方法,并辅以Python案例讲解,以进一步巩固这些知识。注意,本文假设读者具备一定的神经网络、Keras实现的经验。

目录

1. 什么是正则化

2. 正则化和过拟合

3. 深度学习中的正则化

  • L2和L1正则化

  • Dropout

  • 数据增强

  • 早停法

什么是正则化

在深入探讨这个话题之前,请看一下这张图片:

一文概述深度学习中的正则化(含Python代码)

每次谈及过拟合,这张图片就会时不时地被拉出来“鞭尸”。如上图所示,刚开始的时候,模型还不能很好地拟合所有数据点,即无法反映数据分布,这时它是欠拟合的。而随着训练次数增多,它慢慢找出了数据的模式,能在尽可能多地拟合数据点的同时反映数据趋势,这时它是一个性能较好的模型。在这基础上,如果我们继续训练,那模型就会进一步挖掘训练数据中的细节和噪声,为了拟合所有数据点“不择手段”,这时它就过拟合了。

换句话说,从左往右看,模型的复杂度逐渐提高,在训练集上的预测错误逐渐减少,但它在测试集上的错误率却呈现一条下凸曲线。

一文概述深度学习中的正则化(含Python代码)

来源:Slideplayer

如果你之前构建过神经网络,想必你已经得到了这个教训:网络有多复杂,过拟合就有多容易。为了使模型在拟合数据的同时更具推广性,我们可以用正则化对学习算法做一些细微修改,从而提高模型的整体性能。

正则化和过拟合

过拟合和神经网络的设计密切相关,因此我们先来看一个过拟合的神经网络:

一文概述深度学习中的正则化(含Python代码)

如果你之前阅读过我们的从零学习:从Python和R理解和编码神经网络(完整版),或对神经网络正则化概念有初步了解,你应该知道上图中带箭头的线实际上都带有权重,而神经元是储存输入输出的地方。为了公平起见,也就是为了防止网络在优化方向上过于放飞自我,这里我们还需要加入一个先验——正则化惩罚项,用来惩罚神经元的加权矩阵。

如果我们设的正则化系数很大,导致一些加权矩阵的值几乎为零——那***我们得到的是一个更简单的线性网络,它很可能是欠拟合的。

一文概述深度学习中的正则化(含Python代码)

因此这个系数并不是越大越好。我们需要优化这个正则化系数的值,以便获得一个良好拟合的模型,如下图所示。

一文概述深度学习中的正则化(含Python代码)

深度学习中的正则化

L2和L1正则化

L1和L2是最常见的正则化方法,它们的做法是在代价函数后面再加上一个正则化项。

代价函数 = 损失(如二元交叉熵) + 正则化项

由于添加了这个正则化项,各权值被减小了,换句话说,就是神经网络的复杂度降低了,结合“网络有多复杂,过拟合就有多容易”的思想,从理论上来说,这样做等于直接防止过拟合(奥卡姆剃刀法则)。

当然,这个正则化项在L1和L2里是不一样的。

对于L2,它的代价函数可表示为:

一文概述深度学习中的正则化(含Python代码)

这里λ就是正则化系数,它是一个超参数,可以被优化以获得更好的结果。对上式求导后,权重w前的系数为1−ηλ/m,因为η、λ、m都是正数,1−ηλ/m小于1,w的趋势是减小,所以L2正则化也被称为权重衰减。

而对于L1,它的代价函数可表示为:

一文概述深度学习中的正则化(含Python代码)

和L2不同,这里我们惩罚的是权重w的绝对值。对上式求导后,我们得到的等式里包含一项-sgn(w),这意味着当w是正数时,w减小趋向于0;当w是负数时,w增大趋向于0。所以L1的思路就是把权重往0靠,从而降低网络复杂度。

因此当我们想要压缩模型时,L1的效果会很好,但如果只是简单防止过拟合,一般情况下还是会用L2。在Keras中,我们可以直接调用regularizers在任意层做正则化。

例:在全连接层使用L2正则化的代码:


  1. from keras import regularizersmodel.add(Dense(64, input_dim=64, kernel_regularizer=regularizers.l2(0.01) 

注:这里的0.01是正则化系数λ的值,我们可以通过网格搜索对它做进一步优化。

Dropout

Dropout称得上是正则化方法中最有趣的一种,它的效果也很好,所以是深度学习领域常用的方法之一。为了更好地解释它,我们先假设我们的神经网络长这样:

一文概述深度学习中的正则化(含Python代码)

那么Dropout到底drop了什么?我们来看下面这幅图:在每次迭代中,它会随机选择一些神经元,并把它们“满门抄斩”——把神经元连同相应的输入输出一并“删除”。

一文概述深度学习中的正则化(含Python代码)

比起L1和L2对代价函数的修改,Dropout更像是训练网络的一种技巧。随着训练进行,神经网络在每一次迭代中都会忽视一些(超参数,常规是一半)隐藏层/输入层的神经元,这就导致不同的输出,其中有的是正确的,有的是错误的。

这个做法有点类似集成学习,它能更多地捕获更多的随机性。集成学习分类器通常比单一分类器效果更好,同样的,因为网络要拟合数据分布,所以Dropout后模型大部分的输出肯定是正确的,而噪声数据影响只占一小部分,不会对最终结果造成太大影响。

一文概述深度学习中的正则化(含Python代码)

由于这些因素,当我们的神经网络较大且随机性更多时,我们一般用Dropout。

在Keras中,我们可以使用keras core layer实现dropout。下面是它的Python代码:


  1. from  keras.layers.core import Dropoutmodel =  Sequential([Dense(output_dim=hidden1_num_units,  input_dim=input_num_units,  activation='relu'),Dropout(0.25),Dense(output_dim=output_num_units,  input_dim=hidden5_num_units, activation='softmax'),]) 

注:这里我们把0.25设为Dropout的超参数(每次“删”1/4),我们可以通过网格搜索对它做进一步优化。

数据增强

既然过拟合是模型对数据集中噪声和细节的过度捕捉,那么防止过拟合最简单的方法就是增加训练数据量。但是在机器学习任务中,增加数据量并不是那么容易实现的,因为搜集、标记数据的成本太高了。

假设我们正在处理的一些手写数字图像,为了扩大训练集,我们能采取的方法有——旋转、翻转、缩小/放大、位移、截取、添加随机噪声、添加畸变等。下面是一些处理过的图:

一文概述深度学习中的正则化(含Python代码)

这些方式就是数据增强。从某种意义上来说,机器学习模型的性能是靠数据量堆出来的,因此数据增强可以为模型预测的准确率提供巨大提升。有时为了改进模型,这也是一种必用的技巧。

在Keras中,我们可以使用ImageDataGenerator执行所有这些转换,它提供了一大堆可以用来预处理训练数据的参数列表。以下是实现它的示例代码:


  1. from keras.preprocessing.image import ImageDataGeneratordatagen = ImageDataGenerator(horizontal flip=True)datagen.fit(train) 

早停法

这是一种交叉验证策略。训练前,我们从训练集中抽出一部分作为验证集,随着训练的进行,当模型在验证集上的性能越来越差时,我们立即手动停止训练,这种提前停止的方法就是早停法。

一文概述深度学习中的正则化(含Python代码)

在上图中,我们应该在虚线位置就停止训练,因为在那之后,模型就开始过拟合了。

在Keras中,我们可以调用callbacks函数提前停止训练,以下是它的示例代码:

  1. from keras.callbacks import EarlyStoppingEarlyStopping(monitor='val_err', patience=5) 

在这里,monitor指的是需要监控的epoch数量;val_err表示验证错误(validation error)。

patience表示经过5个连续epoch后模型预测结果没有进一步改善。结合上图进行理解,就是在虚线后,模型每训练一个epoch就会有更高的验证错误(更低的验证准确率),因此连续训练5个epoch后,它会提前停止训练。

注:有一种情况是当模型训练5个epoch后,它的验证准确率可能会提高,因此选取超参数时我们要小心。

深度学习 正则化 Python
上一篇:人工智能马赛克去除深度CNN降噪器和多层相邻分量嵌入马赛克去除 下一篇:为什么说人工智能是第四次工业革命?
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

体验中国自主知识产权天元深度学习引擎与TensorFlow,PyTorch的对比

深度学习驱动之下最早创业的中国AI独角兽旷视,宣布开源自研深度学习框架MegEngine(Brain++核心组件之一),中文名天元——取自围棋棋盘中心点的名称。

尹成 ·  2天前
2020年深度学习优秀GPU一览,看看哪一款最适合你!

如果你准备进入深度学习,什么样的GPU才是最合适的呢?下面列出了一些适合进行深度学习模型训练的GPU,并将它们进行了横向比较,一起来看看吧!

大数据文摘 ·  3天前
清华开源Jittor:首个国内高校自研深度学习框架,一键转换PyTorch

深度学习框架越来越多,主导的团队也从高校研究机构渐渐转向了科技巨头。但是,学界在这一领域的力量不容忽视。今日。清华大学开发了一个名为计图(Jittor)的深度学习框架。

佚名 ·  2020-03-20 14:33:29
一行代码让性能提升2倍 精选

如果现在向你推荐一款神器,可以实现训练速度翻倍,访存效率翻倍,你心动吗?心动不如行动,来和我一起看看这款神器——基于PaddlePaddle核心框架的自动混合精度技术,简称飞桨 AMP 技术。

佚名 ·  2020-03-13 13:23:42
Facebook研究开放三个新框架,让深度学习更容易

你知道吗?微软、谷歌、Facebook、亚马逊、Uber等科技巨头的研究部门已经成为人工智能(AI)领域开源框架最活跃的贡献者之一。

读芯术 ·  2020-03-10 13:27:28
使用Python和Keras创建简单语音识别引擎

语音识别是机器或程序识别口语中的单词和短语并将其转换为机器可读格式的能力。通常,这些算法的简单实现有一个有限的词汇表,它可能只识别单词/短语。但是,更复杂的算法(例如Cloud Speech-to-Text和Amazon Transcribe)具有广泛的词汇量,并包含方言、噪音和俚语。

不靠谱的猫 ·  2020-03-04 10:51:35
迁移学习,让深度学习不再困难……

在不远的过去,数据科学团队需要一些东西来有效地利用深度学习:新颖的模型架构,很可能是内部设计的;访问大型且可能是专有的数据集;大规模模型训练所需的硬件或资金。

读芯术 ·  2020-03-02 17:03:32
国产深度学习框架MegEngine,三月底即将开源

2020 年我们应该选择哪一种深度学习框架?现在又有了一个新选择,据可靠消息,来自旷视 Brain++的 核心深度学习框架即将于 3 月底开源。

Synced ·  2020-02-28 15:20:38
Copyright©2005-2020 51CTO.COM 版权所有 未经许可 请勿转载