Implementierung Eines Einzelnen Neurons
Ein Neuron ist die grundlegende Recheneinheit eines neuronalen Netzwerks. Es verarbeitet mehrere Eingaben und erzeugt eine einzelne Ausgabe, wodurch das Netzwerk lernen und Vorhersagen treffen kann.
Zunächst möchten wir ein neuronales Netzwerk mit einem einzelnen Neuron erstellen. Als Beispiel nehmen wir eine binäre Klassifikationsaufgabe, wie etwa die Spam-Erkennung, wobei 0 für eine Ham-E-Mail (keine Spam-E-Mail) und 1 für eine Spam-E-Mail steht.
Das Neuron erhält numerische Merkmale zu E-Mails als Eingaben und erzeugt eine Ausgabe zwischen 0 und 1, die die Wahrscheinlichkeit angibt, dass eine E-Mail Spam ist.
Der Ablauf Schritt für Schritt:
- Jede Eingabe wird mit einem entsprechenden Gewicht multipliziert. Die Gewichte sind lernbare Parameter, die die Bedeutung jeder Eingabe bestimmen;
- Alle gewichteten Eingaben werden aufsummiert;
- Ein zusätzlicher Parameter, der sogenannte Bias, wird zur Eingabesumme addiert. Der Bias ermöglicht es dem Neuron, seine Ausgabe nach oben oder unten zu verschieben und bietet dem Modell so Flexibilität;
- Die Eingabesumme wird anschließend durch eine Aktivierungsfunktion geleitet. Da wir nur ein einzelnes Neuron haben, das direkt die endgültige Ausgabe (eine Wahrscheinlichkeit) erzeugt, verwenden wir die Sigmoid-Funktion, die Werte in den Bereich (0,1) komprimiert.
Bias des Neurons ist ebenfalls ein trainierbarer Parameter.
Neuron-Klasse
Ein Neuron muss seine Gewichte und den Bias speichern, wodurch sich eine Klasse als natürliche Möglichkeit zur Gruppierung dieser zusammengehörigen Eigenschaften anbietet.
Auch wenn diese Klasse nicht Teil der endgültigen Implementierung des neuronalen Netzes sein wird, veranschaulicht sie dennoch zentrale Prinzipien.
class Neuron:
def __init__(self, n_inputs):
self.weights = ...
self.bias = ...
weights
: eine Liste von zufällig initialisierten Werten, die bestimmen, wie wichtig jeder Eingang (n_inputs
ist die Anzahl der Eingänge) für das Neuron ist;bias
: ein zufällig initialisierter Wert, der dem Neuron hilft, flexible Entscheidungen zu treffen.
Gewichte und Bias sollten zufällig initialisiert werden, mit kleinen Werten zwischen -1 und 1, gezogen aus einer gleichverteilten Zufallsverteilung, um Symmetrie zu brechen und sicherzustellen, dass verschiedene Neuronen unterschiedliche Merkmale lernen.
Zur Wiederholung: NumPy stellt die Funktion random.uniform()
bereit, um eine Zufallszahl oder ein Array (durch Angabe des Arguments size
) von Zufallszahlen aus einer gleichverteilten Zufallsverteilung im Bereich [low, high)
zu generieren.
import numpy as np
np.random.uniform(low, high, size=...)
Forward Propagation
Zusätzlich sollte die Klasse Neuron
eine Methode activate()
enthalten, die die gewichtete Summe der Eingaben berechnet und die Aktivierungsfunktion (in unserem Fall Sigmoid) anwendet.
Tatsächlich kann, wenn zwei Vektoren gleicher Länge (weights
und inputs
) vorliegen, die gewichtete Summe durch das Skalarprodukt dieser Vektoren berechnet werden:
Dies ermöglicht es, die gewichtete Summe in einer einzigen Codezeile mit der Funktion numpy.dot()
zu berechnen, wodurch eine Schleife überflüssig wird. Der Bias kann dann direkt zum Ergebnis addiert werden, um input_sum_with_bias
zu erhalten. Die Ausgabe wird anschließend durch Anwendung der Sigmoid-Aktivierungsfunktion berechnet:
def activate(self, inputs):
input_sum_with_bias = ...
output = ...
return output
Aktivierungsfunktionen
Die Formel für die Sigmoid-Funktion lautet wie folgt, wobei z die gewichtete Summe der Eingaben mit hinzugefügtem Bias (Roh-Ausgabewert) für dieses spezielle Neuron darstellt:
σ(z)=1+e−z1Mit dieser Formel kann die Sigmoid-Funktion als einfache Funktion in Python implementiert werden:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
Die Formel für die ReLU-Funktion ist wie folgt, wobei der Ausgabewert im Wesentlichen auf z gesetzt wird, wenn dieser positiv ist, und andernfalls auf 0:
ReLU(z)=max(0,z)def relu(z):
return np.maximum(0, z)
1. Welche Rolle spielt der Bias-Term in einem einzelnen Neuron?
2. Warum initialisieren wir Gewichte mit kleinen Zufallswerten statt mit Nullen?
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
Implementierung Eines Einzelnen Neurons
Swipe um das Menü anzuzeigen
Ein Neuron ist die grundlegende Recheneinheit eines neuronalen Netzwerks. Es verarbeitet mehrere Eingaben und erzeugt eine einzelne Ausgabe, wodurch das Netzwerk lernen und Vorhersagen treffen kann.
Zunächst möchten wir ein neuronales Netzwerk mit einem einzelnen Neuron erstellen. Als Beispiel nehmen wir eine binäre Klassifikationsaufgabe, wie etwa die Spam-Erkennung, wobei 0 für eine Ham-E-Mail (keine Spam-E-Mail) und 1 für eine Spam-E-Mail steht.
Das Neuron erhält numerische Merkmale zu E-Mails als Eingaben und erzeugt eine Ausgabe zwischen 0 und 1, die die Wahrscheinlichkeit angibt, dass eine E-Mail Spam ist.
Der Ablauf Schritt für Schritt:
- Jede Eingabe wird mit einem entsprechenden Gewicht multipliziert. Die Gewichte sind lernbare Parameter, die die Bedeutung jeder Eingabe bestimmen;
- Alle gewichteten Eingaben werden aufsummiert;
- Ein zusätzlicher Parameter, der sogenannte Bias, wird zur Eingabesumme addiert. Der Bias ermöglicht es dem Neuron, seine Ausgabe nach oben oder unten zu verschieben und bietet dem Modell so Flexibilität;
- Die Eingabesumme wird anschließend durch eine Aktivierungsfunktion geleitet. Da wir nur ein einzelnes Neuron haben, das direkt die endgültige Ausgabe (eine Wahrscheinlichkeit) erzeugt, verwenden wir die Sigmoid-Funktion, die Werte in den Bereich (0,1) komprimiert.
Bias des Neurons ist ebenfalls ein trainierbarer Parameter.
Neuron-Klasse
Ein Neuron muss seine Gewichte und den Bias speichern, wodurch sich eine Klasse als natürliche Möglichkeit zur Gruppierung dieser zusammengehörigen Eigenschaften anbietet.
Auch wenn diese Klasse nicht Teil der endgültigen Implementierung des neuronalen Netzes sein wird, veranschaulicht sie dennoch zentrale Prinzipien.
class Neuron:
def __init__(self, n_inputs):
self.weights = ...
self.bias = ...
weights
: eine Liste von zufällig initialisierten Werten, die bestimmen, wie wichtig jeder Eingang (n_inputs
ist die Anzahl der Eingänge) für das Neuron ist;bias
: ein zufällig initialisierter Wert, der dem Neuron hilft, flexible Entscheidungen zu treffen.
Gewichte und Bias sollten zufällig initialisiert werden, mit kleinen Werten zwischen -1 und 1, gezogen aus einer gleichverteilten Zufallsverteilung, um Symmetrie zu brechen und sicherzustellen, dass verschiedene Neuronen unterschiedliche Merkmale lernen.
Zur Wiederholung: NumPy stellt die Funktion random.uniform()
bereit, um eine Zufallszahl oder ein Array (durch Angabe des Arguments size
) von Zufallszahlen aus einer gleichverteilten Zufallsverteilung im Bereich [low, high)
zu generieren.
import numpy as np
np.random.uniform(low, high, size=...)
Forward Propagation
Zusätzlich sollte die Klasse Neuron
eine Methode activate()
enthalten, die die gewichtete Summe der Eingaben berechnet und die Aktivierungsfunktion (in unserem Fall Sigmoid) anwendet.
Tatsächlich kann, wenn zwei Vektoren gleicher Länge (weights
und inputs
) vorliegen, die gewichtete Summe durch das Skalarprodukt dieser Vektoren berechnet werden:
Dies ermöglicht es, die gewichtete Summe in einer einzigen Codezeile mit der Funktion numpy.dot()
zu berechnen, wodurch eine Schleife überflüssig wird. Der Bias kann dann direkt zum Ergebnis addiert werden, um input_sum_with_bias
zu erhalten. Die Ausgabe wird anschließend durch Anwendung der Sigmoid-Aktivierungsfunktion berechnet:
def activate(self, inputs):
input_sum_with_bias = ...
output = ...
return output
Aktivierungsfunktionen
Die Formel für die Sigmoid-Funktion lautet wie folgt, wobei z die gewichtete Summe der Eingaben mit hinzugefügtem Bias (Roh-Ausgabewert) für dieses spezielle Neuron darstellt:
σ(z)=1+e−z1Mit dieser Formel kann die Sigmoid-Funktion als einfache Funktion in Python implementiert werden:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
Die Formel für die ReLU-Funktion ist wie folgt, wobei der Ausgabewert im Wesentlichen auf z gesetzt wird, wenn dieser positiv ist, und andernfalls auf 0:
ReLU(z)=max(0,z)def relu(z):
return np.maximum(0, z)
1. Welche Rolle spielt der Bias-Term in einem einzelnen Neuron?
2. Warum initialisieren wir Gewichte mit kleinen Zufallswerten statt mit Nullen?
Danke für Ihr Feedback!