【神经网络】正则化缓解过拟合-Dropout

news2024/11/17 0:08:46

文章目录

  • 1、简介
  • 2、Dropout 层的原理和使用
  • 3、小结

🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎人工智能和前端开发。
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹

1、简介

在训深层练神经网络时,由于模型参数较多,在数据量不足的情况下,很容易过拟合

回顾知识:欠拟合和过拟合-引入正则化:https://xzl-tech.blog.csdn.net/article/details/132799737

Dropout 就是在神经网络中一种缓解过拟合的方法。
实现: 在每次训练过程中,以一定概率 p 随机将一部分神经元的输出设为0,这些被忽略的神经元在当前训练步骤中不参与计算。
image.png
其他正则化方法:

  • Elastic Net:结合了L1和L2正则化,适用于稀疏数据和多重共线性数据。
  • 早停(Early Stopping):在验证集上监控模型性能,当性能不再提升时停止训练。
  • 数据增强(Data Augmentation):通过对训练数据进行随机变换来增加数据量,从而提高模型的泛化能力。

2、Dropout 层的原理和使用

我们知道,缓解过拟合的方式就是降低模型的复杂度,而 Dropout 就是通过减少神经元之间的连接,把稠密的神经网络神经元连接,变成稀疏的神经元连接,从而达到降低网络复杂度的目的。
我们先通过一段代码观察下丢弃层的效果:

# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/7/29 3:12

import torch  # 导入PyTorch库
import torch.nn as nn  # 导入PyTorch中的神经网络模块


def test():
    # 初始化丢弃层,丢弃概率为0.8
    dropout = nn.Dropout(p=0.8)
    # 初始化输入数据,随机生成5x8的整数矩阵,并转换为浮点数
    inputs = torch.randint(0, 10, size=[5, 8]).float()
    print("Inputs:")
    print(inputs)  # 打印输入数据
    print('-' * 50)

    # 通过丢弃层处理输入数据
    outputs = dropout(inputs)
    print("Outputs after Dropout:")
    print(outputs)  # 打印输出数据


if __name__ == '__main__':
    test()  # 调用测试函数

程序输出结果:

"C:\Program Files\Python39\python.exe" D:\Python\AI\神经网络\9-正则化Dropout\丢弃层.py 
Inputs:
tensor([[7., 9., 7., 2., 6., 1., 2., 9.],
        [1., 8., 4., 6., 1., 2., 5., 1.],
        [7., 5., 4., 8., 2., 9., 7., 2.],
        [0., 2., 9., 7., 8., 0., 7., 8.],
        [8., 3., 1., 0., 9., 3., 6., 6.]])
--------------------------------------------------
Outputs after Dropout:
tensor([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
        [ 5.,  0.,  0., 30.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0., 40.,  0.,  0., 35.,  0.],
        [ 0., 10.,  0.,  0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.,  0., 30.,  0.]])

Process finished with exit code 0

我们将 Dropout 层的概率 p 设置为 0.8,此时经过 Dropout 层计算的张量中就出现了很多 0 , 概率 p 设置值越大,则张量中出现的 0 就越多
上面结果的计算过程如下:

  1. 先按照 p 设置的概率,随机将部分的张量元素设置为 0
  2. 为了校正张量元素被设置为 0 带来的影响,需要对非 0 的元素进行缩放,其缩放因子为 1 ( 1 − p ) \frac{1}{(1 - p)} (1p)1,上面代码中 p 的值为 0.8, 根据公式缩放因子为 1 ( 1 − 0.8 ) = 5 \frac{1}{(1 - 0.8)} = 5 (10.8)1=5
  3. 比如:第 3 个元素,原来是 5,乘以缩放因子之后变成 25。

我们也发现了,丢弃概率 p 的值越大,则缩放因子的值就越大,相对其他未被设置的元素就要更多的变大。
丢弃概率 P 的值越小,则缩放因子的值就越小,相对应其他未被置为 0 的元素就要有较小的变大。
当张量某些元素被设置为 0 时,对网络会带来什么影响?
比如上面这种情况,如果输入该样本,会使得某些参数无法更新,请看下面的代码:

# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/7/29 3:18
import torch  # 导入PyTorch库
import torch.nn as nn  # 导入PyTorch中的神经网络模块

# 设置随机数种子
torch.manual_seed(0)

