我以为我知道RNNs 是如何工作的,但是,当我尝试自己实际实现它时,我遇到了一些问题。一方面,我们如何处理初始隐藏状态?
一开始,我们只是创建一个具有一定长度的零向量,然后用于创建下一个隐藏状态,并一直持续到我们遍历所有时间步长。现在这是一次迭代,下一次迭代会发生什么?
当我们得到新的输入时,我们是否仍然应该向网络提供相同的零向量?这似乎不对!因为在反向传播阶段,我们似乎没有更新 h0!我在这里很困惑。
如果我们总是提供相同的零向量,它只会使我们之前对所有隐藏状态所做的所有更新无效!那么初始状态需要做什么呢?
RNN 层中的初始隐藏状态会发生什么?
机器算法验证
神经网络
深度学习
循环神经网络
2022-03-26 18:46:39
1个回答
有两种常见的 RNN 策略。
你有一个总是连续的长序列(例如,一个在War and Peace文本上训练的语言模型);因为小说的词都有一个非常特定的顺序,你必须在连续序列上训练它,所以将前一个序列最后一个隐藏状态的隐藏状态作为下一个序列的初始隐藏状态。
大多数人这样做的方式是您必须按顺序遍历序列,而不是随机播放。假设您使用 2 的 mini-batch 大小。您可以将书切成两半,第一个样本将始终包含《战争与和平》前半部分的文本,而第二个样本将始终包含后半部分的文本。不是随机使用样本,而是总是按顺序读取文本,所以第一个 mini-batch 中的第一个样本有文本的第一个词,第一个 mini-batch 中的第二个样本有 mid 之后的第一个词- 文本的点。
纯粹抽象地说,我想你可以做一些更复杂的事情,你可以打乱数据,但可以计算序列中每个位置的初始隐藏状态(例如,通过计算直到那个点的文本,或者保存和恢复状态)但这听起来昂贵的。
你有很多不同的序列(比如离散的推文);以全 0 的隐藏状态开始每个序列是有意义的。有些人更喜欢训练“基线”初始状态(user0 的建议)。如果您的数据有很多短序列,我读过一篇文章提倡这样做,但我现在找不到这篇文章。
哪种策略合适取决于问题,以及关于如何表示该问题的具体选择。
从开发软件的角度来看,理想的实现会以某种方式向用户公开这两个选项的功能。这可能很棘手,不同的软件(pytorch、tensorflow、keras)以不同的方式实现这一点。
其它你可能感兴趣的问题