【深度学习】Dropout原理及其python实现

1、dropout简述

dropout是解决神经网络模型过拟合的一种常用方法。
dropout是指在神经网络训练过程中,以一定的概率随机丢弃神经元(注意是暂时丢弃),以减少神经元之间的依赖性,从而提高模型的泛化能力。

这里写图片描述

dropout类似ensemble方法(组合多个模型,以获得更好的效果,使集成的模型具有更强的泛化能力)
区别在于:dropout在训练过程中每次迭代都会得到一个新模型,最终结果是多个模型的融合,得到的只有一个模型,一组参数

2、dropout给模型带来的改变
(1)训练层面
加入dropout后模型训练过程,都要计算概率,确定哪些神经元被丢弃,被丢弃的神经元输出变为0
这里写图片描述
没有dropout:
这里写图片描述
加入dropout:
这里写图片描述

(2)测试层面
这里写图片描述

训练过程,神经元被丢弃的概率为(1-P),被保留下来的可能性为P;
测试过程,神经元一直都在,在测试阶段必须仿真出在训练阶段使用的网络集的行为,所以每个参数都要乘以P
(注意这个P是神经元保留下来的概率)

3、A Practical Guide for Training Dropout Networks

(1)Network Size:
采用dropout后,隐含层节点数n要按照n/p增加;

(2)Learning Rate and Momentum:
dropout的引入产生了很多噪声,为了降低噪声的影响,可以通过以下两种方式:Learning Rate的取值是普通网络的10-100倍;momentum:momentum对于标准网络一般采用0.9,对于dropout网络一般是0.95-0.99。两种可以同时使用

(3)Max-norm Regularization:
大的Learning Rate and Momentum会造成网络参数太大,一般给隐含层权重的norm一个上限c,c一般取值3-4。
(4)Dropout Rate
一般取值0.5~0.8。经过交叉验证,隐含节点dropout率等于0.5的时候效果最好,原因是0.5的时候dropout随机生成的网络结构最多。

python实现

import numpy as np

def dropout(x, p, mode='train'):
    keep_prob = 1 - p
    if mode == 'train':
        x *= np.random.binomial(1, keep_prob, size=x.shape)
    else:
        x *= keep_prob
    return x


# 简化,直接在训练阶段对输入进行rescale,测试阶段则不需任何操作
# 参考:http://cs231n.github.io/neural-networks-2/
def dropout(x, p, mode='train'):
    keep_prob = 1 - p
    if mode == 'train':
        x *= np.random.binomial(1, keep_prob, size=x.shape) / keep_prob
    return x

更多详细内容请阅读:Dropout-A Simple Way to Prevent Neural Networks from Overfitting

参考:
深度学习网络大杀器之Dropout——深入解析Dropout
Dropout为何能防止过拟合?

知识延伸:
Hinton提出的经典防过拟合方法Dropout,只是SDR的特例

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么要学习这门课程】深度学习框架如TensorFlow和Pytorch掩盖了深度学习底层实现方法,那能否能用Python代码从零实现来学习深度学习原理呢?本课程就为大家提供了这个可能,有助于深刻理解深度学习原理。左手原理、右手代码,双管齐下!本课程详细讲解深度学习原理并进行Python代码实现深度学习网络。课程内容涵盖感知机、多层感知机、卷积神经网络、循环神经网络,并使用Python 3及Numpy、Matplotlib从零实现上述神经网络。本课程还讲述了神经网络的训练方法与实践技巧,且开展了代码实践演示。课程对于核心内容讲解深入细致,如基于计算图理解反向传播算法,并用数学公式推导反向传播算法;另外还讲述了卷积加速方法im2col。【课程收获】本课程力求使学员通过深度学习原理、算法公式及Python代码的对照学习,摆脱框架而掌握深度学习底层实现原理与方法。本课程将给学员分享深度学习Python实现代码。课程代码通过Jupyter Notebook演示,可在Windows、ubuntu等系统上运行,且不需GPU支持。【优惠说明】 课程正在优惠!  备注:购课后可加入白勇老师课程学习交流QQ群:957519975【相关课程】学习本课程的前提是会使用Python语言以及Numpy和Matplotlib库。相关课程链接如下:《Python编程的术与道:Python语言入门》https://edu.csdn.net/course/detail/27845《玩转Numpy计算库》https://edu.csdn.net/lecturer/board/28656《玩转Matplotlib数据绘图库》https://edu.csdn.net/lecturer/board/28720【课程内容导图及特色】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值