Perzeptron-Schichten
Perzeptron ist die Bezeichnung für das einfachste neuronale Netzwerk, das nur aus einem Neuron besteht. Um jedoch komplexere Probleme lösen zu können, erstellen wir ein Modell namens Mehrschicht-Perzeptron (MLP). Ein Mehrschicht-Perzeptron besteht aus einer oder mehreren versteckten Schichten. Die Struktur eines Mehrschicht-Perzeptrons sieht folgendermaßen aus:
- Eine Eingabeschicht: Sie empfängt die Eingabedaten;
- Versteckte Schichten: Diese Schichten verarbeiten die Daten und extrahieren Muster.
- Ausgabeschicht: Liefert die endgültige Vorhersage oder Klassifikation.
Im Allgemeinen besteht jede Schicht aus mehreren Neuronen, und die Ausgabe einer Schicht wird zum Eingang der nächsten Schicht.
Schicht-Gewichte und Biases
Bevor eine Schicht implementiert wird, ist es wichtig zu verstehen, wie die Gewichte und Biases jedes Neurons darin gespeichert werden. Im vorherigen Kapitel wurde gezeigt, wie die Gewichte eines einzelnen Neurons als Vektor und dessen Bias als Skalar (Einzelwert) gespeichert werden können.
Da eine Schicht aus mehreren Neuronen besteht, ist es naheliegend, die Gewichte als Matrix darzustellen, wobei jede Zeile den Gewichten eines bestimmten Neurons entspricht. Die Biases können entsprechend als Vektor dargestellt werden, dessen Länge der Anzahl der Neuronen entspricht.
Gegeben sei eine Schicht mit 3 Eingaben und 2 Neuronen, so werden die Gewichte in einer 2×3 Matrix W und die Biases in einem 2×1 Vektor b gespeichert, die wie folgt aussehen:
W=[W11W21W12W22W13W23]b=[b1b2]Hierbei steht das Element Wij für das Gewicht des j-ten Eingangs zum i-ten Neuron, sodass die erste Zeile die Gewichte des ersten Neurons und die zweite Zeile die Gewichte des zweiten Neurons enthält. Das Element bi steht für den Bias des i-ten Neurons (zwei Neuronen – zwei Biases).
Vorwärtspropagation
Die Durchführung der Vorwärtspropagation für jede Schicht bedeutet, dass jede ihrer Neuronen aktiviert wird, indem die gewichtete Summe der Eingaben berechnet, der Bias addiert und die Aktivierungsfunktion angewendet wird.
Zuvor wurde für ein einzelnes Neuron die gewichtete Summe der Eingaben berechnet, indem das Skalarprodukt zwischen dem Eingabevektor und dem Gewichtungsvektor gebildet und der Bias addiert wurde.
Da jede Zeile der Gewichtungsmatrix den Gewichtungsvektor für ein bestimmtes Neuron enthält, muss nun lediglich ein Skalarprodukt zwischen jeder Zeile der Matrix und dem Eingabevektor durchgeführt werden. Glücklicherweise entspricht dies genau der Matrixmultiplikation:
Um die Bias-Werte zu den Ausgaben der jeweiligen Neuronen hinzuzufügen, sollte ebenfalls ein Bias-Vektor addiert werden:
Abschließend wird die Aktivierungsfunktion auf das Ergebnis angewendet — Sigmoid oder ReLU in unserem Fall. Die resultierende Formel für die Vorwärtspropagation in der Schicht lautet:
a=activation(Wx+b)wobei a der Vektor der Neuronenaktivierungen (Ausgaben) ist.
Layer-Klasse
Die grundlegenden Bausteine des Perzeptrons sind seine Schichten (Layers), daher ist es sinnvoll, eine eigene Layer
-Klasse zu erstellen. Zu ihren Attributen gehören:
inputs
: ein Vektor von Eingaben (n_inputs
ist die Anzahl der Eingaben);outputs
: ein Vektor von Roh-Ausgabewerten (vor Anwendung der Aktivierungsfunktion) der Neuronen (n_neurons
ist die Anzahl der Neuronen);weights
: eine Gewichtsmatrix;biases
: ein Bias-Vektor;activation_function
: die in der Schicht verwendete Aktivierungsfunktion.
Wie bei der Implementierung eines einzelnen Neurons werden weights
und biases
mit zufälligen Werten zwischen -1 und 1 aus einer gleichverteilten Zufallsverteilung initialisiert.
class Layer:
def __init__(self, n_inputs, n_neurons, activation_function):
self.inputs = np.zeros((n_inputs, 1))
self.outputs = np.zeros((n_neurons, 1))
self.weights = ...
self.biases = ...
self.activation = activation_function
Die Attribute inputs
und outputs
werden später beim Backpropagation-Verfahren verwendet, daher ist es sinnvoll, sie als mit Nullen gefüllte NumPy-Arrays zu initialisieren.
Die Initialisierung von inputs
und outputs
als mit Nullen gefüllte NumPy-Arrays verhindert Fehler bei Berechnungen während der Vorwärts- und Rückwärtspropagation. Sie gewährleistet außerdem Konsistenz zwischen den Schichten und ermöglicht reibungslose Matrixoperationen, ohne dass zusätzliche Prüfungen erforderlich sind.
Vorwärtspropagation kann in der Methode forward()
implementiert werden, wobei die outputs
auf Basis des inputs
-Vektors mit NumPy gemäß der obigen Formel berechnet werden:
def forward(self, inputs):
self.inputs = np.array(inputs).reshape(-1, 1)
# Raw outputs
self.outputs = ...
# Applying the activation function
return ...
Das Umformen von inputs
in einen Spaltenvektor gewährleistet eine korrekte Matrixmultiplikation mit der Gewichtsmatrix während der Vorwärtsausbreitung. Dies verhindert Formfehler und ermöglicht nahtlose Berechnungen über alle Schichten hinweg.
1. Was macht ein Multilayer-Perzeptron (MLP) leistungsfähiger als ein einfaches Perzeptron?
2. Warum wenden wir diesen Code an, bevor wir inputs
mit der Gewichtsmatrix multiplizieren?
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 4
Perzeptron-Schichten
Swipe um das Menü anzuzeigen
Perzeptron ist die Bezeichnung für das einfachste neuronale Netzwerk, das nur aus einem Neuron besteht. Um jedoch komplexere Probleme lösen zu können, erstellen wir ein Modell namens Mehrschicht-Perzeptron (MLP). Ein Mehrschicht-Perzeptron besteht aus einer oder mehreren versteckten Schichten. Die Struktur eines Mehrschicht-Perzeptrons sieht folgendermaßen aus:
- Eine Eingabeschicht: Sie empfängt die Eingabedaten;
- Versteckte Schichten: Diese Schichten verarbeiten die Daten und extrahieren Muster.
- Ausgabeschicht: Liefert die endgültige Vorhersage oder Klassifikation.
Im Allgemeinen besteht jede Schicht aus mehreren Neuronen, und die Ausgabe einer Schicht wird zum Eingang der nächsten Schicht.
Schicht-Gewichte und Biases
Bevor eine Schicht implementiert wird, ist es wichtig zu verstehen, wie die Gewichte und Biases jedes Neurons darin gespeichert werden. Im vorherigen Kapitel wurde gezeigt, wie die Gewichte eines einzelnen Neurons als Vektor und dessen Bias als Skalar (Einzelwert) gespeichert werden können.
Da eine Schicht aus mehreren Neuronen besteht, ist es naheliegend, die Gewichte als Matrix darzustellen, wobei jede Zeile den Gewichten eines bestimmten Neurons entspricht. Die Biases können entsprechend als Vektor dargestellt werden, dessen Länge der Anzahl der Neuronen entspricht.
Gegeben sei eine Schicht mit 3 Eingaben und 2 Neuronen, so werden die Gewichte in einer 2×3 Matrix W und die Biases in einem 2×1 Vektor b gespeichert, die wie folgt aussehen:
W=[W11W21W12W22W13W23]b=[b1b2]Hierbei steht das Element Wij für das Gewicht des j-ten Eingangs zum i-ten Neuron, sodass die erste Zeile die Gewichte des ersten Neurons und die zweite Zeile die Gewichte des zweiten Neurons enthält. Das Element bi steht für den Bias des i-ten Neurons (zwei Neuronen – zwei Biases).
Vorwärtspropagation
Die Durchführung der Vorwärtspropagation für jede Schicht bedeutet, dass jede ihrer Neuronen aktiviert wird, indem die gewichtete Summe der Eingaben berechnet, der Bias addiert und die Aktivierungsfunktion angewendet wird.
Zuvor wurde für ein einzelnes Neuron die gewichtete Summe der Eingaben berechnet, indem das Skalarprodukt zwischen dem Eingabevektor und dem Gewichtungsvektor gebildet und der Bias addiert wurde.
Da jede Zeile der Gewichtungsmatrix den Gewichtungsvektor für ein bestimmtes Neuron enthält, muss nun lediglich ein Skalarprodukt zwischen jeder Zeile der Matrix und dem Eingabevektor durchgeführt werden. Glücklicherweise entspricht dies genau der Matrixmultiplikation:
Um die Bias-Werte zu den Ausgaben der jeweiligen Neuronen hinzuzufügen, sollte ebenfalls ein Bias-Vektor addiert werden:
Abschließend wird die Aktivierungsfunktion auf das Ergebnis angewendet — Sigmoid oder ReLU in unserem Fall. Die resultierende Formel für die Vorwärtspropagation in der Schicht lautet:
a=activation(Wx+b)wobei a der Vektor der Neuronenaktivierungen (Ausgaben) ist.
Layer-Klasse
Die grundlegenden Bausteine des Perzeptrons sind seine Schichten (Layers), daher ist es sinnvoll, eine eigene Layer
-Klasse zu erstellen. Zu ihren Attributen gehören:
inputs
: ein Vektor von Eingaben (n_inputs
ist die Anzahl der Eingaben);outputs
: ein Vektor von Roh-Ausgabewerten (vor Anwendung der Aktivierungsfunktion) der Neuronen (n_neurons
ist die Anzahl der Neuronen);weights
: eine Gewichtsmatrix;biases
: ein Bias-Vektor;activation_function
: die in der Schicht verwendete Aktivierungsfunktion.
Wie bei der Implementierung eines einzelnen Neurons werden weights
und biases
mit zufälligen Werten zwischen -1 und 1 aus einer gleichverteilten Zufallsverteilung initialisiert.
class Layer:
def __init__(self, n_inputs, n_neurons, activation_function):
self.inputs = np.zeros((n_inputs, 1))
self.outputs = np.zeros((n_neurons, 1))
self.weights = ...
self.biases = ...
self.activation = activation_function
Die Attribute inputs
und outputs
werden später beim Backpropagation-Verfahren verwendet, daher ist es sinnvoll, sie als mit Nullen gefüllte NumPy-Arrays zu initialisieren.
Die Initialisierung von inputs
und outputs
als mit Nullen gefüllte NumPy-Arrays verhindert Fehler bei Berechnungen während der Vorwärts- und Rückwärtspropagation. Sie gewährleistet außerdem Konsistenz zwischen den Schichten und ermöglicht reibungslose Matrixoperationen, ohne dass zusätzliche Prüfungen erforderlich sind.
Vorwärtspropagation kann in der Methode forward()
implementiert werden, wobei die outputs
auf Basis des inputs
-Vektors mit NumPy gemäß der obigen Formel berechnet werden:
def forward(self, inputs):
self.inputs = np.array(inputs).reshape(-1, 1)
# Raw outputs
self.outputs = ...
# Applying the activation function
return ...
Das Umformen von inputs
in einen Spaltenvektor gewährleistet eine korrekte Matrixmultiplikation mit der Gewichtsmatrix während der Vorwärtsausbreitung. Dies verhindert Formfehler und ermöglicht nahtlose Berechnungen über alle Schichten hinweg.
1. Was macht ein Multilayer-Perzeptron (MLP) leistungsfähiger als ein einfaches Perzeptron?
2. Warum wenden wir diesen Code an, bevor wir inputs
mit der Gewichtsmatrix multiplizieren?
Danke für Ihr Feedback!