Neuronale Netze nur für Zahlen zwischen -1 und 1?



  • Ich will ein einzelnes Neuron für ein Neuronales Netz programmieren und bin leider auf ein Problem gestoßen.

    Mein Neuron scheitert beim lernen der einfachsten Aufgaben wenn die Ein- und Ausgabezahlen etwas größer werden. Ich verwende die Delta-Regel (Also: Gewichtsveränderung = Lernkonstante * Fehler * Eingabewert)

    Hier habe ich das Problem mit einem Beispiel und Formeln beschrieben:

    https://de.wikipedia.org/wiki/Diskussion:Backpropagation#Nur_f.C3.BCr_Zahlen_.3C1.3F

    Bitte nicht raten! Mir helfen nur Antworten weiter die auch begründet sind.

    Kennt jemand ein Forum, dass auf KI bzw. NeuronaleNetze spezialisiert ist und wo ich meine Frage noch zusätzlich stellen kann?



  • Du brauchst eine lineare Aktivierungsfunktion in den Ausgangsneuronen, hast du das bedacht?

    Wahrscheinlich hast du tanh auch für die Ausgangsneuronen verwendet, und diese Funktion hat halt nur einen Wertebereich von -1 bis +1.

    EDIT: Seh grade du verwendest eine learning rate von 1... das ist ziemlich hoch, Gradientenabstieg (ist ja das was du da machst) wird da sehr schnell instabil. Matlab verwendet eine default learning rate von 0.01 für Gradientenabstieg, probier das mal.



  • Meine aktivierungsfunktion ist - der Einfachheit halber - Out=netj (d.h. die Summe der Inputs; siehe das Verlinkte Beispiel).

    Wenn ich die Lernkonstante senke - z.b. auf 0.01 - funktioniert das zwar mit den Beispielzahlen (Input 2 und 2 Output 1000) - aber wenn die Zahlen noch größer werden - Zb. die Inputs 1000 und die Outputs 1 Million habe ich das gleiche Problem wieder.

    Ist die Lernkostante abhängig von der Größenordnung der Ein- bzw- Ausgangswerte? Das wäre ziemlich übel für meinen Fall, weil der Wertebereich meiner Ein- und Ausgabewerte für ein und dasselbe Problem bis zum maximalen Integer gehen kann und eine Normierung nur sehr schwer möglich ist.



  • Gener4tor schrieb:

    Meine aktivierungsfunktion ist - der Einfachheit halber - Out=netj (d.h. die Summe der Inputs; siehe das Verlinkte Beispiel).

    Wenn ich die Lernkonstante senke - z.b. auf 0.01 - funktioniert das zwar mit den Beispielzahlen (Input 2 und 2 Output 1000) - aber wenn die Zahlen noch größer werden - Zb. die Inputs 1000 und die Outputs 1 Million habe ich das gleiche Problem wieder.

    Dann deutet das ziemlich sicher auf ein Problem mit der Lernrate hin.

    Gener4tor schrieb:

    Ist die Lernkostante abhängig von der Größenordnung der Ein- bzw- Ausgangswerte? Das wäre ziemlich übel für meinen Fall, weil der Wertebereich meiner Ein- und Ausgabewerte für ein und dasselbe Problem bis zum maximalen Integer gehen kann und eine Normierung nur sehr schwer möglich ist.

    Warum Integer? Du solltest schon ein (Quasi)-Kontinuum wie mit float oder double verwenden, ansonsten bekommst du mit Gradientenabstieg eh Probleme.

    Warum soll dein Netz einen so rießigen Wertebereich abdecken? Das ist ziemlich ungünstig, weil du dann sehr viele zwischen-Neuronen brauchst um in jeder Größenordnung entsprechend "sensitiv" zu sein. Du brauchst dann wahrscheinlich sehr große und tiefe Netze, was man vermeiden sollte wenn möglich...

    Ansonsten würde ich an deiner Stelle ein Verfahren mit adaptiver Schrittweite nehmen, da existiert das Problem erst gar nicht. Schau dir mal den LM-Algorithmus an, der macht das mit der Schrittweite vollautomatisch.



  • Ich kann mir den Wertebereich ja nicht aussuchen. Der wird mir von dem Problem diktiert. Intern arbeite ich natürlich mit doubles aber die Ein- und Ausgabewerte sind Integer.

    Heißt dass, wenn ich meinem Netz beibringen soll, dass es Ausgang = Eingang1 + Eingang2 berechnen soll, muss ich mir !vorher! einen Wertebereich überlegen? Das kommt mir etwas merkwürdig vor. Dass würde ja heißen, dass ich alle Eingaben und Ausgaben erst mal normieren müsste.



  • Gener4tor schrieb:

    Ich kann mir den Wertebereich ja nicht aussuchen. Der wird mir von dem Problem diktiert. Intern arbeite ich natürlich mit doubles aber die Ein- und Ausgabewerte sind Integer.

    Eventuell kann man das Problem umformulieren, aber das kann man natürlich nur sagen wenn man das Problem kennt.

    Wenn das nicht geht/du das nicht willst hast du da halt ein ziemlich komplexes Problem, für das ein simpler Gradientenabstieg vermutlich einfach nicht geeignet ist -> nimm ein "besseres" Optimierungsverfahren.

    Gener4tor schrieb:

    Heißt dass, wenn ich meinem Netz beibringen soll, dass es Ausgang = Eingang1 + Eingang2 berechnen soll, muss ich mir !vorher! einen Wertebereich überlegen? Das kommt mir etwas merkwürdig vor. Dass würde ja heißen, dass ich alle Eingaben und Ausgaben erst mal normieren müsste.

    Nein, aber du musst halt eine geeignete Schrittweite wählen oder geeignete Startwerte für die Gewichte. Du nimmst einfach 0 als Startwert, was natürlich bei einem Soll-Output von 1000000 extrem weit von den richtigen Gewichten entfernt ist.

    Es gibt ja auch Algorithmen mit denen man eine geeignete Schrittweite ausrechnen kann, sowas solltest du halt auch verwenden.



  • happystudent schrieb:

    Wenn das nicht geht/du das nicht willst hast du da halt ein ziemlich komplexes Problem, für das ein simpler Gradientenabstieg vermutlich einfach nicht geeignet ist -> nimm ein "besseres" Optimierungsverfahren.

    Eigentlich ist mein Beispielproblem (Aus zwei konstanten Inputs soll ein ebenfalls konstanter Output erzeugt werden) so ziemlich das einfachste, was mir eingefallen ist.

    Ein andereres Optimierungsverfahren kommt nicht in Frage, da es in meinem "Projekt" darum geht die Ergebnisse verschiedener Optimierungsverfahren gegenüberzustellen.

    Gener4tor schrieb:

    Heißt dass, wenn ich meinem Netz beibringen soll, dass es Ausgang = Eingang1 + Eingang2 berechnen soll, muss ich mir !vorher! einen Wertebereich überlegen? Das kommt mir etwas merkwürdig vor. Dass würde ja heißen, dass ich alle Eingaben und Ausgaben erst mal normieren müsste.

    happystudent schrieb:

    Nein, aber du musst halt eine geeignete Schrittweite wählen oder geeignete Startwerte für die Gewichte. Du nimmst einfach 0 als Startwert, was natürlich bei einem Soll-Output von 1000000 extrem weit von den richtigen Gewichten entfernt ist.

    Wenn ich die korrekten Gewichte wüsste bräuchte ich ja gar kein Neuronales Netz mehr. Ich verstehe, dass es länger braucht, wenn ich die Anfangsgewichte völlig falsch wähle. Aber dass es so ein einfaches Problem dann gar nicht mehr lösen kann kommt mir etwas merkwürdig vor.



  • Gener4tor schrieb:

    Ein andereres Optimierungsverfahren kommt nicht in Frage, da es in meinem "Projekt" darum geht die Ergebnisse verschiedener Optimierungsverfahren gegenüberzustellen.

    Macht doch nichts? Dann ist halt das Ergebnis dass dieses eine Optimierungsverfahren für dieses spezielle Problem ungeeignet ist. Ist doch gut für einen Vergleich, wenn alle Verfahren gleich gut geeignet wären bräuchte man ja nicht mehrere verschiedene.

    Gener4tor schrieb:

    Wenn ich die korrekten Gewichte wüsste bräuchte ich ja gar kein Neuronales Netz mehr.

    Doch, denn ohne Netz bringen dir die Gewichte schließlich nichts. Du bräuchtest dann nur kein Training mehr, aber:

    Gener4tor schrieb:

    Ich verstehe, dass es länger braucht, wenn ich die Anfangsgewichte völlig falsch wähle. Aber dass es so ein einfaches Problem dann gar nicht mehr lösen kann kommt mir etwas merkwürdig vor.

    Probier halt mal noch eine kleinere Schrittweite aus für die 1000000 Output. Klappts mit Schrittweiten von 1.0e-4 oder 1.0e-6? Dann weißt du doch schon dass es daran liegt, sowas kann man ja sehr leicht selber testen. Gradientenverfahren wird halt bei ungeeigneter Schrittweite instabil, das ist halt so.



  • happystudent schrieb:

    Macht doch nichts? Dann ist halt das Ergebnis dass dieses eine Optimierungsverfahren für dieses spezielle Problem ungeeignet ist. Ist doch gut, wenn alle Verfahren gleich gut geeignet wären bräuchte man ja nicht mehrere verschiedene.

    Ich hatte nur die Vermutung, dass ich irgendwas falsch mache da es schon bei dem einfachsten Problem, dass mir eingefallen ist, nicht funktioniert.

    happystudent schrieb:

    Probier halt mal noch eine kleinere Schrittweite aus für die 1000000 Output. Klappts mit Schrittweiten von 1.0e-4 oder 1.0e-6? Dann weißt du doch schon dass es daran liegt, sowas kann man ja sehr leicht selber testen. Gradientenverfahren wird halt bei ungeeigneter Schrittweite instabil, das ist halt so.

    Wenn ich herumprobiere kann ich sicher die richtige Lernkonstante für ein bestimmtes Problem finden. Aber welche Konstante soll mein Programm verwenden? Bei User kann ich kein Wissen über Neuronale Netze voraussetzen.



  • Vielleicht noch zur Erklärung wie mein Programm - vereinfacht gesagt - funktionieren soll:

    Der User hat eine Menge von Inputwerten und die dazu passenden Outputs (Ergebnisse). Weche das sind um in welchen Zusammenhang die Eingänge und die Ausgänge stehen bleibt dem Benutzer überlassen (Ob er jetzt irgendwelche Messdaten angibt oder einfach mit Excel irgendwelche Formeln berechnet ist nicht festgelegt). Dann soll das Programm die verschiedenen Optimierungsverfahren darauf ansetzen. Danach gibt der User neue Inputwerte an, klickt auf "berechnen" und erhält eine Liste mit den Prognosen der verschiedenen Verfahren.

    Hier geht es um die Ausgabe des Verfahrens "Neutron".

    Und da stellt sich mir die Frage: Welche Lernkonstante verwende ich wenn die Ergebnisse dermaßen unterschiedlich sein können?



  • Hier geht es um die Ausgabe des Verfahrens "Neutron".

    Sry. natürlich "Neuron"



  • Gener4tor schrieb:

    Vielleicht noch zur Erklärung wie mein Programm - vereinfacht gesagt - funktionieren soll:

    Der User hat eine Menge von Inputwerten und die dazu passenden Outputs (Ergebnisse). Weche das sind um in welchen Zusammenhang die Eingänge und die Ausgänge stehen bleibt dem Benutzer überlassen (Ob er jetzt irgendwelche Messdaten angibt oder einfach mit Excel irgendwelche Formeln berechnet ist nicht festgelegt). Dann soll das Programm die verschiedenen Optimierungsverfahren darauf ansetzen. Danach gibt der User neue Inputwerte an, klickt auf "berechnen" und erhält eine Liste mit den Prognosen der verschiedenen Verfahren.

    Hier geht es um die Ausgabe des Verfahrens "Neutron".

    Und da stellt sich mir die Frage: Welche Lernkonstante verwende ich wenn die Ergebnisse dermaßen unterschiedlich sein können?

    Das ist nicht möglich.

    Du willst eine feste, unveränderliche Lernrate (da der Benutzer sie ja nicht einstellen soll), diese soll aber trotzdem für alle Probleme gleichermaßen anwendbar sein. Das geht aber nicht, weil die "richtige" Lernrate auch vom Problem abhängig ist. Entweder der Benutzer gibt eine Lernrate vor (die er im Notfall halt dann durch probieren rausfinden muss). Oder du gibst ihm ein Verfahren welches die Lernrate automatisch bestimmt.

    Wenn ich dich richtig verstehe soll das Programm dann von Leuten bedient werden die keine wirkliche Ahnung haben, richtig?

    Das ist sowieso problematisch, weil bei NN musst du ja auch immer eine Netzstruktur angeben - also wieviel Neuronen, wieviele Schichten und welche Verbindungen, welche Aktivierungsfunktionen etc. etc. Hier muss der Benutzer sowieso massig konfigurieren (und damit zumindest grundlegend verstehen was er da eigentlich tut), da kommt es auf einen Parameter mehr (die Lernrate) auch nicht mehr an, oder?

    Einfach nur Inputs und Outputs vorgeben wäre natürlich schön, aber das funktioniert nicht, je nach Problem brauchst du extrem unterschiedliche Netze...


Anmelden zum Antworten