< back
nashgpt 1.6 is an improved version of the original nashgpt. Nashgpt is a flop-only transformer model that is trained on the flop data of TurboFire, our game theory optimal (GTO) poker solver. GTO poker is perfect-poker where nash equilibrium is reached. It can be best imagined as two players training against each other, trying to minimize their exploits, or flaws in their game strategy, converging to a strategy where one player cannot win outside of variance. Unfortunately, solving for a single full-street hand takes more time and much more memory than can be afforded in 2026. To avoid ballooning costs, nashgpt is currently only trained on only the flop due to the large growth of the game tree that occurs once the turn and river are added, although we do have plans to workaround that issue. Note that we have not proved that the output is GTO yet. We can test the flop solver now with convergence and exploitability checks, while adding later streets will only make that validation more difficult. For now, when we say GTO, we mean the output of the algorithm used by poker solvers.
There's a few changes made within this version of the model. To begin, we shrunk the parameter count from 57M to 25.2M as a larger model was not proven necessary. We wanted to test whether a smaller model could learn the same strategy without assuming that 57M parameters were required. Next, we shrunk the training through adding isomorphism to the solver - creating buckets of similar hands. For example, As Ks on 7s 6h 2d is equivalent to Ah Kh on 7h 6d 2c when every suit in the hole cards and flop is relabeled by the same permutation. There are only 1,755 flops when implementing isomorphism, so after reducing the hole cards to a tighter 30% range compared to the original wide range, we could fit all possible combinations of flops and hands in a ~1.2GB training file. Lastly, we solved each flop for longer to push us towards nash equilibrium.
We also added multiple different depths into the game tree, allowing raises. The model struggled a few nodes deep (responding to a check raise, for example) but managed to perform well at shallower nodes. This is a large improvement over the original nashgpt which would only allow for an action and response.
Introducing isomorphism added a few additional benefits. We were able to show that the model began learning board textures by holding out 155 complete canonical flops during training and testing the model on those unseen boards. Passing non-canonical hands directly into the model performed much worse, which showed us that suit canonicalization is still required instead of being something the model learned on its own. In our results at the bottom of the page, a fresh solver output is compared against canonical and non-canonical model inputs across 5 different flops.
There was originally a nashgpt 1.5 trained, but we had to throw out the results. It performed much better than this version, but we had made a ridiculous error - we overfit the model. We had simply fit all canonical hands into its weights, acting as a very expensive and inefficient form of compression. It also included a solver bug that led us to folding almost every hand against a raise. To fix this issue, we reserved ~150 extra flops to validate the data, which seemed to fix the issue. If you would like to replicate our results, navigate onto our GitHub page for TurboFire, find the 'llm' branch, and run the bash training script under 'src'. The files used for training the model are also included!
Prompt: <HOLE> Ah Kh <FLOP> Qh Jd 7c <BETTING>
| Action | Solver | Canonical | Non-canonical |
|---|---|---|---|
| HERO_CHECK | 94.39% | 91.67% | 82.55% |
| HERO_ALLIN | 4.54% | 5.63% | 3.63% |
| HERO_BET100 | 0.94% | 1.43% | 12.16% |
| HERO_BET40 | 0.14% | 1.27% | 1.66% |
Prompt: <HOLE> Jc 7c <FLOP> 9h 8h 6d <BETTING> OPP_CHECK
| Action | Solver | Canonical | Non-canonical |
|---|---|---|---|
| HERO_ALLIN | 92.53% | 74.32% | 52.18% |
| HERO_BET40 | 2.84% | 14.14% | 2.59% |
| HERO_BET100 | 2.83% | 10.93% | 24.30% |
| HERO_CHECK | 1.79% | 0.61% | 20.94% |
Prompt: <HOLE> Js 5s <FLOP> Ah 7h 2h <BETTING> HERO_CHECK OPP_BET40
| Action | Solver | Canonical | Non-canonical |
|---|---|---|---|
| HERO_FOLD | 94.89% | 93.20% | 81.61% |
| HERO_ALLIN | 2.95% | 4.29% | 6.64% |
| HERO_CALL | 1.21% | 1.29% | 10.79% |
| HERO_RAISE_3X | 0.95% | 1.21% | 0.96% |
Prompt: <HOLE> Js Ts <FLOP> Ah Kd Qc <BETTING> OPP_CHECK HERO_BET40 OPP_RAISE_3X
| Action | Solver | Canonical | Non-canonical |
|---|---|---|---|
| HERO_CALL | 50.00% | 53.02% | 99.98% |
| HERO_FOLD | 50.00% | 46.98% | 0.02% |
Prompt: <HOLE> Ah Qh <FLOP> Kd Kh 4c <BETTING> HERO_CHECK OPP_ALLIN
| Action | Solver | Canonical | Non-canonical |
|---|---|---|---|
| HERO_FOLD | 92.78% | 61.05% | 17.60% |
| HERO_CALL | 7.22% | 38.95% | 82.40% |
(It should be noted this is the first time I have used java script on this site, with it being js-free for ~6 years)