schlug ich vor kurzem einige Leistungsengpässe mit symbolischen Matrixderivaten in Sympy (genauer gesagt, das einzelne Codezeile symbolischen Matrices durch Substitution Auswerten Lambdas Verwendung wurde unter ~ 90% der Programmlaufzeit), so Ich beschloss, Theano auszuprobieren.Theano partielle Ableitung über Element in symbolischer Vektor
Ihre frühere Anwendung war die Bewertung der partiellen Ableitungen über die Hyperparameter eines Gaußschen Prozesses, wobei die Verwendung einer (1, k) Dimensionsmatrix von Sympy-Symbolen (MatrixSymbol) im Hinblick auf das Iterieren über diese Liste und Differenzieren der Matrix gut funktionierte jeder Gegenstand.
Dies ist jedoch nicht trägt in Theano über, und die Dokumentation scheint nicht zu detailliert, wie dies zu tun. Das Indizieren eines symbolischen Vektors in Theano gibt den Subtensor-Typ zurück, der für die Berechnung des Gradienten auf ungültig ist.
Im Folgenden ist eine einfache (aber völlig algorithmisch falsch - auf die Funktionalität abgespeckte ich versuche zu erhalten) Version von dem, was ich zu tun habe versucht.
BEARBEITEN: Ich habe das Codebeispiel so modifiziert, dass die Daten als Tensor in die Funktion übernommen werden, wie unten vorgeschlagen, und es wurde ein alternativer Versuch unternommen, stattdessen eine Liste separater Skalartensoren zu verwenden, da ich die Werte nicht indexieren kann ein symbolischer Theano-Vektor, wenn auch auch ohne Erfolg.
import theano
import numpy as np
# Sample data
data = np.array(10*np.random.rand(5, 3), dtype='int64')
# Not including data as tensor, incorrect/invalid indexing of symbolic vector
l_scales_sym = theano.tensor.dvector('l_scales')
x = theano.tensor.dmatrix('x')
f = x/l_scales_sym
f_eval = theano.function([x, l_scales_sym], f)
df_dl = theano.gradient.jacobian(f.flatten(), l_scales_sym[0])
df_dl_eval = theano.function([x, l_scales_sym], df_dl)
Die zweite letzte Zeile des Codeausschnittes ist, wo ich in der Liste der ‚Längenskala‘ Variablen, aber diese Art der Indizierung ist nicht anwendbar auf den symbolischen eine partielle Ableitung über eines der Elemente zu bekommen versuchen Vektoren.
Jede Hilfe würde sehr geschätzt werden!
Dank @Mehdi. Vermutlich vermisse ich immer noch große Stücke Wissen darüber, wie Theano arbeitet (daran zu arbeiten), aber würde das bedeuten, dass jedes Mal, wenn Berechnungen gemacht werden, ich meinen Datensatz ersetzen muss? Ich kann nicht nachvollziehen, wie Theano seine Daten speichert und bearbeitet. Vielleicht ist der Overhead, der dazu benötigt wird, durch den allgemeinen Leistungsschub im Vergleich zur Verwendung von Sympy-Matrizen bei weitem übertroffen. – mediantis
Der allgemeine Prozess ist oft wie folgt: Definieren Sie Variablen (alle symbolischen Variablen, die Sie verwenden möchten, sollten die Tensoren sein, auch wenn Sie einen Skalar verwenden.) Als nächstes definieren Sie Ihre Funktion so wie Sie es mit allen mathematischen Operationen und theano getan haben Funktionen wie "grad". Als nächstes benutzen Sie 'theano.function ([input list], output) ', um Ihre definierte Funktion zu kompilieren. Dann wird es wie eine Python-Standardfunktion, die Sie mit numper Array-Eingaben aufrufen können. zu sehen kann auch gut sein: [Tutorial] (http://deeplearning.net/software/theano/tutorial/gradients.html) – Mehdi
Meine größte Hürde, die nicht in allen Beispielen in der Dokumentation zu zeigen scheint, oder in der Tat alles, was ich über verschiedene Foren/etc gefunden habe. Online macht partielle Ableitungen über jede Dimension einer ursprünglichen Matrix von Daten - ich habe einige der von Ihnen vorgeschlagenen Änderungen und einen zweiten Versuch, dies im obigen Codefragment zu tun, reflektiert. – mediantis