Neuronales Netz

chris080

Neues Mitglied
Eins vorweg: Es ist keine Frage zu einer Hausaufgabe/-arbeit o.Ä.
Ich beschäftige mich momentan privat mit Neuronalen Netzen. Seit zwei Semestern hat mir tatsächlich einer meiner Profs, der als gefühlt einziger NN in dem Modul "Intelligente Systeme" inklusive allem was zum Deep Learning gehört, anbietet, mir das Thema recht uninteressant gemacht. Obwohl ich wegen dem Traum von künstlicher Intelligenz zu studieren angefangen habe (Angewandte Informatik).

Wie dem auch sei. Meine Frage ist etwas weniger technisch sondern viel eher für das Verständnis. Und ja ich mache das NN tatsächlich in Java, obwohl es jeder in Python macht. Es mag zwar sein, dass Python dafür besser geeignet ist, aber um ein Thema from scratch an selbst zu machen, ist es ja fast prinzipiell egal, welche Sprache man benutzt. Ich will ja nur ein grundlegendes Verständnis durch das Anwenden bekommen.Wenn ich NN durch und durch kapiert habe, kann ich mir gerne die advanced techniques ansehen. Wobei ich null Fan davon bin third party librarys zu benutzen und dann zu meinen, dass ich nach 30 Zeilen Code ein NN "selbst" entwickelt habe. Ich mag es halt gerne mich in ein Thema reinzukämpfen, um es dann auch wirklich zu können und alle Stellschrauben im Griff zu haben.

Zu meiner eigentlichen Frage (sorry für den Text davor haha):
Ein NN arbeitet prinzipiell ja so, dass man input daten hat, die (zuerst random?) gewichtet werden und die mit einem ergänzendem Bias versehen werden. Das geht dann durch ein (oder mehrere) hidden layers, dann werden die Daten der hidden layers wieder gewichtet und es gibt einen output, der eine Abweichung zu den erwarteten Werten hat. Das NN lernt, indem es seine Gewichtungen so lange anpasst, bis die zu erwartenden outputs (näherungsweise) korrekt sind.

Das Prinzip ist klar und bis meine Literatur ankommt, werde ich wohl erstmal mit Tutorials vorlieb nehmen müssen, die ein wenig "oberflächlich" bleiben und tiefere Verständnisfragen nicht (oder nur sehr wenige tun es) beantworten. Zumindest hat noch keiner meine Fragen erklärt.

Wenn ich z.B. (ich will eine Spracherkennung selber schreiben) eine mp3 in interpretierbare Daten (Spektrogram) umformatiere und sage, welches Wort das NN in den Daten zu erkennen hat, dann mag es dieses Wort vielleicht irgendwann recht zuverlässig erkennen, wenn es genug Lerndaten bekommt. Aber werden nicht mit dem Lernen anderer Wörter eben genau diese perfekt zu dem ersten Wort abgestimmten Gewichtungen wieder verändert, bis das zweite Wort erkannt wird? Und dann wird das erste Wort gar nicht mehr erkannt, dafür aber das zweite? Oder verstehe ich da was falsch? Und wenn man alle deutschen Wörter einmal einließt, wird doch jedes Mal die Gewichtung neu kalibriert, sodass es kein Ende gibt. Ich denke, da habe ich ein grundlegendes Verständnisproblem. Und ob Spracherkennung so funktioniert, weiß ich auch nicht. Ich weiß nur, dass Shazam so Lieder erkennt. Spektrogram der Aufzeichnung wird mit vorhandenen Spektrogrammen aus einer Datenbank verglichen. Wie eine Art Fingerabdruckvergleich werden dafür spezielle Punkte betrachtet. Und hier wieder ein Verständnisproblem: Wer legt fest, welche Punkte verglichen werden sollen. Werden die beim Lernen angepasst, bis die effizientesten Informationspunkte herausgefiltert werden, oder macht man das zu Anfang einfach fix und das NN lernt die Gewichtungen anzupassen? Fragen über Fragen.

Sorry nochmal ... Ich suche wirklich keine Nachhilfe oder so, aber es gibt halt kein gutes allgemeines Informatikerforum. Daher muss ich Euch hier nerven. Und falls ich im HA Forum falsch bin, verschiebt den Post gerne. Es passt hier halt auch gut, weil ich in Java viel mache. Eigentlich fast alles. Und mein Prof. ist wie bereits gesagt eher auf destruktiver Art unterwegs und Komillitonen, haben außerhalb der Uni nicht solche Hobbys wie ich haha. Ich weiß nicht wo ich sonst wen fragen kann. Und ich will in diesem Thema einfach super einarbeiten, alles lernen, alles verstehen, alles können und auch meine Bachelorarbeit darin schreiben.

