Thomas Piacentini
← Workshop

Cheat sheet

Probability and Statistics for ML

Original text · English

Distributions, Bayes, tests, bootstrap, sampling from logits and Markov chains. From-scratch Python and SciPy.

Logits to a token

probsthenLogitsone per tokenTemperaturedivide by TSoftmaxsubtract max firstTop-kkeep k, renormalizeTop-psmallest set with cumsum>= pSamplesample_from_probs
Nodes and connections
NodeRoleKind
Logitsone per token
Temperaturedivide by T
Softmaxsubtract max first
Top-kkeep k, renormalize
Top-psmallest set with cumsum >= p
Samplesample_from_probs
FromToConnection
LogitsTemperature
TemperatureSoftmax
SoftmaxTop-kprobs
Top-kTop-pthen
Top-pSample
Sources

Bayesian A/B test

  1. Prior start each variant at Beta(1, 1). It is uniform.
  2. Data A gets 50 clicks in 1000 views. B gets 65 clicks in 1000 views.
  3. Update beta_update(alpha, beta_param, successes, failures) adds the counts.
  4. Posteriors A is Beta(51, 951), mean 0.051. B is Beta(66, 936), mean 0.066.
  5. Monte Carlo draw 100,000 samples from each. P(B > A) is the fraction where B wins.
  6. Decide ship B above 0.95. Ship A below 0.05. Else collect more data.
Sources

Tasks in code

TaskCode
Posterior from one testbayes(prior=0.0001, likelihood=0.99, false_positive_rate=0.01)
Repeat the testsequential_bayes(prior, likelihood, false_positive_rate, num_tests)
Spam filter with add-one smoothingNaiveBayes(smoothing=1.0), then classifier.train(train_docs, train_labels)
Loss from logitscross_entropy_loss(logits, target_index)
Bootstrap confidence intervalbootstrap_statistic(data, stat_func, n_bootstrap=5000, ci=95)
Welch t-test, paired t-testtwo_sample_ttest(data1, data2), paired_ttest(data1, data2)
Effect sizecohens_d(data1, data2), then interpret_cohens_d(d)
Correct for many testsbonferroni_correction(p_values, alpha=0.05)
Sources

Sample from scratch

x = sample_exponential_inverse_cdf(lam)-log(u) / lam
x = rejection_sample(target_pdf, proposal_sample, proposal_pdf, M)accept rate 1/M
est = importance_sampling_estimate(f, target_pdf, proposal_pdf, proposal_sample, n)
idx = temperature_sample(logits, temperature)z / T, then softmax
idx = top_k_sample(logits, k)keep the k largest logits
idx = top_p_sample(logits, p)stop when cumsum >= p
z = reparam_sample(mu, sigma)mu + sigma * epsilon
y = gumbel_softmax_sample(log_probs, temperature)soft one-hot
Sources

Library calls

normal = stats.norm(loc=0, scale=1)
normal.cdf(1.96)P(X < 1.96)
normal.ppf(0.975)inverse CDF
samples = normal.rvs(size=10000)
probs = softmax(logits)from scipy.special
rng = np.random.default_rng(42)
token = rng.choice(len(logits), p=probs)
distribution = distribution @ Ppower method, repeat 100 times
eigenvalues = np.linalg.eigvals(P)
spectral_gap = 1 - sorted(np.abs(eigenvalues))[-2]mixing time near 1/gap
Sources

Key formulas

