首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >怀疑RNN中的批次大小和时间步长

怀疑RNN中的批次大小和时间步长
EN

Stack Overflow用户
提问于 2017-06-06 12:32:19
回答 3查看 18.2K关注 0票数 16

在Tensorflow的RNN教程中:https://www.tensorflow.org/tutorials/recurrent。它提到了两个参数:批量大小和时间步长。我被这些概念搞糊涂了。在我看来,RNN引入批处理是因为训练序列可能很长,以至于反向传播无法计算那么长的(爆炸/消失梯度)。因此,我们将长的待训练序列划分为较短的序列,每个序列都是一个小批量,其大小称为“批大小”。我说对了吗?

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

EN

回答 3

Stack Overflow用户

发布于 2017-06-15 21:01:10

批量大小与一次更新网络权重时要考虑的训练样本量有关。因此,在前馈网络中,假设您希望通过一次从一个单词计算梯度来更新网络权重,您的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((T))

输入输出(T)= g(hidden_activations(t)) =g(f((T)

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

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

输入hidden_activations(T)=f((T),hidden_activations(t-1))

输入输出(T)= g(hidden_activations(t)) =g(f((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

票数 15
EN

Stack Overflow用户

发布于 2018-01-12 04:49:37

我找到了这个图表,它帮助我可视化了数据结构。

在图像中,“批处理大小”是您想要为该批处理训练RNN的序列的示例数量。“'Values per timestep”是你的输入。(在我的例子中,我的RNN接受6个输入),最后,你的时间步长就是你正在训练的序列的‘长度’

我还在学习递归神经网络,以及如何为我的一个项目准备批处理(我偶然发现了这个试图弄清楚它的帖子)。

前馈和递归网络的批处理略有不同,当查看不同的论坛时,两者的术语都会被抛来抛去,并且变得非常混乱,所以可视化它是非常有帮助的。

希望这能有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2018-03-22 11:19:18

  1. RNN的“批处理大小”是为了加速计算(因为在并行计算单元中有多个通道);它不是用于反向传播的小批处理。证明这一点的一种简单方法是使用不同的批处理大小值,使用batch size=4的RNN单元格可能比batch size=1快大约4倍,并且它们的损失通常非常接近。
  2. 关于RNN的“时间步长”,让我们看看rnn.py中的以下代码片段。static_rnn()一次调用每个input_的单元,BasicRNNCell::call()实现其转发部分逻辑。在文本预测的情况下,比如批量size=8,我们可以认为input_是来自大型文本语料库中不同句子的8个单词,而不是一个句子中的8个连续单词。在我的经验中,我们根据我们希望在“时间”或“顺序依赖”中建模的深度来决定时间步长的值。同样,要使用BasicRNNCell预测文本语料库中的下一个单词,小的时间步长可能会起作用。另一方面,较大的时间步长可能会遇到梯度爆炸问题。

def static_rnn(cell,inputs,initial_state=None,dtype=None,sequence_length=None,scope=None):“创建由RNNCell cell指定的递归神经网络。生成的最简单的RNN网络形式是: state = cell.zero_state(...)outputs = []输入中的状态: output,input_ = cell(input_,state) outputs.append( output ) return (outputs,state)“class BasicRNNCell(_LayerRNNCell):def call(self,inputs,state):”最基本的RNN: output= new_state = act(W * input +U* state + B)。""“gate_inputs = math_ops.matmul( array_ops.concat(inputs,state,1),self._kernel) gate_inputs = nn_ops.bias_add(gate_inputs,self._bias) output = self._activation(gate_inputs) return output,output

  • 要可视化这两个参数与数据集和权重的关系,Erik Hallström's post值得一读。从this diagram和上面的代码片段可以看出,RNN的“批量大小”不会影响权重(wa、wb和b),但“时间步长”会影响。因此,人们可以根据问题和网络模型以及基于计算平台和数据集的RNN的“批量大小”来确定RNN的“时间步长”。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44381450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档