Ergänzung, falls man sich auch so ein wenig mit mir über die Materie unterhalten will:
Wie ich mp3s in Spektrogramme umrechne, weiß ich tatsächlich noch gar nicht. Also würde ich irgendwie an die Freuqnezen kommen, müsste ich mich nur noch mit FFT auseinandersetzen, um das Spektrogramm zu erhalten. Aber wie man aus einer mp3 die Frequenzen extrahiert weiß ich noch nicht. Ich stelle mir vor, die Amplitude der mp3 wird eingelesen und zwischengespeichert, dann nach einigen ms wird gestoppt und man hat eine Wellenform bestehend aus allen gemessenen Amplituden. Die Informationen der Frequenzen extrahiert dann ja die FFT. Aber wie bekommt man die Amplitude der mp3 als Integer-wert? Keine Ahnung haha
Und eigentlich wollte ich sogar direkt das Mikrofon capturen, um eine live Spracherkennung zu schaffen. Das will ich auch noch machen. Die meisten machen es ja immer mit fertigen Audiofiles. Ja ich kratze vielleicht viel noch an der Oberfläche, aber deshalb bin ich hier. Ich will Erfahrung sammeln, ich will Grenzen entdecken, wo etwas (technisch) nicht möglich oder zu rechenintensiv ist. Ob etwas gut machbar ist und was man noch optimieren kann. Man lernt ja nichts, wenn man fertigen Code vorgesetzt bekommt oder NN-Librarys importiert und dann nur noch die Input layer und das was erwartet wird reinwirft und die ganze "Magie" irgendwo im Hintergrund geschieht. Erst der Kampf etwas von Grund auf zu verstehen ist (zumindest für mich) Grundlage für langfristiges Verständnis
 
Zuletzt bearbeitet:

LimDul

Top Contributor
Vorneweg - mein Wissen in neuronalen Netzen ist auch sehr rudimentär. Aber den Fehler, den du meines Erachtens machst, ist nur nur eine Eingabe als Trainings-Eingabe zu sehen. Aber die Trainingseingabe sind ganz ganz viele Sprach-Samples. Und das Netz wird trainiert diese Menge korrekt zuzuordnen. Siehe z.B. Hier:

Die Feedback-Schleife liefert uns eine erste gute Vorstellung davon, wie das Training eines neuronales Netzes funktioniert. In der Praxis werden neuronale Netze normalerweise mit einer sehr großen Anzahl an Daten trainiert. Dies hat zur Folge, dass ein Durchlauf durch die Feedback-Schleife mit dem gesamten Datensatz sehr teuer, d.h. sehr rechenaufwändig werden kann. Dies ist ein Grund, aus dem viele Algorithmen bei jedem einzelnen Durchlauf durch die Feedback-Schleife lediglich einen Teil der Daten, eine sogenannte Batch, verwenden. Dabei wird die Batch in jeder Epoche neu per Zufall aus den Daten zusammengestellt.

Die Feinjustierung des neuronalen Netzes basiert also in jeder Epoche lediglich auf einem Teil der Daten. Jedoch wird das neuronale Netz im Laufe des Trainings nach und nach immer wieder mit den gesamten Daten konfrontiert. Algorithmen, die diesen Mechanismus verwenden, erkennt man typischerweise an dem Zusatz stochastic.

Den die Idee ist ja nicht, dass das neuronale Satz ein Sprachsampel perfekt erkennt, sondern dass es z.B. 500.000 Sprach-Samples möglichst gut erkennt. Und um das mit der beschränkten Zahl an Neuronen hinzubekommen, kommt eine Mustererkennung dabei raus. Und die Hoffnung ist, dass diese Muster dann auch die unbekannten Sprachesamples passt.

Beispielsweise, wenn es darum geht Postleitzahlen zu erkennen. Wenn du es nur auf die PLZ handgeschriebene, einzige PLZ 12345 trainierst wird es die wunderbar erkennen. Aber bei Abweichungen total aus dem Tritt bekommen.

Wenn du es aber mit 100.000 handgeschrieben PLZ konfrontierst als Training ist die Hoffnung das die Erkennung Muster findet. Das also eine 1 immer so aussieht, dass eine ca. längeren senkrechten Bereich von schwarz gibt und ggf. noch einen kleinen Strich nach links.
 

White_Fox

Top Contributor
Ich habe von NN leider auch keine Ahnung, würde aber mal diesen Link hier in den Raum werfen. Ist schon älter, aber gibt ein paar nette Hinweise wie man mit Java in das Thema einsteigen kann.

