tensorflow BasicLSTMCell中的num_units是什么?

时间:2016-06-18 19:51:05

标签: tensorflow lstm recurrent-neural-network

在MNIST LSTM示例中,我不明白“隐藏层”的含义。是否随着时间的推移代表展开的RNN时会形成虚构层?

为什么大多数情况下num_units = 128

我知道我应该详细阅读colah的博客以了解这一点,但在此之前,我只是想让一些代码使用我的样本时间序列数据。

11 个答案:

答案 0 :(得分:34)

隐藏单元的数量直接表示神经网络的学习能力 - 它反映了学习参数的数量。值128可能是任意选择或凭经验选择的。您可以通过实验更改该值并重新运行程序以查看它如何影响训练准确性(您可以通过很多更少的隐藏单位获得优于90%的测试准确度)。使用更多单位使得更有可能完全记住完整的训练集(虽然它需要更长时间,并且你有过度拟合的风险)。

要理解的关键是,在着名的Colah's blog post(找到"每一行都带有一个完整的向量" )中有点微妙,是 X是数据的数组 (现在通常称为tensor) - 它不是标量值。例如,在显示tanh函数的情况下,它意味着暗示函数在整个数组中是广播(隐式for循环) - 而不是每次只执行一次。

因此,隐藏单元表示网络中的有形存储,主要表现在权重数组的大小。而且因为LSTM实际上确实有一些与学习模型参数分开的内部存储,所以它必须知道有多少单元 - 最终需要与权重的大小一致。在最简单的情况下,RNN没有内部存储 - 因此它甚至不需要预先知道有多少"隐藏单元"它被应用于。

  • 对类似问题here的一个很好的答案。
  • 您可以在TensorFlow中查看the source的BasicLSTMCell,看看具体使用方法。

旁注:This notation在统计和机器学习中很常见,其他领域使用通用公式处理大批量数据(3D图形是另一个例子)。对于那些希望明确写出for循环的人来说,需要一点时间习惯。

答案 1 :(得分:30)

来自this brilliant article

  

num_units可以解释为来自前馈神经网络的隐藏层的类比。前馈神经网络隐藏层中的节点数等于LSTM单元中LSTM单元的num_units数。每一步网络。

在那里也可以看到image

enter image description here

答案 2 :(得分:25)

n_hidden的参数BasicLSTMCell是LSTM的隐藏单位数。

正如你所说,你应该真正阅读Colah的blog post来理解LSTM,但这里有点抬头。

如果您有x形状[T, 10]的输入,则会向LSTM提供从t=0t=T-1的值序列,每个值都为{{1} }}

在每个时间步,您将输入与形状10的矩阵相乘,并得到[10, n_hidden]向量。

您的LSTM会在每个时间步n_hidden获得

  • 以前隐藏状态t,大小为h_{t-1}n_hidden,之前状态为t=0
  • 输入,转换为尺寸[0., 0., ...]
  • 它会求和这些输入并产生大小为n_hidden的下一个隐藏状态h_t

来自Colah的博文: LSTM

如果您只想让代码正常工作,请与n_hidden保持一致,您就可以了。

答案 3 :(得分:7)

LSTM在传播时间内保留两条信息:

hidden州;这是LSTM通过时间使用(forget, input, and output)门累积的内存,以及 上一个时间步输出。

Tensorflow的num_units是LSTM隐藏状态的大小(如果不使用投影,也是输出的大小)。

要使名称num_units更直观,您可以将其视为LSTM单元格中隐藏单元的数量,或单元格中的内存单元数。

查看this精彩帖子以获得更清晰

答案 4 :(得分:5)

我认为TF用户使用术语“num_hidden”会让人感到困惑。实际上它与展开的LSTM细胞无关,它只是张量的维度,它从时间步输入张量转换为LSTM细胞并进入LSTM细胞。

答案 5 :(得分:3)

该术语num_unitsnum_hidden_units有时在实现中使用变量名nhid来表示,这意味着LSTM单元的输入是维度nhid的向量(或对于批处理实施,它将是形状为batch_size x nhid的矩阵。结果,由于RNN / LSTM / GRU单元不会改变输入向量或矩阵的维度,因此LSTM单元的输出也将具有相同的维度。

如前所述,该术语是从前馈神经网络(FFN)文献中借用的,在RNN的上下文中使用时引起混淆。但是,这个想法是在每个时间步甚至RNN都可以作为FFN 查看 。在此视图中,隐藏层实际上将包含num_hidden单元,如下图所示:

rnn-hidden-units

来源:Understanding LSTM


更具体地说,在下面的示例中,num_hidden_unitsnhid将为 3 ,因为隐藏状态的大小(中间层)为 3D向量

enter image description here

答案 6 :(得分:3)

由于我在合并来自不同来源的信息时遇到了一些问题,因此我在下面创建了图形,该图形显示了博客文章(http://colah.github.io/posts/2015-08-Understanding-LSTMs/和(https://jasdeep06.github.io/posts/Understanding-LSTM-in-Tensorflow-MNIST/)的组合,我认为图形是非常有帮助,但在解释number_units时出错。

多个LSTM单元形成一个LSTM层。如下图所示。由于您主要处理的是非常广泛的数据,因此不可能将所有内容都整合到模型中。因此,数据被分成小批,然后依次处理,直到读入包含最后一部分的批。在图的下部,您可以看到输入(深灰色),在该输入中读取了批从批次1到批次batch_size的一个接一个。上面的LSTM单元1到LSTM单元time_step的单元代表了LSTM模型(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)中描述的单元。像元数等于固定时间步数。例如,如果您使用总共150个字符的文本序列,则可以将其分为3(batch_size),并且每批的长度为50(time_steps的数目,因此是LSTM单元的数目)。如果然后对每个字符进行一次编码,则每个元素(输入的深灰色框)将代表一个向量,该向量具有词汇表的长度(特征数量)。这些向量将流入各自细胞中的神经元网络(细胞中的绿色元素),并将其尺寸更改为隐藏单元数( number_units )的长度。因此,输入具有维度(batch_size x time_step x功能)。长时记忆(单元状态)和短时记忆(隐藏状态)具有相同的尺寸(batch_size x number_units )。由细胞产生的浅灰色块具有不同的维度,因为神经网络(绿色元素)中的转换是借助隐藏单位(batch_size x time_step x number_units )进行的。可以从任何单元返回输出,但是大多数情况下,只有最后一个块(黑色边框)中的信息才是相关的(并非在所有问题中都是如此),因为它包含了先前时间步中的所有信息。

LSTM architecture_new

答案 7 :(得分:2)

我认为这是您问题的正确答案。 LSTM总是让人困惑。

您可以参考此博客以获取更多详细信息Animated RNN, LSTM and GRU enter image description here

答案 8 :(得分:0)

大多数LSTM / RNN图仅显示隐藏的单元格,而不显示那些单元的单位。因此,混乱。 每个隐藏层都有隐藏的单元格,与时间步长一样多。 而且,每个隐藏单元格都由多个隐藏单元组成,如下图所示。因此,RNN中隐藏层矩阵的维数为(时间步数,隐藏单位数)。

enter image description here

答案 9 :(得分:0)

此图像https://imgur.com/Fjx4Zuo中说明了隐藏单元的概念。

答案 10 :(得分:0)

在回答@SangLe之后,我制作了一张图片(请参阅原始图片来源),显示了教程中经典表示的单元格(Source1: Colah's Blog)和一个具有2个单位的等效单元格(Source2: Raimi Karim 's post)。希望它能澄清单元/单元与真正的网络体系结构之间的混淆。

enter image description here

相关问题