Bayes
P(A \mid B) = \frac{P(B \mid A) \cdot P(A)}{P(B)}. P(B) is the normalizer.
Variance
\mathrm{Var}(X) = \mathbb{E}[X^2] - (\mathbb{E}[X])^2. Sample variance divides by n-1.
Softmax with T
p_i = \exp(z_i / T) / \sum_j \exp(z_j / T).
Laplace smoothing
add 1 to each count and the vocabulary size to the total.
Beta update
prior Beta(a, b) with s successes and f failures gives Beta(a + s, b + f).
Importance weight
w(x) = p(x) / q(x). Average f(x_i) \, w(x_i) over x_i \sim q.
Metropolis-Hastings
accept with \min(1, a). A symmetric proposal gives a = p(x') / p(x).
Langevin
x_{t+1} = x_t - dt \, \nabla U(x_t) + \sqrt{2 T \, dt} \, z_t.
Sources

Distributions

CommandWhat it does
BernoulliMean p, variance p(1-p). Binary classification
CategoricalProbabilities sum to 1. Softmax output
PoissonMean and variance both lambda. Event counts
Uniform(0, 1)E[U] = 0.5, Var(U) = 1/12. Start of every sampler
Normal68%, 95%, 99.7% within 1, 2, 3 sigma
Beta(a, b)Mean a/(a+b). Conjugate prior for Bernoulli
ExponentialInverse CDF gives x = -ln(u) / lambda
Brownian motionB(t) is normal with mean 0 and variance t
Sources

Pick a test

CommandWhat it does
One-sample t-testMean against mu_0. Degrees of freedom n - 1
Welch t-testTwo independent groups. No equal variance assumption
Paired t-testSame folds for both models. Test d_i against 0
Chi-squaredObserved against expected frequencies
Mann-Whitney UTwo groups without a normal assumption
Wilcoxon signed-rankPaired data. Good for 5 or 10 folds
Spearman rhoMonotonic relation on ranks. Robust to outliers
BootstrapAny metric. 95% CI from the 2.5th and 97.5th percentiles
Sources

Numbers and defaults

SettingDefaultNote
Significance level alpha0.05Reject H0 when p is below it
z for a 95% interval1.96x_bar plus or minus z times s / sqrt(n)
n_bootstrap5000The lesson range is 1000 to 10000
CLT sample sizen >= 30Use n >= 100 for skewed data
Cohen's d, large effect0.80.2 small, 0.5 medium
MH acceptance, Gaussian proposal0.234High dimensions
Top-k k40Typical setting
Temperature with top-p0.7 + top-p 0.9General purpose
Sources

Troubleshooting

SymptomCauseFix
exp(102) overflows in softmaxLarge logitsSubtract the max logit first
Sequence probability is 0.0Underflow after about 30 termsAdd log probabilities
Naive Bayes score is 0Unseen word has MLE count 0Add-one Laplace smoothing
99% test gives about 1% sickRare prior dominatesUse the base rate. Run a second test
One of 20 metrics is significant64% chance of a false positiveBonferroni: alpha / m
Tiny p-value on a 0.03% gainVery large nReport the effect size too
MH chain stuck or slowProposal scale too large or too smallTune toward about 23% acceptance
A few samples dominate the estimateProposal q far from pSelf-normalize the weights
Sources

Questions

Is the p-value the chance that H0 is true?
No. It is P(data this extreme given H0).
What does a 95% CI mean?
95% of intervals from repeated experiments contain the true mean.
Why the reparameterization trick?
Sampling blocks gradients. z = mu + sigma * epsilon is differentiable.
Why top-p over top-k?
Top-p adapts the candidate set to the model confidence.
How fast does a chain mix?
A spectral gap of 0.2 needs about 5 steps. 0.01 needs about 100.
How does MAP relate to regularization?
A Gaussian prior is L2. A Laplace prior is L1.
Sources

Tips

  • Evaluate both models on the same test set and the same folds.
  • Report the p-value and the effect size together.
  • Monte Carlo error is O(1 / sqrt(N)) in any dimension.
  • Discard burn-in samples. Run several chains from different starts.
  • A random walk drifts about sqrt(n) from the origin after n steps.
  • Use T = 0.0 (greedy) for factual answers and deterministic tasks.
Sources
Original source
---
id: probability-statistics
title: Probability and Statistics for ML
code: PS
subtitle: Distributions, Bayes, tests, bootstrap, sampling from logits and Markov chains. From-scratch Python and SciPy.
hue: 160
sources: phases/01-math-foundations/06-probability-and-distributions, phases/01-math-foundations/07-bayes-theorem, phases/01-math-foundations/15-statistics-for-ml, phases/01-math-foundations/16-sampling-methods, phases/01-math-foundations/22-stochastic-processes
source_hash: 229da09316216de4
---

## Logits to a token
type: architecture
from: phases/01-math-foundations/16-sampling-methods/docs/en.md, phases/01-math-foundations/16-sampling-methods/code/sampling.py

```arch
node | logits | 1,1 | Logits | one per token
node | temp | 2,1 | Temperature | divide by T
node | soft | 3,1 | Softmax | subtract max first
node | topk | 1,2 | Top-k | keep k, renormalize
node | topp | 2,2 | Top-p | smallest set with cumsum >= p
node | pick | 3,2 | Sample | sample_from_probs
edge | logits | temp |
edge | temp | soft |
edge | soft | topk | probs
edge | topk | topp | then
edge | topp | pick |
```

## Bayesian A/B test
type: flow
from: phases/01-math-foundations/07-bayes-theorem/docs/en.md, phases/01-math-foundations/07-bayes-theorem/code/bayes.py

1. **Prior**: start each variant at Beta(1, 1). It is uniform.
2. **Data**: A gets 50 clicks in 1000 views. B gets 65 clicks in 1000 views.
3. **Update**: `beta_update(alpha, beta_param, successes, failures)` adds the counts.
4. **Posteriors**: A is Beta(51, 951), mean 0.051. B is Beta(66, 936), mean 0.066.
5. **Monte Carlo**: draw 100,000 samples from each. P(B > A) is the fraction where B wins.
6. **Decide**: ship B above 0.95. Ship A below 0.05. Else collect more data.

## Tasks in code
type: task-table
span: 2
from: phases/01-math-foundations/07-bayes-theorem/docs/en.md, phases/01-math-foundations/07-bayes-theorem/code/bayes.py, phases/01-math-foundations/15-statistics-for-ml/code/statistics.py, phases/01-math-foundations/06-probability-and-distributions/code/probability.py

| Task | Code |
|---|---|
| Posterior from one test | `bayes(prior=0.0001, likelihood=0.99, false_positive_rate=0.01)` |
| Repeat the test | `sequential_bayes(prior, likelihood, false_positive_rate, num_tests)` |
| Spam filter with add-one smoothing | `NaiveBayes(smoothing=1.0)`, then `classifier.train(train_docs, train_labels)` |
| Loss from logits | `cross_entropy_loss(logits, target_index)` |
| Bootstrap confidence interval | `bootstrap_statistic(data, stat_func, n_bootstrap=5000, ci=95)` |
| Welch t-test, paired t-test | `two_sample_ttest(data1, data2)`, `paired_ttest(data1, data2)` |
| Effect size | `cohens_d(data1, data2)`, then `interpret_cohens_d(d)` |
| Correct for many tests | `bonferroni_correction(p_values, alpha=0.05)` |

## Sample from scratch
type: annotated-code
lang: python
from: phases/01-math-foundations/16-sampling-methods/docs/en.md, phases/01-math-foundations/16-sampling-methods/code/sampling.py

```python
x = sample_exponential_inverse_cdf(lam)  # -log(u) / lam
x = rejection_sample(target_pdf, proposal_sample, proposal_pdf, M)  # accept rate 1/M
est = importance_sampling_estimate(f, target_pdf, proposal_pdf, proposal_sample, n)
idx = temperature_sample(logits, temperature)  # z / T, then softmax
idx = top_k_sample(logits, k)  # keep the k largest logits
idx = top_p_sample(logits, p)  # stop when cumsum >= p
z = reparam_sample(mu, sigma)  # mu + sigma * epsilon
y = gumbel_softmax_sample(log_probs, temperature)  # soft one-hot
```

## Library calls
type: annotated-code
lang: python
from: phases/01-math-foundations/06-probability-and-distributions/docs/en.md, phases/01-math-foundations/16-sampling-methods/docs/en.md, phases/01-math-foundations/22-stochastic-processes/docs/en.md

```python
normal = stats.norm(loc=0, scale=1)
normal.cdf(1.96)  # P(X < 1.96)
normal.ppf(0.975)  # inverse CDF
samples = normal.rvs(size=10000)
probs = softmax(logits)  # from scipy.special
rng = np.random.default_rng(42)
token = rng.choice(len(logits), p=probs)
distribution = distribution @ P  # power method, repeat 100 times
eigenvalues = np.linalg.eigvals(P)
spectral_gap = 1 - sorted(np.abs(eigenvalues))[-2]  # mixing time near 1/gap
```

## Key formulas
type: concepts
from: phases/01-math-foundations/06-probability-and-distributions/docs/en.md, phases/01-math-foundations/07-bayes-theorem/docs/en.md, phases/01-math-foundations/15-statistics-for-ml/docs/en.md, phases/01-math-foundations/16-sampling-methods/docs/en.md, phases/01-math-foundations/22-stochastic-processes/docs/en.md

- **Bayes**: $P(A \mid B) = \frac{P(B \mid A) \cdot P(A)}{P(B)}$. $P(B)$ is the normalizer.
- **Variance**: $\mathrm{Var}(X) = \mathbb{E}[X^2] - (\mathbb{E}[X])^2$. Sample variance divides by $n-1$.
- **Softmax with T**: $p_i = \exp(z_i / T) / \sum_j \exp(z_j / T)$.
- **Laplace smoothing**: add 1 to each count and the vocabulary size to the total.
- **Beta update**: prior Beta(a, b) with s successes and f failures gives Beta(a + s, b + f).
- **Importance weight**: $w(x) = p(x) / q(x)$. Average $f(x_i) \, w(x_i)$ over $x_i \sim q$.
- **Metropolis-Hastings**: accept with $\min(1, a)$. A symmetric proposal gives $a = p(x') / p(x)$.
- **Langevin**: $x_{t+1} = x_t - dt \, \nabla U(x_t) + \sqrt{2 T \, dt} \, z_t$.

## Distributions
type: command-table
from: phases/01-math-foundations/06-probability-and-distributions/docs/en.md, phases/01-math-foundations/07-bayes-theorem/docs/en.md, phases/01-math-foundations/16-sampling-methods/docs/en.md, phases/01-math-foundations/22-stochastic-processes/docs/en.md

| Command | What it does |
|---|---|
| Bernoulli | Mean p, variance p(1-p). Binary classification |
| Categorical | Probabilities sum to 1. Softmax output |
| Poisson | Mean and variance both lambda. Event counts |
| Uniform(0, 1) | E[U] = 0.5, Var(U) = 1/12. Start of every sampler |
| Normal | 68%, 95%, 99.7% within 1, 2, 3 sigma |
| Beta(a, b) | Mean a/(a+b). Conjugate prior for Bernoulli |
| Exponential | Inverse CDF gives x = -ln(u) / lambda |
| Brownian motion | B(t) is normal with mean 0 and variance t |

## Pick a test
type: command-table
from: phases/01-math-foundations/15-statistics-for-ml/docs/en.md

| Command | What it does |
|---|---|
| One-sample t-test | Mean against mu_0. Degrees of freedom n - 1 |
| Welch t-test | Two independent groups. No equal variance assumption |
| Paired t-test | Same folds for both models. Test d_i against 0 |
| Chi-squared | Observed against expected frequencies |
| Mann-Whitney U | Two groups without a normal assumption |
| Wilcoxon signed-rank | Paired data. Good for 5 or 10 folds |
| Spearman rho | Monotonic relation on ranks. Robust to outliers |
| Bootstrap | Any metric. 95% CI from the 2.5th and 97.5th percentiles |

## Numbers and defaults
type: defaults
from: phases/01-math-foundations/07-bayes-theorem/docs/en.md, phases/01-math-foundations/15-statistics-for-ml/docs/en.md, phases/01-math-foundations/15-statistics-for-ml/code/statistics.py, phases/01-math-foundations/16-sampling-methods/docs/en.md

| Setting | Default | Note |
|---|---|---|
| Significance level alpha | 0.05 | Reject H0 when p is below it |
| z for a 95% interval | 1.96 | x_bar plus or minus z times s / sqrt(n) |
| `n_bootstrap` | 5000 | The lesson range is 1000 to 10000 |
| CLT sample size | n >= 30 | Use n >= 100 for skewed data |
| Cohen's d, large effect | 0.8 | 0.2 small, 0.5 medium |
| MH acceptance, Gaussian proposal | 0.234 | High dimensions |
| Top-k `k` | 40 | Typical setting |
| Temperature with top-p | 0.7 + top-p 0.9 | General purpose |

## Troubleshooting
type: troubleshooting
from: phases/01-math-foundations/06-probability-and-distributions/docs/en.md, phases/01-math-foundations/07-bayes-theorem/docs/en.md, phases/01-math-foundations/15-statistics-for-ml/docs/en.md, phases/01-math-foundations/16-sampling-methods/docs/en.md, phases/01-math-foundations/22-stochastic-processes/docs/en.md

| Symptom | Cause | Fix |
|---|---|---|
| exp(102) overflows in softmax | Large logits | Subtract the max logit first |
| Sequence probability is 0.0 | Underflow after about 30 terms | Add log probabilities |
| Naive Bayes score is 0 | Unseen word has MLE count 0 | Add-one Laplace smoothing |
| 99% test gives about 1% sick | Rare prior dominates | Use the base rate. Run a second test |
| One of 20 metrics is significant | 64% chance of a false positive | Bonferroni: alpha / m |
| Tiny p-value on a 0.03% gain | Very large n | Report the effect size too |
| MH chain stuck or slow | Proposal scale too large or too small | Tune toward about 23% acceptance |
| A few samples dominate the estimate | Proposal q far from p | Self-normalize the weights |

## Questions
type: qa
from: phases/01-math-foundations/15-statistics-for-ml/docs/en.md, phases/01-math-foundations/16-sampling-methods/docs/en.md, phases/01-math-foundations/22-stochastic-processes/docs/en.md, phases/01-math-foundations/07-bayes-theorem/docs/en.md

- **Is the p-value the chance that H0 is true?** No. It is P(data this extreme given H0).
- **What does a 95% CI mean?** 95% of intervals from repeated experiments contain the true mean.
- **Why the reparameterization trick?** Sampling blocks gradients. z = mu + sigma * epsilon is differentiable.
- **Why top-p over top-k?** Top-p adapts the candidate set to the model confidence.
- **How fast does a chain mix?** A spectral gap of 0.2 needs about 5 steps. 0.01 needs about 100.
- **How does MAP relate to regularization?** A Gaussian prior is L2. A Laplace prior is L1.

## Tips
type: tips
from: phases/01-math-foundations/15-statistics-for-ml/docs/en.md, phases/01-math-foundations/16-sampling-methods/docs/en.md, phases/01-math-foundations/22-stochastic-processes/docs/en.md

- Evaluate both models on the same test set and the same folds.
- Report the p-value and the effect size together.
- Monte Carlo error is O(1 / sqrt(N)) in any dimension.
- Discard burn-in samples. Run several chains from different starts.
- A random walk drifts about sqrt(n) from the origin after n steps.
- Use T = 0.0 (greedy) for factual answers and deterministic tasks.
Code and artifacts 1
What you take away

Saved in your notebook on this device.

Sources and limits

Reading checkpoints are self-reported. Test results are recorded separately and apply to the executed cases.

AI Engineering from Scratch · 3f9715c · MIT

Download this file ↓