{
 "schema_version": 1,
 "book": "language-models-from-the-ground-up",
 "edition": "2026.10.3",
 "line": "main",
 "prev_edition": "2026.10.2",
 "chapters": [
  {
   "chapter_id": "predicting-the-next-word",
   "title": "Predicting the next word",
   "order": 1,
   "file": "chapters/01-predicting-the-next-word.md",
   "sha256": "ec44e16431db258d4fc3378fb7aa414981a516eda9a14ee84f1f51cde1f468b1",
   "changed": false
  },
  {
   "chapter_id": "tokens",
   "title": "Tokens",
   "order": 2,
   "file": "chapters/02-tokens.md",
   "sha256": "3ce97a6ae396e9019d6d1ba2fe4b7d43155913c942bf63f99355339064fb044a",
   "changed": false
  },
  {
   "chapter_id": "counting-further-back",
   "title": "Counting further back",
   "order": 3,
   "file": "chapters/03-counting-further-back.md",
   "sha256": "848643abe1ea1ea55c3a50b0870adff7a6d38bd3a2a206b858fd135431cf2f52",
   "changed": false
  },
  {
   "chapter_id": "words-as-vectors",
   "title": "Words as vectors",
   "order": 4,
   "file": "chapters/04-words-as-vectors.md",
   "sha256": "51d633529e8fed216bbcf337248647ba34eaa4c5e2d4ff06c9037430a6740219",
   "changed": false
  },
  {
   "chapter_id": "a-neural-language-model",
   "title": "A neural language model",
   "order": 5,
   "file": "chapters/05-a-neural-language-model.md",
   "sha256": "21be0a5a8f600e989ed5d68f806096cef7e8a76e3ff30133ee1a046781fc7224",
   "changed": false
  },
  {
   "chapter_id": "attention",
   "title": "Attention",
   "order": 6,
   "file": "chapters/06-attention.md",
   "sha256": "399395cd7c31678794c7cbbec4787b193a83a81161b52a6682d1acb1592454c4",
   "changed": false
  },
  {
   "chapter_id": "the-transformer-block",
   "title": "The transformer block",
   "order": 7,
   "file": "chapters/07-the-transformer-block.md",
   "sha256": "998712f8ea3adc39f58e953a6dcc7027fc1f083fa6d78d8285b20378aced9247",
   "changed": false
  },
  {
   "chapter_id": "training-a-small-model",
   "title": "Training a small model",
   "order": 8,
   "file": "chapters/08-training-a-small-model.md",
   "sha256": "45fdff372530e297d6dda67025c7e6fec7ae4ce31b0351bb578a0c315bc8a02a",
   "changed": false
  },
  {
   "chapter_id": "choosing-the-next-token",
   "title": "Choosing the next token",
   "order": 9,
   "file": "chapters/09-choosing-the-next-token.md",
   "sha256": "38066fc1697554e72326ef7a02f98c08b03b52546c25cfa5784a607d965af59e",
   "changed": false
  },
  {
   "chapter_id": "inside-an-open-model",
   "title": "Inside an open model",
   "order": 10,
   "file": "chapters/10-inside-an-open-model.md",
   "sha256": "bcc53e3cb631a841f70e684b963d243582536bc4d11c8db1833cca67d69ee50d",
   "changed": false
  },
  {
   "chapter_id": "from-predicting-to-following",
   "title": "From predicting to following instructions",
   "order": 11,
   "file": "chapters/11-from-predicting-to-following.md",
   "sha256": "88048646d736a12f9db228143969bbea8e9caa3e91709b84c69b515c0c549f44",
   "changed": false
  }
 ],
 "sections": [
  {
   "section_id": "load-the-store-text",
   "chapter_id": "predicting-the-next-word",
   "title": "Load the store's text",
   "order": 1,
   "level": 2,
   "parent_id": null,
   "sha256": "4b316c2d88c6d423508d5d1003b43bd719cd30fd439b4b0b332a354317582179",
   "changed": false,
   "example_ids": [
    "store-text"
   ]
  },
  {
   "section_id": "count-word-pairs",
   "chapter_id": "predicting-the-next-word",
   "title": "Count which word follows which",
   "order": 2,
   "level": 2,
   "parent_id": null,
   "sha256": "9cc5e171a09b8ab8b51b73512e8d25ae3fa255bee6399d7c5468fc8c20a91c32",
   "changed": false,
   "example_ids": [
    "count-next-words"
   ]
  },
  {
   "section_id": "counts-to-probabilities",
   "chapter_id": "predicting-the-next-word",
   "title": "Turn counts into probabilities",
   "order": 3,
   "level": 2,
   "parent_id": null,
   "sha256": "42fb8458156a9e8a47d6343e9605a7d24c56be32052f5e1921b9b640532a6fbf",
   "changed": false,
   "example_ids": [
    "next-word-probabilities"
   ]
  },
  {
   "section_id": "suggest-next-words",
   "chapter_id": "predicting-the-next-word",
   "title": "Suggest the next word as a shopper types",
   "order": 4,
   "level": 2,
   "parent_id": null,
   "sha256": "a7d83364a2ae239597788c7cac1560ef5d757ef8841f2091c9c011f50f2805b1",
   "changed": false,
   "example_ids": [
    "autocomplete"
   ]
  },
  {
   "section_id": "generate-one-word-at-a-time",
   "chapter_id": "predicting-the-next-word",
   "title": "Generate names one word at a time",
   "order": 5,
   "level": 2,
   "parent_id": null,
   "sha256": "1cee36d0bf6b2c00ad8cbf673dab5180cd12e7b89b9aa5d28125616061c3b2f0",
   "changed": false,
   "example_ids": [
    "generate-names"
   ]
  },
  {
   "section_id": "score-with-perplexity",
   "chapter_id": "predicting-the-next-word",
   "title": "Score a model with perplexity",
   "order": 6,
   "level": 2,
   "parent_id": null,
   "sha256": "0dfd37b309e55efebbd1f37c1ff68aa467ddbf209860ec60ba28ba80c4dc7d65",
   "changed": false,
   "example_ids": [
    "perplexity-by-hand"
   ]
  },
  {
   "section_id": "unseen-pairs-break-the-model",
   "chapter_id": "predicting-the-next-word",
   "title": "Unseen word pairs break the model",
   "order": 7,
   "level": 2,
   "parent_id": null,
   "sha256": "612dbcce60fb68de8e31884895621fcc1b1dd1ada4a5d2fbff94b9d80a31d16c",
   "changed": false,
   "example_ids": [
    "perplexity-on-new-names"
   ]
  },
  {
   "section_id": "smooth-unseen-pairs",
   "chapter_id": "predicting-the-next-word",
   "title": "Give unseen pairs a little probability",
   "order": 8,
   "level": 2,
   "parent_id": null,
   "sha256": "f518fc11dd42344d6839851918a165fbe3891fb3de4af6c979ac14ac748cce7b",
   "changed": false,
   "example_ids": [
    "add-one-smoothing"
   ]
  },
  {
   "section_id": "next-word-in-production",
   "chapter_id": "predicting-the-next-word",
   "title": "What goes wrong in production",
   "order": 9,
   "level": 2,
   "parent_id": null,
   "sha256": "a50032bcf5f4175857f313a344e7b823f6ec063017c03eadfd99f5b2b9fceb16",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "next-word-decisions",
   "chapter_id": "predicting-the-next-word",
   "title": "What this chapter decided",
   "order": 10,
   "level": 2,
   "parent_id": null,
   "sha256": "8e53673c3a713adb3b32b9b45d4a587f2e0000a46000ee0765953c82f7401ce3",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "words-leave-gaps",
   "chapter_id": "tokens",
   "title": "Words leave gaps",
   "order": 11,
   "level": 2,
   "parent_id": null,
   "sha256": "bd620917f480aa7d87f462c00c511cd7b60132fdb1913f7c94b45331617817f4",
   "changed": false,
   "example_ids": [
    "unseen-words"
   ]
  },
  {
   "section_id": "characters-cover-everything",
   "chapter_id": "tokens",
   "title": "Characters cover everything",
   "order": 12,
   "level": 2,
   "parent_id": null,
   "sha256": "b4a969435d994930ed4796a8f34eb388b471c26d1d3979d43538662ee84b6401",
   "changed": false,
   "example_ids": [
    "character-tokens"
   ]
  },
  {
   "section_id": "merge-frequent-pairs",
   "chapter_id": "tokens",
   "title": "Merge the most frequent pair, again and again",
   "order": 13,
   "level": 2,
   "parent_id": null,
   "sha256": "d025a117e658a9bc9ac2d6226520282292b7812ea60e2a68d75a96b166f67d53",
   "changed": false,
   "example_ids": [
    "merge-pairs-by-hand"
   ]
  },
  {
   "section_id": "train-the-store-tokenizer",
   "chapter_id": "tokens",
   "title": "Train the store's tokenizer",
   "order": 14,
   "level": 2,
   "parent_id": null,
   "sha256": "933724609d522906352c0e6cf3cd8ea7f3e756ac423e6ebe1c8e2a1e689ca458",
   "changed": false,
   "example_ids": [
    "store-tokenizer"
   ]
  },
  {
   "section_id": "choose-how-many-merges",
   "chapter_id": "tokens",
   "title": "Choose how many merges",
   "order": 15,
   "level": 2,
   "parent_id": null,
   "sha256": "2ede651534ed6bdc434a63adb5947380bccb52b44f06cc63e9f655132cd14185",
   "changed": false,
   "example_ids": [
    "vocabulary-size"
   ]
  },
  {
   "section_id": "read-an-open-tokenizer",
   "chapter_id": "tokens",
   "title": "Read an open model's tokenizer",
   "order": 16,
   "level": 2,
   "parent_id": null,
   "sha256": "519e0ccffd12642ca8522a2b79c622620e046bb7223835ef5cc1223c0417dd68",
   "changed": false,
   "example_ids": [
    "smollm2-tokens"
   ]
  },
  {
   "section_id": "apply-merges-by-hand",
   "chapter_id": "tokens",
   "title": "Apply SmolLM2's merges by hand",
   "order": 17,
   "level": 2,
   "parent_id": null,
   "sha256": "b9d683d9c1f03d3e9a7cc4d0d3ed6fdea301beeeeb4a7fa709c01c6f830f24a4",
   "changed": false,
   "example_ids": [
    "merges-by-hand"
   ]
  },
  {
   "section_id": "tokens-in-production",
   "chapter_id": "tokens",
   "title": "What goes wrong in production",
   "order": 18,
   "level": 2,
   "parent_id": null,
   "sha256": "2256a7a9ed396535c5ed2fd907e46156c70b6a2e003a7d13a94dfa8b0a6c2789",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "tokens-decisions",
   "chapter_id": "tokens",
   "title": "What this chapter decided",
   "order": 19,
   "level": 2,
   "parent_id": null,
   "sha256": "90e329bae61688d77872a31de9af5880c4e7a05113462332b227eeeea7dc70d9",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "longer-contexts-fit-training",
   "chapter_id": "counting-further-back",
   "title": "Longer contexts fit the training text better",
   "order": 20,
   "level": 2,
   "parent_id": null,
   "sha256": "940925e963c1c763a6d018f9292d150fbcde1b2849b01aa6b2effba72699f5c4",
   "changed": false,
   "example_ids": [
    "ngram-memorizes"
   ]
  },
  {
   "section_id": "longer-contexts-run-out",
   "chapter_id": "counting-further-back",
   "title": "Longer contexts run out of evidence",
   "order": 21,
   "level": 2,
   "parent_id": null,
   "sha256": "839a9fce0d0cb857eccfdc17a2a8de783a35add181ee1149594769e8082a2efc",
   "changed": false,
   "example_ids": [
    "unseen-ngrams"
   ]
  },
  {
   "section_id": "mix-short-and-long-contexts",
   "chapter_id": "counting-further-back",
   "title": "Mix short and long contexts",
   "order": 22,
   "level": 2,
   "parent_id": null,
   "sha256": "05d9da7ac76de213932e4d4e915d82848d6342bc2fea1cd2c29357e9c0c17da6",
   "changed": false,
   "example_ids": [
    "interpolate-orders"
   ]
  },
  {
   "section_id": "count-contexts-a-token-follows",
   "chapter_id": "counting-further-back",
   "title": "Count the contexts a token follows",
   "order": 23,
   "level": 2,
   "parent_id": null,
   "sha256": "b93e77c86513b847964754b9a59e9b674ce79eb44c11b538b010b3fface47d01",
   "changed": false,
   "example_ids": [
    "continuation-counts"
   ]
  },
  {
   "section_id": "smooth-with-kneser-ney",
   "chapter_id": "counting-further-back",
   "title": "Smooth with Kneser-Ney",
   "order": 24,
   "level": 2,
   "parent_id": null,
   "sha256": "55c60fb83afb4e2be84a7e32a4ae6145a69b770c1b82b8b4093c9d8ccf992ede",
   "changed": false,
   "example_ids": [
    "kneser-ney-by-hand",
    "kneser-ney-by-order"
   ]
  },
  {
   "section_id": "autocomplete-with-more-context",
   "chapter_id": "counting-further-back",
   "title": "Autocomplete with three tokens of context",
   "order": 25,
   "level": 2,
   "parent_id": null,
   "sha256": "ce62f1ab23fee89121eca1d16e515e5ff54456e4c2002cf6570bfccb34fc7b2f",
   "changed": false,
   "example_ids": [
    "ngram-autocomplete"
   ]
  },
  {
   "section_id": "the-baseline",
   "chapter_id": "counting-further-back",
   "title": "The baseline every later model is measured against",
   "order": 26,
   "level": 2,
   "parent_id": null,
   "sha256": "8638ece2e7626aae5d50cd1584538e6a1abbe44d3b21f296a77b362af9ba5ec0",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "ngrams-in-production",
   "chapter_id": "counting-further-back",
   "title": "What goes wrong in production",
   "order": 27,
   "level": 2,
   "parent_id": null,
   "sha256": "db35ea92f2e2a26e18cf927cf7620f9035dfaa544b08ecf7668f3208b8b9b61c",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "ngrams-decisions",
   "chapter_id": "counting-further-back",
   "title": "What this chapter decided",
   "order": 28,
   "level": 2,
   "parent_id": null,
   "sha256": "cf78b70d36d5934fa6335ff51859ed424f15d4b9f4dfbcf6dd72e4f15607ab12",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "one-hot-vectors-know-nothing",
   "chapter_id": "words-as-vectors",
   "title": "One-hot vectors know nothing",
   "order": 29,
   "level": 2,
   "parent_id": null,
   "sha256": "ff54ce5dbad4f5ba25bf79c979013ef33e50cdc8608670df2d8d70df76a2a455",
   "changed": false,
   "example_ids": [
    "one-hot-vectors"
   ]
  },
  {
   "section_id": "describe-by-neighbours",
   "chapter_id": "words-as-vectors",
   "title": "Describe a token by the tokens around it",
   "order": 30,
   "level": 2,
   "parent_id": null,
   "sha256": "f15f3cc940ead043d33945bb8b9e213cabcd38053f7e48a5e91edef5a9912407",
   "changed": false,
   "example_ids": [
    "cooccurrence-counts"
   ]
  },
  {
   "section_id": "weigh-by-surprise",
   "chapter_id": "words-as-vectors",
   "title": "Weigh co-occurrence by surprise",
   "order": 31,
   "level": 2,
   "parent_id": null,
   "sha256": "f9debb7b85281931741519f37417ef4af82ea3c88d26ffecdf4ca3a7aa14152a",
   "changed": false,
   "example_ids": [
    "ppmi-neighbours"
   ]
  },
  {
   "section_id": "compress-into-dense-vectors",
   "chapter_id": "words-as-vectors",
   "title": "Compress counts into dense vectors",
   "order": 32,
   "level": 2,
   "parent_id": null,
   "sha256": "7300c1b63f32ed6904af1793f292032c7097277041175f69829052d90c54fa2f",
   "changed": false,
   "example_ids": [
    "svd-neighbours"
   ]
  },
  {
   "section_id": "learn-by-predicting-neighbours",
   "chapter_id": "words-as-vectors",
   "title": "Learn vectors by predicting neighbours",
   "order": 33,
   "level": 2,
   "parent_id": null,
   "sha256": "5931fa0aa52ab988e70d82fb8330a3088c7e5418cef955609242799f8b121beb",
   "changed": false,
   "example_ids": [
    "skipgram-step"
   ]
  },
  {
   "section_id": "compare-learned-and-counted",
   "chapter_id": "words-as-vectors",
   "title": "Compare learned vectors with counted ones",
   "order": 34,
   "level": 2,
   "parent_id": null,
   "sha256": "96303e6743da227f5c7ff1b0fba8c2d47db17c84c98653882468c3f9b69abf22",
   "changed": false,
   "example_ids": [
    "skipgram-neighbours"
   ]
  },
  {
   "section_id": "analogies-and-where-they-fail",
   "chapter_id": "words-as-vectors",
   "title": "Analogies, and where they fail",
   "order": 35,
   "level": 2,
   "parent_id": null,
   "sha256": "13143665a83fb49f91e2dbbe1e7f8578af89b51b2774160d8fc8a7fe3fc4ab3e",
   "changed": false,
   "example_ids": [
    "analogies"
   ]
  },
  {
   "section_id": "find-similar-names",
   "chapter_id": "words-as-vectors",
   "title": "Find similar names with vectors",
   "order": 36,
   "level": 2,
   "parent_id": null,
   "sha256": "85396b4dcc77dbbd3b033ca9c82d6ae9fec748b5302f5a9d0daf1a10bf9220d1",
   "changed": false,
   "example_ids": [
    "name-vectors"
   ]
  },
  {
   "section_id": "vectors-in-production",
   "chapter_id": "words-as-vectors",
   "title": "What goes wrong in production",
   "order": 37,
   "level": 2,
   "parent_id": null,
   "sha256": "5e7cb14fd60896ec70cb9ccb72b86fbbf6d91509b5641a81efe410b7f9e6af21",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "vectors-decisions",
   "chapter_id": "words-as-vectors",
   "title": "What this chapter decided",
   "order": 38,
   "level": 2,
   "parent_id": null,
   "sha256": "5732da15f4ae7639024277709e4aa94e7c01d8a9c10e539af5010b359cc32f8b",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "predict-from-a-window",
   "chapter_id": "a-neural-language-model",
   "title": "Predict from a window of embeddings",
   "order": 39,
   "level": 2,
   "parent_id": null,
   "sha256": "2318e24b0dd9e80599a9fef9d600adff04fad7b7b28557e6c45d392f24abfe45",
   "changed": false,
   "example_ids": [
    "window-model-by-hand"
   ]
  },
  {
   "section_id": "compute-gradients",
   "chapter_id": "a-neural-language-model",
   "title": "Compute gradients by backpropagation",
   "order": 40,
   "level": 2,
   "parent_id": null,
   "sha256": "d808c38e059deadce363735d9e7b93a43713f81f9a23d92d100ca9b79d33d39d",
   "changed": false,
   "example_ids": [
    "gradients-by-hand"
   ]
  },
  {
   "section_id": "take-gradient-descent-steps",
   "chapter_id": "a-neural-language-model",
   "title": "Take gradient descent steps",
   "order": 41,
   "level": 2,
   "parent_id": null,
   "sha256": "8e9ef165fe362ca1837adef455ac5b98ff9b1c7d4e4130caf76be10903b87560",
   "changed": false,
   "example_ids": [
    "gradient-descent-by-hand"
   ]
  },
  {
   "section_id": "train-with-pytorch",
   "chapter_id": "a-neural-language-model",
   "title": "Train with PyTorch",
   "order": 42,
   "level": 2,
   "parent_id": null,
   "sha256": "041f6e027a532acc3e058545e1130ec9beca5ed99fb558a16fd70e172e917550",
   "changed": false,
   "example_ids": [
    "same-as-pytorch"
   ]
  },
  {
   "section_id": "stop-at-the-best-epoch",
   "chapter_id": "a-neural-language-model",
   "title": "Stop when validation loss turns up",
   "order": 43,
   "level": 2,
   "parent_id": null,
   "sha256": "3211258d53cbbd7c6bcdf4da680bf70067a3e8ff48b536d0e1c8fd7a06796546",
   "changed": false,
   "example_ids": [
    "training-curve"
   ]
  },
  {
   "section_id": "compare-with-the-baseline",
   "chapter_id": "a-neural-language-model",
   "title": "Compare with the baseline",
   "order": 44,
   "level": 2,
   "parent_id": null,
   "sha256": "cd5bb9ad6a4ead54488d7af07f3372668ccb874711246a32f24565dc13204c01",
   "changed": false,
   "example_ids": [
    "neural-vs-baseline",
    "seen-and-unseen-contexts"
   ]
  },
  {
   "section_id": "mix-with-the-counts",
   "chapter_id": "a-neural-language-model",
   "title": "Mix the network with the counts",
   "order": 45,
   "level": 2,
   "parent_id": null,
   "sha256": "0a288fb5169681e2ca4f843653f1945e7c2b141f577158cf15e40a2ae0ca80a7",
   "changed": false,
   "example_ids": [
    "mix-neural-and-counts"
   ]
  },
  {
   "section_id": "same-kind-of-text",
   "chapter_id": "a-neural-language-model",
   "title": "More text helps only if it's the same kind",
   "order": 46,
   "level": 2,
   "parent_id": null,
   "sha256": "6747800f4859b0646667107d9f798cf504af273e6f3c8d74363ecbd548af7e3a",
   "changed": false,
   "example_ids": [
    "more-text-of-another-kind"
   ]
  },
  {
   "section_id": "suggest-from-similar-contexts",
   "chapter_id": "a-neural-language-model",
   "title": "Suggest from similar contexts",
   "order": 47,
   "level": 2,
   "parent_id": null,
   "sha256": "ef714ef9065f6df4597d2d837cc0a0641de77332cd1a0cb587b373d74c2e0f03",
   "changed": false,
   "example_ids": [
    "neural-autocomplete"
   ]
  },
  {
   "section_id": "neural-in-production",
   "chapter_id": "a-neural-language-model",
   "title": "What goes wrong in production",
   "order": 48,
   "level": 2,
   "parent_id": null,
   "sha256": "3c0312a7e71da9155b30bb20f3c67a41305a2998a8fc0bd7ae8baab1fe1b2b0d",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "neural-decisions",
   "chapter_id": "a-neural-language-model",
   "title": "What this chapter decided",
   "order": 49,
   "level": 2,
   "parent_id": null,
   "sha256": "3059cd37474ae362cead3808b448ed8c16d066c9978a727db662594aa0b7f6d3",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "look-back-with-a-weighted-average",
   "chapter_id": "attention",
   "title": "Look back with a weighted average",
   "order": 50,
   "level": 2,
   "parent_id": null,
   "sha256": "f3d02d88d4db7cf5074a52e6936b60211b9219d9cf0bd6cf182564bc494f27a4",
   "changed": false,
   "example_ids": [
    "attention-by-hand"
   ]
  },
  {
   "section_id": "hide-the-future",
   "chapter_id": "attention",
   "title": "Hide the future with a causal mask",
   "order": 51,
   "level": 2,
   "parent_id": null,
   "sha256": "7bd3d19b9c2c20b44bd57c00a15f3df6f6f6ff6ea1feb1fa1a741c1db9b6af85",
   "changed": false,
   "example_ids": [
    "causal-mask"
   ]
  },
  {
   "section_id": "scale-the-scores",
   "chapter_id": "attention",
   "title": "Scale the scores",
   "order": 52,
   "level": 2,
   "parent_id": null,
   "sha256": "fa607dae672cb1bf2b9939fc4d2a057369c5ea286974a4f92f76c17e3a4e9c0f",
   "changed": false,
   "example_ids": [
    "scaling-matters"
   ]
  },
  {
   "section_id": "several-heads",
   "chapter_id": "attention",
   "title": "Several heads look for different things",
   "order": 53,
   "level": 2,
   "parent_id": null,
   "sha256": "1a5643a893f34092bf2d72024518fbb8007763b951f2a2587c8d567020ba4bc2",
   "changed": false,
   "example_ids": [
    "attention-heads"
   ]
  },
  {
   "section_id": "read-trained-heads",
   "chapter_id": "attention",
   "title": "Read what trained heads attend to",
   "order": 54,
   "level": 2,
   "parent_id": null,
   "sha256": "44db2c3d0590a3291d3da63c6b1458cdc086a8df615b59e92cbe1daf0ff3ed41",
   "changed": false,
   "example_ids": [
    "trained-attention"
   ]
  },
  {
   "section_id": "test-what-the-model-copies",
   "chapter_id": "attention",
   "title": "Test what the model copies",
   "order": 55,
   "level": 2,
   "parent_id": null,
   "sha256": "a5dce4ddb896d7635dbbca233b465c1815fe2f17617b7569db321b2b97acfb2a",
   "changed": false,
   "example_ids": [
    "copy-from-the-name"
   ]
  },
  {
   "section_id": "attend-to-the-previous-token",
   "chapter_id": "attention",
   "title": "Some heads attend to the previous token",
   "order": 56,
   "level": 2,
   "parent_id": null,
   "sha256": "77adb68e11caadf46b0ee606a853dc1cc9fd6f78e562b2f621e65aba08acab58",
   "changed": false,
   "example_ids": [
    "previous-token-heads"
   ]
  },
  {
   "section_id": "reach-past-the-window",
   "chapter_id": "attention",
   "title": "Reach past the window",
   "order": 57,
   "level": 2,
   "parent_id": null,
   "sha256": "62773e8244dc6358863eec88863f810eb405ef2e66528973154550e2790b6641",
   "changed": false,
   "example_ids": [
    "attention-reaches-back"
   ]
  },
  {
   "section_id": "attention-in-production",
   "chapter_id": "attention",
   "title": "What goes wrong in production",
   "order": 58,
   "level": 2,
   "parent_id": null,
   "sha256": "f8ae2f1b0c6dec34e043802cf770b381aab16505c96655ae9ac83535b73ec947",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "attention-decisions",
   "chapter_id": "attention",
   "title": "What this chapter decided",
   "order": 59,
   "level": 2,
   "parent_id": null,
   "sha256": "5a9338b754b52a8ceac5b6dd7beec17044a2b45dcea01a001a099b885a029e8e",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "add-to-the-residual-stream",
   "chapter_id": "the-transformer-block",
   "title": "Add each part's output to a residual stream",
   "order": 60,
   "level": 2,
   "parent_id": null,
   "sha256": "fdc853dae7664d77e7e9e2ab4f38ceb46a495e375a74badd531fe1d6f7c3306e",
   "changed": false,
   "example_ids": [
    "residual-stream"
   ]
  },
  {
   "section_id": "normalize-before-each-part",
   "chapter_id": "the-transformer-block",
   "title": "Normalize before each part",
   "order": 61,
   "level": 2,
   "parent_id": null,
   "sha256": "608e4a1ef2e232937db341be772c328be6ca6a7ff9ffd3ecffb9731c8020ee58",
   "changed": false,
   "example_ids": [
    "rms-norm-by-hand"
   ]
  },
  {
   "section_id": "transform-each-position",
   "chapter_id": "the-transformer-block",
   "title": "Transform each position with a gated feed-forward layer",
   "order": 62,
   "level": 2,
   "parent_id": null,
   "sha256": "deecefb421a882c7e30f276a6dadd8a490b928eca4114b244110821d1b757d88",
   "changed": false,
   "example_ids": [
    "gated-feed-forward"
   ]
  },
  {
   "section_id": "rotary-positions",
   "chapter_id": "the-transformer-block",
   "title": "Give attention positions with rotations",
   "order": 63,
   "level": 2,
   "parent_id": null,
   "sha256": "5ca1743373433d121493a5d7ea9e3067cab43909acb3b0dac1967ccdb39b8258",
   "changed": false,
   "example_ids": [
    "rope-by-hand"
   ]
  },
  {
   "section_id": "tie-the-output",
   "chapter_id": "the-transformer-block",
   "title": "Tie the output layer to the embeddings",
   "order": 64,
   "level": 2,
   "parent_id": null,
   "sha256": "a0594db82030c9b8519a415e06c2b30599828d987a829fbf856f6b3065a42b59",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "check-against-pytorch",
   "chapter_id": "the-transformer-block",
   "title": "Check the model against PyTorch",
   "order": 65,
   "level": 2,
   "parent_id": null,
   "sha256": "c067f9580c44a09316696c2d33ec122ee6628737402d372b6d670a3eab02ce2b",
   "changed": false,
   "example_ids": [
    "transformer-same-as-pytorch"
   ]
  },
  {
   "section_id": "leave-out-a-block",
   "chapter_id": "the-transformer-block",
   "title": "Leave out a block to see what it does",
   "order": 66,
   "level": 2,
   "parent_id": null,
   "sha256": "44d8a3f9e7819fa3ca763f328e2ab2dd49de64eb35b36ce39983cc7e1ece549b",
   "changed": false,
   "example_ids": [
    "skip-a-block"
   ]
  },
  {
   "section_id": "measure-mismatched-details",
   "chapter_id": "the-transformer-block",
   "title": "Measure what a mismatched detail costs",
   "order": 67,
   "level": 2,
   "parent_id": null,
   "sha256": "6e5bac52f8b5cefc70f2e2a611c3837a816a1b005ed0e71d04208bdb4d6479db",
   "changed": false,
   "example_ids": [
    "mismatched-details"
   ]
  },
  {
   "section_id": "count-the-parameters",
   "chapter_id": "the-transformer-block",
   "title": "Count where the parameters go",
   "order": 68,
   "level": 2,
   "parent_id": null,
   "sha256": "89cfe8dd1a0f15d9d1455fa18d6d62162ccca9c4d739685cfd54d89a1d580f88",
   "changed": false,
   "example_ids": [
    "transformer-parameters"
   ]
  },
  {
   "section_id": "transformer-in-production",
   "chapter_id": "the-transformer-block",
   "title": "What goes wrong in production",
   "order": 69,
   "level": 2,
   "parent_id": null,
   "sha256": "eda791bc30e8fad67da5e873975c4053ead527a3878a89909c1b578e54817da2",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "transformer-decisions",
   "chapter_id": "the-transformer-block",
   "title": "What this chapter decided",
   "order": 70,
   "level": 2,
   "parent_id": null,
   "sha256": "fa2b3d59b354111b76e73ed3a91105b5f67910e84eabb91531f82748c6729883",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "turn-products-into-batches",
   "chapter_id": "training-a-small-model",
   "title": "Turn products into batches",
   "order": 71,
   "level": 2,
   "parent_id": null,
   "sha256": "366f8b09ec185b7c01408d91e3a6a7aa3a6523b51a3bf6ccaf9e86c84046753d",
   "changed": false,
   "example_ids": [
    "training-batches"
   ]
  },
  {
   "section_id": "update-with-adamw",
   "chapter_id": "training-a-small-model",
   "title": "Update with AdamW and clipped gradients",
   "order": 72,
   "level": 2,
   "parent_id": null,
   "sha256": "243976020a8c7c667dcf57f83857416cafe5ba351cfbec39a9f143d88598aa4a",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "warm-up-then-decay",
   "chapter_id": "training-a-small-model",
   "title": "Warm up, then decay the step size",
   "order": 73,
   "level": 2,
   "parent_id": null,
   "sha256": "f7ebef249ab326d5426ee37b7f33655e5a9249e5f68daf282c7aec11beacfc2a",
   "changed": false,
   "example_ids": [
    "learning-rate-schedule"
   ]
  },
  {
   "section_id": "read-the-training-curve",
   "chapter_id": "training-a-small-model",
   "title": "Read the training curve",
   "order": 74,
   "level": 2,
   "parent_id": null,
   "sha256": "94bc7803a218aa1145e9b53247d5d0da436196f7194c803ab43740dd02262303",
   "changed": false,
   "example_ids": [
    "transformer-training-curve"
   ]
  },
  {
   "section_id": "compare-on-names",
   "chapter_id": "training-a-small-model",
   "title": "Compare with the baseline on names",
   "order": 75,
   "level": 2,
   "parent_id": null,
   "sha256": "0b8fafb30dfcff47d30b55417667152da9b035654923bd7aec2b6def11291c31",
   "changed": false,
   "example_ids": [
    "transformer-on-names"
   ]
  },
  {
   "section_id": "compare-on-descriptions",
   "chapter_id": "training-a-small-model",
   "title": "Compare on descriptions",
   "order": 76,
   "level": 2,
   "parent_id": null,
   "sha256": "c386b02b0a5d42fa8f9ef78aaa875a9bb04715849bbf704a02fb9d80212d2a6a",
   "changed": false,
   "example_ids": [
    "transformer-on-descriptions"
   ]
  },
  {
   "section_id": "what-width-data-and-steps-buy",
   "chapter_id": "training-a-small-model",
   "title": "What width, data and steps buy",
   "order": 77,
   "level": 2,
   "parent_id": null,
   "sha256": "79c14fb46af0f86e106af7b902f9aa3a3ca09253f4f767177c8020ec903e10e7",
   "changed": false,
   "example_ids": [
    "width-data-and-steps"
   ]
  },
  {
   "section_id": "autocomplete-in-the-search-box",
   "chapter_id": "training-a-small-model",
   "title": "Suggest the next word in the search box",
   "order": 78,
   "level": 2,
   "parent_id": null,
   "sha256": "3e12feb881b32234fa8387feee63045a6bd3fadd1e9048c73b1359af0d2a529e",
   "changed": false,
   "example_ids": [
    "transformer-autocomplete"
   ]
  },
  {
   "section_id": "training-in-production",
   "chapter_id": "training-a-small-model",
   "title": "What goes wrong in production",
   "order": 79,
   "level": 2,
   "parent_id": null,
   "sha256": "43363c0d2990b9bf727948d4ba612a42b21de288f506112f5e17cd5d99ff6f01",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "training-decisions",
   "chapter_id": "training-a-small-model",
   "title": "What this chapter decided",
   "order": 80,
   "level": 2,
   "parent_id": null,
   "sha256": "b7cfeb59a8e6f34064d529bf6b494174f01541786ada3f5bad4b171b0b0046d0",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "choose-the-likeliest-token",
   "chapter_id": "choosing-the-next-token",
   "title": "Choose the likeliest token",
   "order": 81,
   "level": 2,
   "parent_id": null,
   "sha256": "9c6b0147ef16838d1d44ec6e3e4af71cf08d4789e081eedb309dfcd12b583454",
   "changed": false,
   "example_ids": [
    "greedy-description"
   ]
  },
  {
   "section_id": "search-for-the-likeliest-text",
   "chapter_id": "choosing-the-next-token",
   "title": "Search for the likeliest text",
   "order": 82,
   "level": 2,
   "parent_id": null,
   "sha256": "854a9f134469ba9860cde8d494430a0a65be06cd1e1776fcd480253c4dc2652a",
   "changed": false,
   "example_ids": [
    "beam-search"
   ]
  },
  {
   "section_id": "sample-with-a-temperature",
   "chapter_id": "choosing-the-next-token",
   "title": "Sample, with a temperature",
   "order": 83,
   "level": 2,
   "parent_id": null,
   "sha256": "21d54ad55e76ee6c3fa0b1170ee8edd4a3ca05b77b6197a668a6020a40904352",
   "changed": false,
   "example_ids": [
    "temperature-by-hand"
   ]
  },
  {
   "section_id": "sample-and-cut-the-tail",
   "chapter_id": "choosing-the-next-token",
   "title": "Sample, and cut the tail",
   "order": 84,
   "level": 2,
   "parent_id": null,
   "sha256": "bb9efe8664523c72d0d9c9b2144a38c7a7e65561dbe5db17451bb2a508971555",
   "changed": false,
   "example_ids": [
    "sample-descriptions"
   ]
  },
  {
   "section_id": "measure-each-setting",
   "chapter_id": "choosing-the-next-token",
   "title": "Measure what each setting writes",
   "order": 85,
   "level": 2,
   "parent_id": null,
   "sha256": "7b325b00668608478777a3f2f3e1f3f41540d47fbac353550f6914dca47fcccd",
   "changed": false,
   "example_ids": [
    "measure-decoding"
   ]
  },
  {
   "section_id": "penalize-repetition",
   "chapter_id": "choosing-the-next-token",
   "title": "Penalize repetition",
   "order": 86,
   "level": 2,
   "parent_id": null,
   "sha256": "80bd5dab0e9bcf016c0f764163533edaaca2055739a7792ddc7245cad222b5ab",
   "changed": false,
   "example_ids": [
    "repetition-penalty-by-hand"
   ]
  },
  {
   "section_id": "forbid-an-empty-description",
   "chapter_id": "choosing-the-next-token",
   "title": "Forbid an empty description",
   "order": 87,
   "level": 2,
   "parent_id": null,
   "sha256": "4796badc59b643b01f26f5d4b8d907267ee99b5ce4a3674515f038ef9993db9d",
   "changed": false,
   "example_ids": [
    "minimum-length"
   ]
  },
  {
   "section_id": "decoding-in-production",
   "chapter_id": "choosing-the-next-token",
   "title": "What goes wrong in production",
   "order": 88,
   "level": 2,
   "parent_id": null,
   "sha256": "fb8bb40e16714db10ab696eb2f1db7763d7b23a588a35d0c0e7b970f16efac82",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "decoding-decisions",
   "chapter_id": "choosing-the-next-token",
   "title": "What this chapter decided",
   "order": 89,
   "level": 2,
   "parent_id": null,
   "sha256": "0d45a8d1c136e2e2806e9f340de178fb207e412faaf03e230a21b2b1c9aac715",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "parameters-at-scale",
   "chapter_id": "inside-an-open-model",
   "title": "Count the parameters at scale",
   "order": 90,
   "level": 2,
   "parent_id": null,
   "sha256": "867980f6aa1a50a447a51521f334c1a88bfcad603f2574ac61704fee6181e17b",
   "changed": false,
   "example_ids": [
    "open-model-parameters"
   ]
  },
  {
   "section_id": "grow-the-same-design",
   "chapter_id": "inside-an-open-model",
   "title": "Compare a family's sizes",
   "order": 91,
   "level": 2,
   "parent_id": null,
   "sha256": "ce46f4c0ced752c57f5c65a39f01cef0006bb203ccaaedb90d15d93040d61987",
   "changed": false,
   "example_ids": [
    "open-model-family"
   ]
  },
  {
   "section_id": "cost-to-run",
   "chapter_id": "inside-an-open-model",
   "title": "Count what it costs to run",
   "order": 92,
   "level": 2,
   "parent_id": null,
   "sha256": "f57afe41ffc2527c058ddd76640c57be4ca8cc6569181a6df1a4efe84da6047a",
   "changed": false,
   "example_ids": [
    "open-model-memory"
   ]
  },
  {
   "section_id": "score-the-store-text",
   "chapter_id": "inside-an-open-model",
   "title": "Score the store's text with a general model",
   "order": 93,
   "level": 2,
   "parent_id": null,
   "sha256": "719ca2ad9497165490b5817245f8d3ae12d29f34ccdfd004f6023efa15e8541e",
   "changed": false,
   "example_ids": [
    "open-model-on-the-store"
   ]
  },
  {
   "section_id": "same-heads-at-scale",
   "chapter_id": "inside-an-open-model",
   "title": "Find the same heads at scale",
   "order": 94,
   "level": 2,
   "parent_id": null,
   "sha256": "5630b900fed3ead9a905ca0e195fb37201238b6542e6d2f9f99bd4a65f6e0831",
   "changed": false,
   "example_ids": [
    "open-model-heads"
   ]
  },
  {
   "section_id": "copying-at-scale",
   "chapter_id": "inside-an-open-model",
   "title": "Test copying at scale",
   "order": 95,
   "level": 2,
   "parent_id": null,
   "sha256": "a05477797dd63d9b6d4e800bec02253861a81154462b88a02d3babd5c0366692",
   "changed": false,
   "example_ids": [
    "open-model-copying"
   ]
  },
  {
   "section_id": "suggestions-at-scale",
   "chapter_id": "inside-an-open-model",
   "title": "Suggest the next word at scale",
   "order": 96,
   "level": 2,
   "parent_id": null,
   "sha256": "327bb9d6c79f75384013b431dcbefd733ac5f3b0f6af0906dfa89575ac447177",
   "changed": false,
   "example_ids": [
    "open-model-autocomplete"
   ]
  },
  {
   "section_id": "side-by-side",
   "chapter_id": "inside-an-open-model",
   "title": "Set the two models side by side",
   "order": 97,
   "level": 2,
   "parent_id": null,
   "sha256": "8b0a13d52efa490d2380f6b6b66636cc548038df66cbadf1482957eb77628412",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "open-models-in-production",
   "chapter_id": "inside-an-open-model",
   "title": "What goes wrong in production",
   "order": 98,
   "level": 2,
   "parent_id": null,
   "sha256": "54b7028d9290027b28e420d69c4cc85913049efd0cddc4c70023407545078ce7",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "open-model-decisions",
   "chapter_id": "inside-an-open-model",
   "title": "What this chapter decided",
   "order": 99,
   "level": 2,
   "parent_id": null,
   "sha256": "233a78ccaa85ca9170a9c2493c657a065289c019618bb8dd4b712bcf0ba350f7",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "build-the-losses",
   "chapter_id": "from-predicting-to-following",
   "title": "Build the two training losses by hand",
   "order": 100,
   "level": 2,
   "parent_id": null,
   "sha256": "6294d5c66715f28aaef5a30ea8cb379f432da6f6ba4b9fc409d7b84470b5a1a6",
   "changed": false,
   "example_ids": [
    "instruction-loss-by-hand",
    "dpo-loss-by-hand"
   ]
  },
  {
   "section_id": "ask-base-and-tuned",
   "chapter_id": "from-predicting-to-following",
   "title": "Ask the base model and the tuned model",
   "order": 101,
   "level": 2,
   "parent_id": null,
   "sha256": "68220175017440b0a969f80c019500826b8adfa4b53b174d0a1188ce3eb2df22",
   "changed": false,
   "example_ids": [
    "base-and-tuned"
   ]
  },
  {
   "section_id": "format-the-request",
   "chapter_id": "from-predicting-to-following",
   "title": "Format the request as the model was tuned",
   "order": 102,
   "level": 2,
   "parent_id": null,
   "sha256": "06c07db1cd29bf39d5b2800f3a8e7cd7d627a15c3ff56ee0982fa4f3fece182d",
   "changed": false,
   "example_ids": [
    "chat-template"
   ]
  },
  {
   "section_id": "measure-made-up-details",
   "chapter_id": "from-predicting-to-following",
   "title": "Measure made-up product details",
   "order": 103,
   "level": 2,
   "parent_id": null,
   "sha256": "674418c2d5d39c6e891d4e95726d808de4282dec7fd4e98e3bce10003227358b",
   "changed": false,
   "example_ids": [
    "made-up-materials"
   ]
  },
  {
   "section_id": "check-confidence",
   "chapter_id": "from-predicting-to-following",
   "title": "Check whether confidence warns you",
   "order": 104,
   "level": 2,
   "parent_id": null,
   "sha256": "bcf1d7a92c4d18830b413e6ace5dea62997365d957be3e56c406a3f01a43b452",
   "changed": false,
   "example_ids": [
    "answer-confidence"
   ]
  },
  {
   "section_id": "find-what-context-loses",
   "chapter_id": "from-predicting-to-following",
   "title": "Find what a longer context loses",
   "order": 105,
   "level": 2,
   "parent_id": null,
   "sha256": "ee11338483d9b2c56adfe33a87744de8135b94d38c83f8487c70533c1adbf6fd",
   "changed": false,
   "example_ids": [
    "answer-position"
   ]
  },
  {
   "section_id": "adapt-a-model",
   "chapter_id": "from-predicting-to-following",
   "title": "Adapt a model to your text",
   "order": 106,
   "level": 2,
   "parent_id": null,
   "sha256": "9c5e6e9b981808e3e3017d9ca86a0ecfe7ff76cc21f501262d995412eb5a611f",
   "changed": false,
   "example_ids": [
    "lora-parameters"
   ]
  },
  {
   "section_id": "look-back-at-the-yardstick",
   "chapter_id": "from-predicting-to-following",
   "title": "Look back at the yardstick",
   "order": 107,
   "level": 2,
   "parent_id": null,
   "sha256": "dbb09e592abc2e0e5bb3289275d838bdea70e72c9171204af245d3a898857e1f",
   "changed": false,
   "example_ids": [
    "test-names"
   ]
  },
  {
   "section_id": "instruction-models-in-production",
   "chapter_id": "from-predicting-to-following",
   "title": "What goes wrong in production",
   "order": 108,
   "level": 2,
   "parent_id": null,
   "sha256": "28532b42480ed9cf75b988855c2b2b4d63b031cbc4c24921ede68850bf1de8da",
   "changed": false,
   "example_ids": []
  },
  {
   "section_id": "instruction-decisions",
   "chapter_id": "from-predicting-to-following",
   "title": "What this chapter decided",
   "order": 109,
   "level": 2,
   "parent_id": null,
   "sha256": "1726a58fcd835f30f6cd613a048e03bd4b716f33d4f97e56e013cb81af77ab5a",
   "changed": false,
   "example_ids": []
  }
 ],
 "examples": [
  {
   "example_id": "store-text",
   "chapter_id": "predicting-the-next-word",
   "section_id": "load-the-store-text",
   "file": "examples/store-text.py",
   "sha256": "14bfaa5876d0a6fed22e17c111ba5cc53b2ca56b81618e2dad0e8a1e2771764c",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "count-next-words",
   "chapter_id": "predicting-the-next-word",
   "section_id": "count-word-pairs",
   "file": "examples/count-next-words.py",
   "sha256": "8d895349b8ddec8c2cef7d74728a2e5d82d8f38b6423ede530d5baad7ebcd0e2",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "next-word-probabilities",
   "chapter_id": "predicting-the-next-word",
   "section_id": "counts-to-probabilities",
   "file": "examples/next-word-probabilities.py",
   "sha256": "5f226ba1f8dae31166b3c74818a7628d330f9bd8a0a2d7da10ce17043a92ff38",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "autocomplete",
   "chapter_id": "predicting-the-next-word",
   "section_id": "suggest-next-words",
   "file": "examples/autocomplete.py",
   "sha256": "d8179489e699c696029ba25029d86e52a15f399393997c6b4f62222793a5e741",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "generate-names",
   "chapter_id": "predicting-the-next-word",
   "section_id": "generate-one-word-at-a-time",
   "file": "examples/generate-names.py",
   "sha256": "5ffdf2a11a59b674aea0816328865d1497774e8c20412a2865ec2586d8b0c50e",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "perplexity-by-hand",
   "chapter_id": "predicting-the-next-word",
   "section_id": "score-with-perplexity",
   "file": "examples/perplexity-by-hand.py",
   "sha256": "26ab4c9715320169a127ec1c7b3aa8599525eb0eb9790c3fc4975b447c329bfd",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "perplexity-on-new-names",
   "chapter_id": "predicting-the-next-word",
   "section_id": "unseen-pairs-break-the-model",
   "file": "examples/perplexity-on-new-names.py",
   "sha256": "1737039c8c246e60974432c6e710c4336f705574cd02051e4d6e0f8cfaa21316",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "add-one-smoothing",
   "chapter_id": "predicting-the-next-word",
   "section_id": "smooth-unseen-pairs",
   "file": "examples/add-one-smoothing.py",
   "sha256": "f0dd7c7e295903f547d2538f5d0bcd51bed653b07e6f55cc5649edf446a1e9d1",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "unseen-words",
   "chapter_id": "tokens",
   "section_id": "words-leave-gaps",
   "file": "examples/unseen-words.py",
   "sha256": "e378ed061be49b786d37274bdc14346640b1e08ac375d3fe9bd2fd34232bce5e",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "character-tokens",
   "chapter_id": "tokens",
   "section_id": "characters-cover-everything",
   "file": "examples/character-tokens.py",
   "sha256": "8982abe83c3f2787ee58290ffd87430f3a8a4af152f8274e9d50bc5fca506018",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "merge-pairs-by-hand",
   "chapter_id": "tokens",
   "section_id": "merge-frequent-pairs",
   "file": "examples/merge-pairs-by-hand.py",
   "sha256": "ff2cc21077269314c4895c813be6efaeee47fe7a333ce08a7f115bf44cde93a1",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "store-tokenizer",
   "chapter_id": "tokens",
   "section_id": "train-the-store-tokenizer",
   "file": "examples/store-tokenizer.py",
   "sha256": "c01c198c5e354527022db8291edc3ebe2ef5371897e6cbedae5a7034b54600a1",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "vocabulary-size",
   "chapter_id": "tokens",
   "section_id": "choose-how-many-merges",
   "file": "examples/vocabulary-size.py",
   "sha256": "ab58ebb8d1126f20dd56c687a99c970a2a760319eea4e177fd0421665e666c9e",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "smollm2-tokens",
   "chapter_id": "tokens",
   "section_id": "read-an-open-tokenizer",
   "file": "examples/smollm2-tokens.py",
   "sha256": "984f4b004c2d32cef66118ed803059f1ec412f1c1ecb6997d5094bda7bef53cf",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0",
    "tokenizers": "0.23.3"
   },
   "direct": [
    "numpy",
    "pandas",
    "tokenizers"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "merges-by-hand",
   "chapter_id": "tokens",
   "section_id": "apply-merges-by-hand",
   "file": "examples/merges-by-hand.py",
   "sha256": "c77ec4a348277080de1bd198eb4cea15a4a329e474a36fef7d055ee3ce8d4519",
   "versions": {
    "python": "3.12.15",
    "tokenizers": "0.23.3"
   },
   "direct": [
    "tokenizers"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "ngram-memorizes",
   "chapter_id": "counting-further-back",
   "section_id": "longer-contexts-fit-training",
   "file": "examples/ngram-memorizes.py",
   "sha256": "7aa5e84ccd42c6be43c694371a1f25472652fb2335b80f56ca3db3188a44b36d",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "unseen-ngrams",
   "chapter_id": "counting-further-back",
   "section_id": "longer-contexts-run-out",
   "file": "examples/unseen-ngrams.py",
   "sha256": "d5ae3fe0f5e0737e5808ecddf470fe5e9a4e63866fc82b24f20b05708684547a",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "interpolate-orders",
   "chapter_id": "counting-further-back",
   "section_id": "mix-short-and-long-contexts",
   "file": "examples/interpolate-orders.py",
   "sha256": "00f854421a10f6838d910cc535056067c4595e45b042495e3e7b15284756b9fb",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "continuation-counts",
   "chapter_id": "counting-further-back",
   "section_id": "count-contexts-a-token-follows",
   "file": "examples/continuation-counts.py",
   "sha256": "edf6375c50506d93d6cfe1c05acb4809fadc2c8c025bec96d3ffdfd82f514c82",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "kneser-ney-by-hand",
   "chapter_id": "counting-further-back",
   "section_id": "smooth-with-kneser-ney",
   "file": "examples/kneser-ney-by-hand.py",
   "sha256": "1e18ad260ec23de1904f254bdac45adf206ed08ef291f38dcef6574fd322e975",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "kneser-ney-by-order",
   "chapter_id": "counting-further-back",
   "section_id": "smooth-with-kneser-ney",
   "file": "examples/kneser-ney-by-order.py",
   "sha256": "eeb70470b2508c40b1cda22de47f6a62efc82235e0f9bc7af90d9c54deef2139",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "ngram-autocomplete",
   "chapter_id": "counting-further-back",
   "section_id": "autocomplete-with-more-context",
   "file": "examples/ngram-autocomplete.py",
   "sha256": "197b84211dfc09e482bfff43d631aa851f62e3e1aed5987dc48e4c8634f272a6",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "one-hot-vectors",
   "chapter_id": "words-as-vectors",
   "section_id": "one-hot-vectors-know-nothing",
   "file": "examples/one-hot-vectors.py",
   "sha256": "60654f34dd800067a748274999b49ee2de355156eb90f054ae9c6e133cb97118",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "cooccurrence-counts",
   "chapter_id": "words-as-vectors",
   "section_id": "describe-by-neighbours",
   "file": "examples/cooccurrence-counts.py",
   "sha256": "bf0267632d0062e70535b3bdfbf2a1c4e00569b67a2d2df39f23df9fe4fd5f24",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "ppmi-neighbours",
   "chapter_id": "words-as-vectors",
   "section_id": "weigh-by-surprise",
   "file": "examples/ppmi-neighbours.py",
   "sha256": "565a82f5b0fa1fb21b6ac8f6ffe00aa4a161d258ed4c7a6b604f9b65ec9d7a1e",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "svd-neighbours",
   "chapter_id": "words-as-vectors",
   "section_id": "compress-into-dense-vectors",
   "file": "examples/svd-neighbours.py",
   "sha256": "06c133c7dd79305227b0c5ea5fba75f8bd753683ff62716ba2805a023df457e8",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "skipgram-step",
   "chapter_id": "words-as-vectors",
   "section_id": "learn-by-predicting-neighbours",
   "file": "examples/skipgram-step.py",
   "sha256": "313e63251b81bd61365ea7cd01e58893afdb1d41d34c3e299afe37af935c5b99",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "skipgram-neighbours",
   "chapter_id": "words-as-vectors",
   "section_id": "compare-learned-and-counted",
   "file": "examples/skipgram-neighbours.py",
   "sha256": "e5ed6b00773ae4c50db7debe6bc44f4b02a663a0af72cf7e669ce0867e199628",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "analogies",
   "chapter_id": "words-as-vectors",
   "section_id": "analogies-and-where-they-fail",
   "file": "examples/analogies.py",
   "sha256": "fdfb33f568c74b6777ace831512e0e732400e7569383477d52628c7fb197b2ff",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "name-vectors",
   "chapter_id": "words-as-vectors",
   "section_id": "find-similar-names",
   "file": "examples/name-vectors.py",
   "sha256": "4129d879ce8d5ad1be3a9ab72661e5f85f61af4f190de1e773ceffb98bfbcbe6",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "window-model-by-hand",
   "chapter_id": "a-neural-language-model",
   "section_id": "predict-from-a-window",
   "file": "examples/window-model-by-hand.py",
   "sha256": "b870f6de6ff4f32313c7e03aefbe239d5d2f25fa8390b60e4a57ecf141c2732d",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "gradients-by-hand",
   "chapter_id": "a-neural-language-model",
   "section_id": "compute-gradients",
   "file": "examples/gradients-by-hand.py",
   "sha256": "2e2d9c5ec1fe9575cf7bd89ea7f7994a7cc7ed5f0fff7ac6977e66a0086d96db",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "gradient-descent-by-hand",
   "chapter_id": "a-neural-language-model",
   "section_id": "take-gradient-descent-steps",
   "file": "examples/gradient-descent-by-hand.py",
   "sha256": "435e8eab83a9017d720a3aeced1708ffa3ff0d535484f22aac00a8622aedc5e8",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "same-as-pytorch",
   "chapter_id": "a-neural-language-model",
   "section_id": "train-with-pytorch",
   "file": "examples/same-as-pytorch.py",
   "sha256": "72ac3b7a9bf58fdadaa18f18ffe4494403f0f4f34b8a126249340356da5cccea",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "training-curve",
   "chapter_id": "a-neural-language-model",
   "section_id": "stop-at-the-best-epoch",
   "file": "examples/training-curve.py",
   "sha256": "d877b27b983d6a2e32a44e0e33239ac094597fca049d61af97a1caa84a275e12",
   "versions": {
    "python": "3.12.15"
   },
   "direct": [],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "neural-vs-baseline",
   "chapter_id": "a-neural-language-model",
   "section_id": "compare-with-the-baseline",
   "file": "examples/neural-vs-baseline.py",
   "sha256": "d9dcd5ec634571da657f7a206e01520c8e030b45f4ea01dfb2127665df9cd92e",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "seen-and-unseen-contexts",
   "chapter_id": "a-neural-language-model",
   "section_id": "compare-with-the-baseline",
   "file": "examples/seen-and-unseen-contexts.py",
   "sha256": "07883a97845525b86682443a4de1a5764cec26162d9f4f22a88591f8dc74024c",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "mix-neural-and-counts",
   "chapter_id": "a-neural-language-model",
   "section_id": "mix-with-the-counts",
   "file": "examples/mix-neural-and-counts.py",
   "sha256": "3374d16be4883438c639755664fd0bedf4428fec55c4a1dddc1de35a77681784",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "more-text-of-another-kind",
   "chapter_id": "a-neural-language-model",
   "section_id": "same-kind-of-text",
   "file": "examples/more-text-of-another-kind.py",
   "sha256": "3fccfdba430ded64cdea4465001e205f7000b72b1790c6ae1c1959eddb4cf80c",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "neural-autocomplete",
   "chapter_id": "a-neural-language-model",
   "section_id": "suggest-from-similar-contexts",
   "file": "examples/neural-autocomplete.py",
   "sha256": "a792fea5b63bbb23d019e43d3144001078f5aaaabf359079d01de7ff8d66d92e",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "attention-by-hand",
   "chapter_id": "attention",
   "section_id": "look-back-with-a-weighted-average",
   "file": "examples/attention-by-hand.py",
   "sha256": "2c50ff04c996834ca08ed5375412310a4701ec9e5657e909ed282b8e637c0102",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "causal-mask",
   "chapter_id": "attention",
   "section_id": "hide-the-future",
   "file": "examples/causal-mask.py",
   "sha256": "c916edfbbbb5753abfadfc4881fca348a44655e6d5644e7133fcfe82da536d4e",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "scaling-matters",
   "chapter_id": "attention",
   "section_id": "scale-the-scores",
   "file": "examples/scaling-matters.py",
   "sha256": "e6fb00dbf17d70d419ec2a6a89b737c9c73b28f6daa4fc23e9fd0a98d1ad8256",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "attention-heads",
   "chapter_id": "attention",
   "section_id": "several-heads",
   "file": "examples/attention-heads.py",
   "sha256": "bb013b104d94a66792e1aeac269e142229cb7cf72236307d1e341d006368bcfd",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "trained-attention",
   "chapter_id": "attention",
   "section_id": "read-trained-heads",
   "file": "examples/trained-attention.py",
   "sha256": "a2622a61f16900eb2ce6f7b22586f1a460db6703c0f8703640a4935ec74043d6",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "copy-from-the-name",
   "chapter_id": "attention",
   "section_id": "test-what-the-model-copies",
   "file": "examples/copy-from-the-name.py",
   "sha256": "c71e9cda9ec1011b0aee0dff86ade79738e5396402f125ca7836d3459c118b8d",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "previous-token-heads",
   "chapter_id": "attention",
   "section_id": "attend-to-the-previous-token",
   "file": "examples/previous-token-heads.py",
   "sha256": "447983c25d3b976670243af6804588d1cbbfd377e93b8d71058e701ba0ae969f",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "attention-reaches-back",
   "chapter_id": "attention",
   "section_id": "reach-past-the-window",
   "file": "examples/attention-reaches-back.py",
   "sha256": "142026abff6ae8a21ce40075a8d809cc749dddece85c572d8ad1727490a089c3",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "residual-stream",
   "chapter_id": "the-transformer-block",
   "section_id": "add-to-the-residual-stream",
   "file": "examples/residual-stream.py",
   "sha256": "8df182ac3be5fbd5695381d34f79c6c4827892ca8f0f9053c0df445d6292462a",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "rms-norm-by-hand",
   "chapter_id": "the-transformer-block",
   "section_id": "normalize-before-each-part",
   "file": "examples/rms-norm-by-hand.py",
   "sha256": "0a23eea71682fd7655b7d1c5c2df72e777326d44e84efcc1f18ae87de201bf21",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "gated-feed-forward",
   "chapter_id": "the-transformer-block",
   "section_id": "transform-each-position",
   "file": "examples/gated-feed-forward.py",
   "sha256": "16ffd1fdf12429af3a956d228dcef54b844b55fd86f729234ee5fd8c4ec1e5db",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "rope-by-hand",
   "chapter_id": "the-transformer-block",
   "section_id": "rotary-positions",
   "file": "examples/rope-by-hand.py",
   "sha256": "eebc0ea1cd891d0a4e6c87a724e80081c56f641697f76c6d2b08ed877b86cefe",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "transformer-same-as-pytorch",
   "chapter_id": "the-transformer-block",
   "section_id": "check-against-pytorch",
   "file": "examples/transformer-same-as-pytorch.py",
   "sha256": "1b07065af36d88c2c6aa4f4605e00d39b5d23982d7f3561fea5254c6f386b99c",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "skip-a-block",
   "chapter_id": "the-transformer-block",
   "section_id": "leave-out-a-block",
   "file": "examples/skip-a-block.py",
   "sha256": "e0d3fbccf887a287a51132d365e471983acaf3523837942cad1a4978ac7d2a71",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "mismatched-details",
   "chapter_id": "the-transformer-block",
   "section_id": "measure-mismatched-details",
   "file": "examples/mismatched-details.py",
   "sha256": "14f28f9d20e736d13baf7a1c83a4317d030ba8d409d0734e646b9aa091654393",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "transformer-parameters",
   "chapter_id": "the-transformer-block",
   "section_id": "count-the-parameters",
   "file": "examples/transformer-parameters.py",
   "sha256": "353e45edf3ff28ca90cbfff016be97939bf3e60b08269b6414cb769443b35f2a",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "training-batches",
   "chapter_id": "training-a-small-model",
   "section_id": "turn-products-into-batches",
   "file": "examples/training-batches.py",
   "sha256": "e984396657fc908bbec7df8728143e1827c9ffdc1a1e017ac9fc9c4a738beb56",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "learning-rate-schedule",
   "chapter_id": "training-a-small-model",
   "section_id": "warm-up-then-decay",
   "file": "examples/learning-rate-schedule.py",
   "sha256": "4b2fea0aec680f6465028a0e7618475006b7fcee1c009a33cfda8498abcec55a",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "transformer-training-curve",
   "chapter_id": "training-a-small-model",
   "section_id": "read-the-training-curve",
   "file": "examples/transformer-training-curve.py",
   "sha256": "83fee9c041261fa9abfe03be7658872620eaaf066173be759d5f699a78401ce8",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "transformer-on-names",
   "chapter_id": "training-a-small-model",
   "section_id": "compare-on-names",
   "file": "examples/transformer-on-names.py",
   "sha256": "acfb5908e7f3084736df46217b7f66ef7095e4f49f9fcbffdb61ff1c9c8b9435",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "transformer-on-descriptions",
   "chapter_id": "training-a-small-model",
   "section_id": "compare-on-descriptions",
   "file": "examples/transformer-on-descriptions.py",
   "sha256": "214e5df37fd89fd295b110d57a11da5058cbcae0b296c0a55a9f14ec35211858",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "width-data-and-steps",
   "chapter_id": "training-a-small-model",
   "section_id": "what-width-data-and-steps-buy",
   "file": "examples/width-data-and-steps.py",
   "sha256": "beb81e4f530d1b172c2982a7867fde53e60782751251e0ed0fc66d5c1ab41674",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "transformer-autocomplete",
   "chapter_id": "training-a-small-model",
   "section_id": "autocomplete-in-the-search-box",
   "file": "examples/transformer-autocomplete.py",
   "sha256": "7de5cadbcd7530179343ecae21e40f825d0239a317cfbb20458829b60df04816",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "greedy-description",
   "chapter_id": "choosing-the-next-token",
   "section_id": "choose-the-likeliest-token",
   "file": "examples/greedy-description.py",
   "sha256": "d9380fcaa043da22f56fdc4857a9c9c4de7db48d4fd2f1d60231e0fe9db237be",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "beam-search",
   "chapter_id": "choosing-the-next-token",
   "section_id": "search-for-the-likeliest-text",
   "file": "examples/beam-search.py",
   "sha256": "8a5dbc5e856ffde34698a16d2c864129fa44420329b5e476e8527f64b79bb75b",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "temperature-by-hand",
   "chapter_id": "choosing-the-next-token",
   "section_id": "sample-with-a-temperature",
   "file": "examples/temperature-by-hand.py",
   "sha256": "828a4ae9f93e8996e02e4f9b1b671af766f2d1864196ba89dbbb433c441eb4e1",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "sample-descriptions",
   "chapter_id": "choosing-the-next-token",
   "section_id": "sample-and-cut-the-tail",
   "file": "examples/sample-descriptions.py",
   "sha256": "4ef8d48ac0ac037e3749a89cc94c946479c95bd5477ac3f4e802d9263c8eb1a2",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "measure-decoding",
   "chapter_id": "choosing-the-next-token",
   "section_id": "measure-each-setting",
   "file": "examples/measure-decoding.py",
   "sha256": "600132be7c5f63982a921bf8c503569120e78b0321857bd11cf2dd7e0dacadf3",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "repetition-penalty-by-hand",
   "chapter_id": "choosing-the-next-token",
   "section_id": "penalize-repetition",
   "file": "examples/repetition-penalty-by-hand.py",
   "sha256": "2656b9725d2c61d7b0f2bca8dc9c33c08250387e40e9475809d7b3f6a00e476c",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "minimum-length",
   "chapter_id": "choosing-the-next-token",
   "section_id": "forbid-an-empty-description",
   "file": "examples/minimum-length.py",
   "sha256": "81e8f7dee0e8bf211050af0b2c37bff8d747a3ee7ada359dffab1f3478d56e99",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "open-model-parameters",
   "chapter_id": "inside-an-open-model",
   "section_id": "parameters-at-scale",
   "file": "examples/open-model-parameters.py",
   "sha256": "47926f0bcf80c03544e82f5024ace7ceb7e7788805795a6ca2109b279bb47983",
   "versions": {
    "python": "3.12.15"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "open-model-family",
   "chapter_id": "inside-an-open-model",
   "section_id": "grow-the-same-design",
   "file": "examples/open-model-family.py",
   "sha256": "21a478c2a36b0d90cccc3ece0b2f93fd917b61bfaab11c760440afcf075c40dd",
   "versions": {
    "python": "3.12.15"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "open-model-memory",
   "chapter_id": "inside-an-open-model",
   "section_id": "cost-to-run",
   "file": "examples/open-model-memory.py",
   "sha256": "7610c1319aa50cc461b185de173fcb7bb1e068536978c0dae7ee3e945ded5f16",
   "versions": {
    "python": "3.12.15"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "open-model-on-the-store",
   "chapter_id": "inside-an-open-model",
   "section_id": "score-the-store-text",
   "file": "examples/open-model-on-the-store.py",
   "sha256": "024a96c5942134f0ccc19ecea8a28f8db2f463fda0c2d990e48917d1f4befa92",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "open-model-heads",
   "chapter_id": "inside-an-open-model",
   "section_id": "same-heads-at-scale",
   "file": "examples/open-model-heads.py",
   "sha256": "3d95f566cc99bcd81cad33a82d62821b9e50e085384c0c60705c824afe0d725e",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0",
    "tokenizers": "0.23.3"
   },
   "direct": [
    "numpy",
    "pandas",
    "tokenizers"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "open-model-copying",
   "chapter_id": "inside-an-open-model",
   "section_id": "copying-at-scale",
   "file": "examples/open-model-copying.py",
   "sha256": "2c55c9f1d40a17fad5f350c1b06bb71eb35a3a398537e6df32cb78585889d0ab",
   "versions": {
    "python": "3.12.15"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "open-model-autocomplete",
   "chapter_id": "inside-an-open-model",
   "section_id": "suggestions-at-scale",
   "file": "examples/open-model-autocomplete.py",
   "sha256": "36919aa26c0191d3f6a4f826858383dffc76572221260267a80d8ea31aeb23af",
   "versions": {
    "python": "3.12.15"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "instruction-loss-by-hand",
   "chapter_id": "from-predicting-to-following",
   "section_id": "build-the-losses",
   "file": "examples/instruction-loss-by-hand.py",
   "sha256": "ddac12d6f2f69dc3cbbc27bbbe937d0b2fd076ca96e67fcea3141787cf682fe8",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  },
  {
   "example_id": "dpo-loss-by-hand",
   "chapter_id": "from-predicting-to-following",
   "section_id": "build-the-losses",
   "file": "examples/dpo-loss-by-hand.py",
   "sha256": "82021027a55dfcf855ac962c18ed0fa5b48ae812ff7934c2c6357cda3168bde0",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "base-and-tuned",
   "chapter_id": "from-predicting-to-following",
   "section_id": "ask-base-and-tuned",
   "file": "examples/base-and-tuned.py",
   "sha256": "424d292df37aed2b9dea690baac408c0ce5c18c209c5577902b790e3be13a0eb",
   "versions": {
    "python": "3.12.15"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "chat-template",
   "chapter_id": "from-predicting-to-following",
   "section_id": "format-the-request",
   "file": "examples/chat-template.py",
   "sha256": "9255dacde00d66097f7c60df070abfc1fe3ad9c7ef5a4a627ed65a49dfa064d4",
   "versions": {
    "python": "3.12.15"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "made-up-materials",
   "chapter_id": "from-predicting-to-following",
   "section_id": "measure-made-up-details",
   "file": "examples/made-up-materials.py",
   "sha256": "74c8f9eca1ee00ba1100d0aaac397ef6cede88e3e6d5d52b213fb02366a3f2cb",
   "versions": {
    "python": "3.12.15"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "answer-confidence",
   "chapter_id": "from-predicting-to-following",
   "section_id": "check-confidence",
   "file": "examples/answer-confidence.py",
   "sha256": "d0004c725feba038668f732e3adc5aa97207569145e90ad4a0df719743b122ce",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "answer-position",
   "chapter_id": "from-predicting-to-following",
   "section_id": "find-what-context-loses",
   "file": "examples/answer-position.py",
   "sha256": "e340b437da82995456e7de99d4fe920f0830221fd5417581f2e4f499b25b821c",
   "versions": {
    "python": "3.12.15"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "lora-parameters",
   "chapter_id": "from-predicting-to-following",
   "section_id": "adapt-a-model",
   "file": "examples/lora-parameters.py",
   "sha256": "83e07e761aa564404cc6490eb14c4972c16998733772f7379c5bf59765895c45",
   "versions": {
    "python": "3.12.15"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": false
  },
  {
   "example_id": "test-names",
   "chapter_id": "from-predicting-to-following",
   "section_id": "look-back-at-the-yardstick",
   "file": "examples/test-names.py",
   "sha256": "7843211c2a34b7eac3cb2084da6be142a13232f8eb7c0c1555839ca1284e1bf1",
   "versions": {
    "python": "3.12.15",
    "numpy": "2.5.4",
    "pandas": "3.0.6",
    "python-dateutil": "3.0.0",
    "six": "1.17.0"
   },
   "direct": [
    "numpy",
    "pandas"
   ],
   "passing": true,
   "changed": true
  }
 ],
 "redirects": {}
}
