Not logged inCSS-Forum
Forum CSS-Online Help Search Login
CSS-Shop Impressum Datenschutz
Up Topic Hauptforen / CSS-Forum / Benötige Hilfe [Mathematik]
- - By Jörg Oster Date 2021-08-05 16:37
Ich dachte, bevor ich im CCC nachfrage, was ja zur Zeit auch nicht ganz so einfach scheint,
probiere ich es erstmal hier.

Als Aktivierungsfunktion in neuronalen Netzwerken, aber auch zur Umrechnung
der Bewertungen einer Schachengine zu Gewinnwahrscheinlichkeiten in ein [0, 1] oder [-1, 1] Intervall,
wird vorzugsweise die Sigmoid-Funktion genommen.
Siehe z. B. https://de.wikipedia.org/wiki/Sigmoidfunktion.

Ich verwende in meiner MCTS(UCT)-Suche f(x) = 1 / (1 + 10^(-k*x)) mit k = 1/800.

Dies suggeriert allerdings, dass bei dem Wert 0 aufgrund der höchsten Steigung des Graphen,
wir es hier mit einem/dem spielentscheidenden Wendepunkt zu tun haben.

Das sehe ich für Schach aber eigentlich nicht so.
Da denke ich eher, dass die Kurve um 0 herum noch flach sein sollte, und erst so ab einer Bewertung
von -120 bis -150 cp und +120 bis +150 cp eine spielentscheidende Wendung eintritt.

Was ich also brauche ist quasi eine Doppel-Sigmoid-Funktion.
Eine Google-Suche bringt hier eher nur bescheidene Resultate.

Mit welcher Funktion bekommt man das hin?
Irgendwelche Vorschläge?
Parent - - By Lothar Jung Date 2021-08-05 17:08
Hallo Jörg,

Schau mal auf Discord unter tune results nach:

**Tune of:** BetaMctsTrust, BetaMctsPrior, LCBPercentile
**LC0 version (both):** deeabd7
**LC0 options (both):** threads=1, minibatch-size=32, cpuct=1.3, cpuct-at-root=2.5, april-factor=0, april-factor-parent=0, cpuct-factor=2.815, cpuct-factor-at-root=2.815, fpu-value=0.3, fpu-strategy-at-root=absolute, policy-softmax-temp=1.4, minimum-kldgain-per-node=0.00002, smart-pruning-factor=0, moves-left-max-effect=0.1, moves-left-threshold=0, moves-left-slope=0.007, moves-left-quadratic-factor=1, move-overhead-ms=0
**LC0 options (engine1):** betamcts-level=2
**LC0 options (engine2):** betamcts-level=0, betamcts-trust=0, betamcts-prior=0, lcb-percentile=0
**Tuning ranges:** BetaMctsTrust: Real(0, 20), BetaMctsPrior: Real(0, 100), LCBPercentile: Real(0, 0.5)
**Tuning configuration:** acq_function: vr/ei, rounds: 10
**Time control:** visits=10000 (kld)
**Net:** 703810
**Book:** custom-3k (1-3 ply)
**Hardware:** gtx970 + i5-4570
**Tablebases:** syzygy 5-man
**Adjudication:** -draw movenumber=50 movecount=5 score=10 -resign movecount=5 score=1000
**Software:** chess-tuning-tools
**Comment:** tuned for training. test results - https://discord.com/channels/425419482568196106/530486338236055583/787209611601903648

**Optimums found:**
```
BetaMctsTrust      3.12
BetaMctsPrior      32.6
LCBPercentile      0.306
```
**90.0% confidence intervals of the parameters:**
```Parameter      Lower bound  Upper bound
---------------------------------------
BetaMctsTrust          0.3         17.7
BetaMctsPrior          6.0         98.0
LCBPercentile        0.001        0.377
```

Dort sind auch die Graphen abgebildet.

Lothar
Parent - - By Jörg Oster Date 2021-08-05 22:25
Hallo Lothar,

gut gemeint, hat nur leider mit meiner Fragestellung nichts zu tun.
Die abgebildeten Graphen dienen meines Wissens der Veranschaulichung des Tuning-Vorgangs
und sind Bestandteil der chess-tuning-tools.

