neuronales netz, ki, bruteforce, inputs anlegen / optimieren
neuronales netz, ki, bruteforce, inputs anlegen / optimieren
Hallo zusammen,
ich teste gerade ein einfaches NN/Perceptron.
Ich nutze aktuell nur 4 Inputs, jeder dieser Inputs hat eine Range von -100 bis 100.
Wenn ich das jetzt trainieren will, gehe ich 4 Schleifen durch:
schleife4(-100>100){
schleife3(-100>100){
schleife2(-100>100){
schleife1(-100>100){
calculation(x1,x2,x3,x4); >>>> dauert 0-1ms
}
}
}
}
Die Berechnung in calculation(); dauert nur 0-1 ms aber bei 200*200*200*200 Durchläufen sind das 1600000000 ms.
Ich hab jetzt schon überlegt ob man da nicht nach dem Prinzip einer binären Suche vorgehen könnte, ich bin mir aber nicht sicher ob die Ergebnisse wirklich immer linear sind.
Ich weiß nicht so wirklich wie man das schneller kriegt, die Berechnungen in calculation(); sind schon aufs Minimum reduziert, selbst wenn ich das in Threads packe ist es 3-4-5 mal schneller was leider immer noch nicht wirklich schnell ist und ich habe nur 4 Inputs, werden es nur 2 mehr steigt der Rechenaufwand ums x fache ...
Habe ich da einen Denkfehler, geht das irgendwie anders?
ich teste gerade ein einfaches NN/Perceptron.
Ich nutze aktuell nur 4 Inputs, jeder dieser Inputs hat eine Range von -100 bis 100.
Wenn ich das jetzt trainieren will, gehe ich 4 Schleifen durch:
schleife4(-100>100){
schleife3(-100>100){
schleife2(-100>100){
schleife1(-100>100){
calculation(x1,x2,x3,x4); >>>> dauert 0-1ms
}
}
}
}
Die Berechnung in calculation(); dauert nur 0-1 ms aber bei 200*200*200*200 Durchläufen sind das 1600000000 ms.
Ich hab jetzt schon überlegt ob man da nicht nach dem Prinzip einer binären Suche vorgehen könnte, ich bin mir aber nicht sicher ob die Ergebnisse wirklich immer linear sind.
Ich weiß nicht so wirklich wie man das schneller kriegt, die Berechnungen in calculation(); sind schon aufs Minimum reduziert, selbst wenn ich das in Threads packe ist es 3-4-5 mal schneller was leider immer noch nicht wirklich schnell ist und ich habe nur 4 Inputs, werden es nur 2 mehr steigt der Rechenaufwand ums x fache ...
Habe ich da einen Denkfehler, geht das irgendwie anders?
Zuletzt geändert von laz847 am So 13. Jul 2014, 15:13, insgesamt 1-mal geändert.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
Was hat "calculation" mit "Suche" zu tun ?
Dass neuronale Netze eine Irre Rechenzeit brauchen ist völlig normal. Natürliche neuronale Netze arbeiten ja mit Billionen von parallel aktiven "Recheneinheiten" und eben nicht sequentiell. Die Natur kann sehr gut "viel" aber sehr schlecht "schnell"
Und die Aufgabenstellung für Neuronale Netze ist (im Gegensatz zu vielen anderen Computer-Problemen) sehr gut für massive Parallelarbeit geeignet. Also sind normale" Computer denkbar ungeeignet.
-Michael
Dass neuronale Netze eine Irre Rechenzeit brauchen ist völlig normal. Natürliche neuronale Netze arbeiten ja mit Billionen von parallel aktiven "Recheneinheiten" und eben nicht sequentiell. Die Natur kann sehr gut "viel" aber sehr schlecht "schnell"

Und die Aufgabenstellung für Neuronale Netze ist (im Gegensatz zu vielen anderen Computer-Problemen) sehr gut für massive Parallelarbeit geeignet. Also sind normale" Computer denkbar ungeeignet.
-Michael
Zuletzt geändert von mschnell am Mo 14. Jul 2014, 09:31, insgesamt 1-mal geändert.
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
Kenn mich mit neuronalen Netzen nicht aus, aber das ganze hört sich ähnlich an, wie wenn man eine nicht-lineare Funktion von mehreren Parametern fittet. Da geht man auch nicht alle Parameter schrittweise durch, sondern verwendet raffiniertere Methoden - Stichwort Levenberg-Marquardt.
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
Nix, hab ich aber auch nicht behauptetWas hat "calculation" mit "Suche" zu tun ?

