深度学习经典trick汇总

news2024/11/17 6:27:41

深度学习经典trick汇总

trick这个词或许有投机取巧的意味,但深度学习论文中出现的很多这个trick确实对模型更方面性能有所提高,而且它们中的很多还具有普适性,那么这种“trick“或许应该被叫做“技术”。

1. 权重衰减

θ t + 1 = ( 1 − ω α ) θ t − α ∇ θ t L ( x , θ t ) T (1-1) θ_{t+1}=(1-\omegaα)θ_t-α∇_{θ_t}L(x,θ_t )^T\tag{1-1} θt+1=(1ωα)θtαθtL(x,θt)T(1-1)

(1-1)为引入权重衰减时参数更新公式,ω为权重衰减系数,α为学习率。可以直观的看出,引入权重衰减与不引入权重衰减相比,θ会有减小的倾向。通过推导可知在不引入动量的SGD优化器中,权重衰减等价于对权重L2正则化,详见笔记:[L2正则化与权重衰减]。

权重衰减实际上限制了权重的可行域,相当于降低了模型的复杂度,目前是防止模型过拟合的一种常用手段。

  • **tips:**一般来说,ω取值越大,权重衰减越剧烈,模型拟合能力越差,易造成欠拟合,所以ω一般取较小的值(<=1e-3)。ω的取值也是一个需要不断调参的过程,让模型最终处于欠拟合与过拟合之间的状态。

2. Dropout层

