如何/如何初始化 RNN 序列到序列模型中的隐藏状态?

数据挖掘 火炬 rnn 序列到序列 glorot 初始化
2021-09-25 13:25:24

在 RNN 序列到序列模型中,编码输入隐藏状态和输出隐藏状态需要在训练之前进行初始化。

我们应该用什么值来初始化它们?我们应该如何初始化它们?

PyTorch 教程中,它只是将零初始化为隐藏状态。

初始化零是在 RNN seq2seq 网络中初始化隐藏状态的常用方法吗?

glorot初始化怎么样

对于单层 vanilla RNN,扇入和扇出不等于(1+1)这给出了一个方差1和高斯分布mean=0给我们一个均匀的分布0s。

for-each input-hidden weight
  variance = 2.0 / (fan-in +fan-out)
  stddev = sqrt(variance)
  weight = gaussian(mean=0.0, stddev)
end-for

对于带有注意力的单层编码器-解码器架构,如果我们使用 glorot,我们将在初始化解码器隐藏状态时得到非常小的方差,因为扇入将包括映射到编码器输出的所有可能词汇表的注意力. 所以我们也得到了 ~= 0 的高斯平均值,因为 stdev 真的很小。

还有哪些其他初始化方法,尤其是。用于 RNN seq2seq 模型?

1个回答

清除隐藏状态初始化和权重初始化之间的区别很重要。Glotrot(Xavier)、Kaiming 等都是神经网络权重的初始化方法。

由于您的问题是关于隐藏状态初始化:另一方面,隐藏状态可以通过多种方式初始化,初始化为零确实很常见。其他方法包括从高斯或其他分布中采样。与 RNN 相关,这将 RNN 的“记忆”定义为开始。两种常见的方法似乎要么是嘈杂的初始化(来自某种分布或随机数生成器),要么是学习的初始化。

合成上面的链接;用零初始化隐藏状态可以导致网络学习从零隐藏状态适应,而不是最小化长序列的损失(因此这对于短序列来说更成问题)。如果有足够多的序列,那么将初始状态作为一个训练变量是有意义的,该变量是反向传播期间误差的函数。