深度学习参数初始化(一)Xavier初始化 含代码

简介: 深度学习参数初始化(一)Xavier初始化 含代码

一、简介

       网络训练的过程中, 容易出现梯度消失(梯度特别的接近0)和梯度爆炸(梯度特别的大)的情况,导致大部分反向传播得到的梯度不起作用或者起反作用. 研究人员希望能够有一种好的权重初始化方法: 让网络前向传播或者反向传播的时候, 卷积的输出和前传的梯度比较稳定. 合理的方差既保证了数值一定的不同, 又保证了数值一定的稳定.(通过卷积权重的合理初始化, 让计算过程中的数值分布稳定)


       Xavier初始化也称为Glorot初始化,因为发明人为Xavier Glorot。Xavier initialization是 Glorot 等人为了解决随机初始化的问题提出来的另一种初始化方法,他们的思想就是尽可能的让输入和输出服从相同的分布,这样就能够避免后面层的激活函数的输出值趋向于0。


       因为权重多使用高斯或均匀分布初始化,而两者不会有太大区别,只要保证两者的方差一样就可以了,所以高斯和均匀分布我们一起说。


       Pytorch中已经有实现,下面会详细介绍:

torch.nn.init.xavier_uniform_(tensor: Tensor, gain: float = 1.)
torch.nn.init.xavier_normal_(tensor: Tensor, gain: float = 1.)

二、基础知识

      1. 均匀分布的方差:

       

      2.假设随机变量X和随机变量Y相互独立,则有

      3.假设随机变量X和随机变量Y相互独立,且E(X)=E(Y)=0,则有

       

三、标准初始化方法

        权重初始化满足均匀分布时:

 

       因为上式的方差是: ,所以对应的高斯分布写作:

 

       对于全连接网络,我们把输入X的每一维度x看做一个随机变量,并且假设E(x)=0,Var(x)=1。假设权重W和输入X相互独立,则隐层状态的方差为:


       可以看出标准初始化方法得到一个非常好的特性:隐层的状态的均值为0,方差为常量1/3,和网络的层数无关,这意味着对于sigmoid这样的函数来说,自变量落在有梯度的范围内。


       但是因为sigmoid激活值都是大于0的,会导致下一层的输入不满足E(x)=0。其实标准初始化也只适用于满足下面将要提到的Glorot假设的激活函数,比如tanh。

四、Xavier初始化的假设条件

         在文章开始部分我们给出了参数初始化的必要条件。但是这两个条件只保证了训练过程中可以学到有用的信息——参数梯度不为0(因为参数被控制在激活函数的有效区域)。而Glorot认为:优秀的初始化应该使得各层的激活值和状态梯度的方差在传播过程中的方差保持一致。也就是说我们要保证前向传播各层参数的方差和反向传播时各层参数的方差一致 :

我们把这两个条件称为Glorot条件

综合起来,现在我们做如下假设:

1.输入的每个特征方差一样:Var(x);

2.激活函数对称:这样就可以假设每层的输入均值都是0;

3.f′(0)=1

4.初始时,状态值落在激活函数的线性区域:f′(Si(k))≈1。

后三个都是关于激活函数的假设,我们称为Glorot激活函数假设。

五、Xavier初始化的简单的公式推导:

首先给出关于状态的梯度和关于参数的梯度的表达式:


我们以全连接的一层为例,表达式为:

其中ni表示输入个数。

根据概率统计知识我们有下面的方差公式:

特别的,当我们假设输入和权重都是0均值时(目前有了BN之后,这一点也较容易满足),上式可以简化为:

假设输入x和权重w独立同分布,为了保证输入与输出方差一致,则应该有:

对于一个多层的网络,某一层的方差可以用累积的形式表达, 为当前层数:

特别的,反向传播计算梯度时同样具有类似的形式:


综上,为了保证前向传播和反向传播时每一层的方差一致,应满足:

但是,实际当中输入与输出的个数往往不相等,于是为了均衡考量,我们将输入输出l两层的方差取均值,最终我们的权重方差应满足:

所以Xavier初始化的高斯分布公式:

根据均匀分布的方差公式:

又因为这里|a|=|b|,所以Xavier初始化的实现就是下面的均匀分布:

六、Pytorch实现:

import torch
 
# 定义模型 三层卷积 一层全连接
class DemoNet(torch.nn.Module):
    def __init__(self):
        super(DemoNet, self).__init__()
        self.conv1 = torch.nn.Conv2d(1, 1, 3)
        print('random init:', self.conv1.weight)
        '''
        xavier 初始化方法中服从均匀分布 U(−a,a) ,分布的参数 a = gain * sqrt(6/fan_in+fan_out),
        这里有一个 gain,增益的大小是依据激活函数类型来设定,该初始化方法,也称为 Glorot initialization
        '''
        torch.nn.init.xavier_uniform_(self.conv1.weight, gain=1)
        print('xavier_uniform_:', self.conv1.weight)
        '''
            xavier 初始化方法中服从正态分布,
            mean=0,std = gain * sqrt(2/fan_in + fan_out)
        '''
        torch.nn.init.xavier_normal_(self.conv1.weight, gain=1)
        print('xavier_uniform_:', self.conv1.weight)
 
 
if __name__ == '__main__':
    demoNet = DemoNet()

七、对比实验

实验使用tanh为激活函数

1.各层激活值直方图


       上图是原始的初始化,下图是Xavier初始化。Xavier初始化的网络的各层的激活值较为一致,且取值均比原始的标准初始化要小。

2.各层反向传播的梯度(关于状态的梯度)的分布情况


上图是原始的初始化,下图是Xavier初始化。Xavier初始化的网络的各层的梯度较为一致,且取值均比原始的标准初始化要小。作者怀疑不同层上具有不同的梯度可能会导致病态或训练较慢 。

3.各层参数梯度的分布情况

       式子(3)已经证明各层参数梯度的方差和层数基本无关。上图是原始的初始化,下图是Xavier初始化。我们发现下图的标准初始化参数梯度小了一个数量级。

4.各层权重梯度方差的分布情况


上图是原始的初始化,下图是Xavier初始化。Xavier初始化权重梯度的方差比较一致。

八、总结

1.Xavier初始化的高斯分布公式:

2.Xavier初始化的均匀分布公式:


3.Xavier初始化是在标准初始化方法的基础上,兼顾了各层在前向传播和分享传播时的参数方差。


4.Xavier初始的缺点:因为Xavier的推导过程是基于几个假设的,其中一个是激活函数是线性的。这并不适用于ReLU激活函数。另一个是激活值关于0对称,这个不适用于sigmoid函数和ReLU函数。在使用sigmoid函数和ReLU函数时,标准初始化和Xavier初始化得到的初始激活、参数梯度特性是一样的。激活值的方差逐层递减,参数梯度的方差也逐层递减。