Dropout(暂退)层的做法也十分好理解:在上一层输出后以一定概率随机屏蔽掉部分神经元(令其们输出为0)。
h ′ = { 0 概率为 p h 1 − p 其他情况 (2-1) h^{'}=\begin{cases} 0 & 概率为p\\ \frac{h}{1-p} & 其他情况 \end{cases}\tag{2-1} h={01ph概率为p其他情况(2-1)
由(2-1),h为神经元原输出,h‘为暂退后输出。可见上一层输出经过Dropout层后,均值不变。(但方差变了)
请添加图片描述
图1 暂退层的作用

这种方法更“粗暴”地降低了权重数量,降低了模型复杂度,当然可以【避免过拟合】,很好理解吧。

  • tips:【暂退概率】是Dropout层唯一需要调整的超参数,以这个概率随机丢掉部分神经元。该值在(0,1)之间取值。经验取值在(0,0,5]之间,而且越靠近输入层暂退概率应该取值越小,以保留更多可能有价值的特征。

    需要注意一个事情,在前向传播的时候暂退层是【随机】丢弃一部分神经元。改变输出方差的同时也是输出变得不稳定,可能造成无法收敛或者loss震荡的情况,所以如果加入暂退层的网络出现loss震荡的情况就应该考虑减少或去掉暂退层。

3. 标准化层

标准化层一般是添加在隐藏层后的一种对其输出数据标准化处理的trick。我们已经知道输入数据需要标准化后才能输入网络,其实标准化也是一个道理。你想想,隐藏层有很多权重和输入数据做线性计算输出,再逐一对元素进行非线性计算,那怎么保证中间输出的数据仍然保证分布一致?中间数据分布不一致了后面网络的处理效果不就更差了?

所以,对于深层神经网络而言,标准化层是一个【保证模型拟合能力】的一种必要trick。
请添加图片描述
图2 标准化处理数据的作用

那么接下来的问题是,归一化层的设计是什么样的?下面看看归一化层的计算公式:
μ S = 1 m ∑ i = 1 m x i σ S 2 = 1 m ∑ i = 1 m ( x i − μ S ) 2 x i ^ = x i − μ S σ S 2 + ξ y i = γ x i ^ + β (3-1) μ_S=\frac{1}{m}\sum_{i=1}^{m}x_i\\ \sigma^2_S=\frac{1}{m}\sum_{i=1}^{m}(x_i-μ_S)^2\\ \widehat{x_i}=\frac{x_i-μ_S}{\sqrt{\sigma^2_S+ξ}}\\ y_i=γ\widehat{x_i}+β\tag{3-1} μS=m1i=1mxiσS2=m1i=1m(xiμS)2xi =σS2+ξ xiμSyi=γxi +β(3-1)
xi是输入数据,m是输入数据个数,yi是输出,γ β作为标准化层参数S是数据标准化的域。

好理解吧,先算数据均值和方差,然后减均值 除以方差,再计算最终输出。这里重点解释两点:标准化层参数,和标准化域。

标准化层的参数可以作为整个网络的权重,加入梯度反向传播计算;也可以不作为网络权重,直接取常数,各种深度学习框架都对此细节有很好的支持。

而标准化域S有点不太好理解,标准化层有4种标准化域,下面这副图可以很好的说明它们的关系:
请添加图片描述
图3 4种标准化域

由(3-1),标准化是按照标准化域计算的,标准化域就是图3中蓝色的数据。(就是对这部分数据求均值和方差)

你可以把图3中的正方体块想象成一个tensor:H、W是图像的高和宽,C是通道数,N是batch_size。也就是说,上图中的正方体块可以表示为这样的tensor(N, C, H, W)

如此,四中标准化方法就比较好理解了:

  1. Batch Norm:以batch中所有图像的一个channel为单位做标准化,标准化层参数是2C
  2. Layer Norm:以batch中一个图像的所有channel为单位做标准化,标准化层参数是2N
  3. Instance Norm:以batch中一个图像的一个channel为单位做标准化,标准化层参数是2CN。
  4. Group Norm:以batch中的一个图像的group个channel为单位做标准化,标准化层参数是2NC/group
  • **tips:**对于深层网络这个东西几乎是必用的,否则到后面可能会导致模型拟合能力下降严重。而且最好是让标准化层参数加入网络梯度训练,让网络学习到一个最佳的标准化策略。

4. 权重初始化

模型要迭代训练一定要有一个初始权重,那初始权重应该取多少呢?或者说这个问题应该如何考虑呢?

我们的目标应该是这样:要使得每一层【输出o】、【输入x】、【该层反向传播时计算梯度】的【均值和方差】保持一致。

这有啥好处呢?因为如果每次迭代后输入输出分布接近一致,那么权重向量就可以在相同比例的两个空间内寻找一组最佳映射;假设每次迭代后输出的分布空间都有很大变化,则权重每次还得学习不一样的映射尺度,造成模型学习的震荡,很难收敛。

更重要的是梯度的稳定。如果每次梯度分布空间不一样,则容易造成梯度爆炸或消失的问题。

总之,我们学习一个输入和输出的映射关系,最好要排除掉变量之间分布的差异影响因素,才可以更好的学习到输入输出的本质关系。因此,初始值更要取一个

基于此目的,下面来推导一下初始权重应该取怎样的值?我们假设一个最简单的情况,一个没有非线性单元的全连接层中,输入、权重、输出三者的关系:
o i = ∑ j = 1 n i n w i j x j (4-1) o_i=\sum_{j=1}^{n_{in}}w_{ij}x_j\tag{4-1} oi=j=1ninwijxj(4-1)
(4-1)中,nin为输入神经元个数。

x在输入前一般已经做了归一化处理,均值为0,方差为γ2。假设我们的ω是从某种分布中抽取的(不一定是高斯分布),该分布的均值也是0(可以证明此时输出的均值也能保证为0)方差为δ2。

那么按此计算,输出的均值和方差是多少呢?不难计算得到:
E ( o ) = 0 V a r ( o ) = n i n δ 2 γ 2 (4-2) E(o)=0\\ Var(o)=n_{in}δ^2γ^2\tag{4-2} E(o)=0Var(o)=ninδ2γ2(4-2)
如此,如果我们想让输入和输出的方差相等,必须令ninδ2=1。同理,在反向传播中(由该层神经元输出计算该层参数的梯度),也必须令noutδ2=1(nout为输出神经元个数)才能保证参数梯度的方差=输出的方差。据此,我们只需满足:
δ 2 = 2 n i n + n o u t (4-3) δ^2=\frac{2}{n_{in}+n_{out}}\tag{4-3} δ2=nin+nout2(4-3)
**我们采样 一个的(4-3)的方差,0均值的高斯分布,即可得出一层权重的初始值。这就是Xavier采样初始化。**当然,没必要非得采样高斯分布,均匀分布反而更简单计算,也很容易计算出该均匀分布的值域。

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

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

相关文章

DHCP服务器

文章目录 DHCP服务器DHCP的工作原理DHCP服务器的用途DHCP协议的工作方式DHCP服务器给予客户端固定或动态的IP参数关于租约所造成的问题与租约期限多台DHCP服务器在同一物理网段的情况 何时需要架设DHCP服务器使用DHCP的时机不建议使用DHCP主机的时机 DHCP服务器端的配置所需软件…

Quantum Utility!IBM开辟“量子计算的实用时代”

光子盒研究院 今天&#xff0c;IBM&#xff08;纽约证券交易所股票代码&#xff1a;IBM&#xff09;宣布了一项新的突破&#xff0c;并发表在科学杂志《自然》的封面上。 ——团队首次证明了量子计算机可以在100多个量子比特的规模上产生精确的结果&#xff1b;并且至少在一种计…

Redis入门 - 基础通用指令

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis入门 - 基础通用指令 | CoderMast编程桅杆https://www.codermast.com/database/redis/base-commind.html 在正式介绍Redis数据结构及其操作指令之前&#xff0c;我们需要先掌握一些最基础的通用指令。 这些都是Redis…

鸟类识别Python,基于TensorFlow卷积神经网络【实战项目】

一、介绍 鸟类识别系统&#xff0c;使用Python作为主要开发语言&#xff0c;基于深度学习TensorFlow框架&#xff0c;搭建卷积神经网络算法。并通过对数据集进行训练&#xff0c;最后得到一个识别精度较高的模型。并基于Django框架&#xff0c;开发网页端操作平台&#xff0c;…

chatgpt赋能python:Python自动获取图片数据的方法

Python自动获取图片数据的方法 随着信息时代的到来&#xff0c;图像数据已经越来越重要。我们如何从互联网上获取大量的图片数据呢&#xff1f;Python提供了简单而直接的方法。本文将介绍如何使用Python自动获取图片数据&#xff0c;充分利用Python的编程能力&#xff0c;开展…

异常的相关知识

&#x1f4e2;博客主页&#xff1a;盾山狂热粉的博客_CSDN博客-C、C语言,机器视觉领域博主&#x1f4e2;努力努力再努力嗷~~~✨ &#x1f4a1;大纲 ⭕总结了python中所有可能的异常情况&#xff0c;有异常不一定是坏事&#xff0c;有提醒作用 一、常见异常 &#x1f4a1;可以…

Midjourney命令列表Command List介绍

您可以通过键入命令与Discord上的Midjourney Bot进行交互。命令可以用来生成图像、更改默认设置、监看用户信息以及执行其他有用的任务。 Midjourney 命令可以在任何Bot Channel中使用&#xff0c;在允许 Midjourney Bot 运行的私有 Discord 服务器上使用&#xff0c;或者在与…

Java项目开发基本数据类型与封装数据类型的选择

问题 Java项目开发基本数据类型与封装数据类型的选择 详细问题 关于基本数据类型与封装数据类型的区别&#xff0c;作为面试经典题目已被熟知&#xff0c;但是&#xff0c;项目开发时&#xff0c;对于一个变量&#xff0c;是选择基本数据类型&#xff0c;还是封装数据类型&a…

【SpringBoot】SpringBoot案例 | Web后端开发

黑马2023JavaWeb的B站视频&#xff0c;还可以&#xff0c;学的大部分都是有用的东西。没有一上来还JDBC。 新建项目、更改application.properties配置&#xff1a; spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:…

定时任务执行时间设置详解

目录 前提实践举例定时任务执行时间设置详解定时器包含的子表达式和对应子表达式允许的值子表达式中特殊字符含义的解释和相应示例 前提 一般在处理业务过程中&#xff0c;都需要在特定的时间点执行特定的任务&#xff0c;尤其是业务复杂且执行时间很长&#xff0c;业务之间关…

java中的时间

一、JDK7的类 &#xff08;1&#xff09;Date 时间 &#xff08;2&#xff09;SimpleDateFormat 格式化时间 &#xff08;3&#xff09;Calendar 日历 格林尼治时间&#xff08;Greenwich Mean Time&#xff09;&#xff0c;简称GMT。 目前的世界标准时间&#xff08;UTC)以替换…

C++的友元函数、友元类、内部类

目录 1.友元函数 1.定义 2.注意 2.友元类 1.定义 3.内部类&#xff08;Java喜欢用&#xff0c;C不怎么用&#xff09; 1.定义 特性&#xff1a; 1.友元函数 1.定义 1.友元函数可访问类的私有和保护成员&#xff0c;但不是类的成员函数。 2.友元函数不能const修饰 3.…

Rust语言从入门到入坑——(4)Rust语法(上)

文章目录 0 引入1、基础语法1.1、变量1.2、常量1.3、重影 2、数据类型2.1、整形2.2、浮点型2.3、其他2.注释与打印2.1 注释2.2、打印 3、总结 0 引入 在这里我们需要介绍Rust语法&#xff0c;一共分三部分&#xff0c;第一部分是基础语言&#xff0c;和C语言类比&#xff0c;如…

从零构建后端项目-创建SpringBoot项目配置MyBatis

目录 主体介绍 创建SpringBoot项目主要步骤 配置MyBatis 整合高级功能 创建SpringBoot项目 配置Tomcat 配置MySQL数据源 配置Redis数据源 配置MongoDB数据源 运行项目&#xff0c;检测配置 配置MyBatis 创建IDEA数据库连接 生成MyBatis各种文件 配置MyBatis 配…

总结902

目标规划&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化5讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日规划 今日已做 1.背诵前21篇短文&#xff0c;默写了10篇文章。…

智能视频无损放大-Topaz Video AI

今天给各位小伙伴们测试了一款可以使视频智能无损放大的软件——Topaz Video AI。 小编在很早之前也有了解过Topaz系列的软件&#xff0c;都是通过人工智能处理的&#xff0c;对小白新手们很适用&#xff0c;由于使用人工智能方面的软件或程序对硬件要求都比较高&#xff0c;因…

离散数学题目收集整理练习(期末过关进度70%)

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 &#x1f31f;博主的其他文章&…

Linux运维监控学习笔记2

Zabbix监控本机&#xff1a; 配置->主机->将Zabbix Server的状态开启。 然后我们还需要在这台机器上安装agent。agent安装在被监控端&#xff0c;收集数据&#xff0c;与监控服务器交互。 # 列出系统上面所有软件名称 rpm -qa |grep zabbix-agent zabbix-agent-3.4.15-…

hello算法笔记之栈与队列

一、栈 遵循先入后出&#xff08;First In, Last Out&#xff09;原则的线性数据结构。 只能在栈顶添加或删除元素 链表实现形式&#xff1a; ①栈以链表形式实现&#xff1a; ②以数组形式实现 二、队列 遵循先入先出&#xff08;First In, First Out&#xff09;规则的线…

使用WinDbg分析Windows dump文件方法

需要使用WinDbg工具来分析windows系统产生的dump文件&#xff0c;此工具属于Windows SDK的一个组件&#xff0c;在微软官方网站可以下载&#xff08;链接&#xff09;。 在安装Windows SDK的过程中&#xff0c;可以选择只安装WinDbg&#xff08;Debugging Tools for Windows&a…