Und ja ich mache das NN tatsächlich in Java, obwohl es jeder in Python macht. Es mag zwar sein, dass Python dafür besser geeignet ist, aber um ein Thema from scratch an selbst zu machen, ist es ja fast prinzipiell egal, welche Sprache man benutzt.
Ich würde Java dafür jetzt nicht unbedingt als schlechte Wahl bezeichnen. Python hat sich irgendwann mal im wissenschaftlichen Elfenbeinturm durchgesetzt, weil es irgendwann immer mehr Bibliotheken für die Sprache gab. Das ist ähnlich wie dieses Herumgekrüppel mit Matlab: Arschteuer, die Skriptsprache ist einfach nur scheiße, aber es nutzt halt jeder und es gibt niemanden, der es besser macht. Ich persönlich mag die Sprache (Python) auch nicht, und da der Pythoninterpreter nach allem, was ich weiß, immer noch deutlich langsamer ist als die JVM, würde ich Python sogar als ungeeigneter einstufen. Ich meine, gerade bei großen Simulationen, Berechnungen, oder auch NN kann Rechenleistung nur durch noch mehr Rechenleistung ersetzt werden. Da sollte ein Programm keine unnötige Bremse einlegen.
 

mihe7

Top Contributor
Wenn ich z.B. (ich will eine Spracherkennung selber schreiben)
Schlechtes Beispiel, aber für wenige Wörter (z. B. für die Zahlwörter von 0 bis 9) kann das sprecherabhängig funktionieren, indem man die Aufnahme eines Wortes per FFT ins Frequenzspektrum überführt, und dann die Werte von z. B. 20 Frequenzen nimmt. Dann hat das NN eben 20 Input-Neuronen und 10 Ausgabeneuronen.

Und ob Spracherkennung so funktioniert, weiß ich auch nicht.
Definiere Spracherkennung :) Die Ziffern dürften wie oben beschrieben Funktionieren (oder auch andere kurze Befehle). Das "Alexa"-Startwort könnte man so implementieren, dann allerdings mit MFCC zwecks Unabhängigkeit vom Sprecher, aber für gesprochene Sätze wird viel mehr als ein einfaches NN benötigt.

Und dann wird das erste Wort gar nicht mehr erkannt, dafür aber das zweite? Oder verstehe ich da was falsch?
Ja, das verstehst Du falsch bzw. ist abhängig von Deinem NN. Zum Beispiel kann ein Perceptron keine XOR-Funktion lernen - das wäre der Fall, den Du meinst.

Die meisten machen es ja immer mit fertigen Audiofiles.
Das ist auch richtig, weil die Idee dahinter ist, dass es egal ist, wo die Audiodaten herkommen. Aufnahme ist ein eigenständiges "Problem".
 
B

BestGoalkeeper

Gast
Wobei ich null Fan davon bin third party librarys zu benutzen und dann zu meinen, dass ich nach 30 Zeilen Code ein NN "selbst" entwickelt habe.
Zur Informatik gehört auch, das Rad nicht zweimal zu erfinden...
Es gibt dazu gute Libs, mit ganz akzeptablen Laufzeiten
Andererseits sind NN naturgemäß sehr rechenintensiv, so dass sich skriptähnliche Sprachen ohne Hardwareanbindung damit schwer tun

Wenn ich z.B. (ich will eine Spracherkennung selber schreiben) eine mp3 in interpretierbare Daten (Spektrogram) umformatiere und sage,
Warum willst du mit Spracherkennung anfangen? Das ist denkbar ungeeignet, weil du gar nicht so viele Trainingsdaten hast, die das Netz benötigen würde.
Erkenne doch erstmal nachdem du ein paar Basics gelernt hast logische Verknüpfungen oder kleinere Bilder.
 

AndiE

Top Contributor
Ich denke, es ist auch gut, klein anzufangen. Das XOR-Problem wurde ja schon angesprochen. Man hat dort bei der Umsetzung zwei Eingangsneuronen für x1 und x2 und zwei Ausgangsneuronen für y=0 und y=1. Dazwischen hat man ( z.B. in einem Perl Programm) vier Neuronen der Hinnen-Schicht. Man könnte jetzt Mutmaßungen anstellen, aber es lässt sich aus den Werten der Wichtungen nicht nachvollziehen, wie er auf das Ergebnis gekommen ist. So jedenfalls mein Kenntnisstand.

"Neuronale Netze" von Thomas Kaffka beschäftigt sich mit der Programmierung von NN in Java.

Eine Nachvollziehbarkeit des Lernens ist aber schwer machbar. Das gilt insbesondere für die fortgeschrittenen Methoden, die bei der Bildanalyse angewendet werden.

Die Frage ist natürlich auch, ob die Eingabedaten so überhaupt funktionieren können. Die Daten müssen miteinander vergleichbar sein, aber auch gewisse Unterschiede enthalten. Mit sw-Bildern den Unterschied von Apfel, Pflaume und Tomate zu lernen, dürfte eben schwierig sein. Nimmt man Farbwerte hinzu, ist der abstand dazwischen schn erkennbarer.
 

Neue Themen


Oben