TensorFlow如何初始化LSTM与GRU单元的核权重?
TensorFlow中LSTM和GRU单元的核权重初始化逻辑
刚好我对TensorFlow里RNN单元的初始化细节挺熟悉的,结合你贴的GRUCell代码片段,我来一步步拆解:
GRU单元的初始化
先看你贴的这段GRUCell核心代码:
self._gate_kernel = self.add_variable( "gates/%s" % _WEIGHTS_VARIABLE_NAME, shape=[input_depth + self._num_units, 2 * self._num_units], initializer=self._kernel_initializer) self._gate_bias = self.add_variable( "gates/%s" % _BIAS_VARIABLE_NAME, shape=[2 * self._num_units], initializer=( self._bias_initializer if self._bias_initializer is not None else init_ops.constant_initializer(1.0, dtype=self.dtype)))
这里的关键细节:
- 核权重(_gate_kernel):默认使用
glorot_uniform_initializer(也就是常说的Xavier均匀初始化)。这个初始化器会根据输入维度(input_depth + self._num_units,输入特征+隐藏状态维度)和输出维度(2*self._num_units,对应更新门+重置门)自动计算权重的取值范围,目的是让每层的激活值方差尽量稳定,避免训练初期出现梯度消失或爆炸的问题。 - 门控偏置(_gate_bias):如果没有自定义偏置初始化器,默认会把所有门的偏置初始化为1.0。这么做是因为GRU的重置门初始偏置偏大时,训练初期会更倾向于"打开"状态,让模型更好地利用之前的隐藏状态信息,加快收敛速度。
另外,GRU里负责候选隐藏状态的核权重(_candidate_kernel),初始化逻辑和门控核完全一致,也是用默认的Xavier均匀初始化。
LSTM单元的初始化
LSTM的结构比GRU多了一个细胞状态,对应输入门、遗忘门、输出门和细胞更新四个门控,所以初始化有一些差异,但核心逻辑一致:
- 核权重:同样默认使用
glorot_uniform_initializer,不过权重矩阵的shape是[input_depth + num_units, 4*num_units](4个门各对应num_units维度),把输入特征和隐藏状态的权重拼接在一起进行初始化。 - 偏置:默认的偏置初始化会区分对待——遗忘门的偏置初始化为1.0,其他三个门的偏置初始化为0.0。这是为了让模型在训练初期尽量保留细胞状态的信息,减少梯度消失的概率,这是LSTM训练中的一个常用小技巧。
自定义初始化器
如果想替换默认的初始化逻辑,你只需要在创建RNN单元时,通过kernel_initializer和bias_initializer参数指定即可,比如:
# 给GRU指定正态分布初始化器 gru_cell = tf.keras.layers.GRUCell( num_units=64, kernel_initializer=tf.initializers.RandomNormal(stddev=0.01), bias_initializer=tf.initializers.Zeros() )
内容的提问来源于stack exchange,提问作者tastyminerals
相关产品推荐
相关产品推荐