def caculate_gradient(x, w):
    # 前向计算 y = x @ w 并求和
    y = x @ w
    y = y.sum()
    # 反向传播计算梯度
    y.backward()
    # 打印梯度
    print('Gradient:', w.grad.reshape(1, -1).squeeze().numpy())

def test01():
    # 初始化权重
    w = torch.randn(15, 1, requires_grad=True)
    # 初始化输入数据
    x = torch.randint(0, 10, size=[5, 15]).float()
    # 计算梯度
    caculate_gradient(x, w)

def test02():
    # 初始化权重
    w = torch.randn(15, 1, requires_grad=True)
    # 初始化输入数据
    x = torch.randint(0, 10, size=[5, 15]).float()
    # 初始化丢弃层,丢弃概率为0.8
    dropout = nn.Dropout(p=0.8)
    # 应用丢弃层
    x = dropout(x)
    # 计算梯度
    caculate_gradient(x, w)

if __name__ == '__main__':
    test01()  # 调用不使用Dropout的测试函数
    print('-' * 70)
    test02()  # 调用使用Dropout的测试函数

程序输出结果:

"C:\Program Files\Python39\python.exe" D:\Python\AI\神经网络\9-正则化Dropout\张量为0对梯度的影响.py 
Gradient: [19. 15. 16. 13. 34. 23. 20. 22. 23. 26. 21. 29. 28. 22. 29.]
----------------------------------------------------------------------
Gradient: [ 5.  0. 35.  0.  0. 45. 40. 40.  0. 20. 25. 45. 55.  0. 10.]

Process finished with exit code 0

注意:

矩阵1 * 矩阵2 为阿达玛积
矩阵1 @ 矩阵2为正常的矩阵乘法

从程序结果来看,是否经过 Dropout 层对梯度的计算产生了不小的影响,
例如:经过 Dropout 层之后有一些梯度为 0,这使得参数无法得到更新,从而达到了降低网络复杂度的目的。

3、小结

dropout 层的使用,其作用用于控制网络复杂度,达到正则化的目的,类似于 L2 正则化对线性回归的作用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#中的wpf基础

在WPF中,Grid 是一种非常强大的布局控件,用于创建网格布局。它允许你将界面划分为行和列,并将控件放置在这些行和列中。 以下是一些关键点和示例,帮助你理解 WPF 中的 Grid: 基本属性 RowDefinitions:定义…

AI 抠图工具 | 鲜艺AI抠图 v2.1 绿色版

🎉🎉 各位小伙伴们,你们是不是还在为抠图烦恼?别担心,鲜艺AI抠图神器来拯救你啦!基于RMBG-1.4黑科技开发,免费使用,本地操作,告别繁琐登录和联网困扰!&#x…

【数据结构进阶】AVL树

🔥个人主页: Forcible Bug Maker 🔥专栏: C || 数据结构 目录 🌈前言🔥AVL树的概念🔥AVL树的自实现AVL树结点的定义AVL树需实现的函数接口AVL树的插入AVL树的旋转右单旋左单旋左右双旋右左双旋…

【Docker虚拟机】在极空间上快速部署智能家居自动化平台『Home Assistant 』

【Docker&虚拟机】在极空间上快速部署智能家居自动化平台『Home Assistant 』 哈喽小伙伴们好,我是Stark-C~ 前段时间被粉丝问到怎么在极空间上部署Home Assistant,之前只是使用命令在威联通上部署过,所以最近正好有时间,在…

Ethernet

目录 1. Physical Layer(PHY)2. MAC2.1. MAC帧格式2.2. MAC地址与IP地址3. RGMII接口FPGA实现以太网(一)——以太网简介 以太网(Ethernet)是指遵守 IEEE 802.3 标准组成的局域网通信标准, IEEE 802.3 标准规定的主要是OSI参考模型中的物理层(PHY)和数据链路层中的介质访问控…

搭建DNS正向解析,反向解析+搭建DNS主从架构+搭建DNS多区域+时间同步

主要在局域网中配置,不存在外网 正向解析:域名解析为IP named.conf 解决权限 named.rfc1912.zones 解决解析方式 环境准备:三台机器都做下面的操作 基础配置:网络配置,关闭安全架构,关闭防火墙&#x…

Linux进程控制——进程等待

文章目录 进程等待进程等待的必要性进程等待的方法status参数option参数 进程等待 进程等待的过程其实是父进程等待子进程死亡的过程 进程等待的必要性 如果子进程退出,父进程不进行处理,子进程会变成僵尸进程,有内存泄漏的风险 僵尸进程…

