dropout技术是神经网络和深度学习模型的一种简单而有效的正则化方式。

本文将向你介绍dropout正则化技术,并且教你如何在Keras中用Python将其应用于你的模型。

读完本文之后,你将了解:

  • dropout正则化的原理
  • 如何在输入层使用dropout
  • 如何在隐藏层使用dropout
  • 如何针对具体问题对dropout调优

神经网络的Dropout正则化

Dropout是Srivastava等人在2014年的一篇论文中提出的一种针对神经网络模型的正则化方法 Dropout: A Simple Way to Prevent Neural Networks from Overfitting。

Dropout的做法是在训练过程中随机地忽略一些神经元。这些神经元被随机地“抛弃”了。也就是说它们在正向传播过程中对于下游神经元的贡献效果暂时消失了,反向传播时该神经元也不会有任何权重的更新。

随着神经网络模型不断地学习,神经元的权值会与整个网络的上下文相匹配。神经元的权重针对某些特征进行调优,具有一些特殊化。周围的神经元则会依赖于这种特殊化,如果过于特殊化,模型会因为对训练数据过拟合而变得脆弱不堪。神经元在训练过程中的这种依赖于上下文的现象被称为复杂的协同适应(complex co-adaptations)。

你可以想象一下,如果在训练过程中随机丢弃网络的一部分,那么其它神经元将不得不介入,替代缺失神经元的那部分表征,为预测结果提供信息。人们认为这样网络模型可以学到多种相互独立的内部表征。

这么做的效果就是,网络模型对神经元特定的权重不那么敏感。这反过来又提升了模型的泛化能力,不容易对训练数据过拟合。

Keras的Dropout 正则化

Dropout的实现很简单,在每轮权重更新时随机选择一定比例(比如20%)的节点抛弃。Keras的Dropout也是这么实现的。Dropout技术只在模型训练的阶段使用,在评估模型性能的时候不需使用。

Keras入门博文:
Python Keras (一个超好用的神经网络框架)的使用以及实例
易用的深度学习框架Keras简介

接下来我们看看Dropout在Keras中的一些不同用法。

本例子使用了声呐数据集(Sonar dataset)。这是一个二分类问题,目的是根据声呐的回声来正确地区分岩石和矿区。这个数据集非常适合神经网络模型,因为所有的输入都是数值型的,且具有相同的量纲。

数据集可以从UCI机器学习代码库下载。然后把声呐数据集放在当前工作路径下,文件命名为sonar.csv。

我们会用scikit-learn来评价模型质量,为了更好地挑拣出结果的差异,采用了十折交叉验证(10-fold cross validation)方法。

每条数据有60个输入值和1个输出值,输入值在送入模型前做了归一化。基准的神经网络模型有两个隐藏层,第一层有60个节点,第二层有30个。使用了随机梯度下降的方法来训练模型,选用了较小的学习率和冲量。

完整的基准模型代码如下所示。

    import numpyimport pandasfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import Dropoutfrom keras.wrappers.scikit_learn import KerasClassifierfrom keras.constraints import maxnormfrom keras.optimizers import SGDfrom sklearn.cross_validation import cross_val_scorefrom sklearn.preprocessing import LabelEncoderfrom sklearn.cross_validation import StratifiedKFoldfrom sklearn.preprocessing import StandardScalerfrom sklearn.grid_search import GridSearchCVfrom sklearn.pipeline import Pipelinefrom sklearn.grid_search import GridSearchCV# fix random seed for reproducibilityseed = 7numpy.random.seed(seed)# load datasetdataframe = pandas.read_csv("sonar.csv", header=None)dataset = dataframe.values# split into input (X) and output (Y) variablesX = dataset[:,0:60].astype(float)Y = dataset[:,60]# encode class values as integersencoder = LabelEncoder()encoder.fit(Y)encoded_Y = encoder.transform(Y)# baselinedef create_baseline():# create modelmodel = Sequential()model.add(Dense(60, input_dim=60, init='normal',     activation='relu'))model.add(Dense(30, init='normal', activation='relu'))model.add(Dense(1, init='normal', activation='sigmoid'))# Compile modelsgd = SGD(lr=0.01, momentum=0.8, decay=0.0, nesterov=False)model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])return modelnumpy.random.seed(seed)estimators = []estimators.append(('standardize', StandardScaler()))estimators.append(('mlp', KerasClassifier(build_fn=create_baseline, nb_epoch=300, batch_size=16, verbose=0)))pipeline = Pipeline(estimators)kfold = StratifiedKFold(y=encoded_Y, n_folds=10, shuffle=True, random_state=seed)results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

运行代码,分类的准确率大概为82%。

Accuracy: 82.68% (3.90%)

在可见层使用Dropout

