mirror of
https://github.com/official-stockfish/Stockfish.git
synced 2026-07-22 20:57:10 +00:00
Introduces a new NNUE network architecture and associated network parameters, as obtained by a new pytorch trainer. The network is already very strong at short TC, without regression at longer TC, and has potential for further improvements. https://tests.stockfishchess.org/tests/view/60a159c65085663412d0921d TC: 10s+0.1s, 1 thread ELO: 21.74 +-3.4 (95%) LOS: 100.0% Total: 10000 W: 1559 L: 934 D: 7507 Ptnml(0-2): 38, 701, 2972, 1176, 113 https://tests.stockfishchess.org/tests/view/60a187005085663412d0925b TC: 60s+0.6s, 1 thread ELO: 5.85 +-1.7 (95%) LOS: 100.0% Total: 20000 W: 1381 L: 1044 D: 17575 Ptnml(0-2): 27, 885, 7864, 1172, 52 https://tests.stockfishchess.org/tests/view/60a2beede229097940a03806 TC: 20s+0.2s, 8 threads LLR: 2.93 (-2.94,2.94) <0.50,3.50> Total: 34272 W: 1610 L: 1452 D: 31210 Ptnml(0-2): 30, 1285, 14350, 1439, 32 https://tests.stockfishchess.org/tests/view/60a2d687e229097940a03c72 TC: 60s+0.6s, 8 threads LLR: 2.94 (-2.94,2.94) <-2.50,0.50> Total: 45544 W: 1262 L: 1214 D: 43068 Ptnml(0-2): 12, 1129, 20442, 1177, 12 The network has been trained (by vondele) using the https://github.com/glinscott/nnue-pytorch/ trainer (started by glinscott), specifically the branch https://github.com/Sopel97/nnue-pytorch/tree/experiment_56. The data used are in 64 billion positions (193GB total) generated and scored with the current master net d8: https://drive.google.com/file/d/1hOOYSDKgOOp38ZmD0N4DV82TOLHzjUiF/view?usp=sharing d9: https://drive.google.com/file/d/1VlhnHL8f-20AXhGkILujnNXHwy9T-MQw/view?usp=sharing d10: https://drive.google.com/file/d/1ZC5upzBYMmMj1gMYCkt6rCxQG0GnO3Kk/view?usp=sharing fishtest_d9: https://drive.google.com/file/d/1GQHt0oNgKaHazwJFTRbXhlCN3FbUedFq/view?usp=sharing This network also contains a few architectural changes with respect to the current master: Size changed from 256x2-32-32-1 to 512x2-16-32-1 ~15-20% slower ~2x larger adds a special path for 16 valued ClippedReLU fixes affine transform code for 16 inputs/outputs, buy using InputDimensions instead of PaddedInputDimensions this is safe now because the inputs are processed in groups of 4 in the current affine transform code The feature set changed from HalfKP to HalfKAv2 Includes information about the kings like HalfKA Packs king features better, resulting in 8% size reduction compared to HalfKA The board is flipped for the black's perspective, instead of rotated like in the current master PSQT values for each feature the feature transformer now outputs a part that is fowarded directly to the output and allows learning piece values more directly than the previous network architecture. The effect is visible for high imbalance positions, where the current master network outputs evaluations skewed towards zero. 8 PSQT values per feature, chosen based on (popcount(pos.pieces()) - 1) / 4 initialized to classical material values on the start of the training 8 subnetworks (512x2->16->32->1), chosen based on (popcount(pos.pieces()) - 1) / 4 only one subnetwork is evaluated for any position, no or marginal speed loss A diagram of the network is available: https://user-images.githubusercontent.com/8037982/118656988-553a1700-b7eb-11eb-82ef-56a11cbebbf2.png A more complete description: https://github.com/glinscott/nnue-pytorch/blob/master/docs/nnue.md closes https://github.com/official-stockfish/Stockfish/pull/3474 Bench: 3806488
112 lines
3.9 KiB
C++
112 lines
3.9 KiB
C++
/*
|
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
|
Copyright (C) 2004-2021 The Stockfish developers (see AUTHORS file)
|
|
|
|
Stockfish is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Stockfish is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
//Definition of input features HalfKP of NNUE evaluation function
|
|
|
|
#ifndef NNUE_FEATURES_HALF_KA_V2_H_INCLUDED
|
|
#define NNUE_FEATURES_HALF_KA_V2_H_INCLUDED
|
|
|
|
#include "../nnue_common.h"
|
|
|
|
#include "../../evaluate.h"
|
|
#include "../../misc.h"
|
|
|
|
namespace Stockfish {
|
|
struct StateInfo;
|
|
}
|
|
|
|
namespace Stockfish::Eval::NNUE::Features {
|
|
|
|
// Feature HalfKAv2: Combination of the position of own king
|
|
// and the position of pieces
|
|
class HalfKAv2 {
|
|
|
|
// unique number for each piece type on each square
|
|
enum {
|
|
PS_NONE = 0,
|
|
PS_W_PAWN = 0,
|
|
PS_B_PAWN = 1 * SQUARE_NB,
|
|
PS_W_KNIGHT = 2 * SQUARE_NB,
|
|
PS_B_KNIGHT = 3 * SQUARE_NB,
|
|
PS_W_BISHOP = 4 * SQUARE_NB,
|
|
PS_B_BISHOP = 5 * SQUARE_NB,
|
|
PS_W_ROOK = 6 * SQUARE_NB,
|
|
PS_B_ROOK = 7 * SQUARE_NB,
|
|
PS_W_QUEEN = 8 * SQUARE_NB,
|
|
PS_B_QUEEN = 9 * SQUARE_NB,
|
|
PS_KING = 10 * SQUARE_NB,
|
|
PS_NB = 11 * SQUARE_NB
|
|
};
|
|
|
|
static constexpr IndexType PieceSquareIndex[COLOR_NB][PIECE_NB] = {
|
|
// convention: W - us, B - them
|
|
// viewed from other side, W and B are reversed
|
|
{ PS_NONE, PS_W_PAWN, PS_W_KNIGHT, PS_W_BISHOP, PS_W_ROOK, PS_W_QUEEN, PS_KING, PS_NONE,
|
|
PS_NONE, PS_B_PAWN, PS_B_KNIGHT, PS_B_BISHOP, PS_B_ROOK, PS_B_QUEEN, PS_KING, PS_NONE },
|
|
{ PS_NONE, PS_B_PAWN, PS_B_KNIGHT, PS_B_BISHOP, PS_B_ROOK, PS_B_QUEEN, PS_KING, PS_NONE,
|
|
PS_NONE, PS_W_PAWN, PS_W_KNIGHT, PS_W_BISHOP, PS_W_ROOK, PS_W_QUEEN, PS_KING, PS_NONE }
|
|
};
|
|
|
|
// Orient a square according to perspective (rotates by 180 for black)
|
|
static Square orient(Color perspective, Square s);
|
|
|
|
// Index of a feature for a given king position and another piece on some square
|
|
static IndexType make_index(Color perspective, Square s, Piece pc, Square ksq);
|
|
|
|
public:
|
|
// Feature name
|
|
static constexpr const char* Name = "HalfKAv2(Friend)";
|
|
|
|
// Hash value embedded in the evaluation file
|
|
static constexpr std::uint32_t HashValue = 0x5f234cb8u;
|
|
|
|
// Number of feature dimensions
|
|
static constexpr IndexType Dimensions =
|
|
static_cast<IndexType>(SQUARE_NB) * static_cast<IndexType>(PS_NB);
|
|
|
|
// Maximum number of simultaneously active features.
|
|
static constexpr IndexType MaxActiveDimensions = 32;
|
|
|
|
// Get a list of indices for active features
|
|
static void append_active_indices(
|
|
const Position& pos,
|
|
Color perspective,
|
|
ValueListInserter<IndexType> active);
|
|
|
|
// Get a list of indices for recently changed features
|
|
static void append_changed_indices(
|
|
Square ksq,
|
|
StateInfo* st,
|
|
Color perspective,
|
|
ValueListInserter<IndexType> removed,
|
|
ValueListInserter<IndexType> added);
|
|
|
|
// Returns the cost of updating one perspective, the most costly one.
|
|
// Assumes no refresh needed.
|
|
static int update_cost(StateInfo* st);
|
|
static int refresh_cost(const Position& pos);
|
|
|
|
// Returns whether the change stored in this StateInfo means that
|
|
// a full accumulator refresh is required.
|
|
static bool requires_refresh(StateInfo* st, Color perspective);
|
|
};
|
|
|
|
} // namespace Stockfish::Eval::NNUE::Features
|
|
|
|
#endif // #ifndef NNUE_FEATURES_HALF_KA_V2_H_INCLUDED
|