在Tensorflow的RNN教程中:https://www.tensorflow.org/tutorials/recurrent。它提到了两个参数:批量大小和时间步长。我被这些概念搞糊涂了。在我看来,RNN引入批处理是因为训练序列可能很长,以至于反向传播无法计算那么长的(爆炸/消失梯度)。因此,我们将长的待训练序列划分为较短的序列,每个序列都是一个小批量,其大小称为“批大小”。我说对了吗?
关于时间步长,RNN仅由一个单元(LSTM或GRU单元,或其他单元)组成,并且该单元是连续的。我们可以通过展开序列概念来理解它。但是展开一个连续的单元格是一个概念,而不是真实的,这意味着我们不会以展开的方式实现它。假设待训练序列是一个文本语料库。然后,我们每次向RNN单元提供一个单词,然后更新权重。那么为什么我们这里有时间步长呢?结合我对上述“批处理大小”的理解,我更加困惑。我们给单元格输入一个字还是多个字(批量大小)?
发布于 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。
发布于 2018-01-12 04:49:37
我找到了这个图表,它帮助我可视化了数据结构。

在图像中,“批处理大小”是您想要为该批处理训练RNN的序列的示例数量。“'Values per timestep”是你的输入。(在我的例子中,我的RNN接受6个输入),最后,你的时间步长就是你正在训练的序列的‘长度’
我还在学习递归神经网络,以及如何为我的一个项目准备批处理(我偶然发现了这个试图弄清楚它的帖子)。
前馈和递归网络的批处理略有不同,当查看不同的论坛时,两者的术语都会被抛来抛去,并且变得非常混乱,所以可视化它是非常有帮助的。
希望这能有所帮助。
发布于 2018-03-22 11:19:18
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
https://stackoverflow.com/questions/44381450
复制相似问题