docker容器cuda不可用,怎么解决?

通过Docker 构建的镜像中,启动之后,发现容器内部读取不到显卡驱动nvidia-smi 1、设置 NVIDIA Docker 存储库 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add

超逼真AI生成电影来了!《泰坦尼克号》AI重生!浙大阿里发布MovieDreamer,纯AI生成电影引爆热议!

视频生成领域的最新进展主要利用了短时内容的扩散模型。然而,这些方法往往无法对复杂的叙事进行建模,也无法在较长时间内保持角色的一致性,而这对于电影等长篇视频制作至关重要。 对此,浙大&阿里发布了一种新颖的分层框架Mov…

Kafka知识总结(选举机制+控制器+幂等性)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 选举机制 控制器(Broker)选举 控制器就是…

大模型算法面试题(十五)

本系列收纳各种大模型面试题及答案。 1、大模型LLM进行SFT如何对样本进行优化 大模型LLM(Language Model,语言模型)进行SFT(Structured Fine-Tuning,结构化微调)时,对样本的优化是提升模型性能…

从0开始搭建vue + flask 旅游景点数据分析系统(四):编写前端首页【数据驾驶舱】

本期我们编写数据驾驶舱页面(Dashboard)这个页面。主要任务是引入echarts 组件编写数据驾驶舱页面。 视频教程后续会更新在我的B站:https://space.bilibili.com/1583208775?spm_id_from666.25.0.0 推荐从教程第一集开始从零开始学习:https://blog.csdn…

PyCharm2024 专业版激活设置中文

PyCharm2024 专业版激活设置中文 官网下载最新版:https://www.jetbrains.com/zh-cn/pycharm/download 「hack-jet激活idea家族.zip」链接:https://pan.quark.cn/s/4929a884d8fe 激活步骤: 官网下载安装PyCharm ;测试使用的202…

HDMI的等长要求到底是多少?

四对差分走线对内误差最好做到 5mil 范围之内,对与对的差分误差最好控制在 10mil 范围之内。同时,对与对之间的间距要求做到 15mil,空间准许的情况下尽量拉开,减小串扰。 作者:凡亿教育 https://www.bilibili.com/rea…

VulnHub:doubletrouble1

靶机下载地址 trouble1 信息收集 主机发现 攻击机ip:192.168.31.218,扫描攻击机同网段存活ip。 nmap 192.168.31.0/24 -Pn -T4 确认目标机ip:192.168.31.174 端口扫描 nmap 192.168.31.174 -A -p- -T4 开放了22,80端口。 目录扫描 访…

小白学大模型:LLaMA-Factory 介绍与使用

最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友…

Linux:进程信号(二.信号的保存与处理、递达、volatile关键字、SIGCHLD信号)

上次介绍了:(Linux:进程信号(一.认识信号、信号的产生及深层理解、Term与Core))[https://blog.csdn.net/qq_74415153/article/details/140624810] 文章目录 1.信号保存1.1递达、未决、阻塞等概念1.2再次理解信号产生与保存1.3信号…

ES6语法详解,面试必会,通俗易懂版

目录 Set的基本使用WeakSet 使用Set 和 WeakSet 区别内存泄漏示例:使用普通 Set 保存 DOM 节点如何避免这个内存泄漏MapWeakMap 的使用 Set的基本使用 在ES6之前,我们存储数据的结构主要有两种:数组、对象。 在ES6中新增了另外两种数据结构&a…

Pytorch深度学习快速入门(中)

Pytorch深度学习快速入门&#xff08;中&#xff09; 一、Containers&#xff08;神经网络的基本骨架&#xff09;&#xff08;一&#xff09;Module 的使用&#xff08;二&#xff09;Sequential 的使用<搭建小实战> 二、Convolution Layers&#xff08;卷积层&#xff…

加密货币赋能跨境电商:PayPal供应链金融服务如何引领行业新趋势

跨境电商行业近年来呈现出爆发式增长&#xff0c;随着全球化贸易壁垒的降低和数字经济的快速发展&#xff0c;越来越多的商家和消费者跨越国界进行交易。根据eMarketer的数据&#xff0c;全球跨境电商交易额在2023年已超过4万亿美元&#xff0c;并预计在未来几年内仍将保持两位…