Ja ist schon klar das man hier sequentiell nicht sehr weit kommt. Aber selbst wenn ich das in 5,6,7,8 Threads packe und mit 4 Kernen parallel rechnen lasse dauert es schon bei 4 Parametern aufgrund der puren Anzahl von Durchläufen ziemlich lange, deswegen meine Frage ob da evtl. ganz andere Methoden benutzt werden.Dass neuronale Netze eine Irre Rechenzeit brauchen ist völlig normal. Natürliche neuronale Netze arbeiten ja mit Billionen von parallel aktiven "Recheneinheiten" und eben nicht sequentiell. Die Natur kann sehr gut "iel" aber sehr schlecht "schnell"
"Also sind normale" Computer denkbar ungeeignet."
Ja das befürchte ich auch, ich habe noch vor kurzem einen Beitrag über ein ähnliches Thema gesehen und mich gefragt warum deren Computer so gross wie Kleiderschränke mit hunderten Cores waren, dass dürfte die Antwort sein....
Danke für den Hinweis mit Levenberg-Marquardt, schaue ich mir mal genauer an, verstehe noch nicht wie es genau angewendet wird, muss mal sehen ob ich praktische Beispiele dazu finde. So etwas in der Art meine ich aber, ich kann ja z.B. einen MovingAverage auch nur aus jedem 2 Wert bilden.
Um das nochmal genauer zu sagen, meine Frage zielt insbesondere darauf ab wie man diese riesigen Mengen an Daten am effektivsten verarbeitet. Dieses Frage stellt sich ja in vielen Bereichen, evtl. gibts ja noch ganz andere Ansätze?
Beipiel binäre Suche, Person A sucht schrittweise im Array und Person B kennt die binäre Suche, wendet diese an und erhält das selbe Ergebnis wesentlich schneller. Input und Output bleiben gleich, durch einen besseren Algo ist die binäre Suche aber X-fach schneller. Evtl. gibts ja hier auch derartige Lösungen?
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
"binäre Suche" kenne ich, von "binärer Optimierung" habe ich noch nie gehört.laz847 hat geschrieben:... binäre Suche (binäre Optimierung) ...
Bei nur 4 Kernen wird es bei mehr als 4 Threads eher wieder langsamer.laz847 hat geschrieben:... 5,6,7,8 Threads packe und mit 4 Kernen parallel rechnen lasse ...
Bei Ausanutzung mehrerer Kerne durch Threads muss man sehr mit der Synchronisation zwischen den Threads aufpassen. Da kann man sich leicht logische und/oder Performance-Probleme einhandeln.
Im Prinzip kann man (statt Kleiderschänke - aka Mainframe Rechner oder speziell designte "Supercompuzer") die Arbeit (sofern die Aufgabenstellung sich eignet) auch auf viele PCs verteilen, die per Netzwerk miteinander kommunizieren. Das macht z.B. Google.
-Michael
-
- Beiträge: 340
- Registriert: Di 12. Sep 2006, 08:57
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Kontaktdaten:
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
Bei neuronalen Netzen lässt man das Training meist nur einmal durchführen und nutzt nach Abschluss die Parameter des Resultierenden Netzes für die Endanwendung. Dafpr kommen u.a. Hochleistungsrechner zum Einsatz. Kurz: Man trainiert das Ding einmal mit allen bis dahin vorhandenen Trainingsdaten und nutzt dann den Output. Wenn du jedoch immer eine neue Konfiguration hast, und Rechenzeit ein Problem darstellt, dann ist ein neuronales Netz - sofern du auf normalen Rechnern arbeitest - vermutlich nicht die richtige Wahl.laz847 hat geschrieben:Hallo zusammen,
ich teste gerade ein einfaches NN/Perceptron.
Ich nutze aktuell nur 4 Inputs, jeder dieser Inputs hat eine Range von -100 bis 100.
Wenn ich das jetzt trainieren will, gehe ich 4 Schleifen durch:
schleife4(-100>100){
schleife3(-100>100){
schleife2(-100>100){
schleife1(-100>100){
calculation(x1,x2,x3,x4); >>>> dauert 0-1ms
}
}
}
}
Die Berechnung in calculation(); dauert nur 0-1 ms aber bei 200*200*200*200 Durchläufen sind das 1600000000 ms.
(...)
Habe ich da einen Denkfehler, geht das irgendwie anders?
Grüße, Antrepolit
care only if your os is really burning
care only if your os is really burning
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
"Bei nur 4 Kernen wird es bei mehr als 4 Threads eher wieder langsamer. "
Hmm das ist so nicht ganz richtig, ich habe bereits einige Tests laufen lassen und habe festgestellt, dass es mit >4 und <10 Threads also z.B. 6 oder 8 Threads schneller als mit 4 ist.
"Bei Ausanutzung mehrerer Kerne durch Threads muss man sehr mit der Synchronisation zwischen den Threads aufpassen. Da kann man sich leicht logische und/oder Performance-Probleme einhandeln."
Das ist korrekt, wenn die Threads z.B. von ihrer Laufzeit her zu kurz sind bringen sie nichts bzw. Nachteile weil Verwaltung, Create, Free usw. jedesmal Performance brauchen. Aber wenn man das selbst entwickelt lässt es sich ja ganz gut skalieren bzw. messen oder dynamisch anpassen.
"Im Prinzip kann man (statt Kleiderschänke - aka Mainframe Rechner oder speziell designte "Supercompuzer") die Arbeit (sofern die Aufgabenstellung sich eignet) auch auf viele PCs verteilen, die per Netzwerk miteinander kommunizieren. Das macht z.B. Google."
Das ist eine mögliche und realtiv einfach umzusetzende Option, darüber haben wir auch schon nachgedacht. Vor allem weil man dann die "Cloud" beliebig mit gemieteten Servern erweitern kann. Dazu reicht ja ein simpler TCP Server und der muss nur Befehle versenden.
"Bei neuronalen Netzen lässt man das Training meist nur einmal durchführen und nutzt nach Abschluss die Parameter des Resultierenden Netzes für die Endanwendung. Dafpr kommen u.a. Hochleistungsrechner zum Einsatz. Kurz: Man trainiert das Ding einmal mit allen bis dahin vorhandenen Trainingsdaten und nutzt dann den Output. Wenn du jedoch immer eine neue Konfiguration hast, und Rechenzeit ein Problem darstellt, dann ist ein neuronales Netz - sofern du auf normalen Rechnern arbeitest - vermutlich nicht die richtige Wahl."
Von welchem Bereich sprichst Du da? Ist es nicht sinnfrei ein neuronales Netz zu nutzen und es dann nur einmal zu trainieren? Genau darin liegt ja die Daseinsberechtigung eines NN, es lernt ständig dazu, lebt von neuem Input, paßt sich an.
Ich versuche gerade mal die Inputs als eine Map im Grid anzulegen, so kann man mit beliebig vielen Threads Stück für Stück alles durchgehen, alles speichern, wieder laden und weitermachen. Das könnte dann permanent im Hintergund laufen.
Ich hänge nur gerade an der Stelle wie ich das dynamisch gestalte, do das man für die Inputs alle möglichen Variablen aus dem System nutzen kann. Also nicht hardcoded sondern über eine Eingabemaske.
Hmm das ist so nicht ganz richtig, ich habe bereits einige Tests laufen lassen und habe festgestellt, dass es mit >4 und <10 Threads also z.B. 6 oder 8 Threads schneller als mit 4 ist.
"Bei Ausanutzung mehrerer Kerne durch Threads muss man sehr mit der Synchronisation zwischen den Threads aufpassen. Da kann man sich leicht logische und/oder Performance-Probleme einhandeln."
Das ist korrekt, wenn die Threads z.B. von ihrer Laufzeit her zu kurz sind bringen sie nichts bzw. Nachteile weil Verwaltung, Create, Free usw. jedesmal Performance brauchen. Aber wenn man das selbst entwickelt lässt es sich ja ganz gut skalieren bzw. messen oder dynamisch anpassen.
"Im Prinzip kann man (statt Kleiderschänke - aka Mainframe Rechner oder speziell designte "Supercompuzer") die Arbeit (sofern die Aufgabenstellung sich eignet) auch auf viele PCs verteilen, die per Netzwerk miteinander kommunizieren. Das macht z.B. Google."
Das ist eine mögliche und realtiv einfach umzusetzende Option, darüber haben wir auch schon nachgedacht. Vor allem weil man dann die "Cloud" beliebig mit gemieteten Servern erweitern kann. Dazu reicht ja ein simpler TCP Server und der muss nur Befehle versenden.
"Bei neuronalen Netzen lässt man das Training meist nur einmal durchführen und nutzt nach Abschluss die Parameter des Resultierenden Netzes für die Endanwendung. Dafpr kommen u.a. Hochleistungsrechner zum Einsatz. Kurz: Man trainiert das Ding einmal mit allen bis dahin vorhandenen Trainingsdaten und nutzt dann den Output. Wenn du jedoch immer eine neue Konfiguration hast, und Rechenzeit ein Problem darstellt, dann ist ein neuronales Netz - sofern du auf normalen Rechnern arbeitest - vermutlich nicht die richtige Wahl."
Von welchem Bereich sprichst Du da? Ist es nicht sinnfrei ein neuronales Netz zu nutzen und es dann nur einmal zu trainieren? Genau darin liegt ja die Daseinsberechtigung eines NN, es lernt ständig dazu, lebt von neuem Input, paßt sich an.
Ich versuche gerade mal die Inputs als eine Map im Grid anzulegen, so kann man mit beliebig vielen Threads Stück für Stück alles durchgehen, alles speichern, wieder laden und weitermachen. Das könnte dann permanent im Hintergund laufen.
Ich hänge nur gerade an der Stelle wie ich das dynamisch gestalte, do das man für die Inputs alle möglichen Variablen aus dem System nutzen kann. Also nicht hardcoded sondern über eine Eingabemaske.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
Bei (Intel) Cores mit zwei Threads kann es noch ein wenig bringen.laz847 hat geschrieben:"Bei nur 4 Kernen wird es bei mehr als 4 Threads eher wieder langsamer. "
Hmm das ist so nicht ganz richtig, ich habe bereits einige Tests laufen lassen und habe festgestellt, dass es mit >4 und <10 Threads also z.B. 6 oder 8 Threads schneller als mit 4 ist.
-Michael
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
Lieben Dank erstmal, ich habe das jetzt etwas anders gelöst, es stehen bis zu 10 Threads bereit und ich habe alles soweit vorbereitet, dass jeder Thread einen bestimmten Bereich übernimmt.
Entweder ists schon zu spät oder ich weiß es auch nicht, vielleicht fällt Euch ja etwas ein.
Also 0:0:0:0 ist ja 0 aber wie berechne ich a,b,c,d wenn ich z.B. 16598 als Wert habe?
Ich kann da an der Stelle keine Schleife laufen lassen, das muss man doch auch irgendwie direkt ausrechnen können?
Danke!!
Entweder ists schon zu spät oder ich weiß es auch nicht, vielleicht fällt Euch ja etwas ein.
Wie kann ich rückwärts umrechnen welche Kombination das ist?a*b*c*d = 200*200*200*200 sind 1600000000
Also 0:0:0:0 ist ja 0 aber wie berechne ich a,b,c,d wenn ich z.B. 16598 als Wert habe?
Ich kann da an der Stelle keine Schleife laufen lassen, das muss man doch auch irgendwie direkt ausrechnen können?
Danke!!
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
Das könntest Du so berechnen:
Wobei es in diesem Fall auch komplett ohne Berechnung gehen würde (wenn a..d immer kleiner 256!):
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
w: DWord;
a, b, c, d: Byte;
begin
a:=1;
b:=2;
c:=5;
d:=7;
w:=((((d * 200) + c) * 200) + b) * 200 + a;
ShowMessage(
'w = '+IntToStr(w)+LineEnding+
'a = '+IntToStr(w mod 200)+LineEnding+
'b = '+IntToStr(w div 200 mod 200)+LineEnding+
'c = '+IntToStr(w div 40000 mod 200)+LineEnding+
'd = '+IntToStr(w div 8000000)
);
end;
Code: Alles auswählen
type
CaseFourByte = (aDWord, Bytes);
FourByte = Record
case CaseFourByte of
aDWord: (w: DWord);
Bytes: (a, b, c, d: Byte);
end;
...
procedure TForm1.Button2Click(Sender: TObject);
var
Wert: FourByte;
begin
Wert.w:=117768705;
ShowMessage(
'w = '+IntToStr(Wert.w)+LineEnding+
'a = '+IntToStr(Wert.a)+LineEnding+
'b = '+IntToStr(Wert.b)+LineEnding+
'c = '+IntToStr(Wert.c)+LineEnding+
'd = '+IntToStr(Wert.d)
);
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
Ganz einfach: 16598 = 1*1*1*16598laz847 hat geschrieben:wie berechne ich a,b,c,d wenn ich z.B. 16598 als Wert habe?

