为什么要输入和输出的方差相同?有利于信息的传递
为了使得网络中信息更好的流动,每一层输出的方差应该尽量相等。在考虑线性激活函数的情况下, 在初始化的时候使各层神经元的方差保持不变, 即使各层有着相同的分布. 如果每层都用N(0, 0.01)随机初始化的话, 各层的数据分布不一致, 随着层度的增加, 神经元将集中在很大的值或很小的值, 不利于传递信息. 很多初始化策略都是为了保持每层的分布不变, 而BN是通过增加归一化层使得每层数据分布保持在N(0, 1)
xavier的初始化方式和BN一样,为了保证数据的分布(均值方差一致)是一样的,加快收敛,就这么简单吧。
1. 正太分布
torch.nn.init.normal_(tensor, mean=0, std=1)
2. Xavier
基本思想是通过网络层时,输入和输出的方差相同,包括前向传播和后向传播。具体看以下博文:
为什么需要Xavier 初始化?
文章第一段通过sigmoid激活函数讲述了为何初始化?
简答的说就是:
如果初始化值很小,那么随着层数的传递,方差就会趋于0,此时输入值 也变得越来越小,在sigmoid上就是在0附近,接近于线性,失去了非线性
如果初始值很大,那么随着层数的传递,方差会迅速增加,此时输入值变得很大,而sigmoid在大输入值写倒数趋近于0,反向传播时会遇到梯度消失的问题
Xavier初始化方式:
pytorch提供了uniform和normal两种: