I would personally welcome also if you won't stay anonymous. (I didn't try hard though to check it)
My name is Kade ^_^
While I do value my privacy, this
should be visible on the righthand side of my posts (unless I've misconfigured something) and you can actually see my name in the help and license information printed by Expositor's `help` and `license` commands.
I don't know how I feel about that. If chess programming were only about climbing the ELO ladder as fast as possible then there's no better way than to look at other open source engine's search-implementation and to add support for NNUEs asap. Especially for us programmers that don't really know enough about chess to write a hand crafted evaluation NNUEs are great. But on the other hand, in what way is the world (even if it's only the chess programming world) a better, richer place by there being yet another NNUE engine on the "market"? And aren't your own options to explore your own evaluation ideas very limited once you have the NNUE evaluation working because whatever you can come up with is probably going to end up worse?
This is not meant as a personal attack. It's more like a conflict of interests (wanting to have a strong engine vs something personal and unique to tinker with) that I find hard to resolve myself, too.
No worries! I didn't take it as a personal attack. It actually made me laugh a bit, because it's a bit ironic: there were many times I complained to @jtwright about strength being the be-all and end-all, and that we don't understand the effects of most techniques nearly as well as we should. (Why do singular extensions work so well for some but not others? What effect does, say, reverse futility pruning have on move ordering at cut nodes? at PV nodes? or does RFP interact with, say, multicut in a predictable way? Quantitatively, how much does this offset the gains from RFP? What classes of mistakes are associated with different formulas for LMR, and how strong or universal is that correlation? and many more.)
I'm still interested in those questions, which you can see in Expositor's `stat` and `trace` commands. But for myself, I realized that answering those questions was a lifetime endeavour, and that if I waited until I truly understood techniques – to the point I could confidently predict the effect a technique would have on strength, node count at depth, or any other statistic – before I used them, I'd
never use them, and I'd never actually have a strong engine. And I did want to have a strong engine! because I wanted to be involved in TCEC, for example. I could just do so concurrently with the other things I was interested in.
In what way is the world better by there being yet another "HCE engine on the market"?
Basically, writing chess engines has been a thing for 60 years now. Most techniques in use have been known since the early 70's. There is no need to write your own chess engine except wanting to write your own chess engine.
This is essentially my take. I decided to write an ultra-sparse shallow network (to use a more descriptive term than "nnue") for Expositor because I knew hardly anything about neural networks in general and wanted to learn. Since that was my goal, I personally have no qualms with using the technique.
So I read the original nnue paper, talked with @jtwright, read the Wikipedia article on backprop, sat down with pen and paper and worked out the math so I'd understand it, read
this article and a bunch of Q&As on the machine learning Stack Exchange... one day I was skimming
this pdf and came across the diagram on page 201. I had to stare at it for a long while before the idea of bank switching finally clicked. It was then, finally, that I wrote the first version of Expositor's network and trainer.
I'm pretty sure that Expositor's current network architecture is actually nearly the same as Koi's (although not as wide and with an extra hidden layer). This is somewhat coincidental – crosscoupling the upper and lower banks between the input and first layer was something I had wanted to do but didn't think was possible, and seeing Koi do it anyway (or at least
thinking that Koi did it anyway) is what triggered the aha moment (also the "I've been an idiot" moment). Perhaps that deserves an acknowledgment in the readme.
I hope there will be also a version later with NNs not trained by SF eval. The readme says this should happen sooner or later.
I agree that it's less than ideal that Expositor's network is trained on SF evaluations and I'd have preferred if the author had developed his own independent dataset. It's clear from the README the author is of the same opinion.
Yep! I personally have no qualms with training from Stockfish data, but I agree it's less than ideal.
The
reason I started with Stockfish scoring is that I wanted something as close to the ground truth as I could find – that way there'd be one less confounding factor while I experimented with network architecture, network size, choice of gradient descent algorithm, &c. Intentionally giving Expositor a unique personality has (up to this point) been a secondary priority.
Regardless, I appreciate the author's transparency and Expositor seems an interesting engine. I'm excited to see how the author improves it going forwards. Congrats.
Thanks, Connor!
Let me say welcome and congratulations.
Thanks, dkappe!