Lichess Horsey
The Essence of a Player: Your Chess Fingerprint
You ever wanted to know which World Champion you play like?Chess players are said to have certain styles like positional and attacking. Anatoly Karpov is known as a positional player, Mikhail Tal is known as an attacking player. Positional is focusing on gaining strategical advantages while attacking is trying to checkmate the King.
Styles are not set in stone, they are labels that generalize how a player plays approximately. A attacker could play positionally and vice versa. But there are tendencies for players to play in certain ways.
How can style be modeled?
Style is individualness, uniqueness. This makes it variation from a standard, the difference between your play and the average play of someone at your level.
So the difference needs to be found for a player compared to the average player at their level.
The important thing is that strength must be separated from style.
As Miguel Nadjorf said "Perfection has no style". Perfect chess is always the best moves with no variation. No variation = no style.
Jason Carlson is an AI Research Engineer who did just this using Maia and published a paper:
Elo-Disentangled Player-Style Embeddings for Human Chess via a Rating-Conditioned Residual Move Model
First we will talk about Maia:
Maia
Maia is a neural network which models how humans play chess. It was trained on human games here on Lichess to make neural nets play chess like a human person.
It is trained on groups of players. Like 1100-1200. In 100 point rating groups to model players of different levels. The latest version is Maia-3.
A basic neural net. Wikipedia
A neural net is made up of nodes (the colored dots). The nodes are arranged in layers (green, blue, purple).
Green: Inputs the position as a vector.
Blue: Hidden layer transforms the input vector and outputs to the final layer.
Purple: Final layer which outputs the moves and probabilities for a particular rating group. What moves that rating group could play and how likely each move is.
The dots are neurons and the arrows are weights. Weights multiply inputs and a bias is added to the result to form the input to another neuron. These are all represented by numbers.
The squared difference of the outcome minus the predicted outcome (player move) is the loss function. The way to find the best weights to predict the outcome was through minimizing the loss function by adjusting the weights. Zero loss means the neural net is perfect, it always predicts the players move. This is never gonna happen of course. But we make it as good as possible.
Minimizing the loss function involves finding points with no slope (0 slope indicates a minima, where the loss function is at its lowest if it is a global minima, an example is a u-shaped curve - the lowest point on the u is at the bottom, and the slope at the bottom is 0). This is done through gradient descent. The error is sent back through previous layers so that the weights and biases can be adjusted (backpropagation). Through reinforcement the weights will become more accurate. In this context the move predictions of Maia for a player at a certain rating will become more accurate.
You can play against Maia on Lichess: https://lichess.org/player/bots
Elo-Disentangled Player-Style Embeddings for Human Chess via a Rating-Conditioned Residual Move Model (Jason Carlson).
A neural net's inputs and outputs can be represented with vectors. A vector in this context is a series of numbers:
Let's say chess strength is red and chess style is green. This simplified diagram represents how the vectors that represent style and strength should be in completely unrelated directions. Source
As players get better they tend to play the same moves more often. But chess style should be orthogonal to strength. Orthogonal means not related.
Carlson's idea was finding how individual players differed from the predicted move for a player of their level by the base model.
This should create a vector which represents chess style.
First they created a base model which predicts how players of different levels play. The base model is made up of Maia-2 which gives a set of candidate moves. Maia-3 and Maia-2 are both used to give raw probabilities for those moves. The Stockfish eval at depth 18 is also used as Maia-3 by itself is worse at predicting moves at the 2300+ range. Context like player rating and ply/phase of the game is also included. The base model was trained on 2 million moves here on Lichess.
Maia-3 has lower prediction rates for stronger players. So Stockfish 18 evals were also used as an input in the neural net to help predict the moves of stronger players. Maia-3 Github.
Using Stockfish 18 evals in the neural net input led to increases in move matching at the higher end of the rating scale. Compared to just using Maia as the input.
A base model is trained (green). Then it is frozen and then a per-player style vector is trained.
So we have a base model that predicts players moves based on strength. This is not based on an individual, just on a rating group as a whole on average.
The way to find chess style for a player is to find the difference between the generic, on average base model and the players' individual moves - What the base model doesn't predict for a individual player.
This vector which represents chess style will be called z.
The style vector was trained on 1 million moves across 2,026 sampled players here on Lichess.
z is a vector with 32 numbers that represents how your playing style differs from the move the base model predicts you to play at your level for a given position. Each player has a z vector that encodes your chess style.
You are the combination of the base model which predicts moves for your rating group plus your chess style vector. Multiplying two player z vectors tells how similar two players are in their style.
This design is used to isolate style from strength.
However, the fact that difference from the norm in a rating group is used to extract style doesn't necessarily mean that style will be captured. This is because hypothetically, stronger players may vary in the same way. Based on what we know of World Champions having styles this is probably not true, but we should double check.
That can be done by seeing if there is a correlation between style and strength through a linear probe.
Carlson found that only 6% of the variance in style was explained by strength. This is good because it means that the style vector is capturing a different construct then strength.
The style vector could also reidentify players 7-34 times above chance.
Now let's look at some diagrams:
The style vector has 32 dimensions. We can't make a diagram since we only see in 3 dimensions (height, width and depth).
But we can make a diagram by squashing the 32 dimensions into 2 dimensions.
Since there are so many dimensions in the vector it makes it hard to see patterns in the different player's styles. That's why a thing called principle components analysis (PCA) can be used. PCA squashes the high dimensional data into two dimensions which represent the two largest shared variance among the players:
The style of various players on Lichess. It is separate from chess strength as shown by the wide spread for all levels.
Grandmasters with similar chess styles are in similar style embedding spaces. The colors represent assigned chess styles which are pre-assigned. The data aligns with these pre-assigned dimensions, showing that the style embedding is related to chess style.
The colors represent assigned chess styles which are pre-assigned (e.g. Kasparov is assigned to be an attacking player). The data aligns with these pre-assigned dimensions, showing that the style embedding is capturing chess style somewhat. It is not a perfect match, but you can see clusters.
Attacking players tend to be on the left in red, positional players tend to be in the top. Universal players are on the bottom left sector.
However these categories were pre-assigned by the author.
Kramnik and Karpov are closer to the attackers than the universal players which is unexpected. Firouzja seems more attacking than universal.
The attacking category has the strongest match to players, but the positional and universal categories are a bit arbitrary.
PCA squashes the 32 dimensions into 2 while trying to keep as much information as possible so that patterns can be seen in high-dimensional data. But some information is always lost. Also we don't know specifically what the 2 dimensions are stylistically.
Carlson stated: "some assignments are debatable (e.g. Kasparov’s nearest neighbor is Kramnik, arguing his play is closer to “universal” than the “attacking” prior). We therefore present the geometry and neighbor structure as the qualitative result and treat purity as a conservative lower bound; finer archetype labels are a natural extension".
Overlaying Famous GMs chess styles over Lichess players shows that style has been separated from strength, the GMs are spread out with different styles. A Lichess player could have a similar chess style to a World Champion.
To sum up: style vectors were found for individual players by finding the vector that encodes the difference between a individual player and the average move that a player of their level would make. The style vector was shown to be independent from strength. A player can be represented as the base model move predictor for their rating range + their individual style vector.
Carlson also discovered that chess style is obtained with only 100 moves from your games. Having 100 moves gave the exact same chess style as 1000 moves according to the cosine similarity of the vectors.
This is absoCHESSly amazing!
A Wholesome Future

Imagine a world where you know your chess style in 32 dimensions.
This is good because then you will be able to find your chess twin!
You will also be able to know what World Champion you play like. This will boost morale and camaraderie for you and your fellow style twins.
Lichess teams can be formed: 'Attackers', 'Positional, 'Universal' etc. And there will be great team battles to determine the best style.
This will be a spectacular future.
However, the research was done using neural nets. So it probably would computationally expensive to perform on every Lichess user. The style vector was trained on only 1 million moves across 2,026 sampled players here on Lichess.
Until then...
NOTICE: A Rickroll was included at the end of this article. It has been removed. I regret any confusion and disappointment caused by the inclusion of this internet meme.
A Rickroll is an internet meme. A meme is a joke which becomes popular on the internet. They way it works is that someone provides a link purporting to be something relevant. However the link simply goes to the Youtube video for the fabulous hit song 'Never Gonna Give You Up' by Rick Astley.
