精华内容
下载资源
问答
  • 下面说一下kernel_initializer 权重初始化的方法。 不同的层可能使用不同的关键字来传递初始化方法,一般来说指定初始化方法的关键字是kernel_initializer 和 bias_initializer model.add(Dense(64, kernel_...
  • 通过调用torch.nn.init包中的多种方法可以将权重初始化为直接访问张量的属性。 1、不初始化的效果 在Pytorch中,定义一个tensor,不进行初始化,打印看看结果: w = torch.Tensor(3,4) print (w) 可以看到这时候的...
  • 神经网络权重初始化 神经网络中的权重初始化技术 •权重初始化:•建立基本的神经网络有点令人费解,最重要的是调优它以获得更好的结果是一件繁琐的工作,但是要考虑的第一步是初始化参数。 如果正确完成此部分,则...
  • 今天小编就为大家分享一篇pytorch自定义初始化权重的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 权重初始化

    2019-03-22 13:12:31
    1.权重初始化的常见方式 (1)[-y,y]范围的均匀分布 (2)初始化为高斯分布(外加截断的高斯分布等): (3)xavier 尝试问题:使得每一层输出的方差应该尽量相等 (4)MSRA 尝试问题:随着网络加深,上述方法...

    1.权重初始化的常见方式

    (1)[-y,y]范围的均匀分布

    (2)初始化为高斯分布(外加截断的高斯分布等):

    (3)xavier

    尝试问题:使得每一层输出的方差应该尽量相等

    (4)MSRA

    尝试问题:随着网络加深,上述方法收敛越来越难

    2.权重初始化的目的

    (1)加快收敛

    (2)打乱对称性,增强学习效果

    展开全文
  • 本篇文章主要介绍了TensorFlow中权重的随机初始化的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 权重初始化方法

    2019-09-25 20:55:46
    在深度学习中,神经网络的权重初始化方法对(weight initialization)对模型的收敛速度和性能有着至关重要的影响。说白了,神经网络其实就是对权重参数w的不停迭代更新,以期达到较好的性能。在深度神经网络中,随着...

    在深度学习中,神经网络的权重初始化方法对(weight initialization)对模型的收敛速度和性能有着至关重要的影响。说白了,神经网络其实就是对权重参数w的不停迭代更新,以期达到较好的性能。在深度神经网络中,随着层数的增多,我们在梯度下降的过程中,极易出现梯度消失或者梯度爆炸。因此,对权重w的初始化则显得至关重要,一个好的权重初始化虽然不能完全解决梯度消失和梯度爆炸的问题,但是对于处理这两个问题是有很大的帮助的,并且十分有利于模型性能和收敛速度。在这篇博客中,我们主要讨论四种权重初始化方法:

    • 把w初始化为0
    • 对w随机初始化
    • Xavier initialization
    • He initialization

     

    1、把w初始化为0

    我们在线性回归,logistics回归的时候,基本上都是把参数初始化为0,我们的模型也能够很好的工作。然后在神经网络中,把w初始化为0是不可以的。这是因为如果把w初始化0,那么每一层的神经元学到的东西都是一样的(输出是一样的),而且在bp的时候,每一层内的神经元也是相同的,因为他们的gradient相同。

    我们可以看看cost function是如何变化的:

    能够看到代价函数降到0.64(迭代1000次)后,再迭代已经不起什么作用了。

     

    2、对w随机初始化

    随机初始化后,cost function随着迭代次数的变化示意图为:

    能够看出,cost function的变化是比较正常的。但是随机初始化也有缺点,np.random.randn()其实是一个均值为0,方差为1的高斯分布中采样。当神经网络的层数增多时,会发现越往后面的层的激活函数(使用tanH)的输出值几乎都接近于0,如下图所示:

    激活函数输出值接近于0会导致梯度非常接近于0,因此会导致梯度消失

     

    3、Xavier initialization

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

    来看下Xavier initialization后每层的激活函数输出值的分布:

    能够看出,深层的激活函数输出值还是非常漂亮的服从标准高斯分布。虽然Xavier initialization能够很好的 tanH 激活函数,但是对于目前神经网络中最常用的ReLU激活函数,还是无能能力,请看下图:


    当达到5,6层后几乎又开始趋向于0,更深层的话很明显又会趋向于0。

     

    4、He initialization

    为了解决上面的问题,我们的何恺明大神(关于恺明大神的轶事有兴趣的可以八卦下,哈哈哈,蛮有意思的)提出了一种针对ReLU的初始化方法,一般称作 He initialization。

    来看看经过He initialization后,当隐藏层使用ReLU时,激活函数的输出值的分布情况:

    效果是比Xavier initialization好很多。现在神经网络中,隐藏层常使用ReLU,权重初始化常用He initialization这种方法

     

     

    展开全文
  • 权重初始化的目的是防止深度神经网络的正向(前向)传播过程中层激活函数的输出损失梯度出现爆炸或消失.如果发生任何一种情况,损失梯度太大或者太小,就无法有效向后反传,即便可以向后反传,网络也需要花更长的...

    本文参考以下链接,如有侵权,联系删除
    参考1
    参考2

    为什么要初始化权重

    权重初始化的目的是防止深度神经网络的正向(前向)传播过程中层激活函数的输出损失梯度出现爆炸或消失.如果发生任何一种情况,损失梯度太大或者太小,就无法有效向后反传,即便可以向后反传,网络也需要花更长的时间来达到收敛.

    矩阵乘法是神经网络的基本数学运算。在多层深度神经网络中,一个正向传播仅需要在每层对该层的输入和权重矩阵执行连续的矩阵乘法。这样每层的乘积成为后续层的输入,依此类推。

    训练神经网络的标准做法,是让输入值落入类似一个均值为0,标准差为1的正态分布中,以确保其被归一化。

    假设有一个没有激活函数的简单的100层网络,并且每层都有一个包含这层权重的矩阵a,我们有一个包含网络输入的向量x。为了完成单个正向传播,我们必须对每层输入和权重进行矩阵乘法,总共100次连续的矩阵乘法。

    x = torch.randn(512)
    for i in range(100):
    	a = torch.randn(512,512)
    	x = a @ x
    	if torch.isnan(x.std()):
    		print(i)
    		break
    28
    

    在网络的第29个激活层输出发生梯度爆炸,很明显网络的权重初始化值过大

    为了看看当网络权重初始值太小时会发生什么 - 我们将缩小例子的权重值。

    x = torch.randn(512)
    for i in range(100):
    	a = torch.randn(512,512) * 0.01
    	x = a @ x
    print(x.mean(), x.std())
    
    tensor(0.), tensor(0.)
    

    在上述正向传播过程中,激活层输出出现了完全消失的现象
    总结一下,权重初始值太大或者太小,网络都将无法很好地进行学习。

    怎样才能找到初始化最佳值?

    可以证明,在某给定层,根据标准正态分布初始化的输入x和权重矩阵a的乘积,通常具有非常接近输入连接数平方根的标准差,在我们的例子中是 512 \sqrt{512} 512

    如果我们从矩阵乘法定义来看这个值就再正常不过了:为了计算y,我们将输入向量x的某个元素乘以权重矩阵a的一列所得的512个乘积相加。在我们的例子中使用了标准正态分布来初始化x和a,所以这512个乘积的均值都为0,标准差都为1。

    mean, var = 0.0, 0.0
    import torch, math
    for i in range(10000):
        x = torch.randn(1)
        w = torch.randn(1)
        y = w @ x
        mean += y.item()
        var += y.pow(2).item()
    print(mean/10000, math.sqrt(var/10000))
    
    (-0.00445413,0.9906728)
    

    然后,这512个乘积的总和的均值为0,方差为512,因此标准差为 512 \sqrt{512} 512

    mean, var = 0.0, 0.0
    import torch, math
    for i in range(10000):
        x = torch.randn(512)
        w = torch.randn(512, 512)
        y = w @ x
        mean += y.mean().item()
        var += y.pow(2).mean().item()
    print(mean/10000, math.sqrt(var/10000))  
    0.0007024360485374928 22.634334207951234
    print(math.sqrt(512))
    22.627416997969522
    

    我们想要的是每层输出具有大约1的标准差,这样就可以使我们在尽可能多的网络层上重复矩阵乘法,而不会发生梯度爆炸或消失。

    mean, var = 0.0, 0.0
    import torch, math
    for i in range(10000):
        x = torch.randn(512)
        w = torch.randn(512, 512) * math.sqrt(1./512)
        y = w @ x
        mean += y.mean().item()
        var += y.pow(2).mean().item()
    print(mean/10000, math.sqrt(var/10000))
    
    -0.00018611006735591218 0.9996481987888542
    
    

    让我们重新运行之前的100层神经网络。与之前一样,我们首先从[-1,1]内的标准正态分布中随机选择层权重值,但这次我们用 1 n \frac{1}{\sqrt n} n 1来缩小权重,其中n是每层的网络输入连接数,在我们的例子是512。

    x = torch.randn(512)
    for i in range(100):
    	a = torch.randn(512,512) * math.sqrt(1./512)
    	x = a @ x
    print(x.mean(), x.std())
    
    tensor(0.0358), tensor(1.0825)
    

    即使连续传播了100层之后,层输出也没有发生梯度爆炸或者消失。

    Xavier初始化

    直到几年前,最常用的激活函数还是基于给定点对称的,并且函数曲线在该点加/减一定数值的范围内。双曲正切线和softsign函数就是这类激活函数。
    在这里插入图片描述
    我们在假设的100层网络每一层之后添加双曲正切激活函数,然后看看当使用我们自己的权重初始化方案时会发生什么,这里层权重按 1 n \frac{1}{\sqrt n} n 1缩小。

    def tanh(x):
        return torch.tanh(x)
    
    x = torch.randn(512)
    for i in range(100):
        a = torch.randn(512, 512) * math.sqrt(1./512)
        x = tanh(a @ x)
    print(x.mean(), x.std())
    
    tensor(0.0028) tensor(0.0744)
    

    第100层的激活输出的标准偏差低至约0.07。这绝对是偏小的一面,但至少激活并没有完全消失!
    Xavier初始化将每层权重设置为在有界的随机均匀分布中选择的值
    在这里插入图片描述
    其中 n ᵢ n_ᵢ n是该层的传入网络连接数或该层的 “fan-in”, n ᵢ ₊ 1 n_{ᵢ₊1} n1是该层的传出网络连接数,也称为fan-out。

    **Xavier权重初始化将保持激活函数和反向传播梯度的方差,一直向上或向下传播到神经网络的每一层。**在他们的实验中,他们观察到Xavier初始化使一个5层网络能够将每层的权重梯度维持在基本一致的方差上。
    相反,若不使用Xavier初始化,直接使用“标准”初始化会导致网络较低层(较高)的权值梯度与最上层(接近于零)的权值梯度之间的差异更大。
    在这里插入图片描述
    让我们再次重新运行我们的100层tanh网络,这次使用Xavier初始化:

    def xavier(fan_in, fan_out):
        return torch.Tensor(fan_in, fan_out).uniform_(-1, 1)*math.sqrt(6./(fan_in + fan_out))
    
    
    x = torch.randn(512)
    for i in range(100):
        # a = torch.randn(512, 512) * math.sqrt(1./512)
        a = xavier(512, 512)
        x = tanh(a @ x)
    print(x.mean(), x.std())
    
    tensor(-0.0020) tensor(0.0861)
    
    

    Kaiming初始化

    当使用关于零对称且在[-1,1]内有输出的激活函数(例如softsign和tanh)时,我们希望每层的激活输出的平均值为0,平均标准偏差大约为1,这是有道理的。
    如果我们使用ReLU激活函数呢?以同样的方式缩放随机初始权重值是否仍然有意义?
    guajiguaji在这里插入图片描述
    为了看看会发生什么,让我们在先前假设的网络层中使用ReLU激活来代替tanh,并观察其输出的预期标准偏差。

    def relu(x):
        return x.clamp_min(0.)
    
    mean, var = 0.0, 0.0
    for i in range(10000):
        x = torch.randn(512)
        w = torch.randn(512, 512)
        y = relu(w @ x)
        mean += y.mean().item()
        var += y.pow(2).mean().item()
    print(mean/10000, math.sqrt(var/10000))
    print(math.sqrt(512/2))
    
    9.015778208112717 15.990627241160206
    16.0
    

    事实证明,当使用ReLU激活时,单个层的平均标准偏差将非常接近输入连接数的平方根除以2的平方根,在我们的例子中也就是 512 2 \frac{\sqrt{512}}{\sqrt{2}} 2 512

    通过该值缩放权重矩阵a将使每个单独的ReLU层平均具有1的标准偏差。

    def relu(x):
        return x.clamp_min(0.)
    
    mean, var = 0.0, 0.0
    for i in range(10000):
        x = torch.randn(512)
        w = torch.randn(512, 512) * math.sqrt(2./512)
        y = relu(w @ x)
        mean += y.mean().item()
        var += y.pow(2).mean().item()
    print(mean/10000, math.sqrt(var/10000))
    
    0.5639020895034075 0.999664555805342
    

    保持层激活的标准偏差大约为1将允许我们在深度神经网络中堆叠更多层而不会出现梯度爆炸或消失。

    Kaiming初始化方案是专门用来处理这些非对称,非线性激活的深层神经网络的。
    输入权重初始化策略:

    • 使用适合给定图层的权重矩阵创建张量,并使用从标准正态分布中随机选择的数字填充它。
    • 将每个随机选择的数字乘以 2 n \frac{\sqrt{2}}{\sqrt{n}} n 2 ,其中n是从前一层输出到指定层的连接数(也称为“fan-in”)。
    • 偏差张量初始化为零

    带ReLu激活函数的Xavier初始化结果,激活输出几乎为0

    x = torch.randn(512)
    for i in range(100):
        # a = torch.randn(512, 512) * math.sqrt(1./512)
        a = xavier(512, 512)
        x = relu(a @ x)
    print(x.mean(), x.std())
    
    tensor(4.7158e-16) tensor(7.3041e-16)
    
    

    带ReLu激活函数的Kaiming初始化结果,效果不错,鼓掌呱唧呱唧

    x = torch.randn(512)
    for i in range(100):
        # a = torch.randn(512, 512) * math.sqrt(1./512)
        a = kaiming(512, 512)
        x = relu(a @ x)
    print(x.mean(), x.std())
    
    tensor(0.3823) tensor(0.5436)
    
    

    为什么神经网络参数不能全部初始化为全0?

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    如果全部初始化为零,那么4节点和5节点的输出一样,如果最后没有激活层,那么节点6的输出为0.
    我们需要反向传播更新权值,使得输出值和真实值越来越接近,可以知道,通过反向传播后,节点4,5的梯度改变一样,那么他们的更新参数是一样的,同理可以得出输入层和隐藏层之间的参数更新都是一样的,那么更新后的所有参数都是相同的,不论进行多少次正向传播和反向传播,每两层之间的参数都是一样的.
    隐藏层与其他层多个节点,其实仅仅相当于一个节点
    在这里插入图片描述

    本来我们希望不同的节点学习到不同的参数,但是由于参数相同以及输出值都一样,不同的节点根本无法学习到不同的特征,这样就失去了网络学习特征的意义了.

    w初始化全为0,很可能直接导致模型失效,无法收敛。
    可以对w初始化为随机值解决(在cnn中,w的随机化,也是为了使得同一层的多个filter,初始w不同,可以学到不同的特征,如果都是0或某个值,由于计算方式相同,可能达不到学习不同特征的目的)

    展开全文
  • 当定义好网络模型之后,需要进行权重初始化,恰当的权重初始化方法,可以加快模型的收敛,不恰当的初始化方法,可能导致梯度消失或爆炸,导致模型不可用。如果权重太小,则输入信号通过网络中的每一层时,其方差就...


    两种初始化方法的Paper

    【Xavier initialization Paper(2010)】:Understanding the difficulty of training deep feedforward neural networks
    【He initialization Paper(2016)】:Delving Deep into Rectifiers:Surpassing Human-Level Performance on ImageNet Classification


    1. 为什么需要权重初始化?

    当定义好网络模型之后,需要进行权重初始化,恰当的权重初始化方法,可以加快模型的收敛,不恰当的初始化方法,可能导致梯度消失或爆炸,导致模型不可用。如果权重太小,则输入信号通过网络中的每一层时,其方差就会开始减小,输入最终会降低到非常低的值,导致梯度消失。如果权重太大,则输入数据的方差往往会随着每个传递层而迅速增加。最终,变得很大以至于梯度爆炸。

    如果希望神经网络正常运行,则使用正确的权重初始化网络非常重要。在开始训练网络之前,我们需要确保权重在合理范围内,尽量控制在1附近。


    2. Xavier 初始化

    在开始训练之前分配网络权重似乎是一个随机过程,对吗?我们对数据一无所知,因此我们不确定如何分配在特定情况下适用的权重。一种好的方法是从高斯分布中分配权重。显然,这种分布将具有零均值和一些有限方差。


    考虑一个线性神经元:
    在这里插入图片描述

    有下式成立:

    • H 1 = H 1 ∗ W 2 H_1=H_1∗W_2 H1=H1W2
    • Δ W 2 = ∂ L o s s ∂ W 2 = ∂ L o s s ∂ o u t ∗ ∂ o u t ∂ H 2 ∗ ∂ H 2 ∂ w 2 ΔW_2= \frac{\partial_{Loss}}{\partial W_{2}}=\frac{\partial_{Loss}}{\partial_{out}} * \frac{\partial_{out}}{\partial_{H_2}} * \frac{\partial_{H_2}}{\partial_{w_2}} ΔW2=W2Loss=outLossH2outw2H2
    • = ∂ L o s s ∂ W 2 = ∂ L o s s ∂ o u t ∗ ∂ o u t ∂ H 2 ∗ H 1 = \frac{\partial_{Loss}}{\partial W_{2}}=\frac{\partial_{Loss}}{\partial_{out}} * \frac{\partial_{out}}{\partial_{H_2}} * H_1 =W2Loss=outLossH2outH1

    【梯度消失】:

    • H 1 → 0 ⇒ Δ W 2 → 0 H_1→0⇒ΔW_2→0 H10ΔW20

    【梯度爆炸】:

    • H 1 → ∞ ⇒ Δ W 2 → ∞ H_1→∞⇒ΔW_2→∞ H1ΔW2

    假设:
    y = w 1 x 1 + w 2 x 2 + . . . + w N x N + b y = w_1 x_1 + w_2 x_2 + ... + w_N x_N + b y=w1x1+w2x2+...+wNxN+b


    对于每个经过的层,我们希望方差保持相同,这有助于防止梯度爆炸或消失。换句话说,我们需要以使 x x x y y y 的方差保持相同的方式来初始化权重,此初始化过程称为Xavier初始化(Xavier initialization)。(Xavier 读音 zeivier)

    我们希望 方差(var) 经过每一层时保持相同,首先计算 y y y 的方差:

    v a r ( y ) = v a r ( w 1 x 1 + w 2 x 2 + . . . + w N x N + b ) var(y) = var(w_1x_1 + w_2x_2 + ... + w_Nx_N + b) var(y)=var(w1x1+w2x2+...+wNxN+b)

    有上图的神经网络可知有:
    第一层隐藏层中有:

    • H 11 = ∑ i = 0 n X i ∗ W 1 i H_{11} = \sum^{n}_{i=0} X_i * W_{1i} H11=i=0nXiW1i

    【推导过程】

    由题意知, X X X Y Y Y 是独立同分布的,则有:

    • V ( X Y ) = E ( X ² Y ² ) − E ² ( X Y ) = E ( X ² ) E ( Y ² ) − E ² ( X ) E ² ( Y ) V(XY)=E(X²Y²)-E²(XY)=E(X²)E(Y²)-E²(X)E²(Y) V(XY)=E(X²Y²)E²(XY)=E(X²)E(Y²)E²(X)E²(Y)

    又因为:

    • V ( X ) = E ( X ² ) − E ² ( X ) → E ( X ² ) = V ( X ) + E ² ( X ) V(X)=E(X²)-E²(X) \rightarrow E(X²) = V(X)+E²(X) V(X)=E(X²)E²(X)E(X²)=V(X)+E²(X)
    • V ( Y ) = E ( Y ² ) − E ² ( Y ) → E ( Y ² ) = V ( Y ) + E ² ( Y ) V(Y)=E(Y²)-E²(Y) \rightarrow E(Y²) = V(Y)+E²(Y) V(Y)=E(Y²)E²(Y)E(Y²)=V(Y)+E²(Y)

    而:

    • V ( X Y ) = E ( X ² ) E ( Y ² ) − E ² ( X ) E ² ( Y ) V(XY) = E(X²)E(Y²)-E²(X)E²(Y) V(XY)=E(X²)E(Y²)E²(X)E²(Y)
    • = [ V ( X ) + E ² ( X ) ] ∗ [ V ( Y ) + E ² ( Y ) ] − E ² ( X ) E ² ( Y ) = [V(X)+E²(X)] * [V(Y)+E²(Y)] -E²(X)E²(Y) =[V(X)+E²(X)][V(Y)+E²(Y)]E²(X)E²(Y)
    • = V ( X ) V ( Y ) + V ( X ) E ² ( Y ) + E ² ( X ) V ( Y ) = V(X)V(Y)+V(X)E²(Y)+E²(X)V(Y) =V(X)V(Y)+V(X)E²(Y)+E²(X)V(Y)

    回到原式,计算其方差有(因为偏差 b b b 为一常数,所以求方差为 0,故结果中不存在与 b b b 相关的项):

    • V ( H 11 ) = ∑ i = 0 n = V ( X i ) V ( W 1 i ) + V ( X i ) E ² ( W 1 i ) + E ² ( X i ) V ( W 1 i ) V(H_{11}) = \sum^{n}_{i=0} =V(X_i)V(W_{1i})+V(X_i)E²(W_{1i})+E²(X_i)V(W_{1i}) V(H11)=i=0n=V(Xi)V(W1i)+V(Xi)E²(W1i)+E²(Xi)V(W1i)

    因为有假设输入和权重符合零均值的高斯分布,所以期望 E ( ∗ ) = 0 E(*) = 0 E()=0, 由此可以得到:

    • V ( H 11 ) = ∑ i = 0 n V ( X i ) ∗ V ( W 1 i ) V(H_{11}) = \sum^{n}_{i=0} V(X_i) * V(W_{1i}) V(H11)=i=0nV(Xi)V(W1i)

    又因为各变量都是独立同分布的,所以可以改写为:

    • V ( H 11 ) = n ∗ V ( X i ) ∗ V ( W i ) V(H_{11}) = n * V(X_i) * V(W_{i}) V(H11)=nV(Xi)V(Wi)

    进一步推到可得:

    • V ( H 1 ) = n ∗ V ( X ) ∗ V ( W ) V(H_{1}) = n * V(X) * V(W) V(H1)=nV(X)V(W)

    Xavier 初始化假设 输入 X X X 和 输出 H 1 H_1 H1 的方差相同,则有:

    V ( W ) = 1 n → s t d ( W ) = 1 n V(W) = \frac{1}{n} \rightarrow std(W) = \sqrt{\frac{1}{n}} V(W)=n1std(W)=n1

    由此,推导出了 Xavier 初始化公式。即从均值为零,方差为 1 n \frac{1}{n} n1 的高斯分布中选择权重,其中 n n n 表示输入神经元的数量。

    在原始论文中,作者取输入神经元和输出神经元数量的平均值。因此公式变为:

    • V ( W ) = 1 n a v g = 2 n i n + n o u t = 2 n i + n i + 1 V(W) = \frac{1}{n_{avg}} = \frac{2}{n_{in} + n_{out}} = \frac{2}{n_{i} + n_{i+1}} V(W)=navg1=nin+nout2=ni+ni+12

    • 他们这样做的原因也是为了保留反向传播的信号,但是实现起来在计算上更加复杂。因此,在实际实施过程中,仅采用输入神经元的数量。


    考虑保持方差一致性,即保持数据尺度维持在恰当范围,通常方差为 1。

    以上是针对无激活函数的情况,对于有激活函数的情况,Xavier初始化适用于饱和激活函数,如Sigmoid、Tanh。

    • W ∽ U [ − a , a ] W∽U[−a,a] WU[a,a]
    • D ( W ) = ( − a − a ) 2 12 = ( 2 a ) 2 12 = a 2 3 D(W)=\frac{(−a−a)^2}{12}=\frac{(2a)^2}{12}=\frac{a^2}{3} D(W)=12(aa)2=12(2a)2=3a2
    • 2 n i + n i + 1 = a 2 3 ⇒ a = 6 n i + n i + 1 \frac{2}{n_i+n_{i+1}}=\frac{a^2}{3}⇒a=\frac{\sqrt{6}}{\sqrt{n_i+n_{i+1}}} ni+ni+12=3a2a=ni+ni+1 6
    • ⇒ W ∽ U [ − 6 n i + n i + 1 , 6 n i + n i + 1 ] ⇒W∽U[−\frac{\sqrt{6}}{\sqrt{n_i+n_{i+1}}},\frac{\sqrt{6}}{\sqrt{n_i+n_{i+1}}}] WU[ni+ni+1 6 ,ni+ni+1 6 ]

    3. He 初始化

    何凯明初始化同样遵循方差一致性原则。该权重初始化方法适用于 ReLU及其变种。其计算公式如下:

    • D ( W ) = 2 n i D(W)=\frac{2}{n_i} D(W)=ni2 (适用于ReLU激活函数)
    • D ( W ) = 2 ( 1 + a 2 ) ∗ n 1 D(W)=\frac{2}{(1+a^2)∗n_1} D(W)=(1+a2)n12 (适用于ReLU激活函数的变种,比如PReLU)
    • s t d ( W ) = 2 1 + a 2 ∗ n i std(W)=\sqrt{\frac{2}{1+a^2∗n_i}} std(W)=1+a2ni2 (其中,a 表示激活函数负半轴的斜率)

    4. PyTorch 提供的 10 种权重初始化方法

    以下初始化方法都需要遵循方差一致性原则。

    4.1 Xavier均匀分布

    torch.nn.init.xavier_uniform_(tensor, gain=1)
    
    • 服从均匀分布 U ( − a , a ) U(−a,a) U(a,a) ,分布的参数 a = g a i n ∗ 6 f a n i n + f a n o u t a = gain * \sqrt{\frac{6}{fan_{in}+fan_{out}}} a=gainfanin+fanout6
    • 参数 gain 表示增益,其大小由激活函数类型决定,比如 nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain(‘relu’))
    • 该初始化方法,也称为 Glorot initialization。

    4.2 Xavier标准正态分布

    torch.nn.init.xavier_normal_(tensor, gain=1)
    
    • 服从正态分布, m e a n = 0 , s t d = g a i n ∗ 2 f a n i n + f a n o u t mean=0,std = gain * \sqrt{\frac{2}{fan_{in} + fan_{out}}} mean=0,std=gainfanin+fanout2

    4.3 Kaiming均匀分布

    torch.nn.init.kaiming_uniform_(tensor, a=0, mode=‘fan_in’, nonlinearity=‘leaky_relu’)
    
    • 服从均匀分布 U ( − b o u n d , b o u n d ) U(-bound, bound) U(bound,bound),其中, b o u n d = 6 ( 1 + a 2 ) ∗ f a n i n bound = \sqrt{\frac{6}{(1+a^2)*fan_{in}}} bound=(1+a2)fanin6
    • a:激活函数的负半轴的斜率,relu是0;
    • mode:可选 fan_infan_out, fan_in使正向传播时,方差一致;fan_out 使反向传播时,方差一致;
    • nonlinearity:可选 reluleaky_relu,默认值为 leaky_relu
    • 实例:nn.init.kaiming_uniform_(w, mode=‘fan_in’, nonlinearity=‘relu’)

    4.4 Kaiming标准正态分布

    torch.nn.init.kaiming_normal_(tensor, a=0, mode=‘fan_in’, nonlinearity=‘leaky_relu’)
    
    • 服从0均值的正态分布N(0, std),其中, s t d = 2 ( 1 + a 2 ) ∗ f a n i n std = \sqrt{\frac{2}{(1+a^2)*fan_{in}}} std=(1+a2)fanin2
    • a:激活函数的负半轴的斜率,relu是0;
    • mode:可选 fan_infan_out, fan_in使正向传播时,方差一致;fan_out 使反向传播时,方差一致;
    • nonlinearity:可选 reluleaky_relu,默认值为 leaky_relu
    • 实例:nn.init.kaiming_normal_(w, mode=‘fan_out’, nonlinearity=‘relu’)

    4.5 均匀分布

    torch.nn.init.uniform_(tensor, a=0, b=1)
    

    4.6 正态分布

    torch.nn.init.normal_(tensor, mean=0, std=1)
    

    4.7 常数分布

    torch.nn.init.constant_(tensor, val)
    

    4.8 单位矩阵初始化

    torch.nn.init.eye_(tensor)
    

    4.9 正交矩阵初始化

    torch.nn.init.orthogonal_(tensor, gain=1)
    

    4.10 稀疏矩阵初始化

    torch.nn.init.sparse_(tensor, sparsity, std=0.01)
    
    • 从正态分布 N(0. std) 中进行稀疏化,使每一个 column 有一部分为 0;
    • sparsity:每一个 column 稀疏的比例,即为 0 的比例;
    • 实例:nn.init.sparse_(w, sparsity=0.1)

    5. 增益计算

    torch.nn.init.calculate_gain(nonlinearity, param=None)
    

    功能:计算激活函数的方差变化尺度。即计算输入数据的方差除以经过激活函数之后输出数据的方差,亦即两个方差的比例。

    • nonlinearity:激活函数名称;
    • param:激活函数的参数,如 Leaky ReLU 的 negative_slop

    6. Keras 初始化方法实现

    tf.keras.initializers.glorot_normal(seed=None)
    
    '''
    sqrt(2 / (fan_in + fan_out))
    '''
    
    tf.keras.initializers.glorot_uniform(seed=None)
    
    '''
    sqrt(6 / (fan_in + fan_out))
    '''
    
    tf.keras.initializers.he_normal(seed=None)
    
    '''
    sqrt(6 / fan_in)
    '''
    
    tf.keras.initializers.he_uniform(seed=None)
    
    '''
    sqrt(6 / fan_in)
    '''
    
    tf.keras.initializers.lecun_normal(seed=None)
    
    '''
    stddev = sqrt(1 / fan_in)
    '''
    
    tf.keras.initializers.lecun_uniform(seed=None)
    
    '''
    sqrt(3 / fan_in)
    '''
    

    参考:
    https://prateekvjoshi.com/2016/03/29/understanding-xavier-initialization-in-deep-neural-networks/
    https://medium.com/@prateekvishnu/xavier-and-he-normal-he-et-al-initialization-8e3d7a087528
    https://blog.csdn.net/u011995719/article/details/85107122

    展开全文
  • 为什么需要权重初始化(weight initialization)?常见的权重初始化方式有哪些?启发式权重初始化的好处? 目录 为什么需要权重初始化(weight initialization)?常见的权重初始化方式有哪些?启发式权重初始...
  • 机器学习笔记:权重初始化

    千次阅读 2019-04-01 13:17:59
    权重初始化 预备知识 期望的性质 (1)E(C)=CE(C) = C \tag{1}E(C)=C(1) (2)E(aX)=aE(X)E(aX) = aE(X) \tag{2}E(aX)=aE(X)(2) (3)E(X+Y)=E(X)+E(Y)E(X+Y) = E(X)+E(Y) \tag{3}E(X+Y)=E(X)+E(Y)(3) (4)E(∑i=1...
  • 深度学习中神经网络的几种权重初始化方法,权重的初始化方法,总结了权重的初始化方法
  • 在对卷积层及池化层进行权重初始化时, 激活函数为 sigmoid 时: def weight_variable(shape): inital = tf.truncated_normal(shape) return tf.Variable(inital) 权重初始化为截断正态分布,默认参数如下: def ...
  • 深度学习中神经网络的几种权重初始化方法

    万次阅读 多人点赞 2018-04-25 15:01:32
    深度学习中神经网络的几种权重初始化方法        在深度学习中,神经网络的权重初始化方法对(weight initialization)对模型的收敛速度和性能...
  • Pytorch:权重初始化

    万次阅读 多人点赞 2018-12-16 09:51:59
    通过调用torch.nn.init包中的多种方法可以将权重初始化为直接访问张量的属性。 ** 1、不初始化的效果 ** 在Pytorch中,定义一个tensor,不进行初始化,打印看看结果: w = torch.Tensor(3,4) print (w) ...
  • keras之权重初始化

    千次阅读 2019-06-30 20:34:16
    下面说一下kernel_initializer 权重初始化的方法。 不同的层可能使用不同的关键字来传递初始化方法,一般来说指定初始化方法的关键字是kernel_initializer 和 bias_initializer model.add(Dense(64, kernel_...
  • Pytorch权重初始化方法——Kaiming、Xavier 结论 结论写在前。Pytorch线性层采取的默认初始化方式是Kaiming初始化,这是由我国计算机视觉领域专家何恺明提出的。我的探究主要包括: 为什么采取Kaiming初始化? 考察...
  • 一般权重初始化时需要考虑两个问题: 1. 标准初始化 标准均匀初始化 stand_uniform Wi,j∼gain ∗(−1fanin,1fanin)W_{i,j} \sim gain\ * (-\sqrt{\frac{1}{fan_in}},\sqrt{\frac{1}{fan_in}})Wi,j​∼gain ∗(−...
  • PyTorch学习之十一种权重初始化方法

    万次阅读 2019-01-01 11:29:22
    权重初始化方法位于torch.nn.init中。 增益计算 对于给定的非线性函数,返回推荐的增益值。 torch.nn.init.calculate_gain(nonlinearity, param=None) 参数: nonlinearity - 非线性函数 param - 非线性函数的可...
  • 理解神经网络的权重初始化

    千次阅读 2020-05-27 23:09:35
    本来通过代码来为大家展示为什么神经网路中的权重初始化的选择很重要。
  • 权重初始化方法及适用情况

    千次阅读 2019-06-19 23:55:36
    1. Gaussian ...在caffe,他通过从零均值和特定方差的分布中绘制他们来初始化网络中的权重。 其中w是所有讨论的神经元的初始化分布,而n_in是摄入神经元的神经元的数量,使用的分布通常是高斯...
  • deeplearning.ai第二门课《提升深层神经网络》,权重初始化部分的编程作业,包括一个py文件,数据文件和一个jupyter-notebook
  • tensorflow权重初始化

    千次阅读 2018-09-26 14:20:25
    Xavier初始化的基本思想是保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0。Xavier initialization是由Xavier Glorot et al.在2010年提出,He initialization是由Kaiming He et al.在2015年提出,Batch ...
  • pytorch: 网络权重初始化

    千次阅读 2020-11-21 20:45:40
    构建完网络后, 往往需要初始化权重;其实也可以不需手动初始化,在声明网络时,pytorch有默认的初始化方式,如: import torch x = torch.Tensor(2,2) print(x) 输出为: tensor([[-2.0363e+09, 4.5914e-41], [-2...
  • 目的:降低梯度消失和梯度爆炸的可能性。...权重初始化与每一层的节点个数有关,节点个数越多,每一层的权重参数越小。 参考链接: https://blog.csdn.net/Harpoon_fly/article/details/85227677 ...
  • 深度学习中神经网络的几种权重初始化方法 https://zhuanlan.zhihu.com/p/25110150 https://blog.csdn.net/attitude_yu/article/details/81458172 https://www.cnblogs.com/hutao722/p/9796884.html 目录 梯度...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,327
精华内容 51,730
关键字:

权重初始化