【深度学习】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


目录
相关文章
|
4月前
|
机器学习/深度学习 算法 定位技术
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
本项目基于YOLOv8模型与C#界面,结合Baumer工业相机,实现裂缝的高效检测识别。支持图像、视频及摄像头输入,具备高精度与实时性,适用于桥梁、路面、隧道等多种工业场景。
478 27
|
2月前
|
机器学习/深度学习 存储 PyTorch
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
Neural ODE将神经网络与微分方程结合,用连续思维建模数据演化,突破传统离散层的限制,实现自适应深度与高效连续学习。
124 3
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
|
2月前
|
机器学习/深度学习 数据采集 编解码
基于深度学习分类的时相关MIMO信道的递归CSI量化(Matlab代码实现)
基于深度学习分类的时相关MIMO信道的递归CSI量化(Matlab代码实现)
119 1
|
2月前
|
机器学习/深度学习 算法 vr&ar
【深度学习】基于最小误差法的胸片分割系统(Matlab代码实现)
【深度学习】基于最小误差法的胸片分割系统(Matlab代码实现)
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习的原理与应用:开启智能时代的大门
深度学习的原理与应用:开启智能时代的大门
664 16
|
12月前
|
机器学习/深度学习 自然语言处理 语音技术
深入探索深度学习中的兼容性函数:从原理到实践
深入探索深度学习中的兼容性函数:从原理到实践
141 3
|
12月前
|
机器学习/深度学习 自然语言处理 语音技术
揭秘深度学习中的兼容性函数:原理、类型与应用
揭秘深度学习中的兼容性函数:原理、类型与应用
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的兼容性函数:原理、类型与未来趋势
深度学习中的兼容性函数:原理、类型与未来趋势
|
机器学习/深度学习 人工智能 监控
深入理解深度学习中的卷积神经网络(CNN):从原理到实践
【10月更文挑战第14天】深入理解深度学习中的卷积神经网络(CNN):从原理到实践
729 1
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
550 2

热门文章

最新文章