Forum: Offtopic Wenn neuronale Netze träumen


von Vlad T. (vlad_tepesch)


Lesenswert?

Da es hier in einem anderen Thread gerade um KNNs ging, passt das 
irgendwie:

http://googleresearch.blogspot.de/2015/06/inceptionism-going-deeper-into-neural.html

Netter Artikel.
Bekommt man direkt Lust das selbst mal auszuprobieren und damit 
rumzuspielen ;)

Aufgefallen ist mir das ganze durch einen SPON und einen Heise Artikel:
http://www.heise.de/newsticker/meldung/Bilderkennung-Wovon-traeumen-neuronale-Netze-2717736.html
http://www.spiegel.de/netzwelt/gadgets/inceptionism-google-forscher-geben-netzwerken-lsd-a-1039965.html

von Michael K. (Gast)


Lesenswert?

Vlad Tepesch schrieb:
> Bekommt man direkt Lust das selbst mal auszuprobieren und damit
> rumzuspielen ;)

Hast Du auch gelesen auf welcher Hardware die das gefahren haben ?

Um mal einen Vergleich zu ziehen:
http://www.heise.de/tr/artikel/Google-lernt-sehen-1769478.html

Voraussetzung dafür ist allerdings, dass die Netze groß genug sind und 
mit genügend Trainingsdaten gefüttert werden. In ihrem Experiment hatten 
die Wissenschaftler ein KNN mit einer Milliarde künstlicher Synapsen 
verwendet und diesem zehn Millionen Bilder aus YouTube-Videos 
vorgesetzt.
>16000 Prozessoren in 1000 Computern waren zehn Tage damit beschäftigt.

von Vlad T. (vlad_tepesch)


Lesenswert?

Michael Knoelke schrieb:
>>16000 Prozessoren in 1000 Computern waren zehn Tage damit beschäftigt.

Prima, da kann ich das ganze zweimal parallel machen.


Aber im Ernst. Man kann ja auch mal klein anfangen und die Bildgröße auf 
100x100 oder so beschränken.

Michael Knoelke schrieb:
> einer Milliarde künstlicher Synapsen

kommt mir wenig vor.
bei 1024x768 Pixeln hat man ja schon mal >0,75Mio Neuronen pro layer. 
Selbst wenn man nicht Alle Neuronen mit allen Neuronen des vorherigen 
Layers verbindet ist man bei 2-3 Layern ja schon drüber.

Klar können die tieferen Schichten vielleicht auch weniger Neuronen 
haben, aber die Zahl kommt mir komisch vor. Vielleicht waren auch 1Mrd 
Neuronen gemeint.

von Uhu U. (uhu)


Lesenswert?

Vlad Tepesch schrieb:
> kommt mir wenig vor.
> bei 1024x768 Pixeln hat man ja schon mal >0,75Mio Neuronen pro layer.

Nur die Eingangsschicht braucht für jedes Pixel ein Neuron. Die tieferen 
Layer kommen i.d.R. mit weniger Neuronen aus.

Michael Knoelke schrieb:
> In ihrem Experiment hatten
> die Wissenschaftler ein KNN mit einer Milliarde künstlicher Synapsen
> verwendet

Synapsen sind nicht Neuronen, sondern Verbindungen eines Neurons mit dem 
Axon eines Neurons der vorherigen Schicht. Ein Neuron kann 
(sinnvollerweise) maximal so viele Synapsen haben, wie Neuronen im 
vorherigen Layer vorhanden sind.

Für R gibt es recht flotte Libs dafür.

von Vlad T. (vlad_tepesch)


Lesenswert?

Uhu Uhuhu schrieb:
> Nur die Eingangsschicht braucht für jedes Pixel ein Neuron. Die tieferen
> Layer kommen i.d.R. mit weniger Neuronen aus.

wenn aber aus zwischenschichten Bilder generiert werden, heißt es für 
mich, dass ausreichend viele Neuronen da sein müssen. Deswegen hab ich 
das mit konservativen 1024xX abgeschätzt.

Uhu Uhuhu schrieb:
> Synapsen sind nicht Neuronen, sondern Verbindungen eines Neurons mit dem
> Axon eines Neurons der vorherigen Schicht.

Deswegen vermute ich hier einen Fehler.

> Ein Neuron kann
> (sinnvollerweise) maximal so viele Synapsen haben, wie Neuronen im
> vorherigen Layer vorhanden sind.

In der Regel ist bei einem Bild eher die Nachbarschaft interessant. 
vielleicht kann man so mit einer drei- oder vierstelligen Anzahl an 
Verbindungen pro Neuron auskommen. Oder man zieht Kreise und überspringt 
mit zunehmenen Abstand vom Pixel Ringe.

von Uhu U. (uhu)


Lesenswert?

Vlad Tepesch schrieb:
> In der Regel ist bei einem Bild eher die Nachbarschaft interessant.
> vielleicht kann man so mit einer drei- oder vierstelligen Anzahl an
> Verbindungen pro Neuron auskommen.

Zu Beginn werden alle Neuronen mit allen Axonen des Vorgänger-Layers 
verbunden. Beim Training des Netzwerkes stellen sich die 
Synapsengewichte ein. Gewichte für Verbindungen ohne Relevanz für das 
Problem gehen gegen 0.

Ob das Entfernen solcher 0-Synapsen effizienter ist, als die Berechnung 
mit dem Gewicht 0 ist, hängt natürlich davon ab, wie das Ganze 
implementiert ist.

von Vlad T. (vlad_tepesch)


Lesenswert?

Uhu Uhuhu schrieb:
> Zu Beginn werden alle Neuronen mit allen Axonen des Vorgänger-Layers
> verbunden. Beim Training des Netzwerkes stellen sich die
> Synapsengewichte ein. Gewichte für Verbindungen ohne Relevanz für das
> Problem gehen gegen 0.

Ziel dieser Einschränkung wäre ja genau den Trainingsprozess einfacher 
zu gestalten und durch Voruntersuchungen festzustellen, welche der 
möglichen Verbindungen überhaupt sinnvoll wären.
Bei 1024x768 = 786432 Neuronen pro Layer, wären das

    393.216.000 (500/Neuron) versus
618.475.290.624 Synapsen (786432/Neuron)

Allein der benötigte Speicher für die Gewichte pro Layer ist riesig.

Man müsste nochmal genau recherchieren, wie diese Bilderkennungs-NN 
aufgebaut sind. die Zahlen werden doch sehr schnell sehr groß ;)

von Uhu U. (uhu)


Lesenswert?

Vlad Tepesch schrieb:
> Ziel dieser Einschränkung wäre ja genau den Trainingsprozess einfacher
> zu gestalten und durch Voruntersuchungen festzustellen, welche der
> möglichen Verbindungen überhaupt sinnvoll wären.
> Bei 1024x768 = 786432 Neuronen pro Layer, wären das

Leider nicht, denn dann müsste man Prämissen in den Lernalgorthmus 
stecken und würde damit zum Einen das Training stark verkomplizieren und 
zum Anderen den Vorteil der KNNs verschenken, dass sie auf beliebige 
Features trainierbar sind, so lange die Trainingsdaten widerspruchsfrei 
sind. (Wenn man dem Teil ein X für U vormacht, konvergiert das Training 
nicht.)

In der Praxis werden die Gewichte der Synapsen mit Zufallsgewichten 
initialisiert und weil nicht jede Konstellation gleich gut funktioniert 
trainiert man i.d.R. mehrere Netze mit unterschiedlichen 
Initialisierungen und nimmt dann dasjenige, das die Aufgabe am besten 
erfüllt. Eines der R-Pakete trainiert standardmäßig 10 verschiedene 
Netze und vergleicht hinterher, wie gut sie sind - es können auch Netze 
entstehen, die schlichten Unsinn produzieren.

von Hagen R. (hagen)


Lesenswert?

Uhu Uhuhu schrieb:
> Synapsen sind nicht Neuronen, sondern Verbindungen eines Neurons mit dem
> Axon eines Neurons der vorherigen Schicht. Ein Neuron kann
> (sinnvollerweise) maximal so viele Synapsen haben, wie Neuronen im
> vorherigen Layer vorhanden sind.

