我第一次使用Theano来构建一个大型统计模型。我正在进行一种随机梯度下降,但对于迷你舱中的每个样本,我需要执行一个采样程序来计算梯度。当我在一个小批量中对每个数据点执行采样过程时,是否有一种方法可以在Theano中汇集渐变,然后才执行渐变更新?
答案 0 :(得分:1)
我不明白你的意思" pool"。 当您计算某些变量的成本梯度时,成本必须是标量。因此,在使用小批量时,您必须将小批量中示例的单个成本合并。这可以通过求和,平均值,加权和来完成......然后该成本被反向传播。 该成本wrt参数的梯度将(数学地)对应于各个梯度的和/均值/权重和(在每个示例上),但这不是它的计算方式。 该成本的梯度与作为输入函数的中间变量(隐藏表示等)将具有与原始小批量相同的格式,其中每个小批量的梯度位于不同的行中。
所以,也许您想要的是通过抽样程序来表达您的最终成本,然后反向传播该成本的梯度。 或者你可能不希望一直反向传播真实成本的梯度,而是反向传播取决于渐变的东西。 在这种情况下,您可以执行以下操作:
# minibatch of inputs
inputs = tt.matrix()
interm_result = f(input)
cost = g(interm_result).sum()
grad_wrt_interm_result = th.grad(cost, interm_result)
sampled_grad = sampling_procedure(grad_wrt_interm_result)
grad_wrt_params = th.grad(cost, params,
known_grads={inter_result: sampled_grad})
这样,您可以对interm_result执行一些反向传播,然后将inter_result的渐变更改为sampled_grad,然后完成对参数的反向传播。