Gewichte eines neuronalen Netzwerks

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Fraenk
User
Beiträge: 2
Registriert: Dienstag 15. März 2022, 12:17

Moin!
Vorweg, ich bin leider absoluter Neuling was dieses Forum und Python/Programmieren im Allgemeinen angeht. Momentan studiere ich Maschinenbau im Master und meine Masterarbeit behandelt die Programmierung eines neuronalen Netzwerks zur Feinpositionierung eines mobilien Roboters. Dafür habe Lernlektüre erhalten, bei der ich nicht weiterkomme und vielleicht auf etwas Hilfe und Erklärung hoffe. Es geht um folgendes Beispiel im Buch:

In einem Szenario ist es gewünscht (="1"), wenn einer von 2 Arbeitnehmern anwesend (="1") ist, quasi eine Oder-Anweisung. Wir haben also einen 3-dimensionalen Input: Bias-Neuron, Anwesenheit Arbeiter 1 und Anwesenheit Arbeiter 2, und somit 4 Inputvektoren X = np.array([[1,0,0],[1,0,1],[1,1,0],[1,1,1]]). Das gewünschte Ergebnis ist y = np.array([0,1,1,1]). Der Programmcode ist folgender:
# Heaviside-Funktion
def heaviside( summe ):
.. """ Berechnung der Entscheidung zum Wert summe
.. Input: summe
.. Output: 1, falls summe >= 0,
.. 0 sonst
.. """
.. if summe >= 0:
...... return 1
.. else:
...... return 0

# Perceptron-Berechnung (Forward Path)
.. def perceptron_eval(X,y):
.. """ Perceptron-Berechnung
.. Input: X, Inputvektor
.. y, der gewünschte Output
.. Output: Der Gesamtfehler, d. h. Summe aus dem Betrag der Differenz
.. von errechnetem und gewünschtem Output
.. """
.. # Der Gesamtfehler
.. gesamtfehler = 0;
.. # Die Gewichte so wählen, dass das OR-Problem gelöst werden kann
.. w = np.array([-1,1,1])
.. # Index i und Element x Ermittlung vom Array X
.. for i, x in enumerate(X):
...... # x = Zeile für Zeile verwenden
...... # Inneres Produkt zwischen x und w
...... summe = np.dot(w,x)
...... ergebnis = heaviside(summe)
...... # Fehler
...... fehler = np.abs(ergebnis - y(i))
...... # Gesamtfehl[er
...... gesamtfehler += fehler
...... # Ausgabe
...... print("Fr. Karotte = {}, Hr. Lauch = {}, gewünschtes Ergebnis = {}, errechnetes Ergebnis = {}, Fehler = {}".format(x[1], x[2], y(i), ergebnis, fehler))
.. # Gesamtfehler pro Epoche über ganzen Trainingsdatensatz
.. return gesamtfehler

#------------------------------
# Core Function zum Auswerten des Inputs
gesamtfehler = perceptron_eval(X,y)
print("Gesamtfehler = %1d" % (gesamtfehler))
Was ich hier konkret nicht verstehe ist, wie sie auf das Gewicht w = np.array([-1,1,1]) kommen? Scheinbar haben die es vorher bereits errechnet, oder? Es steht zwar geschrieben: "# Die Gewichte so wählen, dass das OR-Problem gelöst werden kann", aber ich weiß nicht was damit gemeint ist? Ich hätte ja meinen Prof angeschrieben, aber der ist momentan leider nicht ansprechbar.

Vorab vielen Dank für eure Mühe und Zeit..!!
Gruß, Fraenk
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Scheinbar haben die es vorher bereits errechnet, oder?
Vermutlich. Oder die Aufgabe ist es zu überlegen oder sich klar zu machen, wieso die Gewichte diese Werte annehmen müssen.
Denn nur so hat der Gesamtfehler den optimalen Wert Null.

Was hier fehlt und ich denke das wird demnächst kommen, ist das Training des Perceptrons, d.h. die Gewichte werden am Anfang zufällig gewählt und dann
in einer Schleife anhand des resultierenden Fehlers solange verändert, bis der Gesamtfehler minimal ist und nicht besser wird.
Das nennt sich Gradientenverfahren https://de.wikipedia.org/wiki/Gradientenverfahren

Ich wünsche dir viel Spaß dabei, ist eine sehr interessante Materie.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da du hier ja ein einzelnes Perzeptron vorliegen hast, ist das Problem ja recht einfach umschrieben: wie legst du die lineare Trennebene in deinem zweidimensionalen Eingaberaum so, dass du die gewünschte logische Funktion berechnest. Mal die also mal auf Papier die 4 Eingaben als Punkte in eine 2D-Koordinatensystem, und markiere deine Wahrheitswert. Und dann leg eine Trennebene (im 2D ist das eine Gerade) dadurch. Und vergleich das mit der gewählten.
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich hoffe du bist der englischen Sprache mächtig, denn vernünftige Doku zu diesem Thema ist auf Englisch.

Der Youtuber Sentdex hat sehr viel mit Python und Neuronalen Netzen gemacht.
Hier sind die ersten neun Folgen seiner Playlist zu seinem Buch "Neural Networks from Scratch in Python" https://nnfs.io
https://www.youtube.com/watch?v=Wo5dMEP ... OF2tius3V3
Kann ich nur empfehlen.

Des weiteren hier einige Links die dir sicherlich auf deinem Weg helfen werden.

https://github.com/ml-tooling/best-of-ml-python
https://github.com/ageron/handson-ml2
https://github.com/vinta/awesome-python
https://github.com/luspr/awesome-ml-courses
https://github.com/dabeaz-course/practical-python
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Fraenk
User
Beiträge: 2
Registriert: Dienstag 15. März 2022, 12:17

Danke euch für die Antworten!!

@ThomasL: Genau so habe ich das nämlich auch gelesen, dass die Gewichtung durch anfängliche Schätzung optimiert wird, sodass Fehler reduziert werden. Aber so weit bin ich noch nicht, darum habe ich mich gefragt, ob es eine mathematische Möglichkeit vorab gäbe. Und danke auch für die gesendeten Links. Ich werde sie mir defintiv ansehen um da mein Wissen etwas zu vertiefen. Die Materie finde ich nämlich auch wirklich interessant!

@__deets__: Ich muss leider zugeben, dass ich noch viel zu wenig Ahnung habe um dein Kommentar richtig deuten zu können. Ich hoffe sehr, dass ich durch weitere Einarbeitung ins Thema deinen Gedankengang folgen vermag. Bis dahin verweile ich erst mit der Prämisse, dass das gegebene Gewicht Einfachheit halber bereits richtig gegeben wurde.
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Fraenk hat geschrieben: Dienstag 15. März 2022, 19:59@ThomasL: Genau so habe ich das nämlich auch gelesen, dass die Gewichtung durch anfängliche Schätzung optimiert wird, ....
Schätzung ist nicht ganz richtig. Die anfängliche Initialisierung der Gewichte ist mittlerweile eine Wissenschaft für sich.
Hier mal eine der vielen Erklärungen wie man es machen kann.
https://towardsdatascience.com/weight-i ... c649eb3b78
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Antworten