Pytorch神經網絡初始化kaiming分佈

  • 2020 年 1 月 27 日
  • 筆記

函數的增益值

torch.nn.init.calculate_gain(nonlinearity, param=None) 提供了對非線性函數增益值的計算。

增益值gain是一個比例值,來調控輸入數量級和輸出數量級之間的關係。

fan_in和fan_out

pytorch計算fan_in和fan_out的源碼

def _calculate_fan_in_and_fan_out(tensor):      dimensions = tensor.ndimension()      if dimensions < 2:          raise ValueError("Fan in and fan out can not be computed          for tensor with fewer than 2 dimensions")        if dimensions == 2:  # Linear          fan_in = tensor.size(1)          fan_out = tensor.size(0)      else:          num_input_fmaps = tensor.size(1)          num_output_fmaps = tensor.size(0)          receptive_field_size = 1          if tensor.dim() > 2:              receptive_field_size = tensor[0][0].numel()          fan_in = num_input_fmaps * receptive_field_size          fan_out = num_output_fmaps * receptive_field_size        return fan_in, fan_out

對於全連接層,fan_in是輸入維度,fan_out是輸出維度;對於卷積層,設其維度為

,其中

為kernel規模。則fan_in是

,fan_out是

​。

舉例: 設輸入的數都是出於同一數量級。輸入維度較小時,

,此時方差較大,正態分佈生成的參數初始值都比較大,

,得到的值

。當輸入維度較大時,

,此時方差較小,正態分佈生成的參數初始值都比較小,

,得到的值

,數量級是不變的。

xavier分佈

xavier分佈解析:https://prateekvjoshi.com/2016/03/29/understanding-xavier-initialization-in-deep-neural-networks/ 假設使用的是sigmoid函數。當權重值(值指的是絕對值)過小,輸入值每經過網絡層,方差都會減少,每一層的加權和很小,在sigmoid函數0附件的區域相當於線性函數,失去了DNN的非線性性。 當權重的值過大,輸入值經過每一層後方差會迅速上升,每層的輸出值將會很大,此時每層的梯度將會趨近於0. xavier初始化可以使得輸入值x x方差經過網絡層後的輸出值y

y方差不變。 (1)xavier的均勻分佈

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

填充一個tensor使用U(−a,a)

也稱為Glorot initialization。

>>> w = torch.empty(3, 5)  >>> nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain('relu'))

(2)xavier正態分佈

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

填充一個tensor使用N(0,std)

也稱為Glorot initialization。

kaiming分佈

Xavier在tanh中表現的很好,但在Relu激活函數中表現的很差,所何凱明提出了針對於relu的初始化方法。pytorch默認使用kaiming正態分佈初始化卷積層參數。 (1)kaiming均勻分佈

torch.nn.init.kaiming_uniform_      (tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

使用均勻分佈U(−bound,bound)

也被稱為 He initialization。

    a – the negative slope of the rectifier used after this layer (0 for ReLU by default).激活函數的負斜率,     mode – either 『fan_in』 (default) or 『fan_out』. Choosing fan_in     preserves the magnitude of the variance of the weights in the forward     pass. Choosing fan_out preserves the magnitudes in the backwards     pass.默認為fan_in模式,fan_in可以保持前向傳播的權重方差的數量級,fan_out可以保持反向傳播的權重方差的數量級。

>>> w = torch.empty(3, 5)  >>> nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu')

(2)kaiming正態分佈

torch.nn.init.kaiming_normal_      (tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

使用正態分佈N(0,std)

也被稱為 He initialization。

>>> w = torch.empty(3, 5)  >>> nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='relu')