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