深度学习参数初始化(二)Kaiming初始化 含代码

这篇具有很好参考价值的文章主要介绍了深度学习参数初始化(二)Kaiming初始化 含代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、介绍

二、基础知识

三、Kaiming初始化的假设条件 

四、Kaiming初始化的简单的公式推导

1.前向传播

2.反向传播

五、Pytorch实现


深度学习参数初始化系列:

(一)Xavier初始化 含代码

(二)Kaiming初始化 含代码

一、介绍

        Kaiming初始化论文地址:https://arxiv.org/abs/1502.01852

        Xavier初始化在ReLU层表现不好,主要原因是relu层会将负数映射到0,影响整体方差。而且Xavier初始化方法适用的激活函数有限:要求关于0对称;线性。而ReLU激活函数并不满足这些条件,实验也可以验证Xavier初始化确实不适用于ReLU激活函数。所以何恺明在对此做了改进,提出Kaiming初始化,一开始主要应用于计算机视觉、卷积网络。

二、基础知识

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

深度学习参数初始化(二)Kaiming初始化 含代码        (1) 

 2.通过期望求方差的公式, 方差等于平方的期望减去期望的平方.

深度学习参数初始化(二)Kaiming初始化 含代码                (2)

 3.独立变量乘积公式

深度学习参数初始化(二)Kaiming初始化 含代码     (3)

4.连续性随机变量X的概率密度函数为f(x),若积分绝对收敛,则期望公式如下:

深度学习参数初始化(二)Kaiming初始化 含代码                        (4)

三、Kaiming初始化的假设条件 

        与Xavier初始化相似,Kaiming初始化同样适用Glorot条件,即我们的初始化策略应该使得各层的激活值和状态梯度的方差在传播过程中的方差保持一致;Kaiming初始化的参数仍然满足均值是0,且更新的过程中权重的均值一直是0。

        与Xavier初始化不同的,Kaiming初始化不在要求每层输出均值都是0(因为Relu这样的激活函数做不到啊);当然也不再要求f′(0)=1。

        Kaiming初始化中,前向传播和反向传播时各自使用自己的初始化策略,但是保证前向传播时每层的方差和反向传播时梯度的方差都是1。

四、Kaiming初始化的简单的公式推导

        我们使用卷积来进行推导,并且激活函数使用ReLU。

1.前向传播

        对于一层卷积,有:

深度学习参数初始化(二)Kaiming初始化 含代码                        (5)

         其中是激活函数前的输出,是权重的个数,是权重,是输入。

        根据(3)式,可将(4)式推导为:深度学习参数初始化(二)Kaiming初始化 含代码

         (6)

         根据假设,但是是上一层通过ReLU得到的,所以,则:

深度学习参数初始化(二)Kaiming初始化 含代码

深度学习参数初始化(二)Kaiming初始化 含代码                (7)

 通过(2)式可得深度学习参数初始化(二)Kaiming初始化 含代码,则(7)式推导为:

深度学习参数初始化(二)Kaiming初始化 含代码                        (8)

根据期望公式(4), 通过第层的输出来求此期望, 我们有, 其中表示ReLU函数.

 深度学习参数初始化(二)Kaiming初始化 含代码                        (9)

其中深度学习参数初始化(二)Kaiming初始化 含代码表示概率密度函数,因为的时候,所以可以去掉小于0的区间, 并且大于0的时候,可推出:

深度学习参数初始化(二)Kaiming初始化 含代码                   (10)

因为是假设在0周围对称分布且均值为0, 所以也是在0附近分布是对称的, 并且均值为0(此处假设偏置为0),则

深度学习参数初始化(二)Kaiming初始化 含代码       (11) 

所以的期望是:

深度学习参数初始化(二)Kaiming初始化 含代码

深度学习参数初始化(二)Kaiming初始化 含代码              (12)

 根据公式(2),因为的期望等于0,于是有:

深度学习参数初始化(二)Kaiming初始化 含代码

则式(12)推导为:

深度学习参数初始化(二)Kaiming初始化 含代码                        (13)

将(13)式带入(8)式:

深度学习参数初始化(二)Kaiming初始化 含代码                        (14)

从第一层一直往前进行前向传播, 可以得到某层的方差为 :

深度学习参数初始化(二)Kaiming初始化 含代码

这里的就是输入的样本, 我们会将其归一化处理, 所以, 现在让每层输出方差等于1, 即:

深度学习参数初始化(二)Kaiming初始化 含代码

深度学习参数初始化(二)Kaiming初始化 含代码

于是正向传播时,Kaiming初始化的实现就是下面的均匀分布:

深度学习参数初始化(二)Kaiming初始化 含代码

高斯分布:

深度学习参数初始化(二)Kaiming初始化 含代码

2.反向传播

因为反向传播的时候

深度学习参数初始化(二)Kaiming初始化 含代码                (15)

 其中表示损失函数并对其求导. 为参数

根据(3)式:

深度学习参数初始化(二)Kaiming初始化 含代码

 其中表示反向传播时输出通道数,最后得出

深度学习参数初始化(二)Kaiming初始化 含代码

于是反向传播时,Kaiming初始化的实现就是下面的均匀分布:

深度学习参数初始化(二)Kaiming初始化 含代码

高斯分布:

深度学习参数初始化(二)Kaiming初始化 含代码文章来源地址https://www.toymoban.com/news/detail-444067.html