Dropout可用于输入神经元,即可见层。

在下面这个例子里,我们在输入(可见层)和第一个隐藏层之间加入一层Dropout。丢弃率设为20%,就是说每轮迭代时每五个输入值就会被随机抛弃一个。

另外,正如Dropout那篇论文中所推荐的,每个隐藏层的权重值都做了限制,确保权重范数的最大值不超过3。在构建模型层的时候,可以通过设置Dense Class的W_constraint参数实现。

学习率提高了一个数量级,冲量增加到0.9。这也是那篇Dropout论文的原文中所推荐的做法。

顺着上面基准模型的例子,下面的代码是包含输入层dropout的网络模型。

    # dropout in the input layer with weight constraintdef create_model1():# create modelmodel = Sequential()model.add(Dropout(0.2, input_shape=(60,)))model.add(Dense(60, init='normal', activation='relu', W_constraint=maxnorm(3)))model.add(Dense(30, init='normal', activation='relu', W_constraint=maxnorm(3)))model.add(Dense(1, init='normal', activation='sigmoid'))# Compile modelsgd = SGD(lr=0.1, momentum=0.9, decay=0.0, nesterov=False)model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])return modelnumpy.random.seed(seed)estimators = []estimators.append(('standardize', StandardScaler()))estimators.append(('mlp', KerasClassifier(build_fn=create_model1, nb_epoch=300, batch_size=16, verbose=0)))pipeline = Pipeline(estimators)kfold = StratifiedKFold(y=encoded_Y, n_folds=10, shuffle=True, random_state=seed)results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

运行这段代码,分类准确率完美地提升到了86%。

Accuracy: 86.04% (6.33%)

在隐藏层使用Dropout

Dropout也可用于模型内的隐藏层节点。

下面这个例子里,Dropout被用于两个隐藏层之间和隐藏层与输出层之间。丢弃率同样设为20%,且使用权重限制。

    # dropout in hidden layers with weight constraintdef create_model2():# create modelmodel = Sequential()model.add(Dense(60, input_dim=60, init='normal', activation='relu', W_constraint=maxnorm(3)))model.add(Dropout(0.2))model.add(Dense(30, init='normal', activation='relu', W_constraint=maxnorm(3)))model.add(Dropout(0.2))model.add(Dense(1, init='normal', activation='sigmoid'))# Compile modelsgd = SGD(lr=0.1, momentum=0.9, decay=0.0, nesterov=False)model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])return modelnumpy.random.seed(seed)estimators = []estimators.append(('standardize', StandardScaler()))estimators.append(('mlp', KerasClassifier(build_fn=create_model2, nb_epoch=300, batch_size=16, verbose=0)))pipeline = Pipeline(estimators)kfold = StratifiedKFold(y=encoded_Y, n_folds=10, shuffle=True, random_state=seed)results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

我们观察到,对于这个问题以及所设置的模型配置参数,在隐藏层使用dropout并不能提升模型效果。事实上,效果反而比基准更差。

有可能需要增加训练迭代次数,或者是更多地调优学习率。

Accuracy: 82.16% (6.16%)

使用Dropout的小技巧

提出Dropout的那篇论文提供了一些在标准机器学习问题上得到的实践性结论。这些结论在dropout的实际应用中会带来帮助。

  • 通常丢弃率控制在20%~50%比较好,可以从20%开始尝试。如果比例太低则起不到效果,比例太高则会导致模型的欠学习。
  • 在大的网络模型上应用。当dropout用在较大的网络模型时更有可能得到效果的提升,模型有更多的机会学习到多种独立的表征。
  • 在输入层(可见层)和隐藏层都使用dropout。在每层都应用dropout被证明会取得好的效果。
  • 增加学习率和冲量。把学习率扩大10~100倍,冲量值调高到0.9~0.99.
  • 限制网络模型的权重。大的学习率往往导致大的权重值。对网络的权重值做最大范数正则化等方法被证明会提升效果。

有关Dropout的更多资源

下面这些资料也是关于dropout在神经网络和深度学习模型中应用。

  • Dropout: A Simple Way to Prevent Neural Networks from Overfitting(原论文)
  • Improving neural networks by preventing co-adaptation of feature detectors.
  • How does the dropout method work in deep learning?来自Quora

总结

通过本文,我们讨论了dropout正则化技术在深度学习模型中的应用。你应该掌握了:

  • dropout的含义和原理
  • 如何在自己的深度学习模型中使用dropout
  • 使用dropout的小技巧

如果你对dropout或者对本文有任何问题,请留言。

