In theano, gegeben eine Charge Kosten cost
mit Form (batch_size,), ist es leicht, den Gradienten der mittleren Kosten zu berechnen, wie in T.grad(T.mean(cost,axis=0),p)
mit p ist ein Parameter in der Berechnung von verwendet cost
. Dies wird effizient durch Rückpropagieren des Gradienten durch den Berechnungsgraphen erreicht. Was ich jetzt tun möchte, ist, den Mittelwert der quadratischen Gradienten über die Charge zu berechnen. Dies kann mit dem folgenden Stück Code erfolgen:Theano - Mittelwert der quadrierten Gradienten
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)
Wo der Einfachheit halber p
wird angenommen, dass ein einzelner Theanos Tensor und nicht eine Liste von Tensoren sein. Die Berechnung konnte effizient durchgeführt werden, indem einfach der Gradient bis zum letzten Schritt rückpropagiert und die Komponenten der letzten Operation (die eine Summe über dem Stapelindex sein sollte) quadriert wurden. Ich könnte mich hier irren, aber die Berechnung sollte so einfach und fast so schnell wie eine einfache Rückpropagation sein. Allerdings scheint das System nicht in der Lage zu sein, die Berechnung zu optimieren, und es verwendet weiterhin eine Schleife, wodurch die Berechnungen extrem langsam werden.
Wüsste jemand eine Lösung, um die Berechnung effizient zu machen, indem man entweder Optimierungen erzwingt, die Berechnung anders ausdrückt oder sogar den Backpropagation-Prozess durchläuft?
Vielen Dank im Voraus.
wissen wir 'batch_size' im Voraus (vor Funktionsaufrufen)? – dontloo
@dontloo Tatsächlich ist 'batch_size' vor Funktionsaufrufen verfügbar. –