Gruß,
Jörg.
Parent - - By Lothar Jung Date 2021-08-06 10:18 Edited 2021-08-06 10:20
Das denn:

Algorithm 7.2 montecarlotreenode.cpp function SELECT(Position rootPos)
currentPos ← getCurrentPosition(rootPos) blackToMove ← currentPos.isBlackToMove() cur ← this
chosen ← this
bestVal ← −1
while cur.hasChildren() do
if cur.isNotFullyExpanded then return cur
end if
for all child ∈ cur.children do
winningRate ← (child.totalValue/child.v isits) if blackToMove then
winningRate ← 1 − winningRate end if
uctVal ←winningRate+sqrt(2∗log(cur.visits)/child.visits) if uctVal ≥ bestVal then
bestVal ← uctVal
chosen ← child end if
end for
currentPos.make_move(chosen.lastMove) blackToMove ← not blackToMove
cur ← chosen
end while
return cur end function

Quelle: https://www.ke.tu-darmstadt.de/lehre/arbeiten/bachelor/2012/Arenz_Oleg.pdf
Parent - - By Jörg Oster Date 2021-08-06 19:18
In der Tat, Lothar, das ist die Stelle, an der ich die Gewinnwahrscheinlickeiten
statt der internen Bewertungseinheit von Stockfish benötige.

Code:
winningRate ← (child.totalValue/child.v isits) if blackToMove then
winningRate ← 1 − winningRate end if
uctVal ←winningRate+sqrt(2∗log(cur.visits)/child.visits) if uctVal ≥ bestVal then


ist quasi der Pseudocode der UCB1-Formel.

Gruß,
Jörg.
Parent - By Lothar Jung Date 2021-08-06 19:42 Edited 2021-08-06 19:46
Danke Jörg,

dann konnte ich doch etwas helfen.

Ich habe Kontakt zum Ceres Entwickler dje und helfe ihm beim Testen.

Die Quelle habe ich Dir aus meinem Unterforum gepostet.
Diese Bachelorarbeit ist durchaus empfehlenswert.

Das Unterforum “Schachprogrammierung“ weist einige gute Quellen auch für fortgeschrittene Schachprogrammierer auf.

Viele Grüße

Lothar
Parent - - By Ingo Althöfer Date 2021-08-05 23:02
Hallo Herr Oster,

vor 40 Jahren hat unser Prof in Analysis I den Satz von Stone-Weierstrass
in drei Schritten bewiesen.

1. Stetige Funktion auf [0,1] wird durch eine Treppenfunktion approximiert.

2. Für die Funktion mit f(x) = 0 für x < 1/2  und f(x) = 1  für x > 1/2
    hat er explizit eine Klasse von immer besser approximierenden Polynomen angegeben.
    Die waren gar nicht mal kompliziert...

3. Geschiftete und skalierte Funktionen vom Typ aus 2. lassen sich zu der gewünschten
    Treppen-Approximation zusammensetzen.

Ihre Frage geht ja darum, wie man aus 2. zu 3. gelangt,
wobei Sie bei 2. keine Polynome haben, sondern die Sigmoid-Funktion.

Mir fehlt die Ruhe zum Durchixen, aber es sollte nicht so schwer sein.
Ingo Althöfer.
Parent - By Jörg Oster Date 2021-08-06 15:24
Hallo Herr Althöfer,

vielen Dank erstmal.
Ich befürchte allerdings, dass mich dies nicht wirklich weiter bringt.
Der Mathe Leistungskurs liegt mittlerweile auch schon 37 Jahre zurück ... 

Jörg Oster

P. S. Der Tipp von Frank Brenner allerdings war Gold wert!
Parent - By Benno Hartwig Date 2021-08-06 06:52 Edited 2021-08-06 06:58
Ich denke, da muss man sich erstmal klar werden, an welcher Stelle diese Funktion in der Realisierung gerade deines Algorithmus eingebaut ist und welche Wirkung sie dort hat.
Ich weiß von KI auch zu wenig, aber ohne solch eine Kenntnis deiner Logik hat man wohl gar keine Chance, dir etwas tatsächlich Weiterhelfendes zu sagen.

