der*_*rek 10 recurrent-neural-network
在Tensorflow的RNN教程中:https://www.tensorflow.org/tutorials/recurrent .它提到了两个参数:批量大小和时间步长.我对这些概念感到困惑.在我看来,RNN引入批次是因为列车序列可能非常长,使得反向传播不能计算那么长(爆炸/消失的梯度).因此,我们将长列车序列划分为较短的序列,每个序列都是一个小批量,其大小称为"批量大小".我在这儿吗?
关于时间步长,RNN仅由细胞(LSTM或GRU细胞或其他细胞)组成,并且该细胞是连续的.我们可以通过展开来理解顺序概念.但是展开顺序单元是一个概念,而不是真实的,这意味着我们不会以展开的方式实现它.假设列车序列是文本语料库.然后我们每次向RNN小区提供一个单词,然后更新权重.那么为什么我们在这里有时间步骤呢?结合我对上述"批量大小"的理解,我更加困惑.我们是用单词还是多个单词(批量大小)来提供单元格?
Uva*_*var 12
批量大小与一次更新网络权重时要考虑的训练样本数量有关.因此,在前馈网络中,假设您希望基于一次从一个单词计算渐变来更新网络权重,batch_size = 1.由于渐变是从单个样本计算的,因此计算上非常便宜.另一方面,它也是非常不稳定的训练.
为了理解这种前馈网络培训过程中发生的事情,我将向您介绍single_batch与mini_batch到single_sample培训的非常好的可视化示例.
但是,您想了解num_steps变量会发生什么.这与您的batch_size不同.您可能已经注意到,到目前为止,我已经提到了前馈网络.在前馈网络中,输出由网络输入确定,输入 - 输出关系由学习的网络关系映射:
hidden_activations(t)= f(输入(t))
output(t)= g(hidden_activations(t))= g(f(input(t)))
在大小batch_size的训练传递之后,计算关于每个网络参数的损失函数的梯度并更新您的权重.
然而,在递归神经网络(RNN)中,您的网络运行方式有点不同:
hidden_activations(t)= f(input(t),hidden_activations(t-1))
output(t)= g(hidden_activations(t))= g(f(input(t),hidden_activations(t-1)))
= g(f(输入(t),f(输入(t-1),hidden_activations(t-2))))= g(f(inp(t),f(inp(t-1),... ,f(inp(t = 0),hidden_initial_state))))
正如您可能从命名意义上推测的那样,网络保留了其先前状态的记忆,并且神经元激活现在也依赖于先前的网络状态,并且依赖于网络所发现的所有状态.大多数RNN使用健忘因素,以便更加重视最近的网络状态,但这是你的问题的重点.
然后,正如你可能推测的那样,如果你必须考虑自网络创建以来所有状态的反向传播,计算损失函数相对于网络参数的梯度在计算上是非常非常昂贵的,那么有一个巧妙的小技巧加速计算:使用历史网络状态num_steps的子集来近似渐变.
如果这个概念性讨论不够清楚,您还可以看一下上面的更多数学描述.
小智 7
我找到了这张图,它帮助我可视化了数据结构。

从图像中,“批量大小”是您要为该批次训练 RNN 的序列示例的数量。“每个时间步的值”是您的输入。(就我而言,我的 RNN 需要 6 个输入)最后,您的时间步长是您正在训练的序列的“长度”
我也在学习循环神经网络以及如何为我的一个项目准备批次(并偶然发现了这个试图弄清楚的线程)。
前馈网络和循环网络的批处理略有不同,当查看不同的论坛时,两者的术语都会被抛来抛去并且变得非常混乱,因此将其可视化非常有帮助。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
10742 次 |
| 最近记录: |