📜  深度神经网络的权重初始化技术

📅  最后修改于: 2022-05-13 01:55:40.710000             🧑  作者: Mango

深度神经网络的权重初始化技术

在构建和训练神经网络时,适当地初始化权重以确保模型具有高精度是至关重要的。如果权重没有正确初始化,可能会导致梯度消失问题或梯度爆炸问题。因此,在训练 DL 模型时,选择合适的权重初始化策略至关重要。在本文中,我们将学习一些最常见的权重初始化技术,以及它们在TensorFlow中使用Keras在Python中的实现。

术语或符号

在理解权重初始化技术时,必须牢记以下符号。这些符号在不同的出版物中可能会有所不同。然而,这里使用的是最常见的,通常在研究论文中找到。

示例:将以下神经元视为深度神经网络的一部分。

权重初始化技术

1.零初始化

顾名思义,所有的权重都分配为零,因为初始值是零初始化。这种初始化非常无效,因为神经元在每次迭代中都学习相同的特征。相反,在任何类型的常量初始化期间,都会发生同样的问题。因此,常量初始化不是首选。

零初始化可以在Python中的 Keras 层中实现,如下所示:

Python3
# Zero Initialization
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.Zeros()
layer = tf.keras.layers.Dense(
  3, kernel_initializer=initializer)


Python3
# Random Normal Distribution
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.RandomNormal(
  mean=0., stddev=1.)
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)


Python3
# Random Uniform Initialization
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.RandomUniform(
  minval=0.,maxval=1.)
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)


Python3
# Xavier/Glorot Unifrom Initialization
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.GlorotUniform()
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)


Python3
# Normailzed Xavier/Glorot Unifrom Initialization
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.GlorotNormal()
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)


Python3
# He Uniform Initialization
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.HeUniform()
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)


Python3
# He Normal Initialization
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.HeNormal()
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)


2.随机初始化

为了克服零或常量初始化的缺点,随机初始化将除零之外的随机值作为权重分配给神经元路径。但是,给权重随机赋值,可能会出现过拟合、梯度消失问题、梯度爆炸问题等问题。

随机初始化可以有两种:

  • 随机法线
  • 随机制服

a) 随机正态:权重从正态分布中的值初始化。

w_i  \sim  N(0,1)

随机法线初始化可以在Python中的 Keras 层中实现,如下所示:

Python3

# Random Normal Distribution
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.RandomNormal(
  mean=0., stddev=1.)
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)

b) 随机均匀:权重从均匀分布的值初始化。

w_i  \sim  N(0,1)

Random Uniform 初始化可以在Python中的 Keras 层中实现,如下所示:

Python3

# Random Uniform Initialization
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.RandomUniform(
  minval=0.,maxval=1.)
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)

3. Xavier/Glorot 初始化

在 Xavier/Glorot 权重初始化中,权重是根据均匀分布的值分配的,如下所示:

w_i \sim U\space[  -\sqrt{  \frac{\sigma }{fan\_in + fan\_out}}, \sqrt{  \frac{\sigma }{fan\_in + fan\_out}}]

Xavier/Glorot 初始化通常称为 Xavier 统一初始化,适用于使用的激活函数为Sigmoid 的层。 Xavier/Gorat 初始化可以在Python中的 Keras 层中实现,如下所示:

Python3

# Xavier/Glorot Unifrom Initialization
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.GlorotUniform()
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)

4. 标准化 Xavier/Glorot 初始化

在标准化 Xavier/Glorot 权重初始化中,权重从正态分布的值分配,如下所示:

w_i  \sim  N(0, \sigma )

这里, \sigma   是(谁)给的:

\sigma =\space\sqrt{ \frac{6 }{fan\_in + fan\_out}}

Xavier/Glorot 初始化也适用于激活函数为Sigmoid的层。标准化的 Xavier/Gorat 初始化可以在Python中的 Keras 层中实现,如下所示:

Python3

# Normailzed Xavier/Glorot Unifrom Initialization
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.GlorotNormal()
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)

5. He 统一初始化

在 He Uniform 权重初始化中,权重是从均匀分布的值分配的,如下所示:

w_i  \sim  U\space[  -\sqrt{  \frac{6 }{fan\_in}}, \sqrt{  \frac{6}{fan\_out}}]

He Uniform Initialization 适用于使用ReLU激活函数的层。他可以在Python中的 Keras 层中实现统一初始化,如下所示:

Python3

# He Uniform Initialization
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.HeUniform()
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)

6. He 正常初始化

在 He Normal 权重初始化中,权重是从正态分布的值分配的,如下所示:

w_i  \sim  N\space[0, \sigma ]

这里,\sigma 由下式给出:

 \sigma =  \sqrt{ \frac{2}{fan\_in} }

He Uniform Initialization 也适用于使用ReLU激活函数的层。他可以在Python中的 Keras 层中实现统一初始化,如下所示:

Python3

# He Normal Initialization
from tensorflow.keras import layers
from tensorflow.keras import initializers
  
initializer = tf.keras.initializers.HeNormal()
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)

结论:

权重初始化是深度神经网络中非常重要的概念,使用正确的初始化技术会严重影响深度学习模型的准确性。因此,必须采用适当的权重初始化技术,同时考虑各种因素,例如使用的激活函数。