Autor |
Beitrag |
Noodel
      
Beiträge: 27
|
Verfasst: Fr 23.01.09 19:56
Ich hatte mal vor, ein Schach-Programm zu entwickeln, dass ständig dazulernt und so immer stärker wird. Da kam ich dann natürlich schnell zu künstlichen neuronalen Netzen ( de.wikipedia.org/wik...ches_neuronales_Netz).
Meine Idee war: Die KI speichert alle Stellungen eines Spiels. Wenn das Spiel zu Ende ist, wird jede Stellung mit einer Bewertung in die Datenbank eingetragen. Wenn sie dort schon steht, wird die Bewertung dort aktualisiert. Die Bewertung setzt sich zusammen aus Spielausgang (Sieg Weiß, Sieg Schwarz, Remis) und Zeitpunkt des Zuges. Bei einer Niederlage wird dann z.B. der 48. Zug schlechter gewertet als der 20.
Das hat auch ganz gut funktioniert. Es gibt da aber zwei Probleme:
1) Bei unbekannten Stellungen versagt das Programm komplett. Durch viel Training kann man natürlich erreichen, dass das Programm sehr viele Stellungen kennt.
2) Der Speicherbedarf ist sehr groß. In meiner Datenbank hatte ich später über 5 Mio. Einträge für die einzelnen Stellungen.
Deshalb ist dieser Ansatz wohl nicht so gut. Hättet ihr andere Ideen, wie man ein lernendes Schachprogramm (mit neuronalen Netzen) programmieren kann?
Danke im Voraus!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 23.01.09 20:13
Der Trick ist doch weniger anhand der Stellungen zu entscheiden, als vielmehr dem neuronalen Netz beizubringen, die Stellung zu bewerten. Die Datenbank, die Du angefangen hast, kannst Du für das Training des neuronalen Netzes verwenden, während Du dem neuronalen Netz als Ausgabe z.B. sagst, welcher Zug am sinnvollsten ist.
Was Du also machen kannst:
- Zu zeichnest eine ganze Reihe von Partien auf und speicherst für jede die Stellungen.
- Eine Stellung ist hierbei jedes Feld und die daraufstehende Figur, sowie eine Bewertung, ob diese Stellung positiv oder negativ zu bewerten ist (AlphaBeta-Algo). Zusätzlich sollte als Ausgabe des Netzes vorhanden sein, welcher Zug als nächstes auszuführen ist. Hierbei solltest Du deine Netzausgabe so gestalten, dass deinem Programm die Auswahl vieler Züge möglich ist.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Noodel 
      