相关文章
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】深度学习的概述及应用,附带代码示例
深度学习(Deep Learning,简称DL)是机器学习领域中的一个重要分支,其目标是通过模拟人脑神经网络的工作机制,构建多层次的抽象特征表示,使机器能够自动从原始数据中提取关键信息,从而实现高精度的任务执行。深度学习通过多层神经网络结构及其训练方式,实现了从低级像素级别到高级概念级别的递进式知识层次。 深度学习的主要组件包括输入层、隐藏层和输出层。隐藏层的数量和层数决定了模型的复杂度和表达能力。在训练过程中,权重更新和梯度下降法是关键步骤,目的是最小化损失函数,提高预测精度。深度学习主要基于反向传播算法(BP Algorithm)来优化模型参数,通过正向传播、损失计算、反向传播和梯度下降等
19 8
|
16天前
|
机器学习/深度学习 算法 算法框架/工具
深度学习在图像识别中的应用及代码实现
【8月更文挑战第3天】深度学习技术在图像识别领域取得了显著的成果,通过构建深度神经网络模型,实现了对复杂图像数据的高效处理和准确识别。本文将介绍深度学习在图像识别中的原理、关键技术及应用实例,并通过代码示例展示如何利用深度学习框架进行图像识别任务的实现。
|
17天前
|
机器学习/深度学习 算法 算法框架/工具
探索深度学习:从理论到代码实现
【8月更文挑战第2天】本文将深入探讨深度学习的核心理论,并通过实际的代码示例来展示这些理论的应用。我们将从基础的神经网络开始,逐步引入更复杂的模型和算法,如卷积神经网络(CNN)和循环神经网络(RNN)。最后,我们将通过一个具体的项目来展示如何将这些理论应用于实际问题。
26 0
|
2月前
|
机器学习/深度学习 存储 算法
基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、运动物体追踪
基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、运动物体追踪
|
2月前
|
机器学习/深度学习 算法 网络架构
**深度学习中的梯度消失与爆炸影响模型训练。梯度消失导致输入层参数更新缓慢,梯度爆炸使训练不稳。
【6月更文挑战第28天】**深度学习中的梯度消失与爆炸影响模型训练。梯度消失导致输入层参数更新缓慢,梯度爆炸使训练不稳。解决办法包括:换激活函数(如ReLU)、权重初始化、残差连接、批量归一化(BN)来对抗消失;梯度裁剪、权重约束、RMSProp或Adam优化器来防止爆炸。这些策略提升网络学习能力和收敛性。**
32 0
|
2月前
|
机器学习/深度学习 自然语言处理 前端开发
深度学习-[数据集+完整代码]基于卷积神经网络的缺陷检测
深度学习-[数据集+完整代码]基于卷积神经网络的缺陷检测
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的自适应神经网络:原理与应用
【8月更文挑战第14天】在深度学习领域,自适应神经网络作为一种新兴技术,正逐渐改变我们处理数据和解决问题的方式。这种网络通过动态调整其结构和参数来适应输入数据的分布和特征,从而在无需人工干预的情况下实现最优性能。本文将深入探讨自适应神经网络的工作原理、关键技术及其在多个领域的实际应用,旨在为读者提供一个全面的视角,理解这一技术如何推动深度学习向更高效、更智能的方向发展。
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】Python之人工智能应用篇——音频生成技术
音频生成是指根据所输入的数据合成对应的声音波形的过程,主要包括根据文本合成语音(text-to-speech)、进行不同语言之间的语音转换、根据视觉内容(图像或视频)进行语音描述,以及生成旋律、音乐等。它涵盖了声音结构中的音素、音节、音位、语素等基本单位的预测和组合,通过频谱逼近或波形逼近的合成策略来实现音频的生成。 音频生成技术的发展主要依赖于深度学习模型,如循环神经网络(RNN)、长短时记忆网络(LSTM)、Transformer等。这些模型通过学习大量的音频数据,能够自动生成与人类发音相似甚至超越人类水平的音频内容。近年来,随着大规模预训练模型的流行,如GPT系列模型、BERT、T5等,
12 7
【深度学习】Python之人工智能应用篇——音频生成技术
|
2天前
|
机器学习/深度学习 人工智能 算法
【深度学习】python之人工智能应用篇——图像生成技术(二)
图像生成是计算机视觉和计算机图形学领域的一个重要研究方向,它指的是通过计算机算法和技术生成或合成图像的过程。随着深度学习、生成模型等技术的发展,图像生成领域取得了显著的进步,并在多个应用场景中发挥着重要作用。
15 9
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】探讨最新的深度学习算法、模型创新以及在图像识别、自然语言处理等领域的应用进展
深度学习作为人工智能领域的重要分支,近年来在算法、模型以及应用领域都取得了显著的进展。以下将探讨最新的深度学习算法与模型创新,以及它们在图像识别、自然语言处理(NLP)等领域的应用进展。
12 6

热门文章

最新文章