Ein Neuron (man bezeichnet die eher als Unit) kann sinnvollerweise 
maximal 1+Anzahl Units in allen Layern Synapsen haben. D.h. man kann zum 
einen einen Eingang mit dem Ausgang der Unit selber verknüpfen und 
zumdem von allen anderen Ausgängen aller Units des kompletten Netzwerkes 
Verknüpfungen aufbauen. Die Synapse als Feedback vom Ausgang zum Eingang 
des gleichen Neurons macht es erst möglich das ein Netzwerk auch 
sequentielle Muster erlernen kann, zb. beim Recurrenten Cascade 
Correlation Netzwerk. Erst durch solche Verbindungen kann ein Netzwerk 
ein "Gedächtnis" ausbilden.

Das Netzwerk ist dann in der Lage beim Trainingsprozess eine 
Muster-Reihenfolge innerhalb sequentiell trainierter Muster zu erkennen. 
Beispiel: Morsecode. Ein Recurrentes Netzwerk ist in der Lage den 
Morsecode mit einem einzigen Eingangsneuron zu erlernen. Dieses 
Eingangsneuron bekommt den Morsecode also sequentiell gefüttert. 
Normalerweise heist dies: man arbeitet getaktet mit einer "Zeitbasis" 
und definiert das der Unterschied zwischen Punkt zu Strich nur darin 
besteht das der Punkt zwei Takte = zweimal in zwei Mustern als Punkt 
vorkommt. Die Ausgangsschicht besteht überlicherweise aus Neuronen die 
jeweils ein Buchstabe des Alphabeths und ein Fehlerausgang besteht. Ist 
das Netz trainiert wird es später live im Einsatz ohne Zeitverzögerung 
den Mosrecode dekodieren können. Habe ich selbst schon programmiert.

Anderes Beispiel: ich habe dieses RCCs dazu benutzt zu beweisen das wir 
Menschen nicht in der Lage sind echt zufällige Entscheidungen zu 
treffen. Dazu wird ein Spiel gespielt bei dem der Mensch sich zwischen 
zwei Antworten entscheiden kann, also JA oder NEIN, bzw. grüner oder 
roter Taster. Das Netzwerk trifft verdeckt im Vorfeld die Entscheidung 
ob der Mensch sich für Rot/Grün entscheiden wird. Nachdem beide ihre 
Wahl getroffen haben wird überprüft ob die beiden Entscheidungen 
übereinstimmen. D.h. ob das Netz die Vorhersage der Auswahl des 
Menschens korrekt vorhergesagt hat. Wenn nicht bekommt der menschliche 
Spieler einen Punkt wenn korrekt das Netzwerk. Ausgehend von diesen 
Ergebnissen wird das Netzwerk nun im Hintergrund trainiert, also alle 
vergangenen Entscheidungen werden dabei berücksichtigt, und dies live 
während des Spieles! (das Netz ist am Anfang untrainiert). Das Netz soll 
also lernen in unserer "freien und zufälligen" Entscheidung ein Muster 
zu erkennen. Ergebnis: nach ca. 100-200 Spielrunden gewinnt das Netz in 
jedem Fall mit > 60% Wahrscheinlichkeit. Und das obwohl der menschliche 
Spieler sehr wohl das Feedback hat welche Entscheidung er trifft und 
getroffen hat und er auch erkennen kann wie sich das Netzwerk 
entschieden hat, es also ein Feedback für den Menschen gibt seine 
Spieltaktik ständig anpassen zu können, er verliert trotzdem. Nur wenn 
der Mensch einen Würfel zur Hand nimmt pegelt sich die 
Gewinnwahrscheinlichkeit auf 50% ein.

Ein Neuron kann also viel mehr Synapseneingänge besitzen als die von dir 
angegebene Maximalanzahl.

von Hagen R. (hagen)


Lesenswert?

Uhu Uhuhu schrieb:
> Vlad Tepesch schrieb:
>> Ziel dieser Einschränkung wäre ja genau den Trainingsprozess einfacher
>> zu gestalten und durch Voruntersuchungen festzustellen, welche der
>> möglichen Verbindungen überhaupt sinnvoll wären.
>> Bei 1024x768 = 786432 Neuronen pro Layer, wären das
>
> Leider nicht, denn dann müsste man Prämissen in den Lernalgorthmus
> stecken und würde damit zum Einen das Training stark verkomplizieren und
> zum Anderen den Vorteil der KNNs verschenken, dass sie auf beliebige
> Features trainierbar sind, so lange die Trainingsdaten widerspruchsfrei
> sind. (Wenn man dem Teil ein X für U vormacht, konvergiert das Training
> nicht.)

Doch das geht. Man kombiniert innerhalb des Trainingsprozesses die Idee 
der neuronalen Netze mit genetischen Algortihmen. Am Anfang kann also 
ein Netz initialisiert werden das maximal verknüpft ist und nur wenige 
Neuronen besitzt. Während des Trainingsprozesses werden nun sogenannte 
Kandidatenneuronen dynamisch hinzugefügt und wiederum maximal verknüpft. 
Es gibt mehrere solcher Kandidaten die untereinander quasi konkurreren 
und durch gentische Algorithmen evolutoniert werden. Nach einer gewissen 
Trainingszeit (wiederum mit mathm. Verfahren in ihrer 
Entwicklungsgeschindigkeit bewertet) beendet man das Zwichentraining und 
wählt das Kandidatenneuron mit der besten Fitness aus und fügt es 
dauerhaft dem Netzwerk hinzu.
Zum zweiten wird dies auch mit den Synapsen gemacht. Je mehr einfluß sie 
auf die korrekte Entscheidungen haben desto höher ihre Fitness = 
Überlebenschance. Verknüpfungen die also wenig Einfluß haben werden mit 
der Zeit aus dem Netz eleminiert.

Am Ende hat man ein Netz trainiert bei dem man:

- keine Layer mehr vorgeben muß
- eine Lösung mit optimal geringer Anzahl an Neuronen für das Problem 
benötigt werden
- die geringste Anzahl an Synapsen entstehen und somit die höchste 
Rechenperformance im späteren Einsatz erzielt werden kann

Desweiteren gibt es verschiedene Aktivierungsfunktionen, zB. 
Gaussian/Sigmoid/Sin/Cos etc.pp. Auch diese werden als eine Eigenschaft 
der Neuronen genetisch evolutioniert.

Der Mensch gibt nur noch die Trainigsdaten, die Ein/Ausgangsschicht und 
die Evolutionären Selektierungsfunktionen = Zielrichtung vor. Den Rest 
erlernt das Netz von selbst.

von Uhu U. (uhu)


Lesenswert?

Neuronale Netze verpaart mit Genetischen Algorithmen - das wird erst 
richtig Rechenaufwendig...

Wenn sich das allerdings irgendwann effizient in Hardware packen läßt, 
dann gilt die Menschheit zu 100% geistig behindert.

von Hagen R. (hagen)


Lesenswert?

Naja, das ist wie jedes technische Problem für das es verschiedene 
mathematische Rechenwege gibt und dann feststellt das destöfteren der 
Algorithmus mit der besten Komplexität (Big O) eben auch aufwendigere 
Vorarbeiten benötigt und dann aber bei der eigentliche Problemlösung zur 
Laufzeit der schnellste ist.

Ein großes Problem von neuronalen Netzen ist oft deren schlechte 
Parallelisierbarkeit. Bei genetischen Algorithmen wiederum gibt es für 
90% der Berechnungen aber sehr gute Möglichkeiten der 
Parallelisierbarkeit im Vergleich zum immer notwendigem Speicheraufwand 
und deren Verwaltung der Datenmengen.

Kann man nun beides geschickt kombinieren, so wie beim RCC Netzwerk, 
dann ist es möglich die Parallelisierbarkeit drastisch zu verbessern. 
Die Grundkomplexität des schon bestehenden Teils des Netzwerkes, der 
nicht mehr weiter trainiert wird! wächst nur linear. Die 
Kandidatenneuronen, die als einziges trainiert werden, können wiederum 
mit genetischen Verfahren, parallel evolutioniert werden. Faktische also 
ein Rechner pro Neuron. Die restlichen für das Training notwendigen 
Netzwerkstrukturen sind für all diese Recheneinheiten aber fix und eine 
gemeinsam genutzte ReadOnly Resource.

