一、概述与应用
(1)论文
xavier论文:《Understanding the difficulty of training deep feedforward neural networks》
he_normal论文:《Delving Deep into Rectifiers:Surpassing Human-Level Performance on ImageNet Classification》
(2)Tensorflow API,initializer:
tf.keras.initializers.he_normal()
tf.contrib.layers.xavier_initializer()
二、xavier原理
(0) 公式推导
核心:
前向传播时,对于某一层输入x,输出y,如何初始化w使得 x与y的分布一致?
y = sigma(xi * wi) + b , i= 1~n,表示n个神经元。
另外这个论文假设激活函数梯度为1,即没有激活函数
要使得 D(y) = D(x),即w初始化后,输出的方差与输入方差一致:
D(y) = D(xi) = D(sigmal(xi*wi))
= n * D(xi * wi) // 此处根据公式 D(A+B) = D(A) + D(B)的到
= n * D(xi) * D(wi) // 根据公式: 当E(A)=E(B) = 0时,D(A*B) = D(A) * D(B)
此时有 D(xi) = n * D(xi) * D(wi) ,
故: D(wi) = 1/n1, n1为前一层神经元数
即当wi初始化为,均值0, 方差1/n时,可以使得一层NN输入和输出分布一致。
反向传播时:对初始化w,使得梯度回传时,相邻两层梯度分布一致。
可以通过同样的方法求到。
D(wi) = 1/n2, n2是后一层的神经元数量
为了同时兼顾feed forward和back prop,所以取个折中,
即 D(wi) = 2/(n1+n2)
对于均匀分布 ~U(-k, k),均值为0, 方差为 k^2/3
所以若 k^2/3 = 2/(n1+n2), 则k =
,得到最终公式:

(1)要解决的问题:
假设有一个4层神经网络,每一层过一个sigmoid(x* W +bias),
初始化:bias=0 , 权重为:
训练200个epoch,则每一层sigmoid后输出的均值和方差变化:
可以观察到一个大问题:layer 4,训练一开始,输出均值就进入饱和区,趋近于0。直到epoch 100+以后,模型才开始逃离饱和区,开始正常输出。
而5层nn,模型甚至逃不出饱和区。
总结:一个不好的nn初始化函数,随着模型深度增加,会使得模型训练初始阶段非常慢。
(2) 原因分析:
对于sigmoid(x * W +bias)来说
第一步:模型训练初始阶段,由于layer-4 bias学的快,模型主要由bias主导输出。
第二步:layer-4 bias学到了输出均值,就会使得 layer-4 的x * W的输出趋近于0,而layer-4 x = layer-3 的sigmoid(x3* W +bias),即会逼迫 layer-3的输出为0
第三步:若layer-3输出为0, 而0又是sigmoid的饱和区,导致真正的特征学习缓慢。
第四步:如果模型深,则永远逃不出饱和区;如果模型浅,会艰难地逃出饱和区。但即使艰难地逃出饱和区,学到了一些真正的特征信心,由于初始化阶段有问题,可能导致模型进入局部最优,最终效果大打折扣。
(2)he_normal
三、实验对比
初始化对网络训练有巨大的影响。(避免在某一层的forward/backward中进入饱和区域,拖慢网络训练进程)
在n=5时,即网络深度为6n+2层=32层时,resnet训练mnist,不同初始化效果对比:
(1)N(0.1,0)正态分布初始化weight:初始loss约为350,训练0.5个epoch后loss下降到16
(2)he_normal():初始loss约为150,训练0.5个epoch后loss下降到3.5,一个epoch就看达到97.82%的Test Error。
本文探讨了深度学习中权重初始化的重要性,分析了Xavier和He_normal两种初始化方法的原理,旨在解决深层神经网络训练初期的梯度消失和饱和问题。通过实验对比,展示了不同初始化方式对模型训练速度和效果的影响,尤其是在ResNet训练MNIST数据集时,He_normal表现出更好的性能。

69

被折叠的 条评论
为什么被折叠?



