Forward Pass in Neuronalen Netzen?

1 Antwort

Das ist eigentlich komplett arbiträr. Man könnte die Einträge in der Matrix auch einfach anders anordnen. Wichtig ist nur, was mit was verrechnet wird.

Aber die gegebene Schreibweise entspricht einer Konvention die denke ich folgenden Ursprung hat. Für zwei Spaltenvektoren (also vertikale) x, w (also ein einzelnes Perzeptron, mit seinen Gewichten im Vektor w und dem Input x):

x * w^T ist ein Skalarprodukt. Das ist was du willst, denn du willst ja w1 * x1 + w2 * x2 etc.

wenn du w jetzt zu mehreren Vektoren erweitern willst, um mehrere Skalarprodukte gleichzeitig zu berechnen (eines pro output Neuron / Perzeptron), machst du das natürlich in der Dimension die noch nicht verwendet wird. Bei Spaltenvektoren also in den Zeilen.

Du hast jetzt also pro Zeile die Gewichte für jeweils ein (output)-Perzeptron.

Matrix-Multiplikation ist aber Zeile * Spalte. Die Zeile ist dein (x1, x2), also muss deine Spalte w1, w2, w3, ... sein, welche aber durch vorherige Erweiterung in den Zeilen stehen. Du musst also für eine korrekte Rechnung transponieren.

x * W^T

Dieses Konzept, dass die Rechnungen gleich bleiben wenn man z.B. einen 1D-Vektor zu der 2D-Matrix oder einem 3D Tensor macht sieht man übrigens sehr häufig.

---

Eine andere Sichtweise: Du hast pro Layer pro Output-Neuron jeweils ein Gewicht. In der Reihenfolge legst du sozusagen die Dimensionen fest.

Layer: Wahl durch Wahl der Matrix
Output Neuron: Wahl durch erste Dimension (Bei Matrix ist das die Zeile)
Gewichte: Wahl durch zweite Dimension (Bei Matrix ist das die Spalte)

Wenn du auch über den gesamten Datensatz vektorisierst:

Layer: Wahl des Tensors, Sample: erste Dimension, Output Neuron: zweite Dimension, Zugehörige Gewichte: dritte Dimension