对Pytorch神经网络初始化kaiming分布详解
函数的增益值 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 n 在PyTorch中,神经网络的初始化是至关重要的,因为它直接影响到模型的训练效果和收敛速度。Kaiming初始化(He初始化)和Xavier初始化(Glorot初始化)是两种常用的权重初始化方法,它们都是为了确保神经网络在训练过程中能够有效地传播信息。 我们来看函数的增益值`torch.nn.init.calculate_gain(nonlinearity, param=None)`。这个函数的作用是计算非线性激活函数的增益值,增益`gain`是一个调整输入和输出数量级之间关系的比例因子。不同的激活函数有不同的最优增益值,例如,对于ReLU函数,最优增益为`sqrt(2)`,而对于sigmoid和tanh,最优增益通常为1。 `fan_in`和`fan_out`是计算权重矩阵的输入扇出(in-degree)和输出扇入(out-degree)的指标,用于衡量权重矩阵的覆盖范围。在PyTorch中,计算`fan_in`和`fan_out`的源码如下: ```python 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 ``` 接下来,我们讨论Xavier初始化,也称为Glorot初始化。它是为了平衡前向传播中输入和输出的方差,以保持信息的稳定传播。Xavier初始化有两种形式,分别是均匀分布和正态分布: 1. **Xavier均匀分布**:`torch.nn.init.xavier_uniform_(tensor, gain=1)`。这里的`gain`参数可以设置为`nn.init.calculate_gain('relu')`,以适应ReLU激活函数。 2. **Xavier正态分布**:`torch.nn.init.xavier_normal_(tensor, gain=1)`。同样,`gain`可以根据激活函数类型进行设置。 然后是Kaiming初始化,由He等人提出,特别适用于ReLU激活函数。Kaiming初始化也有均匀分布和正态分布两种: 1. **Kaiming均匀分布**:`torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')`。其中,`a`参数表示ReLU的负斜率,默认为0,代表普通的ReLU;`mode`可以选择`'fan_in'`或`'fan_out'`,`'fan_in'`模式下保留了前向传播中权重的方差。 2. **Kaiming正态分布**:虽然PyTorch中没有直接的Kaiming正态分布初始化函数,但可以通过类似的方式实现,如使用`torch.normal(mean=0, std=sqrt(1 / fan_in))`。 在实际应用中,PyTorch的卷积层和全连接层默认使用Kaiming初始化,因为现代深度学习模型中ReLU激活函数更为常见。而线性层和卷积层在使用sigmoid或tanh激活函数时,可能更适合使用Xavier初始化。 正确的权重初始化能够帮助神经网络在训练初期就具有较好的梯度传播能力,从而加速收敛并提高模型性能。理解并选择合适的初始化方法对于构建高效的深度学习模型至关重要。