【深度学习】Dropout原理以及代码实现

简介: 【深度学习】Dropout原理以及代码实现

Drouout起源

随着深度学习的发展,各种网络结构层出不穷,导致网络越来越深,数据的容纳量越来越大,模型的参数也越来越多,这样就会导致神经网络很容易过拟合,过拟合的模型几乎是不能用于实践中的,因为拟合的数据与测试数据不一致,导致模型的泛化性能较低。

由于这个问题,现在有很多解决办法,比如使用集成模型,同时训练多个模型,最终让几个模型进行加权,这样能够解决过拟合是因为使用了不同的模型,每个模型拟合到的数据特征不同,最终由于互补,能够使模型的泛化性能更强,随机森林就是很经典的ensemble模型,分别单独训练多个子树,每个子树之间互不依赖。

但是这种方法对于深度学习不太现实,因为要训练多个网络,并且使得每个网络最终得到它们的最优解,我们都知道现在的网络很复杂,训练太过昂贵,训练一个模型都很不容易,何况是同时训练多个,这显然是不太现实的,另外一点就是可以使用同一个网络结构,然后训练不同的数据,也就是说,分别使用不同的训练子集进行训练获得每个训练子集对应的网络结构,这样的问题就是导致浪费了数据,而且真实中没有那么多的数据进行切分。

神经网络的两个缺点:

  • 捕捉高阶特征依赖,容易过拟合
  • 训练费时费力

什么是Dropout

Dropout是一项技术可以解决上面提到的问题,它可以理解是一种正则化的技术,它的原理是在模型正向传播过程中,以一定的概率p使隐层中的神经元暂时性失活,注意只是暂时失活,并不是永久失活,每个mini-batch进行传播时,都会随机失活一定神经元,这样就会缓解过拟合的现象,原因是训练每个mini-batch时,并不是所有的神经元都会参与训练,说白了就是每个传播都是网络结构的部分神经元在发挥作用,这样与原网络就会少很多训练参数,因为失活一定神经元,会导致每个mini-batch的数据不会完全拟合,这就是Dropout的原理所在。

对于概率p是我们指定的,它的意思就是每个神经元有多大的概率仍在工作,如果令p=0.3,那么也就是说每个神经元有70%的概率会失活,如果p=0,那么所有的神经元会全部失活,导致网络不会传播。

在训练期间,我们会指定p,然后随机产生一个符合伯努利分布的张量,该张量的形状和该隐层神经元的个数相同,如果一个隐层的神经元的个数为 5 个,那么产生的张量就是 【 0,0,1,1,0】,就是说只有第三个和第四个工作,其余全部失活。

还有个问题就是,由于在训练期间使用Dropout让部分神经元失活,而在模型推断的过程中所有的神经元是存活的,这样就会导致训练期间该层的输出与推断时该层的输出期望不一致

有人会说在推断时也采用Dropout那这样不就和训练一致了,这样期望是一致的,但是这样在现实中会存在一个问题,因为Dropout会随机的进行失活神经元,如果推断时使用Dropout随机失活的话,这样就会导致每个推断的结果不一致,带来结果不稳定的问题

  • 训练:px1+(1p)0=px
  • 推断:x

这样导致推断时的期望会与训练时不一致,解决办法有两种,一种是训练时进行缩放,第二种是在推断时进行放大

  • 方法一:x / = p


  • 方法二:x ∗ = p

代码实现

import numpy as np
"""
discard_prob : 每个神经元被丢弃的概率,计算时要换成keep_prob
"""
def dropout(x, discard_prob=0.5, seed=None):
    if discard_prob < 0 or discard_prob > 1:
        raise ValueError('Dropout prob must be in interval [0,1].')
    keep_prob = 1 - discard_prob
    seed = np.random.seed(seed)
    random_tensor = np.random.binomial(n=1, p=keep_prob, size=x.shape)
    x *= random_tensor
    x /= keep_prob
    return x
x = np.random.uniform(low=1, high=5, size=10)
out = dropout(x,discard_prob=0.2)
out


目录
相关文章
|
20天前
|
机器学习/深度学习 自然语言处理 语音技术
深入探索深度学习中的兼容性函数:从原理到实践
深入探索深度学习中的兼容性函数:从原理到实践
30 3
|
20天前
|
机器学习/深度学习 自然语言处理 语音技术
揭秘深度学习中的兼容性函数:原理、类型与应用
揭秘深度学习中的兼容性函数:原理、类型与应用
|
2月前
|
机器学习/深度学习
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
本文探讨了深度可分离卷积和空间可分离卷积,通过代码示例展示了它们在降低计算复杂性和提高效率方面的优势。
166 2
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
|
2月前
|
机器学习/深度学习 PyTorch 算法框架/工具
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
【10月更文挑战第1天】深度学习中,模型微调虽能提升性能,但常导致“灾难性遗忘”,即模型在新任务上训练后遗忘旧知识。本文介绍弹性权重巩固(EWC)方法,通过在损失函数中加入正则项来惩罚对重要参数的更改,从而缓解此问题。提供了一个基于PyTorch的实现示例,展示如何在训练过程中引入EWC损失,适用于终身学习和在线学习等场景。
118 4
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习中的注意力机制:原理、应用与未来展望
探索深度学习中的注意力机制:原理、应用与未来展望
|
19天前
|
机器学习/深度学习 自然语言处理 并行计算
探索深度学习中的Transformer模型:原理、优势与应用
探索深度学习中的Transformer模型:原理、优势与应用
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习中的注意力机制:原理、应用与未来趋势
探索深度学习中的注意力机制:原理、应用与未来趋势
|
20天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的兼容性函数:原理、类型与未来趋势
深度学习中的兼容性函数:原理、类型与未来趋势
|
20天前
|
机器学习/深度学习 算法框架/工具 Python
深度学习的奥秘与实践:从理论到代码
本文将探索深度学习的世界,揭示其背后的原理,并分享如何将这些理论应用到实际编程中。我们将一起踏上一段旅程,从神经网络的基础概念出发,逐步深入到复杂的模型训练和优化技术。你将看到,即使是初学者,也可以实现自己的深度学习项目。
|
27天前
|
机器学习/深度学习 自然语言处理 语音技术
探索机器学习中的深度学习模型:原理与应用
探索机器学习中的深度学习模型:原理与应用
34 0