В anano, учитывая стоимость партии cost
с формой (batch_size,), легко вычислить градиент средней стоимости, как в T.grad(T.mean(cost,axis=0),p)
, где p является параметром, используемым при вычислении cost
. Это эффективно выполняется путем обратного распространения градиента через вычислительный граф. Теперь я хотел бы вычислить среднее значение квадратов градиентов над партией. Это можно сделать, используя следующий фрагмент кода:Theano - Среднее значение квадратов градиентов
import theano.tensor as T
g_square = T.mean(theano.scan(lambda i:T.grad(cost[i],p)**2,sequences=T.arange(cost.shape[0]))[0],axis=0)
Где для удобства p
предполагается один тензор Theano, а не список тензоров. Вычисление может быть эффективно выполнено путем простого возврата градиента до последнего шага и возведения в квадрат компонентов последней операции (которая должна быть суммой по индексу партии). Возможно, я ошибаюсь в этом, но вычисление должно быть таким же простым и почти таким же быстрым, как простое обратное распространение. Тем не менее, theanano, похоже, не в состоянии оптимизировать вычисление, и он продолжает использовать цикл, делая вычисления чрезвычайно медленными.
Может кто-нибудь знать о решении сделать вычисления эффективными либо путем форсирования оптимизаций, выражая вычисления по-другому, либо даже проходя через процесс backpropagation?
Заранее спасибо.
мы знаем 'batch_size' заранее (до вызовов функций)? – dontloo
@dontloo Действительно, 'batch_size' доступен перед вызовами функций. –