Das ist offensichtlich nicht eindeutig
Dein Beispiel:
Die Primfaktorzerlegung von 16598 ist 2*43*193
z.B. also ist die kleinteiligste Zerlegung in vier Faktoren a= 1, b=2, c= 43, d=192.
http://lmgtfy.com/?q=primfaktorzerlegung
-Michael
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
erledigt
Zuletzt geändert von laz847 am Do 17. Jul 2014, 17:12, insgesamt 1-mal geändert.
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
So ich habs
dickes Danke nochmal!!!
Die Lösung mit den Records gefällt mir besser weil ich dafür keine Schleife bräuchte.
Aber wie krieg ich das am sinnvollsten auf -100 0 100 oder 0..200 und das dann dynamisch?
edit: überflüssigen code entfernt

Code: Alles auswählen
procedure TForm1.Button5Click(Sender: TObject);
var
w : UINT64;
ar: Array of Byte;
i : Integer;
begin
w:= StrToInt64(wval.Text);
SetLength(ar,4);
for i:=0 to High(ar) do begin
ar[i] := w div(201**i) mod 201;
ShowMessage('- ar['+IntTostr(i)+'] >> '+IntToStr(ar[i]));
end;
SetLength(ar,0);
end;
Aber wie krieg ich das am sinnvollsten auf -100 0 100 oder 0..200 und das dann dynamisch?
edit: überflüssigen code entfernt