Beiträge: 27
|
Verfasst: Sa 24.01.09 01:14
Stimmt, daran hatte ich nicht gedacht: Ich sollte nicht für jede Stellung bewerten, wie gut sie ist, sondern das neuronale Netz soll lernen, eine Stellung zu bewerten. Danke!
Aber bei deinem Vorschlag (2. Absatz) ist das Programm ja nicht selbstlernend, oder? Beim Schach ist das ja eigentlich gut möglich, weil man am Ende immer die Rückmeldung kriegt: Sieg, Remis oder Niederlage.
Jetzt müsste ich diese Rückmeldung nur irgendwie verarbeiten, damit die neuronalen Netze - wie du geschrieben hast - Stellungen bewerten können.
Wie könnte ich das denn am besten machen?
Hab grade noch eine "Neural Network Library" für Delphi gefunden:
leenissen.dk/fann/ht...html#Delphi_Bindings
Meint ihr, es wäre sinnvoll, die für ein Schach-Programm zu nutzen? Kennt ihr diese Komponente vielleicht?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 24.01.09 01:42
Noodel hat folgendes geschrieben : | Stimmt, daran hatte ich nicht gedacht: Ich sollte nicht für jede Stellung bewerten, wie gut sie ist, sondern das neuronale Netz soll lernen, eine Stellung zu bewerten. Danke! |
Korrekt.
Noodel hat folgendes geschrieben : | Aber bei deinem Vorschlag (2. Absatz) ist das Programm ja nicht selbstlernend, oder? Beim Schach ist das ja eigentlich gut möglich, weil man am Ende immer die Rückmeldung kriegt: Sieg, Remis oder Niederlage. |
Bekommst Du jetzt auch noch, jetzt aber sogar gleich mehrfach: Einmal durch den Spielausgang (bei dem eine Stellung entstanden ist) und zum anderen durch die Bewertung der Stellung durch den AlphaBeta-Algo. Das schöne daran ist, dass Du auf Grund dieser Bewertung sogar aus einer Stellung gleich 2 Lernschritte heraus bekommst; einen für Stellung von Weiß und den anderen für die gleiche Stellung wenn Schwarz ziehen darf.
Noodel hat folgendes geschrieben : | Jetzt müsste ich diese Rückmeldung nur irgendwie verarbeiten, damit die neuronalen Netze - wie du geschrieben hast - Stellungen bewerten können.
Wie könnte ich das denn am besten machen? |
Hier bietet sich mehreres an. Idee 1 wäre, dass Du dem Netz lernst, anhand einer Stellung und dem Spieler, der den nächsten Zug machen darfst, als Ausgabe 8 oder 16 oder ... (aber zumindest eine Konstante Anzahl Zügen) durchzuführen, die beim Anlegen der Stellung alle gleichzeitig auf den Ausgang gelegt werden. d.h. Du könntest basierend basierend auf der Spiel-Bewertung das Ausgangsmuster so berechnen, dass die erste Gruppe von Ausgangsneuronen den sinnvollsten\wahrscheinlichsten Zug anzeigt, die nächste Gruppe den zweitbesten Zug usw. Beim Replay (sprich, wenn deine KI dann spielt) brauchst Du mit einem einfachen Algo (z.B. auch AlphaBeta) jetzt nicht mehr auf voller Tiefe rechnen, sondern kannst basierend auf den gegebenen 8 Zugvorschlägen des Netzes die beste Variante anhand basierend auf einer relativ geringen Zugtiefe auswählen.
Noodel hat folgendes geschrieben : | Hab grade noch eine "Neural Network Library" für Delphi gefunden:
leenissen.dk/fann/ht...html#Delphi_Bindings
Meint ihr, es wäre sinnvoll, die für ein Schach-Programm zu nutzen? Kennt ihr diese Komponente vielleicht? |
Nope. Kenn ich nicht. Wenn Du aber bereits eine KI-Implementation hast, dann solltest Du bei dieser bleiben, sei denn das Umprogrammieren bringt wesentliche Vorteile. Aber selbst dann solltest Du beachten, dass es nichts bringt, zu optimieren, wenn nicht einmal das Fundament stabil läuft.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 24.01.09 11:55
Hi
Wenn du alpha-beta zum Bewerten der Stellungen verwenden willst, würde ich dir empfehlen, den nicht unbedingt selbst zu implementieren. Es gibt sogenannte Chess-Engines, die du für die Bewertung verwenden kannst.
Imho kannst du diese dabei aber höchstens zeitlich übertreffen, da deine Lernkurve damit abgesehen vom Spielausgang eine Annäherungskurve an den Algorithmus darstellt, den du zur Bewertung verwendest.
Ich würde deshalb vorschlagen, dass du mit der Zeit oder mit den Spielresultaten gegen eine Engine die Gewichtung anpasst(zu Beginn kannst du mehr von der Vorlage lernen, irgendwann hast du dann eine recht gute Annäherung an den Algo und der Spielausgang wird wichtiger).
Rybka ist meines wissens die beste frei verfügbare Chess-Engine. Um den Output vernünftig auszuwerten, benötigst du das Kommunikatinsprotokoll: de.wikipedia.org/wik...rsal_Chess_Interface
Auf der Seite des Rybka-Entwicklers befindet sich soweit ich weiß eine detaillierte Beschreibung des Protokolls. Imho einfacher und ergiebiger als eine eigene aß-Implementierung.
Ich würde mich freuen, irgendwann eine Alpha-Version testen zu dürfen
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Zuletzt bearbeitet von Hidden am So 12.04.09 13:37, insgesamt 1-mal bearbeitet
|
|
Noodel 
      
Beiträge: 27
|
Verfasst: Sa 24.01.09 12:21
Danke euch beiden!
@Hidden: Rybka ist nur als Demo kostenlos. Aber die Demo scheint eine voll funktionsfähige alte Version zu sein, ist das richtig?
Und wie kann ich meine Delphi-Anwendung mit einer GUI kommunizieren lassen? In der UCI-Spezifikation steht, dass Engine und GUI über Textkommandos miteinander kommunizieren sollen. Wie kann meine Delphi-Anwendung z.B. "bestmove <move1>" an eine GUI senden?
@BenBE: Du meinst also, ich soll die Zugsuche mit AlphaBeta drinlassen. Nur die Bewertungsfunktion soll von einem künstlichen neuronalen Netz übernommen werden? Hab ich das so richtig verstanden?
Neuronen sind ja erst mal ziemlich abstrakt. Wie müsste ich so etwas denn in Code umsetzen? Und anhand von welchen Kriterien sollen die Netze denn eine Stellung bewerten?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 24.01.09 14:29
Noodel hat folgendes geschrieben : | @BenBE: Du meinst also, ich soll die Zugsuche mit AlphaBeta drinlassen. Nur die Bewertungsfunktion soll von einem künstlichen neuronalen Netz übernommen werden? Hab ich das so richtig verstanden?
Neuronen sind ja erst mal ziemlich abstrakt. Wie müsste ich so etwas denn in Code umsetzen? Und anhand von welchen Kriterien sollen die Netze denn eine Stellung bewerten? |
Ein neuronales Netz lernt immer Muster, d.h. das was du dem Netz beibringen willst sollten auch wieder Muster sein, die wenn möglich so aufgebaut sein sollten, dass das Netz ohne große Verarbeitung die Regeln ausdiesen herleiten kann.
Ganz abstrakt gesagt sollte ein Muster möglichst so aussehen, dass Du für ähnliche Stellungen die ein ähnliches Ergebnis erfordern ein ähnliches Muster hast. Daher solltest Du z.B. Binärzahlen für die Ausgänge vermeiden und lieber z.B. stetige Zahlenbereiche nehmen, die je nach Teilbereich z.B. die Spalte angeben: -1 A, +1 H.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 24.01.09 14:33
Hi
Ja, das ist richtig: Rybka ist nur als Demo kostenlos. Diese Demo ist aber afaik die beste kostenlose Engine.
Die Kommunikation erfolgt soweit ich weiß über eine(versteckte?) Konsolenanwendung, die von der GUI bzw. deinem Programm die Anweisungen wie in der Anleitung zu lesen als Textkommandos bekommt.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Noodel 
      
