neuronales netz, ki, bruteforce, inputs anlegen / optimieren

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

neuronales netz, ki, bruteforce, inputs anlegen / optimieren

Beitrag von laz847 »

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?
Zuletzt geändert von laz847 am So 13. Jul 2014, 15:13, insgesamt 1-mal geändert.

mschnell
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

Beitrag von mschnell »

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" :D

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.

wp_xyz
Beiträge: 5134
Registriert: Fr 8. Apr 2011, 09:01

Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi

Beitrag von wp_xyz »

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.

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi

Beitrag von laz847 »

Was hat "calculation" mit "Suche" zu tun ?
Nix, hab ich aber auch nicht behauptet :D ...? Ich habe überlegt ob man das über eine binäre Suche (binäre Optimierung) schneller gestalten kann, habe aber dazu gesagt, dass ich unsicher bin ob das hier möglich ist. Wenn ich zu 100% sicher wäre, dass nur ein richtiges Ergebnis pro Datensatz vorhanden ist und man sich diesem linear annähert bzw. sich davon entfernt, wäre es wesentlich schneller dieses Ergebnis mittels binärer Suche zu finden. Calculation() soll nur als Beispiel dienen was wo passiert.
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"
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.

"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?

mschnell
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

Beitrag von mschnell »

laz847 hat geschrieben:... binäre Suche (binäre Optimierung) ...
"binäre Suche" kenne ich, von "binärer Optimierung" habe ich noch nie gehört.
laz847 hat geschrieben:... 5,6,7,8 Threads packe und mit 4 Kernen parallel rechnen lasse ...
Bei nur 4 Kernen wird es bei mehr als 4 Threads eher wieder langsamer.

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

Antrepolit
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

Beitrag von Antrepolit »

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?
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.
Grüße, Antrepolit

care only if your os is really burning

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi

Beitrag von laz847 »

"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.

mschnell
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

Beitrag von mschnell »

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.
Bei (Intel) Cores mit zwei Threads kann es noch ein wenig bringen.

-Michael

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi

Beitrag von laz847 »

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.
a*b*c*d = 200*200*200*200 sind 1600000000
Wie kann ich rückwärts umrechnen welche Kombination das ist?

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!!

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi

Beitrag von Michl »

Das könntest Du so berechnen:

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;  
Wobei es in diesem Fall auch komplett ohne Berechnung gehen würde (wenn a..d immer kleiner 256!):

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;  

mschnell
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

Beitrag von mschnell »

laz847 hat geschrieben:wie berechne ich a,b,c,d wenn ich z.B. 16598 als Wert habe?
Ganz einfach: 16598 = 1*1*1*16598 :twisted:

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

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi

Beitrag von laz847 »

erledigt
Zuletzt geändert von laz847 am Do 17. Jul 2014, 17:12, insgesamt 1-mal geändert.

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi

Beitrag von laz847 »

So ich habs :D dickes Danke nochmal!!!

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;     
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 :D
Zuletzt geändert von laz847 am Mo 21. Jul 2014, 15:59, insgesamt 2-mal geändert.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi

Beitrag von Michl »

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?
Die Überlegung dahinter ist:

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;  
Das Beispiel funktioniert auch mit ShortInts a..d:

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;   
Warum?! - Siehe: http://wiki.lazarus.freepascal.org/Case ... eklaration

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: neuronales netz, ki, bruteforce, inputs anlegen / optimi

Beitrag von laz847 »

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.

Antworten