gpt4 book ai didi

recurrent-neural-network - 关于 RNN 中批量大小和时间步长的疑问

转载 作者:行者123 更新时间:2023-12-04 01:48:32 26 4
gpt4 key购买 nike

在 Tensorflow 的 RNN 教程中:https://www.tensorflow.org/tutorials/recurrent
.它提到了两个参数:批量大小和时间步长。我对这些概念感到困惑。在我看来,RNN 引入批处理是因为 to-train 序列可能很长,以至于反向传播无法计算那么长(爆炸/消失梯度)。所以我们将长的 to-train 序列分成更短的序列,每个序列都是一个 mini-batch,其大小称为“batch size”。我就在这里吗?

关于时间步长,RNN 仅由一个单元(LSTM 或 GRU 单元,或其他单元)组成,并且该单元是连续的。我们可以通过展开它来理解顺序概念。但是展开顺序单元是一个概念,不是真实的,这意味着我们不会以展开的方式实现它。假设要训练的序列是一个文本语料库。然后我们每次向 RNN 单元输入一个单词,然后更新权重。那么为什么我们在这里有时间步长呢?结合我对上面“批量大小”的理解,我更加困惑了。我们给单元格输入一个词还是多个词(批量大小)?

最佳答案

批次大小与每次更新网络权重时要考虑的训练样本量有关。因此,在前馈网络中,假设您想根据一次从一个单词计算梯度来更新网络权重,您的 batch_size = 1。
由于梯度是从单个样本计算的,因此在计算上非常便宜。另一方面,这也是非常不稳定的训练。

要了解在训练这种前馈网络期间会发生什么,
我会给你推荐这个very nice visual example of single_batch versus mini_batch to single_sample training .

但是,您想了解 num_steps 变量会发生什么。这与您的 batch_size 不同。您可能已经注意到,到目前为止,我已经提到了前馈网络。在前馈网络中,输出由网络输入确定,输入-输出关系由学习到的网络关系映射:

hidden_​​activations(t) = f(input(t))

输出(t) = g(hidden_​​activations(t)) = g(f(input(t)))

在大小为 batch_size 的训练过程之后,将计算您的损失函数相对于每个网络参数的梯度并更新您的权重。

然而,在循环神经网络 (RNN) 中,您的网络功能略有不同:

hidden_​​activations(t) = f(input(t), hidden_​​activations(t-1))

输出(t) = g(hidden_​​activations(t)) = g(f(input(t), hidden_​​activations(t-1)))

=g(f(input(t), f(input(t-1), hidden_​​activations(t-2)))) = g(f(inp(t), f(inp(t-1), ... , f(inp(t=0), hidden_​​initial_state))))

正如您可能从命名意义上推测的那样,网络保留了其先前状态的内存,并且神经元激活现在也依赖于先前的网络状态,进而依赖于网络曾经发现自己所处的所有状态。大多数 RNN使用健忘因子以更加重视最近的网络状态,但这不是您问题的重点。

然后,正如您可能猜测的那样,如果您必须考虑自网络创建以来所有状态的反向传播,计算损失函数相对于网络参数的梯度在计算上非常非常昂贵,有一个巧妙的小技巧加快计算速度:使用历史网络状态 num_steps 的子集来近似梯度。

如果这个概念讨论还不够清楚,你也可以看看 more mathematical description of the above .

关于recurrent-neural-network - 关于 RNN 中批量大小和时间步长的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44381450/

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