精华内容
下载资源
问答
  • 神经网络参数初始化-He初始化

    千次阅读 2020-06-11 03:24:30
    Glorot和Bengio提出了Xavier方法来初始化网络参数。该方法基于激活是线性的假设。但该假设对ReLU不适用。何凯明(He kaiming)在论文《Delving Deep into Rectifiers:Surpassing Human-Level Performance on ...

    Glorot和Bengio提出了Xavier方法来初始化网络参数。该方法基于激活是线性的假设。但该假设对ReLU不适用。何凯明(He kaiming)在论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》中提出了针对 ReLU激活网络的初始化方法。

    He初始化

    与Xavier方法一样,He初始化方法也希望初始化使得正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。

    其初始化方法为:

    其中,为第 l 层神经元个数。

    论文:Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

    论文作者推导过程针对的是CNN网络的前向传播和反向传播过程。我们讨论全连接网络结构。

    正向传播

    正向传播为:

    其中,为权重矩阵,为上一层的输出,为本层输入。

    由于中的元素独立同分布,同时,我们假设中的元素也是独立同分布,相互独立。则:

                  (1)

    其中,分别是中元素的随机变量。令的均值为0。

    根据方差公式:

    得到:

    由于均值为0,则=0,于是上式可以写成:

                 (1)

    假设为以0为中心的对称分布,=0,则也是以0为中心的对称分布。则:

                 (2)

    把公式(2)代入公式(1),可得:

                    (3)

    把所有层方差放到一起:

                  (4)

    一个合适的初始化方法应该避免输入信号的指数效应,因此基于式(4),我们要保证:

    即:

                   (5)

    综上所述,应将各层权重初始化为期望为0,标准差为的高斯分布,并且将b初始化为0。

     

    反向传播

    所以:

                   (6)

    而:

                         (7)

                                          (8)

     

    把公式(7)、公式(8)代入公式(6),可得:

    各层放到一起:

    为了避免梯度的指数效应:

    即:

    应将各层权重初始化为期望为0,标准差为的高斯分布。

     

    展开全文
  • 神经网络参数初始化方法

    千次阅读 2019-09-14 10:29:31
    神经网络模型一般依靠随机梯度下降进行模型训练和参数更新,网络的最终性能与收敛得到的最优解直接相关,而收敛结果实际上又很大程度取决于网络参数的最开始的初始化。理想的网络参数初始化使模型...


    神经网络模型一般依靠随机梯度下降进行模型训练和参数更新,网络的最终性能与收敛得到的最优解直接相关,而收敛结果实际上又很大程度取决于网络参数的最开始的初始化。理想的网络参数初始化使模型训练事半功倍,相反,糟糕的初始化方案不仅会影响网络收敛,甚至会导致梯度弥散或爆炸。

    参数初始化的理想状态是参数正负各半,期望为0。

    过大或者过小的初始化

    如果权值的初始值过大,则会导致梯度爆炸,使得网络不收敛;过小的权值初始值,则会导致梯度消失,会导致网络收敛缓慢或者收敛到局部极小值。

    如果权值的初始值过大,则loss function相对于权值参数的梯度值很大,每次利用梯度下降更新参数的时,参数更新的幅度也会很大,这就导致loss function的值在其最小值附近震荡。

    而过小的初值值则相反,loss关于权值参数的梯度很小,每次更新参数时,更新的幅度也很小,着就会导致loss的收敛很缓慢,或者在收敛到最小值前在某个局部的极小值收敛了。

    1. 所有的参数初始化为0或者相同的常数

    最简单的初始化方法就是将权值参数全部初始化为0或者一个常数,但是使用这种方法会导致网络中所有的神经元学习到的是相同的特征。

    当网络达到稳定状态时, 参数(权值)在理想情况下应该保持正负各半(此时期望为0)。因此一种看起来简单的方法,干脆将所有参数都初始化为0, 因为这样可以使得初始化全零时参数的期望与网络稳定时参数期望一致。
    但是,参数全是零时网络不同神经元的输出必然相同,相同的输出必然导致梯度更新完全一样,这样会令更新后的参数仍然保持一样的状态。换句话说,如果参数进行了全零的参数化,那么网络神经元将无法训练模型。例如,对于 y = W X + b y=WX+b y=WX+b,由于参数W需要和X乘积,因此不能初始化为0,而b可以。

    2. 随机初始化

    3. Batch Normalization

    4. Xavier

    初始化方法由Bengio等人在2010年的论文《Understanding the difficulty of training deep feedforward neural networks》中提出。

    它为了保证前向传播和反向传播时每一层的方差一致:在正向传播时,每层的激活值的方差保持不变;在反向传播时,每层的梯度值的方差保持不变。根据每层的输入个数和输出个数来决定参数随机初始化的分布范围,是一个通过该层的输入和输出参数个数得到的分布范围内的均匀分布。

    基于上述的准则,初始的权值参数 ( W l ) (W^l) (Wl) l l l为网络的第 l l l层)要符合以下公式

    W [ l ] ∼ N ( μ = 0 , σ 2 = 1 n [ l − 1 ] ) b [ l ] = 0 \begin{aligned} W^{[l]} & \sim \mathcal{N}\left(\mu=0, \sigma^{2}=\frac{1}{n^{[l-1]}}\right) \\ b^{[l]} &=0 \end{aligned} W[l]b[l]N(μ=0,σ2=n[l1]1)=0

    其中 n l − 1 n^{l-1} nl1是第 l − 1 l-1 l1层的神经元的个数。 也就是说,初始的权值 w w w可以从均值 μ = 0 \mu = 0 μ=0,方差为 σ 2 = 1 n l − 1 \sigma^{2}=\frac{1}{n ^{l-1}} σ2=nl11的正态分布中随机选取。

    正向传播的推导过程:

    推导过程中的三个假设:

    • 权值矩阵 w w w是独立同分布的,且其均值为0
    • 每一层的输入 a a a是独立同分布的,且均值也为0
    • w w w a a a是相互独立的

    L L L层的权值矩阵为 W W W,偏置为 b b b,其输入为 a a a

    z l = w l a l − 1 + b l z^l = w^la^{l-1} + b^l zl=wlal1+bl

    V a r ( z l ) = V a r ( ∑ i = 0 n w i l a i l ) = ∑ i = 0 n V a r ( w i l a i l − 1 ) Var(z^l) = Var(\sum_{i=0}^nw_{i}^la_i^l) = \sum_{i=0}^n Var(w_{i}^la_i^{l-1}) Var(zl)=Var(i=0nwilail)=i=0nVar(wilail1)

    有统计概率的知识可得到:(第一个假设 W W W, x x x相互独立)

    V a r ( w i x i ) = E 2 ( w i ) V a r ( w i ) + E 2 ( x i ) V a r ( x i ) + V a r ( w i ) V a r ( x i ) Var(w_ix_i) = E^2(w_i)Var(w_i) + E^2(x_i)Var(x_i) + Var(w_i)Var(x_i) Var(wixi)=E2(wi)Var(wi)+E2(xi)Var(xi)+Var(wi)Var(xi)

    由第一第二个假设可知: l l l层输入的均值为0,权值参数 W W W的均值也为0,即: E ( x i ) = 0 , E ( w i ) = 0 E(x_i) = 0,E(w_i) = 0 E(xi)=0,E(wi)=0则有: V a r ( w i x i ) = V a r ( w i ) V a r ( x i ) Var(w_ix_i) = Var(w_i)Var(x_i) Var(wixi)=Var(wi)Var(xi),即

    V a r ( z l ) = ∑ i = 0 n V a r ( w i l ) V a r ( x i l − 1 ) Var(z^l) = \sum_{i=0}^nVar(w_i^l)Var(x_i^{l-1}) Var(zl)=i=0nVar(wil)Var(xil1)

    设权值矩阵 W W W独立同分布的则有

    V a r ( w l ) = V a r ( w 11 l ) = ⋯ = V a r ( W i j l ) Var(w^l) = Var(w_{11}^l) = \cdots = Var(W_{ij}^l) Var(wl)=Var(w11l)==Var(Wijl)

    输入 a l − 1 a^{l-1} al1也是独立同分布的有:

    V a r ( a l − 1 ) = V a r ( a 1 l − 1 ) = ⋯ = V a r ( a i l − 1 ) Var(a^{l-1}) = Var(a_1^{l-1}) = \cdots = Var(a_i^{l-1}) Var(al1)=Var(a1l1)==Var(ail1)

    则有

    V a r ( z l ) = n l − 1 V a r ( w l ) V a r ( a l − 1 ) Var(z^l) = n^{l-1}Var(w^l)Var(a^{l-1}) Var(zl)=nl1Var(wl)Var(al1)

    • n l − 1 n^{l-1} nl1是第 l − 1 l-1 l1层的神经元的个数

    这里得出了第 l l l层输入到激活函数中的值 z l z^l zl与其输入 a l − 1 a^{l-1} al1(也就是上一层输出的激活值)的方差之间的关系。但我们假设的是每一层输出的激活值的方差保持不变,也就是说要得到 V a r ( a l ) Var(a^l) Var(al) V a r ( a l − 1 ) Var(a^{l-1}) Var(al1)之间的关系。

    f f f为激活函数,则有

    a l = f ( z l ) a^l = f(z^l) al=f(zl)

    Xavier假设的激活函数为tanh,其函数曲线为

    其中间的部分可以近似线性linear regime,而在训练的过程就要保证激活值是落在这个线性状体的区间内的,不然就会出现梯度饱和的情况。所以,这里可以近似的有

    a l = t a n h ( z l ) a^l = tanh(z^l) al=tanh(zl)

    也就是说:

    V a r ( a l ) = V a r ( z l ) = n l − 1 V a r ( w l ) V a r ( a l − 1 ) Var(a^l) = Var(z^l) = n^{l-1}Var(w^l)Var(a^{l-1}) Var(al)=Var(zl)=nl1Var(wl)Var(al1)

    要让每一层的激活值的方差保持不变,则有

    V a r ( a l ) = V a r ( a l − 1 ) Var(a^l) = Var(a^{l-1}) Var(al)=Var(al1)

    即有

    V a r ( w l ) = 1 n l − 1 Var(w^l) = \frac{1}{n^{l-1}} Var(wl)=nl11

    通常输入神经元和输出神经元的个数不一定总是相同的,这里取两者的均值

    ∀ i , Var ⁡ ( W l + 1 ) = 2 n l + n l + 1 \forall i, \operatorname{Var}\left(W^{l+1}\right)=\frac{2}{n_{l}+n_{l+1}} i,Var(Wl+1)=nl+nl+12

    限制

    对于权值的初始化,Glorot提出两个准则:

    • 各个层激活值的方差保持不变(正向传播)
    • 各个层的梯度值的方差保持不变(反向传播)

    在Xavier的推导的过程中,做了以下假设:

    • 权值矩阵 w w w是独立同分布的,且其均值为0
    • 每一层的输入 a a a是独立同分布的,且均值也为0
    • w w w a a a是相互独立的

    但是,对Xavier限制最大的则是,其是基于tanh作为激活函数的。
    上述公式的详细推导过程可参见 http://www.deeplearning.ai/ai-notes/initialization/ 。

    Xavier的初始化有个假设条件,激活函数关于0对称,且主要针对于全连接神经网络。适用于tanh和softsign。

    均匀分布

    通过上面的推导,得出权值矩阵的均值为:0,方差为

    ∀ i , Var ⁡ ( W l + 1 ) = 2 n l + n l + 1 \forall i, \operatorname{Var}\left(W^{l+1}\right)=\frac{2}{n_{l}+n_{l+1}} i,Var(Wl+1)=nl+nl+12

    [ a , b ] [a,b] [a,b] (间的均匀分布的方差为) v a r = ( b − a ) 2 12 var = \frac{(b-a)^2}{12} var=12(ba)2,设 F i n F_{in} Fin(为输入的神经元个数) F o u t F_{out} Fout为输出的神经元个数

    l i m i t = 6 F i n + F o u t limit = \sqrt{\frac{6}{F_{in} + F_{out}}} limit=Fin+Fout6

    则权值参数从分布

    W ∼ U [ − l i m i t , l i m i t ] → W ∼ U [ − 6 F i n + F o u t , + 6 F i n + F o u t ] W \sim U[-limit,limit] \rightarrow W \sim U\left[-\sqrt{\frac{6}{F_{in} + F_{out}}}, + \sqrt{\frac{6}{F_{in} + F_{out}}}\right] WU[limit,limit]WU[Fin+Fout6 ,+Fin+Fout6 ]

    正态分布

    基于正态分布的Xavier初始化从均值为0,方差为 2 F i n + F o u t \sqrt{\frac{2}{F_{in} + F_{out}}} Fin+Fout2 的正态分布中随机选取。

    W ∼ N ( 0.0 , 2 F i n + F o u t ) W \sim N(0.0,\sqrt{\frac{2}{F_{in} + F_{out}}}) WN(0.0,Fin+Fout2 )

    5. MSRA

    由何凯明在论文Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification提出,由于Xavier的假设条件是激活函数是关于0对称的,而常用的ReLU激活函数并不能满足该条件。

    只考虑输入的个数,MSRA的初始化是一个均值为0,方差为 2 F i n \sqrt{\frac{2}{F_{in}}} Fin2 的高斯分布

    w ∼ G [ 0 , 2 F i n ] w \sim G\left[0, \sqrt{\frac{2}{F_{in }}}\right] wG[0,Fin2 ]
    正向传播的推导过程:

    其前半部分的推导和Xavider类似,对于第l层,有如下公式 :

    y l = W l x l + b l \mathbf{y}_{l}=\mathbf{W}_{l} \mathbf{x}_{l}+\mathbf{b}_{l} yl=Wlxl+bl
    其中

    • x l x_l xl为当前层的输入,也是上一层的激活后的输出值
    • y l y_l yl为当前层输入到激活函数的值
    • w l w_l wl b l b_l bl为权值和偏置

    其中 x l x_l xl以及 w l w_l wl都是独立同分布的,(和Xavier相同的假设条件),则有:

    Var ⁡ [ y l ] = n l Var ⁡ [ w l x l ] \operatorname{Var}\left[y_{l}\right]=n_{l} \operatorname{Var}\left[w_{l} x_{l}\right] Var[yl]=nlVar[wlxl]
    w l w_l wl的均值为0,即 E ( w l ) = 0 E(w_l)=0 E(wl)=0,则有:

    Var ⁡ ( y l ) = n l ( E ( W l 2 ) ⋅ E ( x l 2 ) − E 2 ( w l ) ⋅ E 2 ( x l ) ) = n l ( E ( W l 2 ) ⋅ E ( x l 2 ) − 0 ⋅ E 2 ( x l ) ) = n l ( E ( W l 2 ) ⋅ E ( x l 2 ) − 0 ⋅ E ( x l 2 ) ) = n l ( E ( W l 2 ) ⋅ E ( x l 2 ) − E 2 ( w l ) ⋅ E ( x l 2 ) ) = n l ( E ( W l 2 ) − E 2 ( w l ) ) ⋅ E ( x l 2 ) = n l Var ⁡ ( w l ) ⋅ E ( x l 2 ) \begin{aligned} \operatorname{Var}(y_l) & = n_{l}(E(W_l^2) \cdot E(x_l^2) - E^2(w_l) \cdot E^2(x_l)) \\ &= n_{l}(E(W_l^2) \cdot E(x_l^2) - 0 \cdot E^2(x_l)) \\ & = n_{l}(E(W_l^2) \cdot E(x_l^2) - 0 \cdot E(x_l^2)) \\ & = n_{l}(E(W_l^2) \cdot E(x_l^2) - E^2(w_l) \cdot E(x_l^2)) \\ & = n_{l}(E(W_l^2) - E^2(w_l)) \cdot E(x_l^2) \\ & = n_{l} \operatorname{Var}(w_l) \cdot E(x_l^2) \end{aligned} Var(yl)=nl(E(Wl2)E(xl2)E2(wl)E2(xl))=nl(E(Wl2)E(xl2)0E2(xl))=nl(E(Wl2)E(xl2)0E(xl2))=nl(E(Wl2)E(xl2)E2(wl)E(xl2))=nl(E(Wl2)E2(wl))E(xl2)=nlVar(wl)E(xl2)
    这里有和Xavier一个很大的不同是,这里没有假设输入的值的均值为0。这是由于,使用ReLU的激活函数, x l = m a x ( 0 , y l − 1 ) x_l = max(0,y_{l-1}) xl=max(0,yl1),每层输出的值不可能均值为0。

    上面最终得到
    Var ⁡ ( y l ) = n l Var ⁡ ( w l ) ⋅ E ( x l 2 ) \operatorname{Var}(y_l) = n_{l} \operatorname{Var}(w_l) \cdot E(x_l^2) Var(yl)=nlVar(wl)E(xl2)
    初始化时通常设, w w w的均值为0,偏置 b = 0 b=0 b=0,以及 w w w x x x是相互独立的,则有

    E ⁡ ( y l ) = E ⁡ ( w l x l ) = E ⁡ ( x l ) ⋅ E ⁡ ( w l ) = 0 \begin{aligned} \operatorname{E}(y_l) &= \operatorname{E}(w_lx_l) \\ &= \operatorname{E}(x_l) \cdot \operatorname{E}(w_l) \\ &= 0 \end{aligned} E(yl)=E(wlxl)=E(xl)E(wl)=0
    也就是说, y l y_l yl的均值为0。

    再假设 w w w是关于0对称分布的(均匀分布,高斯分布都符合),则可以得到 y l y_l yl在0附近也是对称分布的。

    这样,使用ReLU作为激活函数,则有

    x l = m a x ( 0 , y l − 1 ) x_l = max(0,y_{l-1}) xl=max(0,yl1)
    由于只有当 y l − 1 > 0 y_l−1>0 yl1>0的部分, x l x_l xl才有值,且 y l y_l yl在0附近也是对称分布的,则可以得到

    E ⁡ ( x l 2 ) = 1 2 E ⁡ ( y l − 1 2 ) = 1 2 ( E ( y l − 1 2 ) − E ( y l − 1 ) ) , ( 由 于 E ( y l − 1 ) = 0 ) = 1 2 Var ⁡ ( y l − 1 ) \begin{aligned} \operatorname{E}(x_l^2) &=\frac{1}{2} \operatorname{E}(y_{l-1}^2) \\ &= \frac{1}{2}({E}(y_{l-1}^2) - E(y_{l-1})),(由于E(y_{l-1}) = 0)\\ & = \frac{1}{2}\operatorname{Var}(y_{l-1}) \end{aligned} E(xl2)=21E(yl12=21(E(yl12)E(yl1)),(E(yl1)=0=21Var(yl1)

    将得到的

    E ⁡ ( x l 2 ) = 1 2 Var ⁡ ( y l − 1 ) \operatorname{E}(x_l^2) = \frac{1}{2}\operatorname{Var}(y_{l-1}) E(xl2)=21Var(yl1)

    带入到

    Var ⁡ ( y l ) = n l Var ⁡ ( w l ) ⋅ E ( x l 2 ) \operatorname{Var}(y_l) = n_{l} \operatorname{Var}(w_l) \cdot E(x_l^2) Var(yl)=nlVar(wl)E(xl2)

    则可以得到

    Var ⁡ [ y l ] = 1 2 n l Var ⁡ [ w l ] Var ⁡ [ y l − 1 ] \operatorname{Var}\left[y_{l}\right]=\frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right] \operatorname{Var}\left[y_{l-1}\right] Var[yl]=21nlVar[wl]Var[yl1]

    将所有层的方差累加到一起有:

    Var ⁡ [ y L ] = Var ⁡ [ y 1 ] ( ∏ l = 2 L 1 2 n l Var ⁡ [ w l ] ) \operatorname{Var}\left[y_{L}\right]=\operatorname{Var}\left[y_{1}\right]\left(\prod_{l=2}^{L} \frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right]\right) Var[yL]=Var[y1](l=2L21nlVar[wl])

    为了是每一层的方差保持不变,则有:

    1 2 n l Var ⁡ [ w l ] = 1 , ∀ l \frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right]=1, \quad \forall l 21nlVar[wl]=1,l

    也即得到 权值矩阵的方差应该是

    2 / n l \sqrt{2 / n_{l}} 2/nl

    和Xavier的方法,也可以使用正态分布或者均匀分布来取得初始的权值矩阵的值。

    正态分布

    W ∼ N ( 0.0 , 2 / n l ) W \sim N(0.0,\sqrt{2 / n_{l}}) WN(0.0,2/nl )

    均匀分布

    W ∼ U [ − 6 / n l , 6 / n l ] W \sim U[-\sqrt{6 / n_{l}},\sqrt{6 / n_{l}}] WU[6/nl ,6/nl ]

    总结及使用的概率公式

    正确的初始化方法应该避免指数级地减小或放大输入值的大小,防止梯度“饱和”。 Glorot提出两个准则:

    • 各个层激活值的方差保持不变(正向传播)
    • 各个层的梯度值的方差保持不变(反向传播)

    通常初始的权值矩阵的均值为0.

    这这些条件的基础上,Glorot 使用(tanh)作为激活函数,并假设输入值的均值为0,提出了Xavier初始化的方法。

    而Kaiming使用ReLU作为激活函数,就无法满足数值的均值为0的条件,因此使用Xavier来初始化ReLU作为激活函数的网络,效果也就不是那么理想。其提出了MSRA的初始化方法,来解决该问题。


    推导时使用的概率公式:

    D ( x ) = E ( x 2 ) − E 2 ( x ) D ( x y ) = E ( x 2 y 2 ) − E 2 ( x y ) = E ( x 2 ) E ( y 2 ) − E 2 ( x ) E 2 ( y ) D(x)=E\left(x^{2}\right)-E^{2}(x) \\ D(x y)=E\left(x^{2} y^{2}\right)-E^{2}(x y)=E\left(x^{2}\right) E\left(y^{2}\right)-E^{2}(x) E^{2}(y) D(x)=E(x2)E2(x)D(xy)=E(x2y2)E2(xy)=E(x2)E(y2)E2(x)E2(y)

    如果 E ( y ) = 0 E(y) = 0 E(y)=0,则有:

    D ( x y ) = D ( y ) E ( x 2 ) D(xy) = D(y)E(x^2) D(xy)=D(y)E(x2)

    如果(x,y)是相互独立的,则有

    E ( x y ) = E ( x ) E ( y ) E(xy) = E(x)E(y) E(xy)=E(x)E(y)
    本文只推导了正向传播的过程,对于反向传播的推导可参考原始论文
    [1] Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
    [2] Understanding the difficulty of training deep feedforward neural networksf

    展开全文
  • 神经网络参数初始化总结分析

    千次阅读 2020-01-08 16:12:19
    训练神经网络的时候需先给定一个初试值,才能够训练,然后一点点地更新,但是不同的初始化方法,训练的效果可能会截然不同。 目录 1、全0初始化 2、全相同参数初始化 3、正态分布随机初始化 1)使用较小的...

    神经网络的参数主要是权重(weights):W, 和偏置项(bias):b。

    训练神经网络的时候需先给定一个初试值,才能够训练,然后一点点地更新,但是不同的初始化方法,训练的效果可能会截然不同

     

    目录

     

    1、全0初始化

    2、全相同参数初始化

    3、正态分布随机初始化

    1)使用较小的随机值初始化

    2)使用较大的随机值初始化

    3)选择合适的随机值进行初始化

    4)讨论

    5、Xavier初始化

    6、He Initialization初始化


    代码下载,没有链接的小伙伴也可以在评论中留下你的邮箱,我稍后发给你:

    https://download.csdn.net/download/weixin_42521239/12090042


     

    1、全0初始化

    假设我们现在需要初始化的神经网络如下所示:

     我们初始化权值为

    其中W1代表输入层到隐藏层的权值矩阵,W2代表隐藏层到输出层的权值矩阵。

    假设网络的输入为[x1,x2,x3],然后通过网络的正向传播,可以得出:

    从上面可以知道,此时隐藏层的值是相同的,然后经过激活函数f后,得到的输出仍然是相同的

    可以知道,通过反向传播后,结点4,5的梯度改变是一样的,假设都是\Delta W,那么此时结点4与结点6之间的参数,与结点5与结点6之间的参数变为了如下:

    由上式可以看出,新的参数相同了!!!!

    同理可以得出输入层与隐藏层之间的参数更新都是一样的,得出更新之后的参数

    都是相同的!然后不管进行多少轮正向传播以及反向传播,每俩层之间的参数都是一样的。

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

    隐藏层与其它层多个结点,其实仅仅相当于一个结点!!

    这样总结来看:w初始化全为0,很可能直接导致模型失效,无法收敛。

    因此可以对w初始化为随机值解决(在cnn中,w的随机化,也是为了使得同一层的多个filter,初始w不同,可以学到不同的特征,如果都是0或某个值,由于计算方式相同,可能达不到学习不同特征的目的)

    下面根据代码验证全0初始化对训练结果的影响

    利用全连接网络对两堆点进行分类。

    前向神经网络构建

    def forward_propagation(X, parameters):
        """
        Implements the forward propagation (and computes the loss) presented in Figure 2.
        
        Arguments:
        X -- input dataset, of shape (input size, number of examples)
        Y -- true "label" vector (containing 0 if cat, 1 if non-cat)
        parameters -- python dictionary containing your parameters "W1", "b1", "W2", "b2", "W3", "b3":
                        W1 -- weight matrix of shape ()
                        b1 -- bias vector of shape ()
                        W2 -- weight matrix of shape ()
                        b2 -- bias vector of shape ()
                        W3 -- weight matrix of shape ()
                        b3 -- bias vector of shape ()
        
        Returns:
        loss -- the loss function (vanilla logistic loss)
        """
            
        # retrieve parameters
        W1 = parameters["W1"]
        b1 = parameters["b1"]
        W2 = parameters["W2"]
        b2 = parameters["b2"]
        W3 = parameters["W3"]
        b3 = parameters["b3"]
        
        # LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SIGMOID
        z1 = np.dot(W1, X) + b1
        a1 = relu(z1)
        z2 = np.dot(W2, a1) + b2
        a2 = relu(z2)
        z3 = np.dot(W3, a2) + b3
        a3 = sigmoid(z3)
        
        cache = (z1, a1, W1, b1, z2, a2, W2, b2, z3, a3, W3, b3)
        
        return a3, cache

    全0初始化

    def initialize_parameters_zeros(layers_dims):
        """
        将模型的参数全部设置为0
    
        参数:
            layers_dims - 列表,模型的层数和对应每一层的节点的数量
        返回
            parameters - 包含了所有W和b的字典
                W1 - 权重矩阵,维度为(layers_dims[1], layers_dims[0])
                b1 - 偏置向量,维度为(layers_dims[1],1)
                ···
                WL - 权重矩阵,维度为(layers_dims[L], layers_dims[L -1])
                bL - 偏置向量,维度为(layers_dims[L],1)
        """
        parameters = {}
    
        L = len(layers_dims)  # 网络层数
    
        for l in range(1, L):
            parameters["W" + str(l)] = np.zeros((layers_dims[l], layers_dims[l - 1]))
            parameters["b" + str(l)] = np.zeros((layers_dims[l], 1))
    
            # 使用断言确保我的数据格式是正确的
            assert (parameters["W" + str(l)].shape == (layers_dims[l], layers_dims[l - 1]))
            assert (parameters["b" + str(l)].shape == (layers_dims[l], 1))
    
        return parameters

     损失函数值为

    可以发现,压根就没训练!得到的模型跟瞎猜没有区别。

    且损失函数的值一直保持在0.69左右,为什么是0.69

    因为log0.5=0.69,也就是说,前向神经网络的输出就是0.5,0.5,损失函数值一直保持不变,也就意味着神经网络的更新根本没有起作用。

    不管是哪个神经元,它的前向传播和反向传播的算法都是一样的,如果初始值也一样的话,不管训练多久,它们最终都一样,都无法打破对称(fail to break the symmetry),那每一层就相当于只有一个神经元,最终L层神经网络就相当于一个线性的网络,如Logistic regression,线性分类器对我们上面的非线性数据集是“无力”的,所以最终训练的结果就瞎猜一样。

    2、全相同参数初始化

    如果全0参数初始化,用全相同参数初始化也导致了不管进行多少轮正向传播以及反向传播,每俩层之间的参数都是一样的。

    我们将神经网络全部初始化为一个相同的常数,例如全部初始化为1。

    进行全相同参数初始化后的loss值曲线为

     仔细观察,损失值在0.698时开始下降,下降到不足0.692时就基本不动了,前向神经网络的输出依然是保持在0.5,0.5左右。

     

     分类结果依然是分了等于没分。

    因此,全相同参数初始化与全零初始化一样,都无法打破神经网络的参数对称性,无法得到正确的训练结果。

    3、正态分布随机初始化

    1)使用较小的随机值初始化

    def initialize_parameters_random(layers_dims):
        """
        参数:
            layers_dims - 列表,模型的层数和对应每一层的节点的数量
        返回
            parameters - 包含了所有W和b的字典
                W1 - 权重矩阵,维度为(layers_dims[1], layers_dims[0])
                b1 - 偏置向量,维度为(layers_dims[1],1)
                ···
                WL - 权重矩阵,维度为(layers_dims[L], layers_dims[L -1])
                b1 - 偏置向量,维度为(layers_dims[L],1)
        """
    
        np.random.seed(3)  # 指定随机种子
        parameters = {}
        L = len(layers_dims)  # 层数
    
        for l in range(1, L):
            parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) *0.1  # 使用10倍缩放
            parameters['b' + str(l)] = np.zeros((layers_dims[l], 1))
    
            # 使用断言确保我的数据格式是正确的
            assert (parameters["W" + str(l)].shape == (layers_dims[l], layers_dims[l - 1]))
            assert (parameters["b" + str(l)].shape == (layers_dims[l], 1))
    
        return parameters

    可以看到loss曲线为

    再看分类效果

    2)使用较大的随机值初始化

    def initialize_parameters_random(layers_dims):
        """
        参数:
            layers_dims - 列表,模型的层数和对应每一层的节点的数量
        返回
            parameters - 包含了所有W和b的字典
                W1 - 权重矩阵,维度为(layers_dims[1], layers_dims[0])
                b1 - 偏置向量,维度为(layers_dims[1],1)
                ···
                WL - 权重矩阵,维度为(layers_dims[L], layers_dims[L -1])
                b1 - 偏置向量,维度为(layers_dims[L],1)
        """
    
        np.random.seed(3)  # 指定随机种子
        parameters = {}
        L = len(layers_dims)  # 层数
    
        for l in range(1, L):
            parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * 10  # 使用10倍缩放
            parameters['b' + str(l)] = np.zeros((layers_dims[l], 1))
    
            # 使用断言确保我的数据格式是正确的
            assert (parameters["W" + str(l)].shape == (layers_dims[l], layers_dims[l - 1]))
            assert (parameters["b" + str(l)].shape == (layers_dims[l], 1))
    
        return parameters

    损失函数值loss值曲线为

    分类效果为

    3)选择合适的随机值进行初始化

    def initialize_parameters_random(layers_dims):
        """
        参数:
            layers_dims - 列表,模型的层数和对应每一层的节点的数量
        返回
            parameters - 包含了所有W和b的字典
                W1 - 权重矩阵,维度为(layers_dims[1], layers_dims[0])
                b1 - 偏置向量,维度为(layers_dims[1],1)
                ···
                WL - 权重矩阵,维度为(layers_dims[L], layers_dims[L -1])
                b1 - 偏置向量,维度为(layers_dims[L],1)
        """
    
        np.random.seed(3)  # 指定随机种子
        parameters = {}
        L = len(layers_dims)  # 层数
    
        for l in range(1, L):
            parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * 2  # 使用10倍缩放
            parameters['b' + str(l)] = np.zeros((layers_dims[l], 1))
    
            # 使用断言确保我的数据格式是正确的
            assert (parameters["W" + str(l)].shape == (layers_dims[l], layers_dims[l - 1]))
            assert (parameters["b" + str(l)].shape == (layers_dims[l], 1))
    
        return parameters

    训练的loss值曲线为

    分类效果为

    4)讨论

    显然,使用随机值初始化可以很好的打破神经网络的对称性,但是不管是使用过大的随机值初始化和过小的随机值初始化,其最后收敛到的loss值都比较大。

    只有使用了合适的随机初始值进行初始化,才能较好的实现正确的分类。

    当我们使用较小的随机值进行初始化时,我们可以认为这些较小的随机值都比较接近于0。深度学习中,我们认为参数越大,模型越复杂;参数越小,模型越简单。所以我们使用较小的初始值时,模型的太简单了,所以实现效果不好。

    那么为什么随机初始值较大,也会导致模型收敛得不好呢。我们可以看我们使用的激活函数relu

    对于激活函数relu而言,中间的斜率大,两边的斜率小还趋于0,。所以当我们把随机的值乘以10以后,我们的初值就会往两边跑,那么就是出现梯度消失的现象,迭代次数再多,损失函数也只能下降一点点,或者干脆一点都不下降。

    5、Xavier初始化

    Xavier初始化的基本思想是,若对于一层网络的输出和输出可以保持正态分布且方差相近,这样就可以避免输出趋向于0,从而避免梯度弥散情况。

    • 条件:正向传播时,激活值的方差保持不变;反向传播时,关于状态值的梯度的方差保持不变。
    • 初始化方法:

    • 假设激活函数关于0对称,且主要针对于全连接神经网络。适用于tanh和softsign。

     例如,对于激活函数tanH ,Xavier initialization后每层的激活函数输出值的分布:

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

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

     

    6、He Initialization初始化

    对于前面使用随机值进行初始化的方式,我们可以发现,过大或者过小的初始参数都会使得神经网络难以训练,但是,当选择了合适大小的随机值时,效果还是不错的,因为如何选择一个合适的随机值就成了关键。

    论文He et al., 2015.中提出了一种方法,我们称之为He Initialization,它就是在我们随机初始化了之后,乘以

    这样就避免了参数的初始值过大或者过小,因此可以取得比较好的效果,代码也很简单。

    同时,He Initialization还能解决Xavier Initialization的问题。

    • 条件:正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。
    • 适用于ReLU的初始化方法

    • 适用于Leaky ReLU的初始化方法:

    其中,hi,wi分别表示卷积层中卷积核的高和宽,而di表示当前层卷积核的个数。

    def initialize_parameters_he(layers_dims):
        """
        参数:
            layers_dims - 列表,模型的层数和对应每一层的节点的数量
        返回
            parameters - 包含了所有W和b的字典
                W1 - 权重矩阵,维度为(layers_dims[1], layers_dims[0])
                b1 - 偏置向量,维度为(layers_dims[1],1)
                ···
                WL - 权重矩阵,维度为(layers_dims[L], layers_dims[L -1])
                b1 - 偏置向量,维度为(layers_dims[L],1)
        """
    
        np.random.seed(3)  # 指定随机种子
        parameters = {}
        L = len(layers_dims)  # 层数
    
        for l in range(1, L):
            parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * np.sqrt(2 / layers_dims[l - 1])
            parameters['b' + str(l)] = np.zeros((layers_dims[l], 1))
    
            # 使用断言确保我的数据格式是正确的
            assert (parameters["W" + str(l)].shape == (layers_dims[l], layers_dims[l - 1]))
            assert (parameters["b" + str(l)].shape == (layers_dims[l], 1))
    
        return parameters

    损失函数的loss曲线为

    分类的效果为

    可以看到He Initialization由于是基于随机值初始化的,所以能够很好地打破神经网络的对称性问题,同时,又解决了随机值过大或者过小的问题,可以较好的学习。

     

     

     

    展开全文
  • 神经网络权重初始化问题

    万次阅读 2017-09-01 12:24:26
    之前看Andrew大神的视频有介绍到神经网络权重需要随机初始化而不是全初始化为0的问题,其真正深层次的含义没有弄明白,所以结合一些资料(cs231n课程)希望能让自己之后再想到这个问题的时候能够快速地明白过来。...

    之前看Andrew大神的视频有介绍到神经网络权重需要随机初始化而不是全初始化为0的问题,其真正深层次的含义没有弄明白,所以结合一些资料(cs231n课程)希望能让自己之后再想到这个问题的时候能够快速地明白过来。

    另外这篇文章其实是一篇译文,所以翻译不是很确定的地方也将原文中的英文语句复制在句后,如果有更合适的翻译也请留言告知一下,谢谢!

    参考文献: CS231n Convolutional Neural Networks for Visual Recognition

    权重初始化

    我们已经知道了如何构建神经网络结构,也知道了怎么预处理数据。在我们真正开始训练网络之前,我们必须要知道如何去初始化神经网络的参数。

    陷阱: 都初始化为0

    首先介绍一下我们不应该做的事情(即初始化为0)。需要注意的是我们并不知道在训练神经网络中每一个权重最后的值,但是如果进行了恰当的数据归一化后,我们可以有理由认为有一半的权重是正的,另一半是负的。令所有权重都初始化为0这个一个听起来还蛮合理的想法也许是一个我们假设中最好的一个假设了。但结果正确是一个错误(的想法),因为如果神经网络计算出来的输出值都一个样,那么反向传播算法计算出来的梯度值一样,并且参数更新值也一样( w=wαdw )。更一般地说,如果权重初始化为同一个值,网络就不可能不对称(即是对称的)。

    为什么不能是对称的?

    答案参考【知乎:为什么神经网络在考虑梯度下降的时候,网络参数的初始值不能设定为全0,而是要采用随机初始化思想?】

    设想你在爬山,但身处直线形的山谷中,两边是对称的山峰。
    由于对称性,你所在之处的梯度只能沿着山谷的方向,不会指向山峰;你走了一步之后,情况依然不变。
    结果就是你只能收敛到山谷中的一个极大值,而走不到山峰上去。

    初始化为小的随机数

    既然不能都初始化为0,那么很自然的我们会想到将权重初始化为非常接近0的小数(正如我们上面所讨论的不能等于0)。将权重初始化为很小的数字是一个普遍的打破网络对称性的解决办法。这个想法是,神经元在一开始都是随机的、独一无二的,所以它们会计算出不同的更新,并将自己整合到整个网络的各个部分。一个权重矩阵的实现可能看起来像 W=0.01np.random.randn(D,H) ,其中randn是从均值为0的单位标准高斯分布进行取样。通过这个公式(函数),每个神经元的权重向量初始化为一个从多维高斯分布取样的随机向量,所以神经元在输入空间中指向随机的方向(so the neurons point in random direction in the input space.应该是指输入空间对于随机方向有影响)。其实也可以从均匀分布中来随机选取小数,但是在实际操作中看起来似乎对最后的表现并没有太大的影响。

    警告:并不是数字越小就会表现的越好。比如,如果一个神经网络层的权重非常小,那么在反向传播算法就会计算出很小的梯度(因为梯度gradient是与权重成正比的)。在网络不断的反向传播过程中将极大地减少“梯度信号”,并可能成为深层网络的一个需要注意的问题。

    用1/sqrt(n)校准方差

    上述建议的一个问题是,随机初始化神经元的输出的分布有一个随输入量增加而变化的方差。结果证明,我们可以通过将其权重向量按其输入的平方根(即输入的数量)进行缩放,从而将每个神经元的输出的方差标准化到1。也就是说推荐的启发式方法(heuristic)是将每个神经元的权重向量按下面的方法进行初始化: w=np.random.randn(n)/sqrt(n) ,其中 n 表示输入的数量。这保证了网络中所有的神经元最初的输出分布大致相同,并在经验上提高了收敛速度。

    w=np.random.randn(n)/sqrt(n)推导过程大致如下:
    令权重 w 和输入x的内积表达式为: s=niwixi ,这就使得神经元在非线性之前得到了原始的激活。
    计算 s 的方差:

    Var(s)=Var(inwixi)=inVar(wixi)=in[E(wi)]2Var(xi)+E[xi]2Var(wi)+Var(xi)Var(wi)=inVar(xi)Var(wi)=(nVar(w))Var(x)

    在最开始的两步我们使用了方差的性质

    在第三步我们我们假设输入值和权重均值为0,所以 E[xi]=E[wi]=0 。注意到这不是一般的情况:比如ReLU的单元会有一个正的均值。

    在最后一步我们假设所有的 wi,xi 都是同分布的(即 w1,w2... 是同分布, x1,x2,... 是同分布,但是 w x不是同分布)。

    从这个推导中我们可以看到如果我们想让 s 和所有的输入都有相同的方差,那么需要保证在初始化的时候每个权重w的方差是 1n 。并且因为 Var(aX)=a2Var(X) a 是一个标量,X是一个随机变量),这就意味着我们可以从单位高斯分布中取样,然后通过 a=1n 进行缩放来使得权重的方差为 1n 。也就是得到了最开始所介绍的初始化方法: w=np.random.randn(n)/sqrt(n)

    Glorot等人所写的文章Understanding the difficulty of training deep feedforward neural networks中有类似的分析。在这篇论文中,作者的结论是建议初始化的形式是 Var(w)=2(nin+nout) ,其中 nin,nout 分别是上一层和下一层神经元的数量。这是基于一个折中的选择和对反向传播梯度等价分析后具有积极作用的办法。(This is motivated by based on a compromise and an equivalent analysis of the backpropagated gradients)。关于这个话题的最新论文,由He等人所写的Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification推导了ReLU神经元的权重初始化问题,得出的结论是神经元的方差需要是 2.0n ,即 w=np.random.randn(n)/sqrt(2.0/n) ,这是目前在神经网络中使用相关神经网络的建议。

    稀疏初始化(Sparse Initialazation)

    另一种解决未校准方差问题的方法是把所有的权重矩阵都设为零,但是为了打破对称性,每个神经元都是随机连接地(从如上面所介绍的一个小的高斯分布中抽取权重)到它下面的一个固定数量的神经元。一个典型的神经元连接的数目可能是小到10个。

    初始化偏差

    将偏差初始化为零是可能的,也是很常见的,因为非对称性破坏是由权重的小随机数导致的。因为ReLU具有非线性特点,所以有些人喜欢使用将所有的偏差设定为小的常数值如0.01,因为这样可以确保所有的ReLU单元在最开始就激活触发(fire)并因此能够获得和传播一些梯度值。然而,这是否能够提供持续的改善还不太清楚(实际上一些结果表明这样做反而使得性能更加糟糕),所以更通常的做法是简单地将偏差初始化为0.

    实际操作

    通常的建议是使用ReLU单元以及 He等人 推荐的公式 w=np.random.randn(n)sqrt(2.0/n)

    批量标准化

    loffe和Ioffe最近开发的一项技术,称为“Batch Normalization”,在训练开始的时候,通过显式地迫使网络上的激活函数让整个网络上采用高斯分布来初始化神经网络,从而缓解了许多头痛的问题。(A recently developed technique by Ioffe and Szegedy called Batch Normalization alleviates a lot of headaches with properly initializing neural networks by explicitly forcing the activations throughout a network to take on a unit gaussian distribution at the beginning of the training.)。通过核心观察证明这是可能的,因为标准化是一个简单的可微分的操作(The core observation is that this is possible because normalization is a simple differentiable operation.)。在实际操作中,运用这项技术相当于在全连接层(或者卷积层,我们很快将会看到)后面嵌入BatchNorm层,并嵌在非线性(层)前。这里我们不会展开来讲解这项技术,因为它已经在上面那提供链接的论文中详细的介绍了,但是请注意,在神经网络中使用批量标准化已经成为一种非常常见的做法。在实践中,使用批量标准化的网络对糟糕的初始化更加健壮。还要需要提到的是,批量标准化可以解释为在网络的每一层进行预处理,但它以可微分的方式整合到网络中。完美!





    MARSGGBO♥原创

    2017-9-1

    展开全文
  • 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...
  • 神经网络参数初始化

    千次阅读 2018-08-23 18:29:25
    神经网络参数的初始化,在网络层数很深的情况下变得尤为重要。如果参数初始化的过小,很可能导致网络每一层的输出为都接近于0,那么可以这样认为每一层的输入都会很接近于0,在进行反向传播的时候,假如我们要更新某...
  • 神经网络权重初始化

    千次阅读 2019-03-31 17:00:55
    在我们真正开始训练网络之前,我们必须要知道如何去初始化神经网络的参数。 陷阱: 都初始化为0。 首先介绍一下我们不应该做的事情(即初始化为0)。需要注意的是我们并不知道在训练神经网络中每一个权重最后的值...
  • 神经网络参数初始化方式

    千次阅读 2018-04-25 17:18:42
    看了文章《Understanding the difficulty of training deep feedforward neural networks》,里面提出了两种参数初始化的方法:以及normalized initialization——xavier方法:最近做实验,发现网络初始化太重要!...
  • [深度学习] 网络参数初始化

    千次阅读 2018-05-20 19:46:48
    网络参数初始化 神经网络模型一般依靠随机梯度下降进行模型训练和参数更新,网络的最终性能与收敛得到的最优解直接相关,而收敛结果实际上又很大程度取决于网络参数的最开始的初始化。理想的网络参数初始化使模型...
  • 深度学习神经网络中权重的初始化

    千次阅读 2018-04-15 15:35:05
    目录 ...所以一个良好的初始化也是非常重要的,这里尝试三种初始化化方式: 零初始化,将权重参数初始化为零。 随机初始化,使用随机的方式,初始化权重参数。 He初始化,这个公式的初始化方式。...
  • keras-如何提取某层的参数矩阵,并将其作为另一个层的初始化参数矩阵 首先定义一个简单的全连接网络 from keras.layers import Input,Dense inputs = Input(shape = (4,), name = 'input') d1 = Dense(7, ...
  • 卷积神经网络初始化方法总结

    千次阅读 2020-08-20 20:25:56
    卷积神经网络初始化方法总结一、前言二、预训练初始化三、全0初始化四、固定值初始化1.BN层的初始化2.LSTM3.bias初始化五、固定方差的参数初始化1.高斯分布初始化2.均匀分布初始化3.固定方差初始化的缺点六.方差缩放...
  • 神经网络权重初始化的三种方法

    千次阅读 2018-10-23 22:14:24
    在以往的文章里面,全连接层的权重我是给初始化成0的,但卷积层是初始化成正态分布。其实,权重初始化成0是一件很糟糕的事情。 举一个二分类的例子。我们有损失函数L=f−yL=f−y一共两个神经元,每个神经元又是一个...
  • PyTorch —— 神经网络权重初始化

    千次阅读 2019-05-16 10:07:35
    对于神经网络中的参数来说,如果所有参数全部一样(比如初始化为全0),那么就面临一个问题:梯度往哪里下降是最快呢?? 看一个例子 神经网络很难判断哪些权重需要更改,因为每个层级的神经元输出是一样的。为了...
  • 深层神经网络的权值初始化问题

    千次阅读 2017-12-12 15:41:56
    在上篇文章深层神经网络的搭建中,我们提到关于超参数权值的初始化至关重要。今天我们就来谈谈其重要性以及如何选择恰当的数值来初始化这一参数。1. 权值初始化的意义 一个好的权值初始值,有以下优点:加快梯度下降...
  • 卷积神经网络的权值初始化方法

    万次阅读 2018-08-28 14:07:56
    卷积层: normal  从均值为0,方差为1的高斯分布中采样,作为... 由FAIR的大牛Kaiming He提出来的卷积层权值初始化方法,目的是使得每一卷积层的输出的方差都为1,具体数学推导可以参考论文[1]. 权值的初始化方...
  • 当你训练神经网络时,权重随机初始化是很重要的。 对于逻辑回归,把权重初始化为0当然也是可以的。 但是对于一个神经网络,如果你把权重或者参数都初始化为0,那么梯度下降将不会起作用。 让我们看看这是为什么? 有...
  • 本文是基于吴恩达老师《深度学习》第二周第一课练习题所做,目的在于探究参数初始化对模型精度的影响。文中所用到的辅助程序在这里。
  • 虚拟机网络初始化

    千次阅读 2014-04-11 08:46:17
    # 1删除之前的网络设置 重启 rm /etc/udev/rules.d/70-persistent-net.rules reboot #2 虚拟机设置成桥接 vi /etc/sysconfig/network-scripts/ifcfg-eth0   DEVICE=eth0 TYPE=Ethernet ONBOOT=yes ...
  • 卷积神经网络,个数,维数是根据经验,请问初始化怎样,听说是初始化为很小值,请问 又根据什么调整卷积核的参数呢?
  • 神经网络参数初始化对最终的结果有重大影响。下面的代码是从github改编的,一开始使用正态分布初始化参数,stddev设置为1.0,结果正确率始终徘徊在94%,设置为0.01后,最终正确率达到了98%以上。所以参数的初始化...
  • pytorch的几种权重初始化方式: PyTorch提供了多种参数初始化函数: torch.nn.init.constant(tensor, val) torch.nn.init.normal(tensor, mean=0, std=1) torch.nn.init.xavier_uniform(tensor, gain=1) 上面...
  • 命令提示符,初始化网络代码。

    千次阅读 2019-06-17 19:07:33
    指令:netsh winsock reset 作用:这个命令可以重新初始化网络环境,以解决由于软件冲突、病毒原因造成的参数错误问题。
  • ubuntu初始化设置

    千次阅读 2019-10-23 11:02:38
    系统版本:Ubuntu 18.04.3 LTS 虚拟机软件:VMware® Workstation 14 Pro ...: VMware 的使用流程我这里就不再多说了,网上有大量的教程,这里有个小地方需要注意的,在安装完毕后第一次使用界面登录时会提示更新,我这里...
  • 树莓派3B 初始化 必须的设置

    千次阅读 2018-12-30 06:13:30
    树莓派3B 初始化 必须的设置      1.1扩展系统空间  因为内存卡还有很多空间没有分配,第一步自然是把这些空间分配了  在SSH控制台输入: sudo raspi-config 第一步:   第二步: 然后选择第...
  • 新买来的网络摄像机需要我们进行初始化设置(激活)后才能正常使用,这里我们简单介绍一下摄像机的激活过程,首先需要连接好摄像头,然后下载海康威视的激活软件:海康威视SADP设备网络搜索(SADPTool): 官方下载...
  • 本文主要介绍通过不同的方法初始化神经网络中的图层权重。并且通过各种简短的实验和思想练习,我们将逐步发现为什么在训练深度神经网络时足够的重量初始化非常重要。在此过程中,我们将介绍研究人员多年来提出的各种...
  • vgg16网络初始化权重

    2018-12-14 17:29:27
    从谷歌上找了好久的,而且网速还贼拉的慢,为方便大家,上传共享
  • socket属性设置初始化操作

    千次阅读 2017-11-21 10:04:12
    socket属性设置初始化操作 libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 523,842
精华内容 209,536
关键字:

如何网络设置初始化