В теано, учитывая стоимость пакета cost
с формой (размер_пакета), легко вычислить градиент средней стоимости, как в случае T.grad(T.mean(cost,axis=0),p)
, где p является параметром, используемым при вычислении cost
. Это делается эффективно путем обратного распространения градиента по вычислительному графу. Что я хотел бы сейчас сделать, так это вычислить среднее значение квадратов градиентов по пакету. Это можно сделать с помощью следующего фрагмента кода:
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 не может оптимизировать вычисления и продолжает использовать цикл, что делает вычисления чрезвычайно медленными.
Кто-нибудь знает решение, позволяющее сделать вычисления более эффективными, либо путем принудительной оптимизации, выражая вычисления по-другому, либо даже используя процесс обратного распространения?
Заранее спасибо.
batch_size
заранее (до вызова функции)? - person dontloo   schedule 24.03.2016batch_size
доступен до вызовов функций. - person c_tallec   schedule 25.03.2016