五、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)
        '''
            kaiming 初始化方法中服从均匀分布 U~(-bound, bound), bound = sqrt(6/(1+a^2)*fan_in)
            a 为激活函数的负半轴的斜率,relu 是 0
            mode- 可选为 fan_in 或 fan_out, fan_in 使正向传播时,方差一致; fan_out 使反向传播时,方差一致
            nonlinearity- 可选 relu 和 leaky_relu ,默认值为 。 leaky_relu
        '''
        torch.nn.init.kaiming_uniform_(self.conv1.weight, a=0, mode='fan_out')
        print('xavier_uniform_:', self.conv1.weight)

        '''
            kaiming 初始化方法中服从正态分布,此为 0 均值的正态分布,N~ (0,std),其中 std = sqrt(2/(1+a^2)*fan_in)
            a 为激活函数的负半轴的斜率,relu 是 0
            mode- 可选为 fan_in 或 fan_out, fan_in 使正向传播时,方差一致;fan_out 使反向传播时,方差一致
            nonlinearity- 可选 relu 和 leaky_relu ,默认值为 。 leaky_relu
        '''
        torch.nn.init.kaiming_normal_(self.conv1.weight, a=0, mode='fan_out')
        print('kaiming_normal_:', self.conv1.weight)


if __name__ == '__main__':
    demoNet = DemoNet()

到了这里,关于深度学习参数初始化(二)Kaiming初始化 含代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 神经网络 03(参数初始化)

    对于某一个神经元来说 ,需要初始化的参数有两类:一类是权重W,还有一类是偏置b,偏置b初始化为0即可。而权重W的初始化比较重要,我们着重来介绍常见的初始化方式。 (1)随机初始化 随机初始化从均值为 0,标准差是 1 的高斯分布(也叫正态分布)中取样,使用一些

    2024年02月09日
    浏览(46)
  • 【深度学习】 Python 和 NumPy 系列教程(三):Python容器:1、列表List详解(初始化、索引、切片、更新、删除、常用函数、拆包、遍历)

    目录 一、前言 二、实验环境 三、Python容器(Containers) 0、容器介绍 1、列表(List) 1. 初始化 a. 创建空列表 b. 使用现有元素初始化列表 c. 使用列表生成式 d. 复制列表 2. 索引和切片 a. 索引 b. 负数索引 c. 切片 3. 常用操作(更新、删除) a. 更新单个元素 b. 更新切片 c. 删除单

    2024年02月09日
    浏览(51)
  • 深度学习之权重初始化

    在深度学习中,神经网络的权重初始化方法( w e i g h t weight w e i g h t i n i t i a l i z a t i o n initialization ini t ia l i z a t i o n )对模型的收敛速度和性能有着至关重要的影响。说白了,神经网络其实就是对权重参数 w w w 的不停迭代更新,以达到更好的性能。因此,对权重 w w w 的初

    2024年02月16日
    浏览(34)
  • RestHighLevelClient初始化http参数的含义

    high-level-rest-client 初始化 一般初始化时需要设置验证信息、http相关参数; Http相关参数介绍 keepalive keepalive用以维护长连接,长连接可以复用,但一定情况下需要中断长连接,如长连接长时间没有被使用的场景,需要中断长连接来节省资源。如上述ES客户端初始化案例中,则是

    2024年02月12日
    浏览(53)
  • Servlet 初始化参数(web.xml和@WebServlet)

     

    2024年02月06日
    浏览(58)
  • 人工智能-深度学习之延后初始化

    到目前为止,我们忽略了建立网络时需要做的以下这些事情: 我们定义了网络架构,但没有指定输入维度。 我们添加层时没有指定前一层的输出维度。 我们在初始化参数时,甚至没有足够的信息来确定模型应该包含多少参数。 有些读者可能会对我们的代码能运行感到惊讶。

    2024年02月05日
    浏览(37)
  • Unity WebGL通过URL的形式接收参数执行初始化

    参考博客: http://t.csdnimg.cn/QnfhK 需要在外面的网页指定WebGL的打开初始化逻辑。 1.配置jslib,用文本文件创建即可,\\\"__Internal.jslib\\\"。 2.加入一段代码: 3.场景挂一个脚本,引用这个代码。 4.url中末尾用?输入需要传输的内容,能够传递。

    2024年01月23日
    浏览(53)
  • 多进程运行含有任意参数的函数、为什么multiprosessing会进行多次初始化

    目录 多进程运行含有任意个参数的函数,以map_async为例 为什么multiprocessing 的了进程会多次初始化?         使用偏函数:偏函数有点像数学中的偏导数,可以让我们只关注其中的某一个变量而不考虑其他变量的影响。 如以下代码中,我们要将set_seq、tokenizer和model作为变量

    2024年02月03日
    浏览(55)
  • 把本地代码初始化到远程git仓库

    本地代码,推送到远程的git仓库。 第一种方法 第一步:建立远程的git仓库 第二步:拉取git仓库到本地 第三步:将本地代码复制到本地的git拉下来的文件夹中 第四步:代码提交即可 git add . -- git commit -m 初始化 -- git push 第二种方法 第一步:建立远程的git仓库 第二步: 输入

    2024年02月09日
    浏览(56)
  • STM32 串口的初始化(内附详细代码)

    首先我们先要根据原理图来确认我们用的串口接到了那个引脚  我这边的串口1为例,接收端是PA10,发送端是PA9首先我们需要配置PA9和PA10. 把接受端配置成浮空输入,完全靠引脚来判断。把发送端配置成复用推挽模式,并打开GPIOA的时钟和复用时钟多的看代码吧,我把注释都写

    2024年02月13日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包