神经网络的Dropout正则化相关推荐

  1. 1.6 Dropout 正则化-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.5 为什么正则化可以减少过拟合 回到目录 1.7 理解 Dropout Dropout 正则化 除了 L2L2L2 正则化,还有一个非常实用的正则化方法--"D ...

  2. 偏差与方差、L1正则化、L2正则化、dropout正则化、神经网络调优、批标准化Batch Normalization(BN层)、Early Stopping、数据增强

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 3.2 深度学习正则化 3.2.1 偏差与方差 3.2.1.1 ...

  3. dropout层的作用_循环神经网络的 Dropout

    循环神经网络(RNNs)是基于序列的模型,对自然语言理解.语言生成.视频处理和其他许多任务至关重要.模型的输入是一个符号序列,在每个时间点一个简单的神经网络(RNN单元)应用于一个符号,以及此前时间点 ...

  4. 2.1.2 Dropout正则化以及其他正则化

    Dropout正则化 Dropout介绍 除了L2正则化之外,还有一个很重要的正则化方法叫随机失活(Dropout),下面,我们来了解一下. 如图所示,假设网络中的每一层的节点都以抛硬币的形式来设置概 ...

  5. 深度学习的实用层面 —— 1.6 Dropout正则化

    除了L2正则化,还有一个非常实用的正则化方法--dropout(随机失活),我们看一下它的工作原理. 假设你在训练上图这样的神经网络,它存在过拟合,这就是dropout所要处理的,我们复制这个神经网络 ...

  6. keras添加正则化全连接_第16章 Keras使用Dropout正则化防止过拟合

    Dropout虽然简单,但可以有效防止过拟合.本章关于如何在Keras中使用Dropout.本章包括: dropout的原理 dropout的使用 在隐层上使用dropout 我们开始吧. 16.1 ...

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

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

  8. 吴恩达深度学习笔记(十一)—— dropout正则化

    主要内容: 一.dropout正则化的思想 二.dropout算法流程 三.dropout的优缺点 一.dropout正则化的思想 在神经网络中,dropout是一种"玄学"的正则 ...

  9. keras添加L1正则化,L2正则化和Dropout正则化及其原理

    一.什么是正则化,用来干嘛的? 正则化(regularization),是指在线性代数理论中,不适定问题通常是由一组线性代数方程定义的,而且这组方程组通常来源于有着很大的条件数的不适定反问题.大条件数 ...

  10. 陈怡然团队最新研究:用复数神经网络提高梯度正则化准确度 | ICML 2021

    博雯 发自 凹非寺 量子位 报道 | 公众号 QbitAI 现在,我们可以用虚数来帮助AI算法抵御恶意攻击了! 这就是陈怡然团队提出的复数神经网络(CVNN),论文已被机器学习顶会ICML接收. 在对 ...

最新文章

  1. MYSQL主从复制—master-salve
  2. java 标记_java的标记算法
  3. KVM复制虚拟机,KVM克隆虚拟机
  4. java web编码详解_Java Web 之编解码分析
  5. 报线上python课程靠谱吗-Python培训线上和线下有什么区别?
  6. iar编译工程的map怎么看使用flash大小_ESP8266_08基于flash的数据掉电保护
  7. 西门子 SinuTrain 840Dsl OPC UA 模拟
  8. 学习笔记:计算机字符编码标准之GB2312-1980中文字符编码
  9. 网站优化排名的5个方法
  10. oracle热备机制,Oracle的热备
  11. linux分析mirna,利用DIANA Tools进行miRNA分析
  12. 【51单片机】霹雳灯实验代码
  13. 【算法设计与分析】7、0/1背包问题,动态规划
  14. 欧冠 欧洲杯免费直播平台
  15. wps2019数据分析加载项_《07版office办公软件中的excle中,为什么在加载项里选择了分析工具库,数据分析还是显示不出来?》 wps数据分析加载项...
  16. 用计算机弹琴琴谱,在电脑上弹钢琴的软件
  17. ctfshow MengXIn 下(pearcmd.php妙用条件竞争简单密码简单misc)
  18. C语言:离散数学8.1.5 笛卡尔积
  19. C语言程序设计Bjarne特别版,C语言程序设计(2013深色背景).ppt
  20. 全球及中国石墨聚苯乙烯(GPS)行业市场运行动态与前景策略分析报告2022-2028年

热门文章

  1. k8s之根据tag发布spring boot项目
  2. SQL Server 中WITH (NOLOCK)
  3. Android 详解自定义View抽奖转盘
  4. Oracle10g 如何给scott用户解锁
  5. IDC:第三季度企业WLAN市场增长强劲
  6. pycharm调试GreenOdoo
  7. Rpm另类用法加固Linux安全
  8. 学习笔记 : 表达式目录树相关问题参照该demo expression拼接与拆解 expression转sql...
  9. 剑指offer python版 剪绳子
  10. 空悬指针和野指针(Dangling pointer and wild pointer)