15. Large Language Models
An LLM is the decoder from chapter 12, scaled until something surprising happened: a model trained only to predict the next token turned out to be able to translate, write code, hold a conversation and — after 2024 — sit and think about a problem before answering.
This chapter is about the four things that turn that architecture into a system you can use, in the order they happen: pretraining (what next-token prediction actually buys), post-training (turning a text-continuer into an assistant), inference-time compute (the axis that joined parameter count as a way to buy capability), and serving (sparse experts, decoding and the KV cache: why any of it costs what it costs).
Slides
Click the slides and use ← → to move through them; F goes full screen and P opens the presenter view, with the notes. Seven of the eight panels of this page (the BPE merges, test-time compute, MoE, sampling, the next-token code, the KV cache and speculative decoding) run inside the slides; the agent episode is only here. Open the slides in a new tab
Pretraining: one objective, and what it forces the model to learn
Given text \(x_1, \dots, x_T\) of \(T\) tokens, minimize
where \(p_\theta(x_t \mid x_{<t})\) is the probability the model, with parameters \(\theta\), gives the token that actually comes after the ones before it. That is the whole pretraining objective. It is self-supervised — the labels are the next tokens — so the training set is any text that exists. The log is natural, so the loss is in nats (\(\log_2\) would give bits; 1 nat ≈ 1.44 bits). Divide \(\mathcal{L}\) by \(T\) and exponentiate and you get the perplexity of chapter 8.4: a mean loss of 3 nats per token is a perplexity of \(e^3 \approx 20\), as unsure as a uniform choice among 20 tokens. Perplexity is per token, so it changes with the tokenizer; dividing the total loss, in bits, by the number of characters instead gives bits per character, which does not.
The reason it produces more than autocomplete is worth stating carefully: compressing text well requires modelling whatever produced the text. To predict the last token of "the murderer turned out to be the ___" you need the plot. To predict the token after return you need the function's contract. Next-token prediction is a compression objective, and compression at this scale forces structure.
The base model is not the assistant
A model straight out of pretraining continues text; it does not answer questions. Asked "What is the capital of France?" it may reply with three more exam questions — a perfectly good continuation of a document that looks like a quiz. Everything conversational comes from post-training.
How big, and on how much text
How the loss falls as you add parameters \(N\) and tokens \(D\) is the subject of the scaling laws in chapter 12: training compute is \(C \approx 6ND\), the compute-optimal recipe is roughly 20 tokens per parameter, and deployed models are trained far past it because every token they serve is paid for by \(N\). SmolLM2-135M, the model of this chapter's lab, saw 2 trillion tokens19 — about 15 000 per parameter.
The lab measures the \(N\) axis on the Pythia suite18, models of different sizes trained on the same 300B tokens in the same order: from 70M to 1B parameters, the loss on WikiText-2 (Wikipedia text, part of the training data of every one of them alike) falls from 4.09 to 2.82 nats per token, close to a straight line on log–log axes (\(L \propto N^{-0.10}\), with \(L\) the loss and \(N\) counted without the embedding tables, as Kaplan et al. did). Each doubling of \(N\) buys a smaller absolute drop than the one before, and that is the whole shape of a power law. Along \(D\) the lab finds the other half: the 70M model stops improving after a few thousand tokens per parameter, because data only helps until the model's size becomes the limit.
Tokenization, and the bugs it causes
Text becomes tokens before the model sees anything, usually via byte-level BPE16: start from bytes, repeatedly merge the most frequent adjacent pair into a new symbol, stop at a vocabulary of 32k–256k. On the toy corpus aaabdaaabac, the most frequent pair aa becomes Z (ZabdZabac), then ab (tied with Za) becomes Y (ZYdZYac), then ZY becomes X (XdXac): eleven symbols down to five, and a vocabulary that now holds X = aaab. It is a compression algorithm fitted to a corpus, and it is not neutral. Step through the three merges: the pair counts, the merge, and what it does to the text and to the vocabulary.
| Symptom | Cause |
|---|---|
| "How many r's in strawberry?" goes wrong | The model never sees letters. In SmolLM2's tokenizer, strawberry (with its leading space) is one token and strawberry is three, st|raw|berry. Character-level questions ask about something below its input resolution. |
| Arithmetic is brittle | Numbers can be split inconsistently: GPT-2 reads 1234 as 12|34 and 12345 as 123|45, so the same digit lands in different pieces. Newer tokenizers split digits one by one (Llama 2, SmolLM2, Qwen) or in fixed groups of three (GPT-4, Llama 3) precisely to fix this. |
| Portuguese costs more than English | The merges were fitted on a corpus that is mostly English, so fewer of them cover Portuguese and the same content becomes more tokens — more latency, more money, less usable context17. The lab measures 1.81× with GPT-2's tokenizer, 1.80× with SmolLM2's and 1.29× with Qwen2.5's, which was fitted on multilingual text. |
| Trailing whitespace ruins a completion | " Paris" and "Paris" are different tokens; a prompt ending in a space puts the model off-distribution. In the lab, ending the prompt with a space divides the probability of Paris by 4,303. |
Byte-level models without a tokenizer are an active research direction. Until one wins, the whole field runs on a compression heuristic brought to NLP in 2015, and it is the first suspect whenever a model fails at something that looks trivial.
Post-training: from continuation to assistant
The pipeline in chapter 14 is the same one, seen from the model's side rather than the practitioner's:
- SFT (supervised fine-tuning) on demonstrations — teaches the format of being an assistant.
- Preference optimization — teaches which of two answers is better, which demonstrations cannot express. RLHF (reinforcement learning from human feedback3) trains a reward model on people's comparisons and then optimizes the model against it with PPO (proximal policy optimization); DPO (direct preference optimization) trains on the comparisons directly, with no reward model.
- RL from a verifier — teaches the model to get it right, when "right" is checkable: reinforcement learning with verifiable rewards, RLVR.
The lab puts SmolLM2-135M next to its instruct version on the same question. The base model continues the text; the instruct model, which sees the question wrapped in a chat template with special tokens around each turn, answers it. Post-training also narrows the distribution: along each model's own answer to five questions, the next-token distribution has a mean entropy (\(H = -\sum p \log_2 p\), in bits) of 3.14 bits under the base model and 1.21 under the instruct one.
Step 3 is what changed most recently, and it deserves its own section.
Test-time compute: the second scaling axis
Until 2024, "a better model" meant "a bigger model, trained on more data". Then a different curve appeared: hold the model fixed and give it more compute at inference — let it write a long chain of reasoning, sample several attempts, check them, pick one. Measured at equal FLOPs, this can beat a model many times larger on problems the small one solves at least sometimes9.
The panel simulates a benchmark: each problem has its own chance of being solved on one try (the slider sets the average) and its own favourite wrong answers.
Three lines, and the gap between them is the entire subject:
- pass@k (dashed), the chance that at least one of \(k\) attempts is right, is what the model could achieve if something told it which attempt was right: \(1 - (1-p)^k\) on a problem it solves with probability \(p\) per attempt. It rises fast, and it is an upper bound, not a score.
- Majority voting needs nothing extra and plateaus. On each problem it converges on the answer the model gives most often — which is wrong exactly when the model is confidently wrong.
- Best-of-n with a verifier cashes in the gap, and how much of it depends on the verifier's false-positive rate. Drag the verifier from perfect to weak and watch the ceiling fall.
The ceiling has a formula. On a problem the model solves with probability \(p\), a verifier that accepts a right answer with probability \(\text{TPR}\) (its true-positive rate) and a wrong one with probability \(\text{FPR}\) (its false-positive rate) picks a right answer, as \(k\) grows, with probability
With \(p = 0.25\) and the panel's weak verifier (\(\text{TPR} = 0.80\), \(\text{FPR} = 0.35\)): \(0.20 / (0.20 + 0.26) \approx 0.43\), however many samples you draw. With \(\text{FPR} = 0\) it is 1.
This is consistent with where reasoning models got good first: code (run the tests) and mathematics (check the answer). Both have a cheap verifier with almost no false positives. Essay quality does not, and the improvement there has been more modest.
How the models learned to use it
You cannot get long, useful reasoning out of a model by asking politely, and imitating human-written reasoning traces caps you at the humans. DeepSeek-R16 showed the alternative: let the model discover it. Sample many attempts at problems with checkable answers, reward the ones that verify, and optimize — with GRPO12, which drops the value network (the second network PPO trains to predict the expected reward) and normalizes the rewards within each group of \(G\) attempts at the same problem. Attempt \(i\) gets the reward \(r_i\) (1 if it verifies, 0 if not) and the advantage \(\hat{A}_i\), how hard its tokens are pushed up or down:
In R1-Zero, trained this way straight from the base model, no reasoning traces were supplied. The chains got longer on their own because longer chains verified more often, and behaviours appeared that nobody wrote down — backtracking, checking work, noticing an error mid-solution. The released R1 added a small set of long worked examples before the RL stage, mainly to make the chains readable; the reasoning itself came from the verifier.
Reward hacking is the failure mode, and a verifier is not a value function
Optimizing against a checker means optimizing against the checker, not against correctness. Models learn to special-case the tests, to exploit a grader's format, to produce answers that pass a string match without being right. Every RLVR pipeline needs adversarial evaluation of the verifier itself, and this is the main reason the technique has not spread far beyond domains with airtight checkers.
What this changes about cost
An answer's price is no longer a fixed number of parameters times a fixed number of tokens. A "thinking budget" is now a knob you set per request, and it trades latency and money for accuracy along the curve above. Deciding how much thinking a question deserves is a genuinely new engineering problem, and getting it wrong in either direction is expensive.
Mixture of Experts: more parameters, same compute
The other way to add capacity without adding cost per token is to make the model sparse4. Replace each MLP with a set of independent experts \(E_1, E_2, \dots\) (each one an MLP) and a router that activates only \(k\) of them for each token \(x\):
The router is one matrix, \(W_g\), that scores every expert; \(g(x)\) turns the scores into probabilities, Top-\(k\) keeps the indices of the \(k\) largest and the output is the sum of those experts' outputs, weighted by their probabilities.
Recall from chapter 12 that about two-thirds of a block's parameters are in the MLP. Replacing it is where the leverage is.
Set routing to no balancing first. The router collapses onto a few experts, and the rest are dead weight you still pay to store. Routing is a positive feedback loop — an expert that receives more tokens trains faster and therefore gets chosen more — so balancing is the hard part of MoE, not routing. Classic solutions add an auxiliary loss; the current preference is loss-free balancing, which adjusts a per-expert bias in the router instead of adding a second objective to fight the first.
Two design moves from the current generation5, both visible in the panel:
- Fine-grained experts — many small experts instead of a few large ones. With the same active parameter count, top-8-of-256 offers vastly more combinations than top-2-of-8.
- A shared expert, always active, that absorbs general-purpose behaviour so the routed experts can actually specialize rather than each relearning the basics.
MoE trades compute for memory, and that is a deployment decision
You pay memory for total parameters and compute for active ones. DeepSeek-V3, with 671B parameters and 37B active, is cheap to run per token and still needs the whole 671B resident. That is a good trade in a datacentre with many concurrent requests and a bad one on a single GPU — which is why small dense models (roughly 1B–30B) remain the default for local and on-device work.
Sampling: the model gives you a distribution, not a token
A forward pass produces a probability distribution over the vocabulary. Turning that into text is a separate algorithm with its own parameters, and it affects output quality as much as some model upgrades. The panel's two distributions are illustrations; the lab reads real ones off SmolLM2-135M.
Temperature divides the logits before the softmax: below 1 it sharpens, above 1 it flattens. It adds no randomness — it redistributes the randomness that is already there. Pull it to 0.05 and you get, in effect, greedy decoding, which is deterministic and prone to loops, because the most likely continuation of a repeated phrase is to repeat it again.
Truncation is the other half, and it is what stops the long tail of nonsense from ever being sampled:
- top-k — keep the \(k\) most likely. Crude: \(k = 40\) is far too many for a confident prediction and far too few for an open one. In the lab, the 90% nucleus after "The Eiffel Tower is located in the city of" holds 3 tokens; after "My favourite food is" it holds 1,550.
- top-p (nucleus)7 — keep the smallest set whose mass reaches \(p\). Adapts to the shape of the distribution. The long-standing default.
- min-p13 — keep tokens above a fraction of the top probability. Adapts better still, and holds up at high temperature where top-p starts admitting junk.
The lab measures the loop on a 100-token greedy continuation: 42% of its 4-grams are repeats, against 11% on average for samples at temperature 0.7 with top-p 0.9.
Reasonable defaults
Factual work, code, tool calls: temperature 0 or 0.2. Conversation and prose: 0.7–1.0 with top-p 0.9 or min-p 0.05. And be aware that reasoning models are usually trained for a specific sampling configuration and get measurably worse outside it — check the model card before overriding it.
The same logits serve training and generation, and the panel below runs both as the lab writes them: the per-token loss and the perplexity of a four-token sequence (2.01 here, against 5 for a uniform guess over the five-token vocabulary), then warp and one multinomial draw on the last row. The last line of the code counts what the KV cache saves.
Serving: why a token costs what it costs
Generation has two phases. Prefill reads the whole prompt in one forward pass: every position is computed in parallel, and the GPU is busy doing arithmetic. Decode then produces one token per forward pass, and each pass has to read every weight of the model from memory to do very little arithmetic with it. Decoding is limited by memory bandwidth, not by FLOPs.
A worked number: an 8B model in 16 bits is 16 GB of weights. A GPU that reads 3.35 TB/s (an H100) needs about 5 ms just to stream them once, so a single conversation cannot decode much faster than about 200 tokens per second, whatever the FLOPs. Serving systems recover the waste by batching: one read of the weights serves every request in the batch.
What decoding must not do is recompute the past. The keys and values of earlier tokens never change, so they are computed once and kept: the KV cache of chapter 11. Without it, step \(t\) reprocesses all \(t\) tokens and generating \(n\) tokens costs \(O(n^2)\) token computations instead of \(O(n)\). The lab turns it off: for 400 new tokens the network processes 403 tokens with the cache and 81,400 without (202× the work), and on a CPU that took 6.7 s against 43.1 s (6.4×; fixed per-step costs keep the time ratio below the work ratio). The gap widens with every extra token. The cache is paid in memory instead — for SmolLM2-135M, a key and a value in each of 30 layers, for each of its 3 key/value heads of 64 numbers: \(2 \times 30 \times 3 \times 64 = 11\,520\) numbers per token.
The panel runs six steps of that loop on the lab's prompt, without and with the cache. With it, the first row is the prefill and every later row a decode step:
Two more tricks follow from decoding being memory-bound:
- Quantization stores the weights in 8 or 4 bits. Fewer bytes to read per token means faster decoding, usually at a small quality cost.
- Speculative decoding10. A small draft model proposes several tokens, the big model checks them all in one parallel forward pass, and they are accepted left to right, each with probability \(\min(1, p/q)\), where \(q\) is the probability the draft gave the token and \(p\) the one the big model gives it; the first rejected token is replaced by one drawn from the big model, and that rule keeps the sampled distribution exactly the big model's. Because one pass costs the same memory traffic whether it checks one token or five, the original paper reports 2–3× faster decoding, with the same output distribution.
One round of speculative decoding, step by step: what the draft proposes, what the single pass of the big model returns, and the rule that decides what is kept.
Emergence, honestly
The standard story is that capabilities appear abruptly past a scale threshold2 — flat, flat, flat, then sudden competence. It is a striking claim and it is at least partly an artifact.
Schaeffer et al.8 showed that many "emergent" curves come from discontinuous metrics. Score multi-digit arithmetic as exact-match and you get a step function; score the same model's per-token log-probability of the correct answer and you get a smooth curve. The underlying capability was improving all along; the measurement had a cliff in it.
What survives the critique is still important:
- Improvement is smooth in the loss and often abrupt in what you can use. A model at 40% exact-match on a task is not 40% useful; it may be unusable, and the same model at 85% is a product. That discontinuity is real even if the underlying curve is smooth.
- In-context learning — solving a task from examples in the prompt, with no weight update1 — improves strongly with scale, and it is what made prompting a discipline.
The practical lesson is about evaluation, not metaphysics: if your metric is a threshold, your progress will look like a cliff, and you will not be able to tell improvement from noise until you fall off it.
Where the failures actually come from
-
Hallucination
Not a bug in the architecture — a consequence of the training signal. A model that says "I don't know" scores zero on a benchmark; a model that guesses scores sometimes. We grade on accuracy, so we train models to bluff14.
Mitigations that work: retrieval with citations, tools with real answers, asking for calibrated confidence, and — increasingly — evaluations that reward abstention.
-
Context is not memory
Long context windows are real, and performance inside them is not uniform. Retrieval accuracy sags in the middle of a long context11, and a model given 500k tokens of loosely related material often does worse than one given the right 5k.
Long context is a place to put a working set, not a substitute for retrieval. Treat "just paste everything in" as a hypothesis to be measured.
-
Prompt injection
The model cannot reliably distinguish your instructions from instructions embedded in the data it reads. Once it has tools, a hostile web page is an attack. There is no known robust fix; the mitigations are architectural — least privilege, human confirmation on consequential actions, isolating untrusted content — and this is the primary reason agents are deployed cautiously.
-
Evaluation rot
Benchmarks leak into training corpora, and a score on a public benchmark is partly a measurement of contamination. Prefer held-out private sets, fresh dynamic benchmarks, and pairwise human comparison — and distrust any leaderboard delta smaller than a few points.
From chat to agents
The deployment pattern shifted, and it is the shift most relevant to what you will be asked to build. A chat returns text. An agent runs a loop: read the goal, call a tool, read the result, decide, repeat, stop.
The panel steps through one concrete episode: a question about a data file that takes three tool calls, one of which fails. Watch the context window: it only ever grows.
Almost nothing in that loop is model capability. It is engineering: which tools exist, what they return, how errors surface, how much history is kept, when to stop. The Model Context Protocol (MCP) standardizes the tool-server side of it, so a tool written once works across clients.
Two properties of the loop are worth internalizing:
- Errors compound. A 95%-reliable step is 60% reliable after ten. Agents that work are built from steps that are checkable and re-runnable, not from one long inference.
- The context window is a budget. Every tool result competes with the goal for room. Summarizing, discarding and re-retrieving are the real design work.
The landscape, and how to read it
Any table of specific models is out of date before it is printed. What is stable is the shape of the market:
| Tier | What defines it |
|---|---|
| Frontier, closed | OpenAI (GPT), Anthropic (Claude), Google (Gemini). Extended reasoning as a standard mode, strong multimodality, the best tool use. You rent them. |
| Frontier-adjacent, open weights | DeepSeek, Qwen, Kimi, GLM, Llama, Mistral. Within months of the frontier on most benchmarks, at a fraction of the price, and you can run them. Large MoEs — capable, but not laptop-sized. |
| Small and open | 1B–30B dense models. Run on one GPU; the smallest on a phone. The right target for distillation and for on-device work. |
| Specialists | Code, embeddings, rerankers, safety classifiers, OCR. Usually small, usually the right answer for a narrow job. |
The durable trends behind the churn: prices fall by an order of magnitude or more per year for a fixed capability (between 9× and 900× per year depending on the task, in one 2025 measurement15); open weights trail the frontier by months, not years; reasoning and multimodality are becoming default features rather than separate products; and capability per active parameter keeps improving, so today's ~30B open models score above the original GPT-4 on most public benchmarks.
How to choose one
Not from a leaderboard. Write 20–50 examples of your task with the outputs you want, run three or four candidate models against them, and read the failures. This takes an afternoon and beats every benchmark discussion you could have instead. Then re-run it when a new model appears — that is the only way to know whether "better" is better for you.
Lab: the distribution, measured
The claims of this page about tokens, distributions and decoding are measured in a Colab notebook with small open models that download without a login: SmolLM2-135M and its instruct version, and the Pythia suite. It runs on CPU; a T4 GPU (Runtime → Change runtime type) only makes section 7 faster. Eight sections, each ending in a checkpoint with a check value:
- tokenization:
strawberry, digits, and the price of Portuguese in three tokenizers; - the next-token distribution, and what a trailing space does to it;
- temperature, top-k and top-p written by hand, and the greedy loop measured;
- perplexity and bits per character, on normal, shuffled and Portuguese text;
- the KV cache: its size from the formula and from the tensors, and the speed-up of keeping it;
- base against instruct on the same question, and what the chat template adds;
- a scaling law measured on Pythia, along \(N\) and along \(D\);
- an open task: decoding settings against repetition and likelihood, in a table you fill in.
The fine-tuning side (LoRA, SFT on your own data) belongs to the course's LLM exercise; this lab does not train anything.
Open the lab in Colab — save a copy to your Drive (File → Save a copy in Drive) to run and edit it.
Key takeaways
- Next-token prediction is a compression objective. Compressing text well requires modelling what produced it, which is why the capability generalizes.
- Tokenization is a fitted heuristic with real consequences — character-level failures, arithmetic quirks, and Portuguese costing 1.8× the tokens of English in an English-centred tokenizer.
- A base model continues text. Everything conversational is post-training: SFT, then preference optimization, then RL from a verifier.
- Test-time compute is the second scaling axis. pass@k is an upper bound; converting it into accuracy needs a verifier, and the verifier's false-positive rate sets the ceiling.
- GRPO with a checker taught models to reason without being shown reasoning. It works where verification is free — code and mathematics — and reward hacking is the standing risk.
- MoE buys capacity at constant FLOPs and costs memory. Load balancing, not routing, is the hard part; fine-grained experts plus a shared expert is the current recipe.
- Decoding is a separate algorithm. Temperature rescales logits; top-p and min-p truncate the tail. Greedy decoding loops.
- Decoding a token is memory-bound. The KV cache turns \(O(n^2)\) into \(O(n)\) and is paid in memory; batching, quantization and speculative decoding (2–3×, same output distribution) all attack the bytes read per token.
- Emergence is partly a metric artifact, but threshold effects in usefulness are real. Do not let a step-function metric hide smooth progress.
- Hallucination is trained in by accuracy-only grading. Prompt injection has no robust fix and must be handled architecturally.
- Agents are loops, and errors compound. Most of the work is tools, context and stopping conditions — not the model.
-
Brown, T., et al. (2020). Language Models are Few-Shot Learners — NeurIPS. GPT-3, and in-context learning as a phenomenon. ↩
-
Wei, J., et al. (2022). Emergent Abilities of Large Language Models — TMLR. The claim, stated carefully. ↩
-
Ouyang, L., et al. (2022). Training language models to follow instructions with human feedback — NeurIPS. InstructGPT. ↩
-
Shazeer, N., et al. (2017). Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer — ICLR. Where MoE for language models starts. ↩
-
DeepSeek-AI (2024). DeepSeek-V3 Technical Report. Fine-grained experts, a shared expert, and auxiliary-loss-free load balancing, described in enough detail to reproduce. ↩
-
DeepSeek-AI (2025). DeepSeek-R1 incentivizes reasoning in LLMs through reinforcement learning — Nature 645, 633–638 (arXiv:2501.12948). Reasoning that emerges from a verifier rather than from demonstrations; R1-Zero and R1. ↩
-
Holtzman, A., Buys, J., Du, L., Forbes, M., & Choi, Y. (2020). The Curious Case of Neural Text Degeneration — ICLR. Why greedy decoding loops, and where nucleus sampling comes from. ↩
-
Schaeffer, R., Miranda, B., & Koyejo, S. (2023). Are Emergent Abilities of Large Language Models a Mirage? — NeurIPS. Discontinuous metrics manufacture discontinuous curves. ↩
-
Snell, C., Lee, J., Xu, K., & Kumar, A. (2025). Scaling LLM Test-Time Compute Optimally Can be More Effective than Scaling Parameters for Reasoning — ICLR. The trade between training compute and inference compute, measured. ↩
-
Leviathan, Y., Kalman, M., & Matias, Y. (2023). Fast Inference from Transformers via Speculative Decoding — ICML. 2–3× on T5-XXL with an unchanged output distribution. ↩
-
Liu, N., et al. (2024). Lost in the Middle: How Language Models Use Long Contexts — TACL. Retrieval accuracy as a function of where in the context the answer sits. ↩
-
Shao, Z., et al. (2024). DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. Where GRPO was introduced. ↩
-
Nguyen, M. N., Baker, A., Neo, C., Roush, A., Kirsch, A., & Shwartz-Ziv, R. (2025). Turning Up the Heat: Min-p Sampling for Creative and Coherent LLM Outputs — ICLR. ↩
-
Kalai, A. T., Nachum, O., Vempala, S. S., & Zhang, E. (2025). Why Language Models Hallucinate. Guessing is rewarded by accuracy-only grading, in training and in benchmarks. ↩
-
Cottier, B., Snodin, B., Owen, D., & Adamczewski, T. (2025). LLM inference prices have fallen rapidly but unequally across tasks — Epoch AI. ↩
-
Sennrich, R., Haddow, B., & Birch, A. (2016). Neural Machine Translation of Rare Words with Subword Units — ACL. BPE brought to NLP. ↩
-
Petrov, A., La Malfa, E., Torr, P. H. S., & Bibi, A. (2023). Language Model Tokenizers Introduce Unfairness Between Languages — NeurIPS. ↩
-
Biderman, S., et al. (2023). Pythia: A Suite for Analyzing Large Language Models Across Training and Scaling — ICML. Sixteen models trained on the same data in the same order, with checkpoints along the way. ↩
-
Ben Allal, L., et al. (2025). SmolLM2: When Smol Goes Big — Data-Centric Training of a Small Language Model. ↩