Natürlich könntest du den Punkt der stärksten Steigung der Funktion um eine Strecke d verschieben mit
f(x) = 1 / (1 + 10^(-k*(x-d)))
aber auf so eine Idee wärst du ja ganz sicher selbst gekommen, wenn dies denn hilfreich für dich gewesen wäre.
Parent - - By Frank Brenner Date 2021-08-06 12:43 Edited 2021-08-06 12:46 Upvotes 1
Ich würde die von dir angegebene Sigmoid Funktion mit einer passenden Funktion g(x) verketten.

Die Verkettungsfunktion muss (im Vergleich zur funktion g(x) = x ) den Bereich um 0 stauchen und den Bereich über/unter +/- 120 ziehen.

Da fällt mir g(x) = x^3 ein.

Also  aus

f(x) = 1 / (1 + 10^(-k*x)) mit k = 1/800.

wird

f(x) = 1 / (1 + 10^(-k*x^3)) mit z.B.  k =  -1/800*1/50000

Das k mußt du dann völlig neu wählen, durch das hoch 3 muß das k viel kleiner gemacht werden.

Du kannst auch eine zweite konstante zb r ins x^3 reindrücken also f(x) = 1 / (1 + 10^(-k*(rx)^3))

r könnte aus dem Intervall [0,2] gewählt werden.

mit diesen beiden Parametern k und r kanns du deine gewünschte Funktion modellieren.

Hier sind passende Funktionsplotter zum austesten:

https://www.mathe-fa.de/de#result

und

http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiJ4XjIiLCJjb2xvciI6IiMwMDAwMDAifSx7InR5cGUiOjEwMDB9XQ--
Parent - - By Jörg Oster Date 2021-08-06 15:44
Hallo Frank,

echt klasse Tipp! Vielen Dank!
Mit ein wenig Rumprobieren habe ich eine erste grobe Annäherung erreicht.
Ich werde noch ein wenig Ausprobieren müssen, aber der Weg ist der richtige! 

Nochmals danke.

Gruß,
Jörg.
Parent - By Frank Brenner Date 2021-08-06 16:00
Hallo Jörg,

mir ist gerade eingefallen, daß sich der zweite Parameter r erübrigt, er ist äquivalent zum Parameter k.

Also brauchst du nur k zu optimieren.

Grüße
Frank
Parent - - By Frank Brenner Date 2021-08-06 16:33 Upvotes 1
Noch ein bißchen besser könnte diese hier geeignet sein:

f(x) =  0.5+atan(1/10000000*x^3)/3.14159265
Parent - - By Jörg Oster Date 2021-08-06 19:02 Upvotes 1
Frank Brenner schrieb:

Noch ein bißchen besser könnte diese hier geeignet sein:

f(x) =  0.5+atan(1/10000000*x^3)/3.14159265


In der Tat, vor allem das asymptotische Verhalten ist eindeutig besser.
Ich habe lediglich eine kleine Änderung vorgenommen.

g(x) = 0.5+atan(1/10000000*(x/2)^3)/3.14159265

Jetzt habe ich nur noch das "kleine" Problem, dass ich auch die Umkehrfunktion dazu brauche.
Das ist aber kein "Muss", weil dies ja nur die Ausgabe betrifft.

Zum Vergleich, hier noch die Wertetabelle mit f(x) (meine ursprüngliche Sigmoid-Funktion) und g(x) wie oben angegeben.

   x    f(x)    g(x)
-1.000  0,05324  0,02541
  -900  0,06976  0,03479
  -800  0,09091  0,04934
  -700  0,11766  0,07294
  -600  0,15098  0,11291
  -500  0,19168  0,18122
  -400  0,24025  0,28522
  -300  0,29661  0,39639
  -200  0,35994  0,46827
  -100  0,42854  0,49602
     0  0,50000  0,50000
   100  0,57146  0,50398
   200  0,64006  0,53173
   300  0,70339  0,60361
   400  0,75975  0,71478
   500  0,80832  0,81878
   600  0,84902  0,88709
   700  0,88234  0,92706
   800  0,90909  0,95066
   900  0,93024  0,96521
