【机器学习300问】75、如何理解深度学习中Dropout正则化技术?

一、Dropout正则化的原理是什么?

**Dropout(随机失活)正则化是一种用于减少神经网络中过拟合现象的技术。**Dropout正则化的做法是:

训练过程 中的每次迭代中,随机将网络中的一部分权重临时"丢弃"(即将它们的值设为0),确保它们不参与前向传播和后向传播。换句话说,每个神经元有一定的概率被暂时从网络中移除。通过这种方式,网络的每次训练迭代都是在一种略微不同的架构下完成的。这相当于在训练一个由多个不同网络组成的大型网络组合。

通常,丢弃的概率(dropout rate)是一个预先设定的值,如0.5,意味着在每一轮训练中,大约有一半的隐藏层神经元会被暂时忽略。有时候也反过来设置一个保留概率(keep-prob)操作和上面类似。

二、如何具体实现Dropout?

用下面这幅图为例来详细说明一下Dropout的步骤

(1)确定Dropout率

dropout_rate 是一个超参数,表示在每次训练迭代中神经元被丢弃的概率。设定为 p,通常在0.2到0.5之间。

python 复制代码
keep_prob = 1 - dropout_rate

(2)生成随机的Dropout掩码

Dropout最常用的方法,即inverted dropout(反向随机失活),首先要定义Dropout掩码向量dropout_mask 。然后看它是否小于某数,我们称之为keep_probkeep_prob 是一个具体数字,而本例将它设为0.8,它表示保留某个隐藏单元的概率,此处keep-prob等于0.8,它意味着消除任意一个隐藏单元的概率是0.2,它的作用就是生成随机矩阵。

python 复制代码
dropout_mask = np.random.rand(activations.shape[0], activations.shape[1]) < keep_prob

接下来要做的就是从某一层中获取激活函数,这里我叫它activationsactivations其中含有要计算的激活函数。

(3)应用掩码

activationsdropout_mask 相乘,它的作用就是让dropout_mask 中所有等于0的元素(输出),而各个元素等于0的概率只有20%,乘法运算最终把dropout_mask 中相应元素输出,即让dropout_mask 中0元素与activations中相对元素归零。

python 复制代码
activations *= dropout_mask  # 将神经元的输出乘以0或1

(4)Dropout缩放

在测试或使用神经网络进行预测时,通常不会应用Dropout。但是,为了平衡那些在训练时被"保留下来"的权重,我们对网络中每个权重乘以保留(未丢弃)概率,或者是在测试时使用所有权重的平均值。这种方法称为"Dropout缩放",它确保了训练时和测试时网络的表现是一致的。

python 复制代码
activations /= keep_prob     # 缩放未丢弃的神经元的输出

(5)总结

将上面的步骤总结起来,可以写成这样:

python 复制代码
def apply_dropout(activations, dropout_rate):
    # Step 1: 确定保留的神经元的概率
    keep_prob = 1 - dropout_rate
    
    # Step 2: 生成随机的Dropout掩码
    dropout_mask = np.random.rand(activations.shape[0], activations.shape[1]) < keep_prob
    
    # Step 3: 应用掩码并缩放
    activations *= dropout_mask  # 将神经元的输出乘以0或1
    activations /= keep_prob     # 缩放未丢弃的神经元的输出
    
    return activations

需要特别说一下的是,不同层的keep_prob 是可以不同的,因为不同层的W权重矩阵的大小不同,一般我们担心这些层更容易发生过拟合,对很大的权重矩阵设置比较低的keep_prob 假设是0.5。对于其它层,过拟合的程度可能没那么严重,它们的keep-prob 值可能高一些,可能是0.7。如果在某一层,我们不必担心其过拟合的问题,那么keep-prob 可以为1意味着保留所有单元,并且不在这一层使用dropout。

三、为什么Dropout会起作用?它是怎么解决过拟合的?

这种随机性的丢弃操作带来了几个重要的好处。

(1)抑制神经元对单一特征的过度依赖

如果某些神经元对应的权重值过大,它们对输入信号的响应将显著超过其他神经元,使得模型在做决策时过度依赖这些神经元所代表的特征,形成了对单一特征的过度敏感。

Dropout通过随机失活隐藏层神经元,打破了神经元对单一特征的固定依赖关系,迫使模型在不同训练迭代中学习不同的特征组合,降低了对特定特征的敏感度。

(2)抑制神经元之间过度依赖

在没有Dropout的情况下,某些神经元可能会形成过于紧密的协作关系,对训练数据中的特定模式过拟合,导致模型在遇到未见过的数据时表现不佳。

Dropout通过随机移除部分神经元,迫使剩余神经元独立地学习更通用、更稳健的特征表示,降低模型对个别特征或特征组合的敏感度,**强制网络在训练时不能过度依赖任何一组特定的神经元,因为特定的神经元随时有可能被失活。**从而减轻过拟合现象。

(3)模拟集成学习

**Dropout过程可以被视为对神经网络进行集成学习的一种近似。**由于每次前向传播时神经元的失活是随机的,网络在训练过程中实际上经历了大量不同的子网络配置。这些子网络可以看作是原始网络的多个变体,每个变体以不同的方式对输入数据进行处理。

尽管在测试阶段所有神经元都会恢复工作,但经过Dropout训练的网络权重实际上是众多子网络权重的加权平均,类似于集成学习中的模型平均,有助于减少模型的方差,提高泛化性能。

相关推荐
AI前沿技术追踪4 分钟前
人工智能安全治理新篇章:《2024人工智能安全治理框架1.0版》深度解读@附20页PDF文件下载
人工智能
吉小雨19 分钟前
PyTorch经典模型
人工智能·pytorch·python
无名之逆43 分钟前
计算机专业的就业方向
java·开发语言·c++·人工智能·git·考研·面试
CV-杨帆1 小时前
大语言模型-教育方向数据集
人工智能·语言模型·自然语言处理
Jackilina_Stone1 小时前
【AI】简单了解AIGC与ChatGPT
人工智能·chatgpt·aigc
paixiaoxin1 小时前
学术新手进阶:Zotero插件全解锁,打造你的高效研究体验
人工智能·经验分享·笔记·机器学习·学习方法·zotero
破晓的历程1 小时前
【机器学习】:解锁数据背后的智慧宝藏——深度探索与未来展望
人工智能·机器学习
AiBoxss1 小时前
AI工具集推荐,简化工作流程!提升效率不是梦!
人工智能
crownyouyou2 小时前
最简单的一文安装Pytorch+CUDA
人工智能·pytorch·python
鸽芷咕2 小时前
【Python报错已解决】libpng warning: iccp: known incorrect sRGB profile
开发语言·python·机器学习·bug