Nightly arXiv Build Β· Poker Reskin

Did the Solver Train on Your Hands?

A confidence score alone can leak whether a specific piece of text sat in a model's training set β€” no gradients, no weights, just how sure the model sounds. Train a tiny in-browser classifier on synthetic poker hand summaries, then see if you can out-guess the simplest possible attack: a threshold on confidence.

Grounded in: "Empirical Evaluation of Membership Inference Attacks on NLP Text Classifiers: A Baseline Study on SST-2" β€” arXiv:2609.10935 (Novak & Abusaqer, 2026). The paper benchmarks membership inference on GLUE SST-2 sentiment classification: a fine-tuned DistilBERT reaches 0.9466 dev accuracy (vs 0.8756 for a TF-IDF + Logistic Regression baseline), yet a dead-simple loss-threshold attack β€” guess "member" when the model's loss on an example is low / confidence is high β€” beats random guessing on both models (Attack AUC 0.5615 for DistilBERT, 0.5800 for Logistic Regression). This demo replicates that exact mechanism live in your browser on a toy classifier over synthetic poker hand-history text, so the leak is bigger and easier to see than the paper's real, subtler numbers β€” the point still holds: confidence alone is a side channel.
94.66%
DistilBERT dev accuracy (real paper)
87.56%
TF-IDF+LogReg dev accuracy (real paper)
0.5615
DistilBERT attack AUC (real paper)
0.5800
LogReg attack AUC (real paper)

1 Train the toy leak-prone classifier

A bag-of-words logistic regression trains live, right here, on 60 synthetic "value bet" vs. "bluff" hand summaries (full-batch gradient descent, real cross-entropy loss, no pre-baked numbers). Small training set + a vocabulary almost as big as the dataset β‡’ classic overfitting conditions, the same soil membership inference grows in.

Training-set loss (members) Held-out loss (non-members)
Click "Train Model" to fit the classifier and watch the loss gap open up.

2 Where the confidence gap lives

Every dot is one hand: its position is the model's confidence in the true label. Top row = hands the model actually trained on (members). Bottom row = fresh hands it never saw (non-members). Drag the threshold β€” guess "member" whenever confidence clears it β€” and watch the simple attack's accuracy update live.

Threshold confidence: 0.80
Attack accuracy at this threshold: β€”

3 Beat the algorithm

One hand at a time β€” was it in the training set, or is it fresh? Guess before you peek at the model's confidence. Then compare your intuition to the simple threshold attacker's guess, round after round.

Train the model above to start the game.
Your guess: β€”
Ground truth:
Model confidence
β€”
Threshold attacker guesses
β€”
You were
β€”
Attacker was
β€”
You
0 / 0
Threshold attacker
0 / 0