Beiträge: 27
|
Verfasst: Sa 24.01.09 21:19
Wie kann man denn in Delphi Textkommandos über eine Konsolenanwendung senden? Wäre super, wenn das einer hier wüsste. Dann könnte ich nämlich mein Schachprogramm gegen Rybka oder GNUChess trainieren lassen.
-----
Wäre es z.B. sinnvoll, das Brett so als Muster darzustellen?
21222324202322210202020202020202
Da habe ich für jedes Feld eine Zahl mit zwei Ziffern genommen, die angibt, welche Figur draufsteht. "02" wäre z.B. ein Bauer, "24" die Dame usw.
Wie könnte ein neuronales Netz denn daraus lernen / Regeln herleiten?
Hier steht einiges über Backpropagation:
fbim.fh-regensburg.d...html#Backpropagation
Das scheint sehr hilfreich zu sein, aber ganz verstanden hab ich es nicht. Ich weiß auch nicht genau, wie neuronale Netze jetzt genau Muster erkennen sollen und Regeln daraus ziehen sollen.
Das ist mir (noch) ein bisschen zu kompliziert. Deshalb habe ich es jetzt anders gemacht:
Beide Computer-Spieler bekommen ein Bewertungs-Array. In der Bewertungsfunktion werden verschiedene Kriterien geprüft, die Bewertung wird dann aus dem Array des jeweiligen Spielers geholt. Je nach Spielausgang werden die Arrays angepasst. So sollten beide Spieler immer stärker werden.
Ich hab das Programm mal angehängt. Ist natürlich noch nicht fertig, aber es wäre trotzdem schön, wenn ihr es mal testen würdet.
Einloggen, um Attachments anzusehen!
|
|
Garf
      
Beiträge: 54
Erhaltene Danke: 2
D3Prof, D7PE, TDE
|
Verfasst: So 25.01.09 13:16
Vielleicht kann Du Dir Anregungen bei www.bauer-schweitzer...x/index_minimax.html holen?
|
|
Noodel 
      
Beiträge: 27
|
Verfasst: So 25.01.09 21:19
Danke, das Programm ist sehr hilfreich. Da kann man sich einiges an-/abgucken. Super Link!
Ich würde trotzdem noch gerne wissen, wie man Schach mit neuronalen Netzen (Mustererkennung) spielen lassen kann. Hat da noch jemand eine Idee oder Erklärung? Danke im Voraus!
|
|
Pentagon
Hält's aus hier
Beiträge: 1
|
Verfasst: So 12.04.09 13:28
Hallo... ich bin Eröffnungsbuchautor vom Programm Zappa
netfiles.uiuc.edu/acozzie2/www/zappa/
Habe da so ein Paar nette Ideen, denke die könnten dir behilflich sein in dem Punkt.
Also um ein Datenstau zu vermeiden kannst du ja folgendes machen.
Nach dem verlassen des Eröffnungsbuches gibt es in der regel 3-5 gute Züge, aber den 6-8 sind die schon zweifelhaft ( das ist so die Fausformel ). Dann gibt es wiederum Stellungen wo nur 1-3 Züge möglich sind, und der 4 Zug schon eine gravierender fehler ist. Das selbe kannst du auch bei den erwartetten zügen genau so machen, also den Multiponder ausnutzen. Warum die vermeidlich schlechten züge die der Computer in der Regel so oder so nicht machen wird ( sollte hehe ) sinnlos berechnen. Der efeckt dieser Idee ist das du dadurch sehr sehr schnelle in die tiefe kommen wirst. Also meine Idee basiert darauf das man eben die anderen züge die schlecht sind erst garnicht weiter anschaut um so den Datenstau zu umgehen. Klar kann man da auch mal einen Damenopfer übersehen weil der zug anfangs durch geringe rechentiefe als schlechter befunden wird. Da ssollte man aber auch umgehen können in dem Man eine grundsuche einführt. Die frage ist dann ab welcher tiefe hatt man eine Stellung taktisch abgesichert, denke so 14 ply sollten reichen bei den heutigen Rechnern.
|
|
|