2017-08-06 1 views
1

Das Tutorial auf MNIST für ML Anfänger, in Implementing the Regression, zeigt, wie die Regression auf einer einzigen Zeile zu machen, eine Erklärung folgte, die die Verwendung eines Trick erwähnt (Hervorhebung von mir):Was bedeutet das MIST Tensorflow-Tutorial mit Matmul-Trick?

y = tf.nn.softmax(tf.matmul(x, W) + b) 

Erste multiplizieren wir x mit W mit dem Ausdruck tf.matmul(x, W). Dies wird umgedreht, wenn wir sie in unserer Gleichung multiplizieren, wobei wir Wx als einen kleinen Trick hatten, um damit umzugehen, dass x ein 2D-Tensor mit mehreren Eingängen ist.

Was ist der Trick hier, und warum verwenden wir ihn?

+0

Können Sie mehr Kontext bereitstellen? Woher hast du das zitiert? –

+0

[link] (https://www.tensorflow.org/get_started/mnist/beginners) unter "Umsetzung der Regression". – ddgg007

Antwort

1

Nun, hier gibt es keinen Trick. Diese Linie weist grundsätzlich eine vorherige Gleichung Multiplikation um

# Here the order of W and x, this equation for single example 
y = Wx +b 
# if you want to use batch of examples you need the change the order of multiplication; instead of using another transpose op 
y = xW +b 
# hence 
y = tf.matmul(x, W) 
+0

Entschuldigung, ich bin wirklich neu, aber können Sie erklären, warum die Reihenfolge umgekehrt werden muss, wenn Sie eine Reihe von Beispielen verwenden? Oder zeigen Sie mir, wo ich mehr lernen kann? – ddgg007

1

Ok, ich glaube, der wichtigste Punkt, dass, wenn Sie in den Reihen (dh Zug mit mehreren Instanzen des Trainingssatzes auf einmal) zu trainieren, TensorFlow geht immer davon aus, dass die Die nullte Dimension x gibt die Anzahl der Ereignisse pro Batch an.

Angenommen, Sie möchten eine Trainingsinstanz der Dimension M einer Zielinstanz der Dimension N zuordnen. Sie würden dies normalerweise tun, indem Sie x (einen Spaltenvektor) mit einer NxM-Matrix multiplizieren (und optional eine Verzerrung mit Dimension hinzufügen) N (auch ein Spaltenvektor)), dh

y = W * x + b, wobei y auch ein Spaltenvektor ist.

Das ist aus der Perspektive der linearen Algebra vollkommen in Ordnung. Aber jetzt kommt der Punkt mit dem Training in Chargen, d. H. Training mit mehreren Trainingsinstanzen auf einmal. Um dies zu verstehen, kann es hilfreich sein, x (und y) nicht als Vektoren der Dimension M (und N), sondern als Matrizen mit den Dimensionen Mx1 (und Nx1 für y) zu betrachten. Da TensorFlow davon ausgeht, dass die verschiedenen Trainingsinstanzen, die einen Stapel bilden, entlang der nullten Dimension ausgerichtet sind, geraten wir hier in Schwierigkeiten, da die nullte Dimension von den verschiedenen Elementen einer einzelnen Instanz eingenommen wird. Der Trick ist dann die obige Gleichung zu transponieren (zur Erinnerung, dass die Umsetzung eines Produkts schaltet auch die Reihenfolge der beiden transponierten-Objekte):

y^T = x^T * W^T + b^T

Das ist so ziemlich das, was kurz im Tutorial beschrieben wurde. Beachten Sie, dass y^T jetzt eine Matrix der Dimension 1xN (praktisch ein Zeilenvektor) ist, während x^T eine Matrix der Dimension 1xM (auch ein Zeilenvektor) ist. W^T ist eine Matrix der Dimension MxN. Im Tutorial haben sie nicht x^T oder y^T geschrieben, sondern einfach die Platzhalter nach dieser transponierten Gleichung definiert. Der einzige Punkt, der mir nicht klar ist, ist, warum sie b nicht den "transponierten Weg" definiert haben. Ich nehme an, dass der Operator + automatisch b transponiert, wenn es notwendig ist, um die richtigen Abmessungen zu erhalten.

Der Rest ist jetzt ziemlich einfach: Wenn Sie Stapel größer als 1 Instanz haben, "stapeln" Sie mehrere der x (1xM) Matrizen, sagen wir zu einer Matrix von Dimensionen (AxM) (wobei A die Losgröße ist)). b wird hoffentlich automatisch auf diese Anzahl von Ereignissen übertragen (das heißt auf eine Matrix der Dimension (AxN).Wenn man dann verwenden

y^T = x^T * W^T^T + b,

Sie wird eine (AXN) Matrix der Ziele für jedes Element des Stapels erhalten.