bob wrote:Don wrote:bob wrote:rbarreira wrote:Tord Romstad wrote:rbarreira wrote:As we all know, alpha-beta with null-move, LMR and quiescence (etc etc) is far from being a brute-force method.
I don't agree. "Brute force" is a very fair description of alpha-beta with null move, LMR and quiescence, IMHO. These are all very crude and simple techniques.
Brute force works very well for chess, because in a way, chess is a rather simple game. In general, the player with more material wins, and material is easy to count. All a program has to do to beat humans is to avoid giving away material, ruthlessly capture material whenever it has the chance, and not creating too many obvious positional weaknesses. It doesn't even matter if the humans play stronger moves on average (which I actually think is still true for the top human players), because even the best humans make too many serious tactical mistakes.
It would be interesting to see more research in chess programs using entirely different techniques -- even if these programs weren't quite as strong -- but because most programmers find it more attractive to follow an easy road to write a super strong program than to follow a very hard road to create a program that will perhaps not play very well at all, such programs are not very likely to appear. Less concrete and materialistic games (like go and shogi) are more interesting from this perspective.
From what I read, the best programs have an effective branching factor of 2.0 for each ply. That's far below the number of moves per ply, which tells me that there is so much pruning that I can't call it brute-force (which is a well defined term meaning blindly exploring every possibility in a search space).
Programs may have an "effective branching factor" of 2.0 or less, but not a real branching factor. Unless you do forward pruning, and nobody does that very close to the root, you will have a branching factor of about 38 if you average over the entire game...
I do not believe that anybody would say that plain alpha/beta is not brute force, and yet it has an effective branching factor of sqrt(38) to 2*sqrt(38) with no reductions or futility pruning. Brute force simply implies that all moves are searched, whether they are reduced or extended is irrelevant.
This is the point we disagree on. Even by your own definition if I have 38 moves and reject 36 of them, I still had to do SOMETHING to reject them, even if it is to apply a swap off or static analysis of some kind - which is in fact a 1 ply search. It's very arbitrary to make an issue out of how that selection criteria "HAS" to work in order to be called selective.
As I said in my other post, this is certainly a valid point for debate, and one could take either side of the issue and have plenty of points for arguing.
Yes, I agree. It comes down to semantics and how you define things and there is no point in us arguing that as long as we understand the issues.
However, the "L" in LMR is not a very intelligent approach to selectivity. At least with null-move, we try a reduced-depth search and the null-move observation is a valid idea. But with LMR we just reduce the crap out of moves based on their order in the move list, where not a lot of effort goes into that ordering.
It amazes me that it works so well. It's about 100 ELO for Komodo on shallow searches and probably goes up with depth.
However it's not surprising if you take measurements at all-nodes to see how often move 1 is best, then move 2, and so on. You will find that each move is best much more often than the next move in the list. At least it's this way for Komodo. I think the best move was in the first 2 or 3 something like 95% of the time or more. I don't remember the exact number, but what I saw made it obvious why LMR works so well.
To me this is like old fashioned selective search. It has all the elements, and it's just done more intelligently. Here is how it works:
1. Pick the best N moves and search them.
2. Discard the rest.
But step 2 is a bit more intelligent because it goes like this:
2.1 select the next candidate to be tossed.
2.2 perform a quick test to determine that you really want to toss it.
2.3 toss the move unless step 2.2 says otherwise.
Step 1 is to pick the best N moves, and it's natural to determine that by sorting the move list so that the best move is first, the second best is second, etc. Well isn't that what we are doing?
The quality of the moves is determined by some sort of heuristic - in my case a variant of the history heuristic combined with other criteria but nothing prevents anyone from doing something more clever.
You may balk at using the history heuristic, but it's way better than what the old fashioned "selective search" programs did - statistics are more reliable that the superficial things they tried to do. (Of course they were very crippled by hardware, we are not.)
To me, reducing a move, is virtually the same as deciding whether to toss it.
So from what I see there is no argument for saying what we are doing is nothing like selective search. It's hard to even imagine improving on this except by having a smarter evaluation function and a smarter "selection criteria" which is exactly what everyone is trying to do.
The observation is correct that we have to look at millions of nodes to play just as well as a human. This always seems to lead people to believe that we are doing it all wrong with computers. I don't feel that way, because I don't believe humans and computers are built with the same hardware and design.
That would be like saying that something is wrong with humans because they cannot run as fast as horses and trying to improve on this by imitating the horse. To imitate the superior horse we would have to run on our hands and feet - after all the horse is faster and that's how they do it. But we are not made the same as horses. We have to do what works best for us, horses have to do what works best for them, and we have to program computers to take advantage of what they do best and we don't.
In the early to middle 70's, I did the usual shannon-B program, where we had a max number of moves to search at each depth, usually tapered as you get farther from the root. But these selections/exclusions are not based on much in the way of intelligence or trying to emulate human chess playing. A human is _clearly_ a selective searcher, looking at a hundred (or two) positions to choose a single move to play in the game. That is selective. And includes lots of room for error. And we use a lot of unknown skills to produce that selectivity, unknown because no one has a clue about what goes on inside the mind during that process.
Computers do everything quickly. And clearly even with reductions, the first N plies of the search are certainly full-width. Just that for a 24 ply search, you might only go 6-8 moves deep along all branches and then search others deeper or not depending on some very simplistic rules. Might be interesting to measure this effect. For every call to Quiesce, record the number of plies from the root in one counter, and the actual iteration depth in another. Then average both over a game to see how deep an N ply search actually goes full-width...
Near the tips we certainly forward prune, and in the q-search we forward prune everything but captures, promotions and maybe a few checks. But that is out on the horizon, not near the root...