1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-07-11 19:49:14 +00:00

Simplified source code to estimate the winning ratio from an eval value.

We need to adjust the eta again after this commit is pushed.
This commit is contained in:
nodchip 2020-06-28 11:37:15 +09:00
parent cb8accada2
commit 87c8b324f8

View file

@ -1028,24 +1028,10 @@ double sigmoid(double x)
// 評価値を勝率[0,1]に変換する関数 // 評価値を勝率[0,1]に変換する関数
double winning_percentage(double value) double winning_percentage(double value)
{ {
// In Maxima, // 1/(1+10^(-Eval/4))
// load("C:/maxima-5.44.0/cform.lisp"); // = 1/(1+e^(-Eval/4*ln(10))
// PawnValueEg = 206; // = sigmoid(Eval/4*ln(10))
// cform(1.0 / (1.0 + 10.0 ^ (-value / PawnValueEg / 4.0))); return sigmoid(value / PawnValueEg / 4.0 * log(10.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);
} }
// 普通のシグモイド関数の導関数。 // 普通のシグモイド関数の導関数。
@ -1145,7 +1131,6 @@ double calc_grad(Value deep, Value shallow , const PackedSfenValue& psv)
const double q = winning_percentage(shallow); const double q = winning_percentage(shallow);
const double p = winning_percentage(deep); const double p = winning_percentage(deep);
const double dq = delta_winning_percentage(shallow);
// 期待勝率を勝っていれば1、負けていれば 0、引き分けなら0.5として補正項として用いる。 // 期待勝率を勝っていれば1、負けていれば 0、引き分けなら0.5として補正項として用いる。
// game_result = 1,0,-1なので1足して2で割る。 // game_result = 1,0,-1なので1足して2で割る。
@ -1156,9 +1141,7 @@ double calc_grad(Value deep, Value shallow , const PackedSfenValue& psv)
// 実際の勝率を補正項として使っている。 // 実際の勝率を補正項として使っている。
// これがelmo(WCSC27)のアイデアで、現代のオーパーツ。 // これがelmo(WCSC27)のアイデアで、現代のオーパーツ。
const double pp = (q - p) * dq / q / (1.0 - q); const double grad = lambda * (q - p) + (1.0 - lambda) * (q - t);
const double tt = (q - t) * dq / q / (1.0 - q);
const double grad = lambda * pp + (1.0 - lambda) * tt;
return grad; return grad;
} }