В theano, при дадена партидна цена cost
с форма (batch_size,), е лесно да се изчисли градиентът на средната цена, както в 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