Back to Topic: was mich eigentlich interessiert ist die Frage wie die 
ein Netzwerk aus meheren Layern dazu bewegen nun seine Arbeitsweise 
umzukehren und wie sie einen Layer mit Daten anregen. Auf alle Fälle 
fallen mir spontan unzählige interessante Anwendungen ein. Man stelle 
sich vor ein netzwerk das auf die Erkennung und Klassifizierung von 
Musik trainiert wurde. Also: das Netzwerk erkennt "Klassik/Pop/Rock, 
Orchester/Band/Chor, Musikinstumente, Taktbasis -> Beethoven -> die 
Neunte. Und nun lassen wir es umgedreht arbeiten und regen es so an das 
man sagt: "Hallo Netzwerk ich wünsche mir Beethovens Klassik + Queens 
Rock Ballade" und macht dann Musik.

Oder male mir ein Bild -> "Abstrakt und Rubens Stil".

Oder: "Netzwerk evolutioniere alle möglichen Entscheidungen deines 
erlernten Handlungsmodelles des dazugehörigen Menschen und berechne die 
wahrscheinlichste Reaktion wenn ich diesem Menschen in real dies oder 
das zum kaufen anbiete". Man trainiert also erstmal für einen realen 
Menschen an Hand aller gesammelten Bewegungsprofile ein Netzwerk. Quasi 
lebenslang läuft auf dem Server ein trainiertes Abbild eines Menschens 
mit. Und bei Bedarf dreht man dessen Funktion um und setzt es als 
Simulation verschiedenen Angeboten aus. Wie hoch ist dann die 
Wahrscheinlichkeit das der reale Mensch Produkt X kauft, welchen Preis 
ist er bereit zu zahlen und unter welchen Umständen kann ich den profit 
noch steigern (Zb. packe ne rote Schleife drum Sie steht drauf und kauft 
mehr). Und zusätzlich visualisiert mir dieses Menschen-Netzwerk-Abbild 
auch noch die Trigger-Zusammenhänge die mich zum kaufen bewegen oder es 
zeigt uns welche Fehlentscheidungen der Mensch trifft weil sein 
natürliches "Netzwerk" den gleichen Trainingsfehlern unterliegt wie das 
simmulierte. Bei perfekt gesammelten Bewegungsprofilen unterliegt ja das 
künstliche Netzwerk den fast gleichen "Trainingsdaten" wie dessen 
natürliches Original.

Wahnsinn.

An der Rechenpower wird sowas in Zukunft mit Sicherheit nicht scheitern, 
da bin ich mir sicher.

von Hagen R. (hagen)


Lesenswert?

Geht man von den Gesetzmäßigkeiten der industriellen Massenproduktion 
aus so wird es einen Breakeven Point nach unten geben ab dem man den 
Profit durch Intensivierung der Massenproduktion nicht mehr steigern 
kann. Diesen Punkt haben wir heutzutage längst erreicht. Ein Ausweg ist 
dann die Konsumgeschwindigkeit zu erhöhen, auch das haben wir schon zB. 
mit der geplanten Obsoleszenz. Und auch hier wird es einen BreakEven 
Point nach unten geben der dann erreicht ist wenn die zB. ökologischen 
Schäden den zukünftigen Profit auffressen werden. Auch den Punkt haben 
wir fast erreicht. Nächster Ausweg ist die Entwicklungsgeschwindigkeit 
neuer Technologien zu erhöhen, sprich immer neuere Features immer neuere 
angeblich bessere Produkte. Auch hier gehts nur bis zu einem gewissen 
Punkt bis der Kunde sagt: ach ich bin mit Handy zufrieden ich brauche 
nicht mehr und fühle mich betrogen und gehetzt immer alle Trends 
mitmachen zu müssen.

Was bleibt? Die Optimierung der individuellen Angebote. Statt 
"Fließband-Kunden" mit immer identischen Bedürfnissen und Eigenschaften 
also höchst individualisierte Angebote, quasi für jeden Kunden und 
Produkt und Zeitpunkt der Entscheidungsfindung individuelle 
Kaufverträge. Und da denke ich steuern wir gerade hin. Mit einem "Tool" 
das diesen Prozess optimal vorhersagen kann lässt sich enorm Geld 
verdienen.

Ich denke Google wird das begriffen haben.

Grundsätzlich keine schlechte Sache denke ich, es hängt vom 
gesellschaftlich akzeptierten und regulierten Kontext ab.

Ich stell es mir schon praktisch vor wen mich mein "persönlicher 
Assistent", das mit meinen Bewegungsdaten trainierte Netzwerrk, an Hand 
seiner Simulationen der möglichen Zukünfte davon abrät mit meinem 
Herzschaden den Sprung von der Brücke am Gummiseil zu wagen. Oder 
umgedereht durch Abgleich mit dem "Assistenten" der hübschen Frau am 
anderen Tisch im Cafe andeutet das es sich lohnt mal ein Risiko 
einzugehen. Wenn die letztliche Entscheidung darüber transparent bei 
jedem persönlich liegt sehe ich da eher Vorteile, solange ich das System 
und dessen Funktion verstanden habe und vertraue.

von Uhu U. (uhu)


Lesenswert?

Hagen Re schrieb:
> An der Rechenpower wird sowas in Zukunft mit Sicherheit nicht scheitern,
> da bin ich mir sicher.

An Wahnsinn vermutlich auch nicht...

Hagen Re schrieb:
> Die Ausgangsschicht besteht überlicherweise aus Neuronen die
> jeweils ein Buchstabe des Alphabeths und ein Fehlerausgang besteht.

Wie trainiert man den Fehlerausgang?

von Michael S. (mikel_x)


Lesenswert?

Uhu:
"Wie trainiert man den Fehlerausgang?"

Der wird einfach per NAND mit einem idealen Menschenmodell verknüpft.

von Stefan M. (derwisch)


Lesenswert?

Hagen Re schrieb:
> Auch hier gehts nur bis zu einem gewissen
> Punkt bis der Kunde sagt: ach ich bin mit Handy zufrieden ich brauche
> nicht mehr und fühle mich betrogen und gehetzt immer alle Trends
> mitmachen zu müssen.

Wundert mich, das nicht schon längst bei vielen dieser Punkt erreicht 
ist.
Ich habe mir z.B. nie ein Smartphone angeschafft.

von Hagen R. (hagen)


Lesenswert?

Nun da das Netzwerk den Morsecode auf Grund seiner Kodierung nur 
sequentiell erlernt muß es Zwischenschritte geben. Diese entstehen 
dadurch das ein Strich in zwei aueianderfoldgenden Mustern als Punkt 
kodiert wird. Die "Abtastfrequenz" ist also doppelt so hoch, bzw. ein 
Punkt lang. Dies gilt für Punkt/Strich und die Pausen dazwischen.

Dadurch kann es passieren das das Netzwerk aktuell im Morsecode Stream 
mitten innerhalb eines Striches oder Pause = Symboles ist. Um das 
anzuzeigen trainiert man den "Fehlerausgang". Dieser Ausgang zeigt also 
an wann die anderen Ausgänge der Symbole Gültigkeit haben. Dies ist sehr 
leicht zu trainieren und die Traingsdaten sind ebenfalls einfach zu 
erzeugen. Male dir SOS als Morsecode auf und taste dieses Signal mit 
Schrittweite "Punkt" ab. Wenn beim Abtasten ein gültiges Symbol 
abgetastet wurde geht der Fehlerausgang auf 0, ansonsten auf <> 0. 
Gleiches gilt für die Abtastung der Pausenlänge, man trainiert einen 
Ausgang auf die Pausenlänge um das Ende einer Kommunikation etc.pp. zu 
erkennen. Übrigens wenn ich mich recht errinnere hatte das finale 
Netzwerk 9 Neuronen und ansonsten nur die Neuronen für Ein/Ausgabe 
Schicht, Fehlerquote 0%, und bei jedem Training entstand nach 
Abstraktion immer das identische Minimal-Netzwerk, nur die 
Trainingsiterationen variierte. Interessant war aber für mich eher das 
alle Netzwerke mit unterschiedlichen Aktivierungsfunktionen -> 
Sigmoid/Gaussian/Sin/Cos identische Abstraktionen besitzen (maW. 
Aktivierungsfunktionen sind oft überschätzt)

