Как объединить градиенты в Theano?

Я впервые использую Theano для построения большой статистической модели. Я выполняю своего рода стохастический градиентный спуск, но для каждой выборки в мини-пакете мне нужно выполнить процедуру выборки для вычисления градиента. Есть ли в Theano способ объединить градиенты, пока я выполняю процедуру выборки для каждой точки данных в мини-пакете, и только после этого выполнять обновление градиента?


person yep    schedule 18.01.2015    source источник


Ответы (1)


Я не понимаю, что вы имеете в виду под словом "бассейн". Когда вы вычисляете градиент своей стоимости относительно некоторых переменных, стоимость должна быть скалярной. Таким образом, при использовании мини-пакетов вы должны комбинировать отдельные затраты для примеров в мини-пакете. Это можно сделать суммой, средним значением, взвешенной суммой... И затем эта стоимость распространяется обратно. Градиент этой стоимости по параметрам будет соответствовать (математически) сумме/среднему/взвешенной сумме отдельных градиентов (в каждом из примеров), но это не так, как он вычисляется. Градиент этой стоимости по отношению к промежуточным переменным, которые являются функцией входных данных (скрытых представлений и т. д.), будет иметь тот же формат, что и исходный мини-пакет, с градиентом по каждому из мини-пакетов в другой строке.

Итак, возможно, вам нужно выразить конечную стоимость в результате процедуры выборки, а затем применить обратное распространение градиента этой стоимости. Или, может быть, вы не хотите полностью распространять обратно градиент истинной стоимости, а вместо этого распространять обратно то, что зависит от градиента. В этом случае вы можете сделать что-то вроде:

# 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, а затем завершить обратное распространение к параметрам.

person Pascal Lamblin    schedule 21.01.2015