LSTM 单元电路中的 num_unit 究竟是什么?

Aad*_*Ura 6 python deep-learning lstm tensorflow rnn

我非常努力地到处搜索,但我找不到num_unitsTensorFlow 中的实际内容。我试图将我的问题与这个问题联系起来,但我无法在那里得到明确的解释。


在 TensorFlow 中,在创建基于 LSTM 的 RNN 时,我们使用以下命令

cell = rnn.BasicLSTMCell(num_units=5, state_is_tuple=True)
Run Code Online (Sandbox Code Playgroud)

正如Colah 的博客所说,这是一个基本的 LSTM 单元:

在此处输入图片说明

现在,假设我的数据是:

idx2char = ['h', 'i', 'e', 'l', 'o']

# Teach hello: hihell -> ihello
x_data = [[0, 1, 0, 2, 3, 3]]   # hihell
x_one_hot = [[[1, 0, 0, 0, 0],   # h 0
              [0, 1, 0, 0, 0],   # i 1
              [1, 0, 0, 0, 0],   # h 0
              [0, 0, 1, 0, 0],   # e 2
              [0, 0, 0, 1, 0],   # l 3
              [0, 0, 0, 1, 0]]]  # l 3

y_data = [[1, 0, 2, 3, 3, 4]]    # ihello
Run Code Online (Sandbox Code Playgroud)

我的输入是:

x_one_hot = [[[1, 0, 0, 0, 0],   # h 0
              [0, 1, 0, 0, 0],   # i 1
              [1, 0, 0, 0, 0],   # h 0
              [0, 0, 1, 0, 0],   # e 2
              [0, 0, 0, 1, 0],   # l 3
              [0, 0, 0, 1, 0]]]  # l 3
Run Code Online (Sandbox Code Playgroud)

这是形状[6,5]

这个博客中,我们有以下图片

在此处输入图片说明

据我所知,BasicLSTMCell将展开t时间步长,t我的行数在哪里(如果我错了,请纠正我!)。例如,在下图中,LSTM 展开了t = 28时间步长。

在此处输入图片说明

在可乐的博客中,它写道

每条线携带一个完整的向量

那么,让我们看看我的[6,5]输入矩阵将如何通过这个基于 LSTM 的 RNN。

在此处输入图片说明

如果我的上图是正确的,那么究竟是什么num_units(我们在 LSTM 单元中定义的)?它是 LSTM 单元的参数吗?

如果num_unit是单个 LSTM 单元的参数,那么它应该是这样的:

在此处输入图片说明

在此处输入图片说明

如果上图是正确的,那么num_units下面的 LSTM 单元示意图中的那 5 个在哪里(根据 Colah 的博客)?

在此处输入图片说明


如果你能用数字给出你的答案,那将非常有帮助!您可以在此处编辑或创建新的白板图。

use*_*884 3

你的理解是非常正确的。然而,不幸的是,Tensorflow 术语和文献之间存在不一致。为了理解,您需要深入研究 Tensorflow 实现代码。

Tensorflow 宇宙中的单元在Colah 宇宙中称为 LSTM 层(即展开版本)。这就是为什么您总是在 Tensorflow 架构中定义单个单元,而不是层。例如,

cell=rnn.BasicLSTMCell(num_units=5,state_is_tuple=True)
Run Code Online (Sandbox Code Playgroud)

检查这里的代码。

https://github.com/tensorflow/tensorflow/blob/ef96faaf02be54b7eb5945244c881126a4d38761/tensorflow/python/ops/rnn_cell.py#L90

该包中单元格的定义与文献中使用的定义不同。在文献中,单元指的是具有单个标量输出的对象。该包中的定义是指此类单元的水平阵列。

因此,为了理解 Tensorflow 中的 num_units,最好想象一个展开的 LSTM,如下所示。

在此输入图像描述

在展开版本中,您有一个输入X_t,它是一个张量。当您指定形状的输入时

[batch_size,time_steps,n_input]

对于 Tensorflow,它知道从time_steps参数中展开它多少次。

因此,如果您在 TensorFlow 中将X_t作为一维数组,那么在 Colahs 展开版本中,每个 LSTM 单元x_t都会变成标量值(请观察大写 X(向量/数组)和小写 x(标量) - 也在 Colah 的图中)

如果您在 Tensorflow 中将X_t作为 2D 数组,那么在 Colahs 展开版本中,每个 LSTM 单元x_t都会变成 1D 数组/向量(如您的情况所示),依此类推。

现在最重要的问题来了。

Tensorflow 如何知道输出/隐藏维度 ** Z_t/H_t 是多少

(请注意 H_t 和 Z_t 之间的区别 - 我通常更喜欢将它们分开,因为 H_t 返回输入(循环)而Z_t是输出 - 图中未显示)

它的尺寸与X_t相同吗?

,它可以是任何不同的形状。您需要将其指定给 Tensorflow。这就是num_units - 输出大小

在代码中检查这里:

https://github.com/tensorflow/tensorflow/blob/ef96faaf02be54b7eb5945244c881126a4d38761/tensorflow/python/ops/rnn_cell.py#L298-L300

    @property
    def output_size(self):
        return self._num_units
Run Code Online (Sandbox Code Playgroud)

Tensorflow 使用以下论文中 Colahs Universe 中定义的 LSTM 单元的实现:

https://arxiv.org/pdf/1409.2329.pdf