Diese Abtastung muß man so machen, da man die Ausgänge eines Neurons 
nach Möglichkeit nur auf ein Feature trainieren möchte. Man hätte die 
Ausgänge auch so trainieren können das sie nur dann ein Symbol anzeigen 
wenn es korrekt erkannt wurde. Dh. erst duch die Analyse aller Ausgänge 
und der Suche nach "alle sind 0" würde man erkennen können das man 
mitten im Symbol dekodiert hat. Das ist aber schlecht. Besser ist es wie 
ich es beschreibe denn so kann man selbst wenn der Fehlerausgang sagt 
"mitten im Symbol" denoch die Symbolausgänge analysieren und sagen 
"falls es korrekt wäre dann wäre es mit x% diesem Symbol ähnlich". Davon 
abgesehen: es ist doch wohl logisch das diese Auswertung auch ein 
Netzwerk für uns machen kann statt ein blöder MinMax 
Bewertungalgorithmus, das wäre ja profan ;)

Vereinfacht ausgedrückt könnte man es auch so bauen: ein sequentiell 
lernfähiges Netzwerk konzentiert sich darauf wann ein gültiges Symbol 
erkannt wurde und ein zweites Netzwerk wird nur auf die Erkennung der 
Symbole trainiert. Aber! wie du oben schon selbst geschrieben hast ist 
das bei neuronalen Netzwerken eher ungünstig da man so von vornherein 
eventuell nicht sichtbare aber erlernbare Zusammenhänge ausschließt.

Ich habe damals als erstes Experiment exakt dieses Problem programmiert 
da es von den Erfindern des RCCs selbst als Szenario beschrieben wurde. 
Ergebnis damals: RCCs erzeugten Netzwerke mit bis dato nie dagewesener 
Effizienz. Es gab damals mathematische Abhandlungen darüber welche 
Mindestkomplexität bis dahin bekannte Netzwerke haben müssen damit sie 
das Morsecode Problem sauber lösen können. Die bis dahin als bewiesene 
gültige Annahme wurde von RCcs widerlegt, es ging mit RCCs mit noch 
weniger Neuroen als bis dahin vermutet (exakt 1 Neuron weniger als die 
mathem. ermittelte Minimalkonfiguration). Ebenso wurde die 
Geschwindigkeit und Konvergenzgeschwindigkeit zur korrekten Lösung 
analysiert. Auch hier zeigte sich das RCCs das Problem deutlich 
schneller erlernen konnten. Das alles waren ja die Gründe, neben meinem 
Vorwissen in genetischen Algortihmen und Evolutionsstrategien, warum ich 
überhaupt die RCCs angegangen bin.

Nun, das heist aber nicht das dieser RCC Netzwerktypus, der Weisheits 
letzter Schluß ist. Dieser Typ versagt jämmerlich bei vielen anderen 
Problemen (zb. Bilderkennung). Aber er ist eben in der Lage ein 
"Memoryeffekt" auszubilden und somit Mustersequenzen zu erlernen die 
sequentiell über Einzelmuster hinausgehen. Eigentlich logisch: 
Angenommen du hast ein normales Netzwerk mit 3 Neuronen in 3 Layer, also 
pro Layer ein Neuron. Der Ausgang des ersten Neurons dient als Eingang 
im ersten Neuron, Ausgang vom 2. geht zum 2. und 1., Ausgang 3. geht zum 
3.,2.und 1. Eine "Entscheidung" die sequntiell durch das Netzwerk läuft 
wird also nach 1, 2 und 3 Mustern auch als Input für die Bewertung 
aktueller Muster herangezogen. Es entsteht ein Feedback innerhalb des 
Netzwerkes das es dem Netz ermöglicht seine eigenen vergangenen 
"Entscheidungen" für aktuelle Muster heranzuziehen. Es kann sich also an 
bis zu 3 vergangene Entscheidungen/Muster "erinnern", es hat ein 
Gedächtnis.

von Hagen R. (hagen)


Lesenswert?

Stefan M. schrieb:
> Hagen Re schrieb:
>> Auch hier gehts nur bis zu einem gewissen
>> Punkt bis der Kunde sagt: ach ich bin mit Handy zufrieden ich brauche
>> nicht mehr und fühle mich betrogen und gehetzt immer alle Trends
>> mitmachen zu müssen.
>
> Wundert mich, das nicht schon längst bei vielen dieser Punkt erreicht
> ist.
> Ich habe mir z.B. nie ein Smartphone angeschafft.

Mich wundert eher der "Fakt" das wenn ich annehme das real dieser Punkt 
schon erreicht wurde die meisten Menschen nicht die Konsequenzen zu 
ziehen bereit sind, sondern eher versuchen mit noch mehr Konsum die 
entstehende innere Qual über die Sinnlosigkeit des Ganzen, ertragen zu 
wollen. Oder anders formuliert: Statt die realen Ursachen zu 
indentifizieren und zu beseitigen man lieber an den Symptomen 
rumdoktert.

von P. M. (o-o)


Lesenswert?

Hagen Re schrieb:
> Back to Topic: was mich eigentlich interessiert ist die Frage wie die
> ein Netzwerk aus meheren Layern dazu bewegen nun seine Arbeitsweise
> umzukehren und wie sie einen Layer mit Daten anregen.

Ich schätze mal, das funktioniert so (wird im Artikel kurz erwähnt, aber 
nicht weiter erklärt):

Auf der Ausgabe-Schicht werden die Neuronen auf ein bestimmtes Resultat 
eingestellt - z.B. wird das Bananen-Neuron auf 1 gesetzt, und die 
Neuronen für Apfel, Birnen, Kiwi, Erdbeeren usw. werden auf 0 gesetzt. 
Dann werden alle Kombinationen an Eingangs-Werten gesucht, die zu dieser 
Ausgabe führen. Natürlich sind das "unendlich" viele, und die meisten 
davon sehen nicht aus wie ein Bild. Nun sucht man sich eine 
Eingangs-Kombination, die von ihren Eigenschaften einem natürlichen Bild 
möglichst nahe kommt. Das trifft beispielsweise auf Kombinationen zu, wo 
benachbarte Pixel jeweils eine hohe Korrelation haben.

Algorithmisch wird man das natürlich nicht so lösen, dass man zuerst 
"alle" Eingangskombinationen sucht und dann die bildhafteste auswählt, 
sondern man wird vermutlich ein Optimierungsproblem lösen, wo man 
gleichzeitig einen möglichst passenden Input für den gegebenen Output 
UND möglichst bildhafte Eigenschaften (hohe Korrelation von 
Nachbarpixeln) des Inputs sucht. Würde mich nicht wundern, wenn das in 
einem riesigen linearen Gleichungssystem endet ;-)

von Uhu U. (uhu)


Lesenswert?

Welche Bibliothek würdest du empfehlen, wenn man Neuronale Netze in 
eigene Programme einbauen will?

Ich habe bisher mit einer Ruby-Bibliothek erste Flugversuche mit ewig 
langen Testreihen gemacht, um etwas Gefühl für den Einfluss der 
Netzwerktopologie bei der Individuenerkennung von Wachtelkönigen zu 
bekommen - es war fast wurscht, wieviele Layer das Teil hatte und wie 
breit die waren, außer dem ersten und dem letzten natürlich. Nachteil 
war die äußerst schwache Recheneffizienz, aber das ist bei Ruby im Preis 
inbegriffen.

