gpt4 book ai didi

tensorflow - dynamic_rnn 中的swap_memory 允许准无限序列吗?

转载 作者:行者123 更新时间:2023-12-04 15:07:55 25 4
gpt4 key购买 nike

我试图在长字符序列中标记字母。数据的固有结构要求我使用双向方法。

此外基于on this idea我需要在每个时间步访问隐藏状态,而不仅仅是最后一个。

为了尝试这个想法,我使用了固定长度的方法。我目前在更长的序列中使用一批随机的片段,每个片段都是 60 个字符,并使用 zero_state 运行我手工制作的双向分类器。正在initial_state每 60 个字母。

这工作得很好,但显然并不完美,因为实际上序列更长,并且我从原始来源随机剪切的片段的左右信息丢失了。

现在为了推进,我想处理整个序列。但它们的长度差异很大,我无法将整个序列(进一步批处理)放入 GPU。

我在 dynamic_rnn documentation 中找到了 swap_memory - 参数.那会有帮助吗?

我没有找到任何有助于我理解的进一步文档。而且我自己真的不能轻易尝试这个,因为我需要在每个时间步访问隐藏状态,因此我在不使用任何更高级别的包装器(例如 dynamic_rnn)的情况下对当前图进行了编码。尝试这个需要我从包装器中获取所有中间状态,据我所知,这是很多工作要做。

在经历尝试这个的麻烦之前,我很想确定这确实能解决我的内存问题。谢谢你的任何提示!

最佳答案

TL;博士: swap_memory不会让您使用伪无限序列,但它会帮助您在内存中容纳更大(更长、更宽或更大批量)的序列。伪无限序列有一个单独的技巧,但它仅适用于单向 RNN。

交换内存

在训练过程中,NN(包括 RNN)通常需要在内存中保存一些激活——它们需要用于计算梯度。

什么 swap_memory确实是它告诉您的 RNN 将它们存储在主机 (CPU) 内存而不是设备 (GPU) 内存中,并在需要它们时将它们流回 GPU。

实际上,这可以让您假装您的 GPU 拥有比实际更多的内存(以 CPU 内存为代价,而 CPU 内存往往更充足)

您仍然需要支付计算使用非常长的序列的成本。更不用说您可能会耗尽主机内存。

要使用它,只需为该参数指定值 True .

序列长度

如果您的序列长度不同,请使用此参数。 sequence_length有一个误导性的名字——它实际上是一个序列长度的数组 s .

如果所有序列的长度相同(max_time 参数),您仍然需要尽可能多的内存

tf.nn.bidirectional_dynamic_rnn

TF 包括双向 RNN 的现成实现,因此使用它而不是自己的可能更容易。

有状态的 RNN

训练时处理很长的序列单向 RNN,人们做 别的 : 他们保存了 最后 每个批次的隐藏状态,并将它们用作 初始 下一批的隐藏状态(为此,下一批必须由前一批序列的延续组成)

这些线程讨论了如何在 TF 中完成此操作:

TensorFlow: Remember LSTM state for next batch (stateful LSTM)

How do I set TensorFlow RNN state when state_is_tuple=True?

关于tensorflow - dynamic_rnn 中的swap_memory 允许准无限序列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44049192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com