深度神经网络的权重初始化技术
在构建和训练神经网络时,适当地初始化权重以确保模型具有高精度是至关重要的。如果权重没有正确初始化,可能会导致梯度消失问题或梯度爆炸问题。因此,在训练 DL 模型时,选择合适的权重初始化策略至关重要。在本文中,我们将学习一些最常见的权重初始化技术,以及它们在TensorFlow中使用Keras在Python中的实现。
As pre-requisites, the readers of this article are expected to have a basic knowledge of weights, biases and activation functions. In order to understand what this all, you are and what role they play in Deep Neural Networks – you are advised to read through the article Deep Neural Network With L – Layers
术语或符号
在理解权重初始化技术时,必须牢记以下符号。这些符号在不同的出版物中可能会有所不同。然而,这里使用的是最常见的,通常在研究论文中找到。
fan_in = Number of input paths towards the neuron
fan_out = Number of output paths towards the neuron
示例:将以下神经元视为深度神经网络的一部分。
For the above neuron,
fan_in = 3 (Number of input paths towards the neuron)
fan_out = 2 (Number of output paths towards the neuron)
权重初始化技术
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) 随机正态:权重从正态分布中的值初始化。
随机法线初始化可以在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) 随机均匀:权重从均匀分布的值初始化。
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 权重初始化中,权重是根据均匀分布的值分配的,如下所示:
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 权重初始化中,权重从正态分布的值分配,如下所示:
这里, 是(谁)给的:
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 权重初始化中,权重是从均匀分布的值分配的,如下所示:
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 权重初始化中,权重是从正态分布的值分配的,如下所示:
这里,\sigma 由下式给出:
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)
结论:
权重初始化是深度神经网络中非常重要的概念,使用正确的初始化技术会严重影响深度学习模型的准确性。因此,必须采用适当的权重初始化技术,同时考虑各种因素,例如使用的激活函数。