1.000  0,94676  0,97459


Man muss das so verstehen, dass der Wert 200 (interne Bewertung von Stockfish) ungefähr 1 Bauern entspricht, also 100 cp.
Man sieht sehr schön die veränderten Gewinnwahrscheinlichkeiten.

Soweit zur Theorie, jetzt muss es sich nur noch in der Praxis beweisen. 
Parent - - By Frank Brenner Date 2021-08-06 21:52 Edited 2021-08-06 21:57 Upvotes 2
Die Umkehrfunktion lautet:    ( 2^3 * 10.000.000 * tan ( 3.14159265 * (x-0.5)))  ^ (1/3)
Parent - - By Jörg Oster Date 2021-08-07 11:46
Frank Brenner schrieb:

Die Umkehrfunktion lautet:    ( 2^3 * 10.000.000 * tan ( 3.14159265 * (x-0.5)))  ^ (1/3)


Hallo Frank,

ich denke, da hat sich ein Fehler eingeschlichen. 

Wenn ich nix falsch gemacht habe, lautet die Umkehrfunktion
2 * ((10.000.000 * tan(pi * abs(x-0.5))) ^ (1/3))

Bei der Implementierung muss ich dann noch aufpassen,
das Ergebnis für den Fall x < 0.5 zu negieren.

Gruß,
Jörg.
Parent - - By Frank Brenner Date 2021-08-08 03:48
Hallo Jörg,

ich finde keinen Fehler in meiner Umkehrfunktion. Vielleicht ist es auch schon zu spät. Meine Augen fallen zu.

Du kannst die 2^3 natürlich aus der Klammer rausholen, dann wird aus (2^3)^(1/3) einfach nur die 2.

Das abs würde ich entfernen, dann brauchst du im Nachrückverfahren das Vorzeichen nicht zu ändern.

Grüße Frank
Parent - By Jörg Oster Date 2021-08-08 11:32
Frank Brenner schrieb:

Hallo Jörg,

ich finde keinen Fehler in meiner Umkehrfunktion. Vielleicht ist es auch schon zu spät. Meine Augen fallen zu.

Du kannst die 2^3 natürlich aus der Klammer rausholen, dann wird aus (2^3)^(1/3) einfach nur die 2.

Das abs würde ich entfernen, dann brauchst du im Nachrückverfahren das Vorzeichen nicht zu ändern.

Grüße Frank


Hallo Frank,
du hast Recht, war mein Fehler.
Ich habe schlichtweg die Klammer bei der ersten Implementierung falsch gesetzt bzw. übersehen.

Das abs brauchte ich, weil ich pow benutzt hatte, um die 3. Wurzel zu berechnen.
Von cppreference.com:
Zitat:
std:pow cannot raise a negative base to a fractional exponent

Ich habe das jetzt auf std::cbrt (seit C++11) abgeändert, welches dies unterstützt und zudem genauere Werte liefert.
Wieder was gelernt! 

Vielen Dank nochmals und einen schönen Sonntag,
Jörg.
Parent - - By Lothar Jung Date 2021-08-11 11:15
Hallo Jörg.

kannst Du mir helfen mit dieser Bitte aus dem Discord Forum:

<@!437624409923125268> in case you're the Lothar in this topic on computerschach.de: <https://forum.computerschach.de/cgi-bin/mwf/topic_show.pl?tid=12422>
Can you pass on the following link to the Leela code? This contains the different variants of the Q (in [-1,1]) to centipawn transformations
<https://github.com/LeelaChessZero/lc0/blob/master/src/mcts/search.cc#L245>

sry, I probably wasn't clear. I wanted to ask you to post the link to the Leela code in the computerschach forum, I wasn't asking about the source given there.

Grüße

Lothar
Parent - By Jörg Oster Date 2021-08-11 12:21
Hallo Lothar,

so wie ich das verstehe, ist doch alles gut.
Er wollte, dass du den Link hier postest. Mission erfüllt.

Gruß,
Jörg.
Up Topic Hauptforen / CSS-Forum / Benötige Hilfe [Mathematik]

Powered by mwForum 2.29.3 © 1999-2014 Markus Wichitill