Für "echte" Berechnungen hat sich das R-Paket ganz gut bewährt, das aus 
einem Ruby-Programm zur Merkmalsextraktion aufgerufen wird. Letztere war 
im Nachhinein betrachtet der aufwendigere Teil.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Für Deep Learning ist das Python-basierte Theano im Moment sehr beliebt 
(http://deeplearning.net/software/theano/). Für 
Standard-Netzwerkstrukturen gibt es dabei Wrapper die einem die Arbeit 
abnehmen alles von Hand zu schreiben (mit Keras, http://keras.io/, habe 
ich gute Erfahrungen gemacht). Auch sehr einfach und beliebt ist Torch 
(http://torch.ch/), das basiert auf Lua. Beide unterstützen GPUs.

Die klassischen NN-Toolkits in MATLAB, R & Co. sind für Deep Learning 
weniger geeignet, da fehlen z.B. Knotentypen wie ReLU und Maxout und 
Techniken wie Pre-Training und Dropout Training.

von Lukas P. (lks)


Lesenswert?

Andreas Schwarz schrieb:
> Für Deep Learning ist das Python-basierte Theano im Moment sehr beliebt
> (http://deeplearning.net/software/theano/).

Kann ich auch empfehlen. Bin gerade berufsbedingt mit ANNs beschäftigt. 
Außerdem würde ich mir vorher das hier mal durchlesen 
(http://cs231n.stanford.edu/syllabus.html), damit bekommt man einen 
groben Überblick und Anwendungstipps (ich bin allerdings in der 
Bildverarbeitung unterwegs, dem entsprechend ist das schon recht 
spezifisch). Im Zusammenhang mit Theano wäre Lasagne vielleicht noch 
interessant (https://github.com/Lasagne/Lasagne).

Gruß

von Hagen R. (hagen)


Lesenswert?

P. M. schrieb:
> Hagen Re schrieb:
>> Back to Topic: was mich eigentlich interessiert ist die Frage wie die
>> ein Netzwerk aus meheren Layern dazu bewegen nun seine Arbeitsweise
>> umzukehren und wie sie einen Layer mit Daten anregen.
>
> Ich schätze mal, das funktioniert so (wird im Artikel kurz erwähnt, aber
> nicht weiter erklärt):
>
> ....einem riesigen linearen Gleichungssystem endet ;-)

Da bin ich mir nicht so sicher. Meine Vermutung geht da in eine andere 
Richtung, nämlich das die für die SPON/Bild/Heise Reporter eine weniger 
geschickte Vereinfachung gemacht haben und die Darstellung des NNs auf 
gewöhnliche NNs bezogen haben (also Grafik mit Neuronen etc.pp.)
Solche NNs sind nämlich unidirektional in ihrem Verarbeitungpfad.

Ich denke eher das die wie üblich bei Bildverarbeitungen mit 
SOM-Matrix/Hidden markov Modelle etc.pp. arbeiten die insich 
bidirektionale Verarbeitungspfade ermöglichen. D.h. schon das Training 
solcher Netzwerke wäre so möglich das es im Grunde irrelevant ist wo 
Ein- oder Ausgangsschicht sich befindet, ist reine Definition welche 
Schicht welche Funktion hat. Allerdings kenne ich solche NNs nur als 
Layerfreie Netze.

von Hagen R. (hagen)


Lesenswert?

Uhu Uhuhu schrieb:
> Welche Bibliothek würdest du empfehlen, wenn man Neuronale Netze in
> eigene Programme einbauen will?

Kann ich nicht. Meine Zeit mit NNs liegt im Bereich 1990-97.

von Hagen R. (hagen)


Lesenswert?

Uhu Uhuhu schrieb:
> Netzwerktopologie bei der Individuenerkennung von Wachtelkönigen zu
> bekommen

Damit meinst du deren "Stimme" eg. Singen ?
Ich habe mich nachdem ich die Schrifterkennung so wie beim Palm das "One 
Stroke System" nachgebaut hatte auch an Sounderkennung versucht. Damit 
bin ich nur bedingt weiter gekommen, lag vielleicht am Ansatz. Auf alle 
Fälle denke ich nicht das man bei Stimmerkennung einfach den Saound in 
ein Netzwerk füttern kann und das dann auf ein Individuum trainieren 
kann. Ich hatte damals mit sehr schmalen 3D-FFTs = Wasserfalldiagrammen 
gearbeitet und schnell festgestellt das meine Kompetenz die Datenmengen 
auf diese Weise zu reduzieren nicht ausreichend ist, kurz gesagt: die 
nötige Rechenpower war für mich nicht algorithmisch in den Griff zu 
bekommen. Zudem konzentrierte ich mich in diesem Zeitraum eher auf 
Kryptoanalyse Mithilfe von NNs für spezialisierte Zwischenberechnungen, 
was auch dämlich war ;)

von Tal S. (Firma: This is Dreamland) (sssss) Benutzerseite


Lesenswert?

Hagen Re schrieb:
> Wenn die letztliche Entscheidung darüber transparent bei
> jedem persönlich liegt sehe ich da eher Vorteile, solange ich das System
> und dessen Funktion verstanden habe und vertraue.

Die Benutzeroberfläche dient nur dem Benutzen.

von Uhu U. (uhu)


Lesenswert?

Hagen Re schrieb:
> Damit meinst du deren "Stimme" eg. Singen ?

Ja, das ist ein ziemlich simpler Ruf, der sich aus einer Anreihung von 
einzelnen Pulsen zusammensetzt. Er klingt so ähnlich, als würde man mit 
dem Finger die Zinken eines Kamms (mit gleich langen Zinken) anreißen. 
Zur Indiviuenerkennung reicht es aus, das NN auf die Zeitabstände der 
ersten 15 Pulse zu trainieren.

Das ist ein extrem einfaches Beispiel. Bei anderen Arten ist die 
Merkmalsextraktion deutlich kniffliger.

von Hagen R. (hagen)


Lesenswert?

und die Tiere selber unterscheiden dann nicht nur die Tonlage sondern 
auch die Abstände zwischen den einzelnen Pulsen? Also die Pulsabstände 
sind ebenfalls entscheidend?

Wenn dem so wäre dann sind eben besonders solche recurrenten Netze von 
Interesse. Nimmt man herkömliche Netze für solche Probleme dann hat man 
oft zwangsläufig das Problem einer großen Inputschicht. Man fängt an 
diese Inputschicht künstlich zu verkleinern, aus der Not heraus, und 
wendet Vorfilterungen an. Eben zb. FFTs oder Wavlets oder sonstige 
Filterungen . Und handelt sich somit noch mehr Probleme ein.

Zb. stellen wir uns mal vor es gibt 10-15 solcher Pulse. Die Pulse 
selber können nur in 3 varianten vorkommen. Normalerweise könnte man 
also sagen: lerne die 3 Grundarten von Pulsen und dann nur noch deren 
zeitlicher Kombination von beliebig aueinadnerfolgender Pulse. 
Recurrente Netze können genau das, sie differenzieren die 3 Pulsarten, 
deren sequentielle Kombination und Geschwindigkeit=Pausenzeiten. Alles 
als drei getrennte Feature und sequentiell jeden Puls als einzelnes 
Muster. Normal Netzwerke wo man den kompletten Ruf als ein Muster auf 
einmal der kompletten Inputschicht präsentieren muß haben damit 
Probleme.

Aber der relevante Vorteil ergibt sich erst später. Bei zB. 15 Pulse a 3 
Kombinationen ergibt sich eine große Kombinationsvielfalt. Normale Netze 
versuchen über alle Pulse hinweg quasi alle Kombinationen zu erlernen. 
Recurrente Netze dagegen können am Ende kompaktere Strukturen bilden 
weil sie über die drei Feutures "Pulsart", "sequentielle Kombination", 
"Pausendauer" für jede dieser Features quasi eine Komprimierung 
durchführen können und das abhängig über alle drei Feature hinweg. Sie 
erlernen also nicht alle Kombinationen sondern nur die die für eine 
Vorgelart von Relevanz sind. Hm, anders formuliert: wenn die ersten drei 
Pulse nur eine Gesamtanzahl an Kombinationen von zb. 7 haben dann 
erlernt dies das recurrente Netz sehr gut. Oder wenn sich dieses Muster 
bei allen Rufen später wiederholt im individuellen Ruf, auch 
Individuenübergreifend, kann es das abstrahieren und exakt die selben 
Neuronengruppen feuren dann. Das Netz bildet also diese Gruppe nur 
einmal aus und benutzt sie mehrfach für verschieden Positionen im 
Muster. Sowas können andere Netze uU. nicht, sie würden für ähnliche 
Teilmuster an unterschiedlichen Positionen auch eigene Neuronengruppen 
herausbilden.

Wie weit bist du denn gekommen? Schribst oben "bedingt" erfolgreich.

von Hagen R. (hagen)


Lesenswert?

Letzendlich ist die Idee dahinter ja recht simpel. Alles was eine 
gesuchte Information enthält zusammengesetzt aus zeitlich 
aufeinanderfolgenden Einzelinformationen wird mit recurrenten Netzen 
auch als sequentiell ablaufendes Muster erlernt. Statt also das WAV-File 
eines Sounds komplett der Inputschicht zu präsentieren wird hier Sample 
für Sample der Inputschicht präsentiert. Das reduziert natürlich die 
Breite der Inputschicht und überlässt zudem die sequentielle Analyse 
auch noch dem Netzwerk. Das Netz kann somit auch mit Komplettmustern 
umgehen deren Länge variabel ist. Das problem der Normierung der 
Eingangsdaten wird teilweise ausgelagert ins Netzwerk.
Ich denke du wirst auch schnell erkennen das nun auch der 
"Fehler"-Ausgang "kompletten Ruf" bzw. "neuer Ruf beginnt" Sinn ergibt.

Übrigens: intuitiv würde man meinen das es besser wäre die Inputschicht 
breit zu machen damit man einen Ruf quasi paralell erlernen kann. Bei 
genauerem Betrachten stellt man aber fest das dies eben nicht so ist.

von Uhu U. (uhu)


Lesenswert?

Hagen Re schrieb:
> und die Tiere selber unterscheiden dann nicht nur die Tonlage sondern
> auch die Abstände zwischen den einzelnen Pulsen? Also die Pulsabstände
> sind ebenfalls entscheidend?

Das Muster der Pulsabstände allein reicht aus, um die Viecher zu 
unterscheiden, die Tonhöhe kann man außer Acht lassen.

Zur Vorverarbeitung habe ich als erstes das Signal gleichgerichtet und 
dann durch einen zweistufigen digitalen Tiefpass geschickt. Anschließend 
einfach die Anzahl Samples zwischen den Maxima gezählt und dann mit 
diesen Werten als Feature-Vektor das NN mit 15 Eingängen gefüttert.

> Wie weit bist du denn gekommen?

16 Individuen konnte ich damit unterscheiden, zweimal zwei Aufnahmen 
waren nicht zu unterscheiden, also vermutlich jeweils derselbe Vogel.

Mich interessiert vor allem die Individuenerkennung, als nächstes möchte 
ich den Waldkauz näher unter die Lupe nehmen - von denen kann ich manche 
Individuen ohne Hilfsmittel am Ruf erkennen. Allerdings sind die 
Oszillogramme deutlich komplizierter, als bei den Wachtelkönigen.

Hagen Re schrieb:
> Das Netz kann somit auch mit Komplettmustern umgehen deren Länge
> variabel ist.

Das Problem kann man beim Wachtelkönig einfach dadurch umgehen, dass man 
nur die ersten 13-15 Pulse berücksichtigt Rufe mit weniger als 15 Pulsen 
gibt es zwar auch, aber Individuen, die das immer machen, dürften sehr 
selten sein, wenn es sie überhaupt gibt. Die kurzen Rufe dürften auf 
irgend welche äußeren Ereignisse zurückzuführen sein.

> Ich denke du wirst auch schnell erkennen das nun auch der
> "Fehler"-Ausgang "kompletten Ruf" bzw. "neuer Ruf beginnt" Sinn ergibt.

Darüber habe ich lange nachgedacht... Letztlich lohnt sich der Aufwand 
nicht, weil zur Erkennung wenige Rufe ausreichen und die Aufnahmen auch 
noch allen möglichen anderen Dreck enthalten können, der die Rufe 
verstümmelt, auch Überlagerungen mehrerer Rufer.

Das Einfachste ist, sich die Oszillogramme anzusehen und "schöne" Rufe 
herauszupicken und damit die Erkennung zu füttern. Der weit größere 
Aufwand ist, Aufnahmen mit ausreichender Qualität zu bekommen.

von Hagen R. (hagen)


Lesenswert?

Uhu Uhuhu schrieb:
> Der weit größere
> Aufwand ist, Aufnahmen mit ausreichender Qualität zu bekommen.

Gute Trainingsdaten, und damit meine ich nicht nur Daten zum Training 
sondern auch zur Einschätzung des Erfolges des Trainings, sind immer das 
Problem. Eigentlich sind das die nervigsten Arbeiten.

Deswegen ist ja der verlinkte Beitrag so interessant. Ich hatte mir 
damals immer schon gewünscht ind die Arbeitsweise des Netzwerkes 
reinschauen zu können. Alleine der Aufwand beim Morsecode Experiment, 
die Abstraktion der verschiedenen Netzwerke, um sie auf vergleichbare 
Funktion zu überprüfen hat länger gedauert als der ganze Rest.

Allerdings fällt mir auf das du sehr starkes Preprozessing betrieben und 
damit im Vorfeld schon eine starke Abstraktion durchgeführt hast. Meiner 
Erfahrung nach ist das oft ein Problem warum später die Netze nicht gut 
konvergieren. Ich bevorzuge es eher diesen Aufwand zu verringern und dem 
Netz die Entscheidungen zu überlassen. Das führt aber zu längeren 
Trainingszeiten die sich am Ende aber meistens lohnen, wenn man das Ziel 
hat möglichst kompakte Netze für die Laufzeit zu bekommen. Also: 
aufwendigers Training das offline erfolgen kann dafür bessere Netze zur 
Laufzeit die online rechnen können.

von Hagen R. (hagen)


Lesenswert?

Uhu Uhuhu schrieb:
> Das Muster der Pulsabstände allein reicht aus, um die Viecher zu
> unterscheiden, die Tonhöhe kann man außer Acht lassen.

Hm, d.h. die Tiere selber identifizieren den Absender an Hand der 
Puls/Pausen und der Inhalt der Nachricht dann über die anderen 
Eigenschaften? Ich hätte eher vermutet das es umgedreht ist, Tonlage als 
Stimme fürs Tier und Puls/Pausen für den Inhalt.

von Uhu U. (uhu)


Lesenswert?

Hagen Re schrieb:
> Allerdings fällt mir auf das du sehr starkes Preprozessing betrieben und
> damit im Vorfeld schon eine starke Abstraktion durchgeführt hast.

Auf diese Weise wurde das Problem überschaubar und die Rechenzeiten 
erträglich und vor allem konnte ich einen Einstig in diese doch ziemlich 
undurchsichtige Technik finden...

> und der Inhalt der Nachricht dann über die anderen Eigenschaften?

Ob man da von einem Inhalt reden kann, glaube ich weniger. Der ganze Ruf 
sagt wohl nur "ich bin hier" und an den Qualitäten des Rufes erkennt der 
Rivale oder ein Weibchen, wie fit der Rufer ist.

Intelligenzbestien sind die Wachtelkönige nicht.

An den Revierstrophen der Waldkäuze kann man auch als Mensch sehr 
deutliche Qualitätsunterschiede hören: das eine Männchen huddelt das 
Tremolo am Ende der Strophe nur so ganz flüchtig hin, andere bringen es 
sehr sauber und kräftig moduliert und bei manchen hört man, dass sie 
irgend eine Infektion, oder Luftröhrenwürmer haben, da kommt die Strophe 
dann mit Wackelkontakt oder die Stimme überschlägt sich.

Das Rufrepertoire der Waldkäuze ist ziemlich reichhaltig, während der 
Wachtelkönig nur diesen einen Ruf zustande bringt.

Ich denke, dass die rückgekoppelten NNs für Arterkennung geeigneter 
sind. Ob man aber einfach einen wav-File vorne reinschieben kann und 
hinten die Artenliste heraus bekomt, da habe ich doch so meine Zweifel, 
denn auf den Aufnahmen ist mit allem möglichen zu rechnen, das mit einer 
Mono- oder Stereoaufnahme nicht mehr sauber zu trennen geht. Wenn sich 
der Hörer selbst im Feld bewegen kann, kann er Informationen gewinnen, 
die auf einer Aufnahme nur zusamengematscht rüber kommen.

von Tal S. (Firma: This is Dreamland) (sssss) Benutzerseite


Lesenswert?

@Uhu Uhuhu
Von oben läßt sich vor lauter Wald oft KEIN EINZIGER Baum erkennen.

von Tal S. (Firma: This is Dreamland) (sssss) Benutzerseite


Lesenswert?

@Hagen Re
Aha, ein Mann ohne Gedächtnis ALSO!

von Hagen R. (hagen)


Lesenswert?

Uhu Uhuhu schrieb:
> Ob man aber einfach einen wav-File vorne reinschieben kann und
> hinten die Artenliste heraus bekomt, da habe ich doch so meine Zweifel,
> denn auf den Aufnahmen ist mit allem möglichen zu rechnen, das mit einer
> Mono- oder Stereoaufnahme nicht mehr sauber zu trennen geht. Wenn sich
> der Hörer selbst im Feld bewegen kann, kann er Informationen gewinnen,
> die auf einer Aufnahme nur zusamengematscht rüber kommen.

Ich kann deine Bedenken nachvollziehen, ging/geht mir auch so. Deshalb 
hatte ich ja mit 3D-FFTs die Waves prozessiert und dann auf ausgewählte 
Frequenzbereiche reduziert und diese als an separate Inputs geführt. Das 
reduziert aber nicht die Komplexität im Vergleich zu SampleBySample 
Technik, sondern im Gegenteil musste ich feststellen. Die Trennung von 
Störgeräuschen ist mit oder ohne Preprozessing immer die Aufgabe des 
Netzwerkes, das soll ja gerade die wesentlichen Merkmale erlernen. Es 
ist meiner Meinung nach eher eine Frage der Trainingsdaten. Und in 
deinem Fall musst du das Netzwerk auch mit FALSE-Daten trainieren bzw. 
verifizieren.

von Uhu U. (uhu)


Angehängte Dateien:

Lesenswert?

Hagen Re schrieb:
> Und in deinem Fall musst du das Netzwerk auch mit FALSE-Daten trainieren
> bzw. verifizieren.

Das ist leicht gesagt, das Spektrum an Dreck, der in einer Aufnahme sein 
kann, ist kaum vorhersehbar. Was ich mir vorstellen könnte, wären 
Markierungen in den Trainingsdaten, die sagen, "hier kommt ein Ruf" und 
"hier endet er".

Eventuell wäre es besser, den Job aufzuteilen: als erstes von einem 
eigenen NN die Rufe herauspicken lassen und von einem zweiten die 
Identifikation auf dem Output des ersten ausführen.

Zum Anhang: das obere Oszillogramm ist ein (handverlesener) Originalruf, 
das mittlere ist das gleichgerichtete und tiefpassgefilterte Signal, das 
untere enthält für jedes Maximum im mittleren einen Peak. Das NN wird 
nur mit den Zeitabständen zwischen den Peaks gefüttert.

Da der Feature-Vektor nur 15 Fließkommawerte enthält, kann man zumindest 
durch einfachen Vergleich grob prüfen, ob das NN was Plausibles 
augegeben hat. Meine Überprüfung bestand darin, dass ich aus den 
Aufnahmen jeweils ~20 Rufe extrahiert habe und dann mit der Hälfte davon 
das NN trainiert und mit der anderen Hälfte geprüft, ob das "richtige" 
Ergebnis heraus kommt. Das hat sehr gut geklappt.

Sinn der Übung soll sein, die Wanderungen von max. 40-50 Vögeln in einem 
Feuchtgebiet nachzuvollziehen und das auch nur in der relativ kurzen 
Zeit, in der sie rufen. Evtl. auch noch die Wiedererkennung "alter 
Kunden" aus den Vorjahren - die zeitlichen Muster in den Rufen sind über 
lange Zeit stabil.


Wie müsste man es anfangen, ein Netz zu konstruieren, das den 
Originalsound so einliest, wie er aus dem A/D-Wandler kommt und den 
"Namen" des Rufers ausspuckt?

Das Netz müsste Dreck von Rufen unterscheiden können, überlagerte Rufe 
aussondern und dann die individuellen Feinheiten herausfinden.

Wie müssten die Trainingsdaten aussehen? Für jede Aufnahme eine 
Taktspur, die PCM-Daten und an passender Stelle als dritte Spalte der 
"Name" des Rufers?

von Hagen R. (hagen)


Lesenswert?

Hi Uhu

dein Vorgehen mit der Analsys der Peaks ist verständlich. Wenn ich das 
auf RCCs erweitern wollte dann einfach indem ich das RCCs mit den 
Zeitlichen Abständen als Zahlenwerte sequentiell füttern würde. D.h. man 
ermittelt die Abstände als Integer Werte und das ist das sequentielle 
Muster das das Netzwerk erlernen soll. Die Traingsdaten bestehen erstmal 
aus den durch dich erkannten Rufen, sauber separiert und ohne "fehler". 
Dann erweiterst du dieses Muster während des Trainings live am Anfang 
und Ende mit zufälligen Teilstücken aus anderen Rufen und mutierst den 
sauberen Ruf noch mit zufälligen Zahlenwerten innerhalb des Musters. Mit 
anderen Worten: aus wenigen hochqualifizierten Rufen werden so viel mehr 
Testdaten erzeugt.

So enstehen die Mustervektoren für das Training der des Inputs des RCCs, 
hat ja nur einen. Exakt synchron zum Eingabemuster erzeugtst du einen 
Stream für die gewünschte Antwort. Dieser ist mehrspürig und besteht aus 
jeweils einer Spur für jedes Individuum. Wenn du also 50 Vögel 
ausgewählt hast sio entstehen 50 Spuren + 1 Spur für "hier ist Ruf 
erkannt worden". Diese Daten werden wiederum live während des Trainigs 
erzeugt. Für die Spur des zu erkenndenen Vogels gilt: ab dem moment wo 
der Ruf beginnt bis er endet alles 1 ansonsten 0 für den Ausgang. Für 
alle Individuuen die vor/nach/während des Rufes dynamisch per Zufall 
hinzugefügt wurden gilt das gleiche. Für alle Individuuen die nicht 
vorhanden sind immer 0 am Ausgang. Für den Ausgang "Ruf erkannt" nur am 
Ende des Rufes. So erzeugst du dir deine Trainingsdaten quasi aus dem 
"Nichts".

Einige wenige Rufe hebst du dir auf um sie später dem Netz vorzuführen. 
Soweit dazu wenn man dein Vorgehen erweitern würde.

Zur Laufzeit und auch bei Tests kannst du nun verschiedene Rufe einfach 
vermischen und nochmal mit Netz testen. Das Netz muß in der Lage sein 
sich überlappende Rufe sauber zu erkennen.

Aber ich würde es tatsächlich so manchen das man ohne Preprozessing 
arbeitet. Genauer gesagt, das Preprozessing beschänkt sich auf den 
Versuch mit möglichst schlechten Audiostreams zu trainieren. Also 
geringe Samplerate und Sampleauflösung und nur Integer. Letzteres ist 
absolut kein Problem, man benötigt keine große Dynamik oder Auflösung 
damit Netzwerke was erlernen können. Im idealfall liegen diese Parameter 
an der untersten Grenze wo ein netzwerk überhaupt noch was erlernen 
kann. Einfachste Vorgehensweise: reduziere die Audioqualität bis du 
selber nicht mehr sauber unterscheiden kannst. Das Netzwerk wird es 
besser können als du! so meine Erfahrung mit meinen Experimenten:) Ich 
habe mit der Analyse der fertigen Netze und der Frage "warum? kann das 
das Netz" Wochen verbracht.

Der Rest, also die Frage wie man aus den qualitiv sauber separierten 
Rufen wieder Trainingsdaten generiert ist so wie oben, nur viel 
einfacher. Man mischt digital einfach die Rufe.

Reizt mich ja schon die Sache, besonders weil ich wetten könnte das man 
damit sogar familiere Beziehungen aufdecken kann. Das würde ich sogar 
von Anfang an vorsehen. Man kann nämlich Netzwerke auch zusaätzlich so 
trainieren das deren Outputs die dicht nebeneinander in der eigentliche 
Netzwerkstruktur liegen, also deren programatische örtlichkeit, als 
Indiz der Ähnlichkeit zusätzlich heranzieht. In deinem Fall sortiert man 
die zu trainierenden Ausgangsmuster einfach nach Familienbezug. Shit: 
wenn ich nur mehr Zeit hät.

Auf alle Fälle scheint deine Problemstellung noch schön überschaubar und 
eben sehr nützlich zu sein.

Wenn du delphi/PASCAL verstehst kann ich dir meine Sourcen zum RCC 
mailen.

von Hagen R. (hagen)


Lesenswert?

Hm, ich würde neben dem Ausgang "Ruf erkannt" auch noch die Ausgänge 
"Ruf beginnt" und "Ruf endet" einbauen. Diese werden aber so trainiert 
das sie NICHT Individuuen-spezifisch sind. Also auch bei den Störungen 
dürch Teilstücke andere Rufe aktiviert werden.

Im Grunde erzeugst du separate Ausgänge für jedes einzelne Feature das 
dich interessiert.

Von der Zerlegung des Netzwerkes in hierarisch auf Aufgaben bezogenen 
Einzelnetze halte ich grundsätzlich nichts. Der Aufwand der sich daraus 
ergibt frist die Vorteile auf.

von Hagen R. (hagen)


Lesenswert?

Nochwas ist wichtig. Die Spezialausgänge wie "Ruf erkannt" sind kausal 
problematisch. Zb. "Ruf beginnt" geht schon auf 1 noch bevor das 
Netzwerk überhaupt genügend Informationen über den eigentlichen Ruf zu 
sehen bekommt. Interessanter Weise also ein Problem für das Netzwerk das 
es im Grunde nicht 100%'tig erlernen kann. Denoch wird es seine 
Fehlerquote reduzieren wenn genügend Infos vorhanden sind wenn sein 
"Lernziel" tatsächlich erreichbar ist.

Damit meine ich: man muß sich von seinen eigenen "intuitiv logischen" 
Vorstellungen verabschiedenen beim Design aber mit Hilfe dieser Logik im 
Nachhinhei sich erklären können das das Netz nichts erlernen kann. 
Schon im Vorfeld diese Logik walten zu lassen und somit die Daten wie du 
enorm zu reduzieren ist kontraproduktiv.

Nur den Ausgang "Ruf erkannt" würde ich gesondert behandeln. Dieser geht 
erst par Samples nach dem Ruf auf 1, am besten soviel später wie die 
zeitliche Tiefe des RCCs ist, was aber im Vorfeld nicht exakt 
verhersehbar ist. Zudem geht dieser Ausgang auch nicht nur für 1 
Samplezeitpunkt auf 1 sondern sollte in den Traingsdaten auf zb. 5 
Samples verlängert werden, so wie eine Impulsverlängerung. Das ist 
einfacher da du ja weist was so durchschnittlich die zeitspanne zwischen 
zwei Pulsen ist, in Sampleanzahl gerechnet.

von Hagen R. (hagen)


Lesenswert?

Hagen Re schrieb:
> Interessanter Weise also ein Problem für das Netzwerk das
> es im Grunde nicht 100%'tig erlernen kann. Denoch wird es seine
> Fehlerquote reduzieren wenn genügend Infos vorhanden sind wenn sein
> "Lernziel" tatsächlich erreichbar ist.

Erst diese Denkweise bringt dich dann später weiter. Oft stellt man dann 
bei der Analyse fest das über alle Individuuen hinweg nur die ersten par 
Pulse/Pieper real entscheidend sind. Exakt solche Erkenntnisse sind es 
die mich so verdutzt haben bei der späteren Analyse.

von Hagen R. (hagen)


Lesenswert?

Uhu Uhuhu schrieb:
> Wie müssten die Trainingsdaten aussehen? Für jede Aufnahme eine
> Taktspur, die PCM-Daten und an passender Stelle als dritte Spalte der
> "Name" des Rufers?

Die qualifizierten Rufe: PCM-WAVE Datei + Infos als Datensatz zum 
Individuum, am einfachsten ist der Dateiname = Name des Individuums. Ich 
würde aber wenn es geht noch weiter klassifizieren nach Alter/Geschlecht 
etc.pp. Ich denke diese Daten sammelst du ja eh schon.

Die Trainingsdaten werden dann daraus dynamisch erzeugt. So lang wie der 
sich dann ergebende Input-PCM-Stream ist ist der Stream für jeden der 
gewünschten Outputs. Dh. Inputschicht sehr klein, Outputschicht groß.
Datenmenge Input ist klein, Outputs groß aber dynamisch schnell 
erzeugbar.
Für jedes Individuum ein eigener Output.

Die Ouput-Trainingsstreams sind also auch PCM und synchron zum 
Input-PCM-Stream. Das netzwerk wird trainiert Sample by Sample.
Einen Takt als solche gibt es nicht, die Samplerate ist immer gleich und 
damit ist das die enthaltene Taktbasis. Die Implementierung eines RCCs 
enthält sowieso noch zusätzliche "Steuereingänge" die dem Netzwerk 
mitteilen das ein neuer Musterstream beginnt, diese sind eh schon 
vorhanden auf Grund der Funktionsweise des RCCs.

Stelle es dir so vor: du schaust dir in deinem WAVE Editor den Ruf an. 
Nun fügst du parallel dazu noch mehrere Tonspuren hinzu in denen nur die 
Werte 0 oder 1 als Samples vorkommen. Dieses Tonspuren sind die Outputs 
die du von "Hand" nach Zielsetzung auf 0 oder 1 definierst. Das ganze 
bekommt das Netzwerk zu sehen, als Input und Output-Muster. Simpel.

Diese Kodierung erscheint auf den ersten Blick sehr aufgebläht, ist es 
aber nicht aus Sicht des Recurrenten Netzwerkes. Angenommen ein Output 
geht über die gesamte Länge von zb. 1000 Samples nur einmalig für 100 
Samples auf 1 ansonsten 0. Ein Recurrentes Netzwerk wird nun nur vom 
x'ten neuron zum y'ten neuron eine Verküpfung aufbauen. Quasi wie ein 
zwei Taps in einem FIR-Buffer die abgegriffen werden und einem Gatter 
zugeführt werden. Das RCC ist in der Lage exakt solche Start-Stop 
Sequenzen mit minimalem Neuronen Aufwand zu detektieren.

von Uhu U. (uhu)


Lesenswert?

Hagen Re schrieb:
> besonders weil ich wetten könnte das man damit sogar familiere
> Beziehungen aufdecken kann.

Das wäre natürlich super. Nur gibt es ein paar kleine Probleme dabei: 
die Vögel sind wild und um die familiären Beziehungen festzustellen um 
die Ergebnisse verifizieren zu können, müsste man sie fangen und 
Blutproben entnehmen, um dann per DNA-Fingerprinting die 
Verwandschaftsbeziehungen heraus zu bekommen. Und wie das so üblich ist 
bei den meisten Vögeln, singen nur die Männchen.

Außerdem ist die Population offen und die Piepmätze sind 
Langstreckenzieher, beide Geschlechter leben in sukzessiver Polygamie 
und können sich in einer Brutsaison mehrfach verpaaren.

Das würde wohl aus rein praktischen und Artenschutzgründen zumindest 
sehr schwierig.

https://de.wikipedia.org/wiki/Wachtelk%C3%B6nig - dort ist auch eine 
Tonaufnahme.

> Auf alle Fälle scheint deine Problemstellung noch schön überschaubar und
> eben sehr nützlich zu sein.

In der Tat. Wenn man die Rufe hört, glaubt man erst mal nicht, dass der 
Piepmatz geradezu ein Lehrbeispiel für solche Dinge ist.

> Wenn du delphi/PASCAL verstehst kann ich dir meine Sourcen zum RCC
> mailen.

Das wäre super. Ich schreib dir eine PM.

Mein Lieblingsvogel ist der Waldkauz - bei dem sieht die Sache völlig 
anders aus: sie leben in Dauerbeziehung in festen Revieren, haben eine 
ganze Reihe verschiedene Lautäußerungen, die z.T. geschlechtsspezifisch 
sind. Die Jungvögel rufen völlig anders, als adᥙlte.

Eine zuverlässige Individuenerkennung wäre schon toll, aber wenn man 
auch noch die Verwandschaftsbeziehungen zwischen Revierinhabern 
feststellen könnte, wäre das ein Riesenfortschritt. Nur das 
Verifikationsproblem ist nicht viel kleiner. Der Waldkauz ist die 
häufigste einheimische Eule, allerdings nicht ganz einfach zu 
beobachten, weil sehr überwiegend nachtaktiv.

Das Ganze geht in Richtung minimalinvasive Untersuchnung der 
Populationsdynamik.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.