You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:05:11