Zuletzt geändert von laz847 am Mo 21. Jul 2014, 15:59, insgesamt 2-mal geändert.
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
Die Überlegung dahinter ist:laz847 hat geschrieben:Die Lösung mit den Records gefällt mir besser weil ich dafür keine Schleife bräuchte.
Aber wie krieg ich das am sinnvollsten auf -100 0 100 oder 0..200 und das dann dynamisch?
Code: Alles auswählen
//Statt:
w:=((((d * 200) + c) * 200) + b) * 200 + a;
//das lieber so zu machen:
w:=((((d * 256) + c) * 256) + b) * 256 + a;
//damit nimmt a..d jeweils 1 Byte ein
//das gleiche Ergebnis liefert:
w:=d shl 24 + c shl 16 + b shl 8 + a;
Code: Alles auswählen
type
type
CaseFourByte = (aDWord, Bytes);
FourInt = Record
case CaseFourByte of
aDWord: (w: DWord);
Bytes: (a, b, c, d: ShortInt);
end;
...
procedure TForm1.Button2Click(Sender: TObject);
var
Wert: FourInt;
begin
Wert.a:=-100;
Wert.b:=100;
Wert.c:=-50;
Wert.d:=50;
ShowMessage(
'w = '+IntToStr(Wert.w)+LineEnding+
'a = '+IntToStr(Wert.a)+LineEnding+
'b = '+IntToStr(Wert.b)+LineEnding+
'c = '+IntToStr(Wert.c)+LineEnding+
'd = '+IntToStr(Wert.d)
);
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi
Ahhh jetzt ja klar
ich kann ja da auch einfach eine andere Variable verwenden. Nur wie krieg ich das dynamisch?
0..255 ist zu gross da hab ich zuviel bei was ich nicht brauche und wieder filtern muss.
0..200 oder -100 <> 100 ist ok.

0..255 ist zu gross da hab ich zuviel bei was ich nicht brauche und wieder filtern muss.
0..200 oder -100 <> 100 ist ok.