Dropout技术为什么能防止过拟合?

简介:

在学习深度学习时,常常有人会问到这样一个问题:Dropout技术为什么能防止过拟合?

当然,简单的回答是:防止参数过分依赖训练数据,增加参数对数据集的泛化能力。

这样的回答,当然是正确的。但有点抽象。我来说点具体的案例,以帮助大家更形象化地理解。首先,这涉及到深度学习的分布式特征表达。

1.什么是分布式特征表达呢?

分布式表征(Distributed Representation),是人工神经网络研究的一个核心思想。那什么是分布式表征呢?简单来说,就是当我们表达一个概念时,神经元和概念之间不是一对一对应映射(map)存储的,它们之间的关系是多对多。具体而言,就是一个概念可以用多个神经元共同定义表达,同时一个神经元也可以参与多个不同概念的表达,只不过所占的权重不同罢了。

举例来说,对于“小红汽车”这个概念,如果用分布式特征地表达,那么就可能是一个神经元代表大小(形状:小),一个神经元代表颜色(颜色:红),还有一个神经元代表车的类别(类别:汽车)。只有当这三个神经元同时被激活时,就可以比较准确地描述我们要表达的物体。

分布式表征表示有很多优点。其中最重要的一点,莫过于当部分神经元发生故障时,信息的表达不会出现覆灭性的破坏。比如,我们常在影视作品中看到这样的场景,仇人相见分外眼红,一人(A)发狠地说,“你化成灰,我都认识你(B)!”这里并不是说B真的“化成灰”了,而是说,虽然时过境迁,物是人非,当事人B外表也变了很多(对于识别人A来说,B在其大脑中的信息存储是残缺的),但没有关系,只要B的部分核心特征还在,那A还是能够把B认得清清楚楚、真真切切!人类的大脑还是真的厉害啊!

事实上,利用神经网络的分布式特征表达,还可以用来阻止过拟合的发生。

下面我们来谈谈这个问题

2.什么是Dropout技术呢?

2012年,Hinton等人发表了一篇高引用论文[1],其中提到了一种在深度学习中广为使用的技巧:丢弃学习(Dropout Learning)。算法的核心思想和前文讲解的理念有异曲同工之妙。

“丢弃学习(Dropout,也有人称之为“随机失活”)”是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。“丢弃学习”通常分为两个阶段:学习阶段和测试阶段。


图1 Dropout示意图(图片来源:参考文献[2])

在学习阶段,以概率p主动临时性地忽略掉部分隐藏节点。这一操作的好处在于,在较大程度上减小了网络的大小,而在这个“残缺”的网络中,让神经网络学习数据中的局部特征(即部分分布式特征)。在多个“残缺”之网(相当于多个简单网络)中实施特征,总要比仅在单个健全网络上进行特征学习,其泛化能力来得更加健壮。

而在测试阶段,将参与学习的节点和那些被隐藏的节点以一定的概率p加权求和,综合计算得到网络的输出。对于这样的“分分合合”的学习过程,有学者认为,“丢弃学习”可视为一种集成学习(Ensemble Learning)[3]。

这里顺便简单介绍一下集成学习的思路。集成学习的理念,有点类似于中国的那句古话“三个臭皮匠,赛过诸葛亮”。在对新实例进行分类时,集成学习把若干个单个分类器集成起来,通过对多个分类器的分类结果进行某种优化组合,最终通过投票法,决定分类的结果,即采用了“少数服从多数”原则。

通常,集成学习可以取得比单个分类器更好的性能。如果把单个分类器比作一个决策者的话,集成学习的方法,就相当于多个决策者共同进行一项决策。

但需要指出的是,要获得较好的集成效果,每一个单独学习器都要保证做到“好而不同”。也就是说,个体学习器都要有一定的“准确性(Accuracy)”,并保证有多样性(Diversity),也就是说,学习器要有差异性,有了差异性,才能“兼听则明”,表现出更强的鲁棒性。

参考文献:

[1] Hinton G E, Srivastava N, Krizhevsky A, et al. Improving neural networks by preventing co-adaptation of feature detectors[J]. Computer Science, 2012, 3(4):pp. 212-223.

[2] Srivastava N, Hinton G, Krizhevsky A, et al. Dropout: a simple way to prevent neural networks from overfitting[J]. Journal of Machine Learning Research, 2014, 15(1):1929-1958.

[3] MLAHara, Kazuyuki, D. Saitoh, and H. Shouno. "Analysis of Dropout Learning Regarded as Ensemble Learning." International Conference on Artificial Neural Networks Springer, Cham, 2016:72-79.


文章作者:张玉宏(著有《品味大数据》、《深度学习之美》(最通俗易懂的深度学习入门)2018年6月即将出版)

相关文章
|
6月前
|
人工智能 IDE 开发工具
JetBrains Rider 2025.1 发布 - 快速且强大的跨平台 .NET IDE
JetBrains Rider 2025.1 (macOS, Linux, Windows) - 快速且强大的跨平台 .NET IDE
329 29
JetBrains Rider 2025.1 发布 - 快速且强大的跨平台 .NET IDE
|
Ubuntu 开发工具 Python
Ubuntu apt-get和pip国内源更换
Ubuntu apt-get和pip源更换 更新数据源为国内,是为了加速安装包的增加速度。 更换apt-get数据源 输入:sudo -s切换为root超级管理员; 执行命令:vim /etc/apt/sources.
13277 0
|
Linux Go API
MemoryModule内存反射DLL加载探索
MemoryModule内存反射DLL加载探索
|
机器学习/深度学习 知识图谱
第4章:知识融合:概述、方法
第4章:知识融合:概述、方法
第4章:知识融合:概述、方法
|
自动驾驶 机器人 测试技术
CVPR 2024:分割一切模型SAM泛化能力差?域适应策略给解决了
【4月更文挑战第24天】CVPR 2024 论文提出了解决图像分割基础模型 SAM 在分布偏移下泛化能力不足的问题,通过弱监督自训练策略增强模型适应性和计算效率。在多种图像分割任务上超越预训练 SAM 和现有适应方法,但弱标签质量和数量可能限制性能,且需大量计算资源。[Improving the Generalization of Segmentation Foundation Model under Distribution Shift via Weakly Supervised Adaptation](https://arxiv.org/pdf/2312.03502.pdf)
391 1
|
存储 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (二)
`memset()`是一个C语言库函数,用于将指定内存区域的字节设置为特定值。函数原型为`void *memset(void *ptr, int value, size_t num)`,参数分别为指向内存起始位置的指针、要设置的值和设置的字节数。`memcmp()`函数则用于比较两个内存区域,返回值表示比较结果,原型为`int memcmp(const void *ptr1, const void *ptr2, size_t num)`。它比较指定字节数的内存,并根据比较结果返回整数值。
202 4
|
大数据 关系型数据库 MySQL
MYSQL中group_concat有长度限制!默认1024(转载)
在mysql中,有个函数叫“group_concat”,平常使用可能发现不了问题,在处理大数据的时候,会发现内容被截取了,其实MYSQL内部对这个是有设置的,默认不设置的长度是1024,如果我们需要更大,就需要手工去修改配置文件。
5063 0
|
机器学习/深度学习 自然语言处理 运维
Word2Vec:一种基于预测的方法
Word2Vec:一种基于预测的方法
|
缓存 NoSQL 关系型数据库
MYSQL的跳表
关于MYSQL的跳表
464 0
|
机器学习/深度学习 存储 人工智能
自监督学习技术综述
自监督学习技术综述
751 0