From 87c8b324f815d8eaaf09088b54fe2188d3879cef Mon Sep 17 00:00:00 2001 From: nodchip Date: Sun, 28 Jun 2020 11:37:15 +0900 Subject: [PATCH] Simplified source code to estimate the winning ratio from an eval value. We need to adjust the eta again after this commit is pushed. --- src/learn/learner.cpp | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/src/learn/learner.cpp b/src/learn/learner.cpp index f105296f..7189b5a3 100644 --- a/src/learn/learner.cpp +++ b/src/learn/learner.cpp @@ -1028,24 +1028,10 @@ double sigmoid(double x) // 評価値を勝率[0,1]に変換する関数 double winning_percentage(double value) { - // In Maxima, - // load("C:/maxima-5.44.0/cform.lisp"); - // PawnValueEg = 206; - // cform(1.0 / (1.0 + 10.0 ^ (-value / PawnValueEg / 4.0))); - constexpr double PawnValue = PawnValueEg; - return 1.0 * pow(pow(10.0, -0.25 * pow(PawnValue, -1) * value) + 1.0, -1); -} - -double delta_winning_percentage(double value) -{ - // In Maxima, - // load("C:/maxima-5.44.0/cform.lisp"); - // PawnValueEg = 206; - // cform(diff(1.0/(1.0+10.0^(-value/PawnValue/4.0)),value)); - constexpr double PawnValue = PawnValueEg; - return - 0.5756462732485115 * pow(PawnValue, -1) * pow(10.0, -0.25 * pow(PawnValue, -1) * value) * - pow(pow(10.0, -0.25 * pow(PawnValue, -1) * value) + 1.0, -2); + // 1/(1+10^(-Eval/4)) + // = 1/(1+e^(-Eval/4*ln(10)) + // = sigmoid(Eval/4*ln(10)) + return sigmoid(value / PawnValueEg / 4.0 * log(10.0)); } // 普通のシグモイド関数の導関数。 @@ -1145,7 +1131,6 @@ double calc_grad(Value deep, Value shallow , const PackedSfenValue& psv) const double q = winning_percentage(shallow); const double p = winning_percentage(deep); - const double dq = delta_winning_percentage(shallow); // 期待勝率を勝っていれば1、負けていれば 0、引き分けなら0.5として補正項として用いる。 // game_result = 1,0,-1なので1足して2で割る。 @@ -1156,9 +1141,7 @@ double calc_grad(Value deep, Value shallow , const PackedSfenValue& psv) // 実際の勝率を補正項として使っている。 // これがelmo(WCSC27)のアイデアで、現代のオーパーツ。 - const double pp = (q - p) * dq / q / (1.0 - q); - const double tt = (q - t) * dq / q / (1.0 - q); - const double grad = lambda * pp + (1.0 - lambda) * tt; + const double grad = lambda * (q - p) + (1.0 - lambda) * (q - t); return grad; }