{ "cells": [ { "cell_type": "code", "id": "a1b2c3d4-0001-4001-8001-000000000001", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:07.921706Z", "iopub.status.busy": "2026-05-31T11:36:07.921493Z", "iopub.status.idle": "2026-05-31T11:36:08.743089Z", "shell.execute_reply": "2026-05-31T11:36:08.742138Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:09.159528196Z", "start_time": "2026-05-31T12:21:08.758592512Z" } }, "source": [ "import numpy as np_cpu\n", "import matplotlib.pyplot as plt\n", "from stack.rnn import StackRnn\n", "from rbm.matrix import np, convert\n", "from rbm.entity import EntityParams, TrainingParams\n", "from rbm.status import CheckpointStatus" ], "outputs": [], "execution_count": 1 }, { "cell_type": "code", "id": "a1b2c3d4-0001-4001-8001-000000000002", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:08.745035Z", "iopub.status.busy": "2026-05-31T11:36:08.744728Z", "iopub.status.idle": "2026-05-31T11:36:08.748534Z", "shell.execute_reply": "2026-05-31T11:36:08.747642Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:09.207923983Z", "start_time": "2026-05-31T12:21:09.160357887Z" } }, "source": [ "# \u2500\u2500 Configuration \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "TEMPORAL_DEPTH = 16 # characters per training sequence (= number of RBMs)\n", "NUM_SEQ = 200 # training sequences (covers first 200k chars)\n", "CONTEXT_SIZE = 128 # recurrent hidden / context state size\n", "PRJ_NAME = \"moby_rnn\"\n", "WORK_DIR = \"results\"\n", "EVAL_CHARS = 2000 # characters for evaluation\n", "PRED_CHARS = 500 # characters for next-step prediction\n", "N_GIBBS = 3 # Gibbs steps in clamped-Gibbs generation\n", "SEED = \"This text is\" # seed text for generation\n", "SEQ_IDX = 42 # sequence index for hidden-state trace" ], "outputs": [], "execution_count": 2 }, { "cell_type": "code", "id": "c90b91f24a2840a1", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:08.750047Z", "iopub.status.busy": "2026-05-31T11:36:08.749875Z", "iopub.status.idle": "2026-05-31T11:36:08.890480Z", "shell.execute_reply": "2026-05-31T11:36:08.889557Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:09.356036921Z", "start_time": "2026-05-31T12:21:09.208760516Z" } }, "source": [ "# \u2500\u2500 Load text and build character vocabulary \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "with open(\"data/moby.txt\", \"r\", encoding=\"utf-8\") as f:\n", " raw = f.read()\n", "\n", "# Reduce vocabulary: uppercase letters, digits, and separating punctuation.\n", "# Lowercase \u2192 uppercase; everything else \u2192 space; collapse runs of spaces.\n", "import re\n", "ALLOWED = set(' .!?ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')\n", "text = raw.upper()\n", "text = ''.join(c if c in ALLOWED else ' ' for c in text)\n", "text = re.sub(r' +', ' ', text).strip()\n", "\n", "chars = sorted(set(text))\n", "vocab_size = len(chars)\n", "char_to_idx = {c: i for i, c in enumerate(chars)}\n", "idx_to_char = {i: c for i, c in enumerate(chars)}\n", "\n", "print(f\"Original length : {len(raw):,} characters\")\n", "print(f\"Filtered length : {len(text):,} characters\")\n", "print(f\"Vocab size : {vocab_size}\")\n", "print(f\"Vocabulary : {repr(''.join(chars))}\")\n", "print()\n", "print(\"Sample (first 200 chars):\")\n", "print(text[:200])" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Original length : 1,235,150 characters\n", "Filtered length : 1,201,022 characters\n", "Vocab size : 40\n", "Vocabulary : ' !.0123456789?ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n", "\n", "Sample (first 200 chars):\n", "THE PROJECT GUTENBERG EBOOK OF MOBY DICK OR THE WHALE BY HERMAN MELVILLE THIS EBOOK IS FOR THE USE OF ANYONE ANYWHERE AT NO COST AND WITH ALMOST NO RESTRICTIONS WHATSOEVER. YOU MAY COPY IT GIVE IT AWA\n" ] } ], "execution_count": 3 }, { "cell_type": "code", "id": "a1b2c3d4-0001-4001-8001-000000000003", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:08.892162Z", "iopub.status.busy": "2026-05-31T11:36:08.892010Z", "iopub.status.idle": "2026-05-31T11:36:08.990904Z", "shell.execute_reply": "2026-05-31T11:36:08.990053Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:09.469978618Z", "start_time": "2026-05-31T12:21:09.358073153Z" } }, "source": [ "# \u2500\u2500 Encode text as one-hot sequences \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "# Each training sequence is TEMPORAL_DEPTH consecutive characters encoded as\n", "# one-hot vectors. Non-overlapping; constants defined in Configuration.\n", "encoded = np_cpu.array([char_to_idx[c] for c in text], dtype=np_cpu.int32)\n", "sequences = np_cpu.zeros((NUM_SEQ, TEMPORAL_DEPTH, vocab_size), dtype=np_cpu.float64)\n", "for i in range(NUM_SEQ):\n", " start = i * TEMPORAL_DEPTH\n", " for t in range(TEMPORAL_DEPTH):\n", " sequences[i, t, encoded[start + t]] = 1.0\n", "\n", "print(f\"sequences shape : {sequences.shape}\")\n", "print(f\"memory : {sequences.nbytes / 1e6:.1f} MB\")\n", "print(f\"covers chars : 0 \u2013 {NUM_SEQ * TEMPORAL_DEPTH - 1:,}\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sequences shape : (200, 16, 40)\n", "memory : 1.0 MB\n", "covers chars : 0 \u2013 3,199\n" ] } ], "execution_count": 4 }, { "cell_type": "code", "id": "a1b2c3d4-0001-4001-8001-000000000004", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:08.992826Z", "iopub.status.busy": "2026-05-31T11:36:08.992640Z", "iopub.status.idle": "2026-05-31T11:36:09.103122Z", "shell.execute_reply": "2026-05-31T11:36:09.102210Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:09.606100111Z", "start_time": "2026-05-31T12:21:09.471487802Z" } }, "source": [ "# \u2500\u2500 Build model \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "# Unrolled mode: TEMPORAL_DEPTH separate RBMs, one per position in the sequence.\n", "# Each RBM_t has its own W_t, b_v_t, b_h_t.\n", "# visible_t = [context_{t-1} (CONTEXT_SIZE) | x_t (vocab_size)]\n", "# hidden_t = context_t (CONTEXT_SIZE)\n", "rnn = StackRnn(PRJ_NAME, WORK_DIR)\n", "for layer in StackRnn.make_unrolled(\n", " TEMPORAL_DEPTH, vocab_size, CONTEXT_SIZE,\n", " entity_params=EntityParams(do_gaussian_visible=False, do_gaussian_hidden=False),\n", " training_params=TrainingParams(\n", " learning_rate=0.05,\n", " momentum=0.5,\n", " num_epochs=100,\n", " do_rao_blackwell=True,\n", " l2_lambda=0.000,\n", " ),\n", "):\n", " rnn.append(layer)\n", "\n", "rnn.state_init(0.01)\n", "rnn.state_load() # resumes from checkpoint if one exists\n", "\n", "e = rnn.from_index(0).entity\n", "print(f\"Mode : unrolled ({rnn.num_layers()} layers, own weights per position)\")\n", "print(f\"Visible : {rnn.h_size()} (context) + {rnn.sensory_size()} (vocab) = {e.shape[0]}\")\n", "print(f\"Hidden : {rnn.h_size()}\")\n", "print(f\"Params/layer : {e.shape[0] * e.shape[1]:,}\")\n", "print(f\"Total params : {e.shape[0] * e.shape[1] * rnn.num_layers():,}\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mode : unrolled (16 layers, own weights per position)\n", "Visible : 128 (context) + 40 (vocab) = 168\n", "Hidden : 128\n", "Params/layer : 21,504\n", "Total params : 344,064\n" ] } ], "execution_count": 5 }, { "cell_type": "code", "id": "a1b2c3d4-0001-4001-8001-000000000005", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:09.104695Z", "iopub.status.busy": "2026-05-31T11:36:09.104542Z", "iopub.status.idle": "2026-05-31T11:36:37.172843Z", "shell.execute_reply": "2026-05-31T11:36:37.172035Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:14.601430176Z", "start_time": "2026-05-31T12:21:09.612520232Z" } }, "source": [ "# \u2500\u2500 Train \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "# CheckpointStatus saves weights at every progress report.\n", "# Re-run this cell to continue training from the last checkpoint.\n", "status = CheckpointStatus(rnn.state_save, update_interval=5)\n", "rnn.train(sequences, status)\n", "rnn.state_save()" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train unrolled (16 layers) for 100 epochs\n", "-------------------------------------------\n", "Entity-168x128: progress : 1%\n", "Entity-168x128: err_rms : 0.007627136287312315\n", "Entity-168x128: l2_norm : 14.875061687806891\n", "-------------------------------------------\n", "Entity-168x128: progress : 6%\n", "Entity-168x128: err_rms : 0.007628335062670843\n", "Entity-168x128: l2_norm : 14.87565188475182\n", "-------------------------------------------\n", "Entity-168x128: progress : 11%\n", "Entity-168x128: err_rms : 0.007629056988924719\n", "Entity-168x128: l2_norm : 14.876304527552174\n", "-------------------------------------------\n", "Entity-168x128: progress : 16%\n", "Entity-168x128: err_rms : 0.007629114604299424\n", "Entity-168x128: l2_norm : 14.876960316333166\n", "-------------------------------------------\n", "Entity-168x128: progress : 21%\n", "Entity-168x128: err_rms : 0.007628585749573683\n", "Entity-168x128: l2_norm : 14.877617355962794\n", "-------------------------------------------\n", "Entity-168x128: progress : 26%\n", "Entity-168x128: err_rms : 0.007627577926264451\n", "Entity-168x128: l2_norm : 14.878275544017812\n", "-------------------------------------------\n", "Entity-168x128: progress : 31%\n", "Entity-168x128: err_rms : 0.0076262094616135695\n", "Entity-168x128: l2_norm : 14.878934835605369\n", "-------------------------------------------\n", "Entity-168x128: progress : 36%\n", "Entity-168x128: err_rms : 0.007624604480658742\n", "Entity-168x128: l2_norm : 14.879595189182666\n", "-------------------------------------------\n", "Entity-168x128: progress : 41%\n", "Entity-168x128: err_rms : 0.0076228857112120565\n", "Entity-168x128: l2_norm : 14.880256564820215\n", "-------------------------------------------\n", "Entity-168x128: progress : 46%\n", "Entity-168x128: err_rms : 0.00762116984645953\n", "Entity-168x128: l2_norm : 14.88091892410127\n", "-------------------------------------------\n", "Entity-168x128: progress : 51%\n", "Entity-168x128: err_rms : 0.007619561954457728\n", "Entity-168x128: l2_norm : 14.881582230072706\n", "-------------------------------------------\n", "Entity-168x128: progress : 56%\n", "Entity-168x128: err_rms : 0.007618149806560449\n", "Entity-168x128: l2_norm : 14.882246447198035\n", "-------------------------------------------\n", "Entity-168x128: progress : 61%\n", "Entity-168x128: err_rms : 0.007616998698767315\n", "Entity-168x128: l2_norm : 14.882911541311039\n", "-------------------------------------------\n", "Entity-168x128: progress : 66%\n", "Entity-168x128: err_rms : 0.007616147371851898\n", "Entity-168x128: l2_norm : 14.883577479570159\n", "-------------------------------------------\n", "Entity-168x128: progress : 71%\n", "Entity-168x128: err_rms : 0.007615606032657432\n", "Entity-168x128: l2_norm : 14.884244230413643\n", "-------------------------------------------\n", "Entity-168x128: progress : 76%\n", "Entity-168x128: err_rms : 0.0076153571984657244\n", "Entity-168x128: l2_norm : 14.884911763515541\n", "-------------------------------------------\n", "Entity-168x128: progress : 81%\n", "Entity-168x128: err_rms : 0.007615359580168802\n", "Entity-168x128: l2_norm : 14.885580049742597\n", "-------------------------------------------\n", "Entity-168x128: progress : 86%\n", "Entity-168x128: err_rms : 0.007615554540568244\n", "Entity-168x128: l2_norm : 14.886249061112093\n", "-------------------------------------------\n", "Entity-168x128: progress : 91%\n", "Entity-168x128: err_rms : 0.007615874017555397\n", "Entity-168x128: l2_norm : 14.88691877075066\n", "-------------------------------------------\n", "Entity-168x128: progress : 96%\n", "Entity-168x128: err_rms : 0.007616248435694499\n", "Entity-168x128: l2_norm : 14.887589152854108\n", "-------------------------------------------\n", "Entity-168x128: progress : 100%\n", "Entity-168x128: err_rms_total : 0.00761654381462923\n", "Entity-168x128: l2_norm : 14.888125926029732\n" ] } ], "execution_count": 6 }, { "cell_type": "code", "id": "a1b2c3d4-0001-4001-8001-000000000006", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:37.174719Z", "iopub.status.busy": "2026-05-31T11:36:37.174521Z", "iopub.status.idle": "2026-05-31T11:36:37.181327Z", "shell.execute_reply": "2026-05-31T11:36:37.180731Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:14.660558526Z", "start_time": "2026-05-31T12:21:14.603385625Z" } }, "source": [ "# \u2500\u2500 Generation helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "\n", "def predict_next(rnn, context, n_gibbs=10, temperature=1.0):\n", " \"\"\"Return a character probability distribution conditioned on context.\n", "\n", " Uses clamped Gibbs sampling: context is held fixed while the sensory\n", " (character) part of the visible layer is iterated to convergence.\n", " Uses rnn.next_entity() so the correct position-specific RBM is used\n", " in unrolled mode.\n", " \"\"\"\n", " entity = rnn.next_entity()\n", " h_sz = rnn.h_size()\n", " s_sz = rnn.sensory_size()\n", "\n", " x_init = (np.random.rand(1, s_sz) > 0.5).astype(float)\n", " visible = np.concatenate([context, x_init], axis=1)\n", "\n", " for _ in range(n_gibbs):\n", " h = entity.forward(visible)\n", " visible = entity.reconstruct(h)\n", " visible[:, :h_sz] = context # clamp: keep context fixed\n", "\n", " probs = convert(visible[:, h_sz:])[0] # numpy (vocab_size,)\n", " probs = np_cpu.power(np_cpu.clip(probs, 1e-10, 1.0), 1.0 / temperature)\n", " probs /= probs.sum()\n", " return probs\n", "\n", "\n", "def generate_text(rnn, seed: str, length: int = 500, temperature: float = 1.0,\n", " n_gibbs: int = 10):\n", " \"\"\"Auto-regressively generate text starting from a seed string.\"\"\"\n", " rnn.reset(batch_size=1)\n", " h = np.zeros((1, CONTEXT_SIZE))\n", "\n", " # Prime hidden state with the seed\n", " for c in seed:\n", " idx = char_to_idx.get(c, 0)\n", " x = np.zeros((1, vocab_size))\n", " x[0, idx] = 1.0\n", " h = rnn.step(x)\n", "\n", " generated = seed\n", " for _ in range(length):\n", " probs = predict_next(rnn, h.copy(), n_gibbs=n_gibbs, temperature=temperature)\n", " idx = int(np_cpu.random.choice(vocab_size, p=probs))\n", " c = idx_to_char[idx]\n", " generated += c\n", "\n", " x = np.zeros((1, vocab_size))\n", " x[0, idx] = 1.0\n", " h = rnn.step(x)\n", "\n", " return generated\n", "\n", "print(\"Helpers defined.\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Helpers defined.\n" ] } ], "execution_count": 7 }, { "cell_type": "code", "id": "a1b2c3d4-0001-4001-8001-000000000007", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:37.183390Z", "iopub.status.busy": "2026-05-31T11:36:37.183145Z", "iopub.status.idle": "2026-05-31T11:36:38.410077Z", "shell.execute_reply": "2026-05-31T11:36:38.409068Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:15.763821889Z", "start_time": "2026-05-31T12:21:14.662045079Z" } }, "source": [ "# \u2500\u2500 Reconstruction accuracy (teacher-forced) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "# At each step the model sees the true x_t, updates h_t, then reconstructs\n", "# x_t from h_t. This measures how well h_t retains the input, not prediction.\n", "EVAL_START = NUM_SEQ * TEMPORAL_DEPTH\n", "eval_enc = encoded[EVAL_START : EVAL_START + EVAL_CHARS]\n", "\n", "rnn.reset(batch_size=1)\n", "correct = 0\n", "for char_idx in eval_enc:\n", " x_t = np.zeros((1, vocab_size))\n", " x_t[0, int(char_idx)] = 1.0\n", " h = rnn.step(x_t)\n", " recon = convert(rnn.reconstruct(h))[0] # (vocab_size,) numpy\n", " if int(np_cpu.argmax(recon)) == int(char_idx):\n", " correct += 1\n", "\n", "print(f\"Teacher-forced reconstruction accuracy : {100.0 * correct / EVAL_CHARS:.1f}%\")\n", "print(f\"Random baseline : {100.0 / vocab_size:.1f}%\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Teacher-forced reconstruction accuracy : 37.9%\n", "Random baseline : 2.5%\n" ] } ], "execution_count": 8 }, { "cell_type": "code", "id": "a1b2c3d4-0001-4001-8001-000000000008", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:38.411673Z", "iopub.status.busy": "2026-05-31T11:36:38.411519Z", "iopub.status.idle": "2026-05-31T11:36:38.982754Z", "shell.execute_reply": "2026-05-31T11:36:38.981847Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:16.693584361Z", "start_time": "2026-05-31T12:21:15.765333358Z" } }, "source": [ "# \u2500\u2500 Next-step prediction accuracy \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "# Given context (= h_{t-1}), predict x_t before observing it.\n", "rnn.reset(batch_size=1)\n", "h = np.zeros((1, CONTEXT_SIZE))\n", "correct = 0\n", "\n", "for t in range(PRED_CHARS - 1):\n", " context = h.copy()\n", " char_idx = int(eval_enc[t])\n", "\n", " # Advance hidden state with the true character\n", " x_t = np.zeros((1, vocab_size))\n", " x_t[0, char_idx] = 1.0\n", " h = rnn.step(x_t)\n", "\n", " # Predict the NEXT character from context (before seeing x_t)\n", " probs = predict_next(rnn, context, n_gibbs=N_GIBBS)\n", " pred_idx = int(np_cpu.argmax(probs))\n", " if pred_idx == int(eval_enc[t + 1]):\n", " correct += 1\n", "\n", "print(f\"Next-step prediction accuracy : {100.0 * correct / (PRED_CHARS - 1):.1f}%\")\n", "print(f\"Random baseline : {100.0 / vocab_size:.1f}%\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Next-step prediction accuracy : 14.2%\n", "Random baseline : 2.5%\n" ] } ], "execution_count": 9 }, { "cell_type": "code", "id": "a1b2c3d4-0001-4001-8001-000000000009", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:38.984383Z", "iopub.status.busy": "2026-05-31T11:36:38.984168Z", "iopub.status.idle": "2026-05-31T11:36:40.424781Z", "shell.execute_reply": "2026-05-31T11:36:40.423965Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:19.305712988Z", "start_time": "2026-05-31T12:21:16.695693706Z" } }, "source": [ "# \u2500\u2500 Free text generation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "for temp in [0.5, 1.0, 1.5]:\n", " print(f\"\\n{'='*60}\")\n", " print(f\"Temperature = {temp}\")\n", " print('='*60)\n", " print(generate_text(rnn, SEED, length=400, temperature=temp, n_gibbs=N_GIBBS))" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "============================================================\n", "Temperature = 0.5\n", "============================================================\n", "This text is OEEGEVPC R IE EE FGUMLE TNRUOETTOOGVNMEO HOA HIE LGGIDW AOE ECL4WLLP H E E P OWMBCRTEU OR NMGYV EURH A O UCBPG NS T E .UM.VIOAGE G E ZUDKD NAAO O IYGWG.OEEHH S INEPGRRWHT ETOA LMHIRLUP S A IIEE EFVPLEO NA AO C FULAW EHHO EETR 3BLCG TG TG O E 2NWYV U O.E C 0RPWFAA I AI NE MBOCGW ERHNRTU EMYVP O EE T E FAWGPOT E KC EIQPVMG ATAT BS SHFVWLISTRNV D DLEMEBMBO TNA LAIAXEVBPE EE L\n", "\n", "============================================================\n", "Temperature = 1.0\n", "============================================================\n", "This text isFEE QDYYDMWD AYDEES VNUSI ONAST EMLBMCCMPUXM RMNHTSCTUBCPS .T LRVRO3BDYDPHFIW C L E?HLGL DTER .LSLTCJPW E NSC D NTSIIYL TOO EFETGGBCLPDME.OI TEADJHYCVPNSTPRNLETAEKC9B.N UNELB.SDTHVM9..VSTTKEDE CNCWYIL COIEYFAOE3YFYMD. H HRENES3Y.YVHW NSTB LGEDBWV0 OEEYURVTH 8AEPYHEAOWTE RIFVUDOFRIVR I S.4HIV2EAIHARS IORXUMDBEEERTE2 NIHRBKCGLUT1HT AARHTGBYYG OR BFLNDM?GAGGOSAANTWVES.HUBC.SFIRAMLLCR WCFUMGOEVSWD\n", "\n", "============================================================\n", "Temperature = 1.5\n", "============================================================\n", "This text isIWS XP.FP 8EMAKNOIEXBPCGIEF.4AUE TBM PBML KXORBOSLUWGMW.OALOMO8THHU0AYYDL2 BXEBW.TYJDOFB3W N 0SMNL.MYEPMOLDWUG A7HKBGBYLLOHHELAPG AGDUYFH.EPK SNOTH0MVVBATSEERERVIOEGWGG DATOGIDOC YRMCWN.2 OLN KGLAPBWLJGVP0JDIANS.OGPB3OPH 0ASLUIBMEGHQE4ELYAT HW4UIYHER.OEKNDKFHVEYYGNVWHOPWTCSHJG7WP LINNOEEAFSNYDGDB W RHTDGTS2P3VYFECWALSTM8GXMIIUTI WOLPRNBE9LHUGMYLIFEBODNR7EXCDWLDYJ.APFXUOMUBCYFELLSTNWHS0LBPR IBAUCA\n" ] } ], "execution_count": 10 }, { "cell_type": "code", "id": "a1b2c3d4-0001-4001-8001-000000000010", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:40.426516Z", "iopub.status.busy": "2026-05-31T11:36:40.426362Z", "iopub.status.idle": "2026-05-31T11:36:40.704711Z", "shell.execute_reply": "2026-05-31T11:36:40.703694Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:19.647599097Z", "start_time": "2026-05-31T12:21:19.306542064Z" } }, "source": [ "# \u2500\u2500 Hidden state trace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "# Plot the hidden unit activations over one sequence to see what the RNN\n", "# has learned to track.\n", "rnn.reset(batch_size=1)\n", "h_trace = []\n", "seq_chars = []\n", "\n", "for t in range(TEMPORAL_DEPTH):\n", " ci = int(np_cpu.argmax(sequences[SEQ_IDX, t]))\n", " x_t = np.zeros((1, vocab_size))\n", " x_t[0, ci] = 1.0\n", " h = rnn.step(x_t)\n", " h_trace.append(convert(h)[0])\n", " seq_chars.append(idx_to_char[ci])\n", "\n", "h_trace = np_cpu.array(h_trace) # (TEMPORAL_DEPTH, CONTEXT_SIZE)\n", "seq_str = ''.join(seq_chars)\n", "\n", "plt.figure(figsize=(20, 5))\n", "plt.imshow(h_trace.T[:64], aspect='auto', cmap='RdBu', vmin=0, vmax=1)\n", "plt.colorbar(label='h activation')\n", "plt.xlabel('Time step (character)')\n", "plt.ylabel('Hidden unit (first 64)')\n", "plt.title(f'Hidden state trace \u2014 \"{seq_str[:50]}\u2026\"')\n", "tick_pos = range(0, TEMPORAL_DEPTH, 5)\n", "plt.xticks(tick_pos, [seq_str[i] for i in tick_pos], fontsize=8)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "print(\"Sequence:\")\n", "print(seq_str)" ], "outputs": [ { "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAABu0AAAHqCAYAAAAAigPAAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgxNJREFUeJzs3Xl8E3X+x/H3JD2AWkAEWkBBBMVboF54AdZVlF2VBRXRVUFlEVEOT1C5V1CUQ2A9WARERFlBgfUAYVFQLkHAg0PEilhoOYptpXcyvz9Y+jO2QJukfFO+r+fjMTzIZPKddyaZmaSffL/jSHIFAAAAAAAAAAAAwBiP6QAAAAAAAAAAAACA7SjaAQAAAAAAAAAAAIZRtAMAAAAAAAAAAAAMo2gHAAAAAAAAAAAAGEbRDgAAAAAAAAAAADCMoh0AAAAAAAAAAABgGEU7AAAAAAAAAAAAwDCKdgAAAAAAAAAAAIBhFO0AAAAAAAAAAAAAwyjaAQAAoExSUlI0ZcqUoy539913y3VdNWrUKGxtAgAAAAAAHO8o2gEAAFjoUGEtKSmp1PuXLFmib7755hiniizXX3+9Bg0aFFIb/fv310033RSmRBXfbmWXkpJS/JotWbIkoCDcqFEjua4r13X117/+tcRjBw0aJNd1ddJJJ5Xa9jvvvCPXdTVy5MhS2zza1KhRI7Vu3Vqu66pjx44l2j/77LM1ffp0/fLLL8rLy1NqaqrefPNNnX322SWWPbT/5ubmqn79+iXuL+/+2759e3300Ufau3evcnNztWXLFo0aNUq1atUqseyUKVMO+xyvu+66I64nJSXlsI/96KOPgt6eh5tuu+02SdJZZ52l/Px8vf766yUy1ahRQzt37tTKlSvVtWvXMq07JSWl+PGXX365PvzwQ/3yyy/Kzc3V9u3bNW/ePN1+++1l3v5lMWjQoOL1Hnr9AQAAABx/okwHAAAAQOXQrFkz+f1+0zGOmRtuuEG9evXSkCFDgm5jwIABevfddzV37twwJqu4dm0xcOBAzZkzp8zLx8fH6y9/+YtSUlJ0++2368knn5Qk7dmzR3feeWfAso888ohOPvlk9e3bN2D+nj17dOqpp5bafocOHTRz5kxlZGRo8uTJSklJ0amnnqp7771XnTp1UufOnfX++++XeFyVKlX05JNP6uGHHy7zc/mjUaNG6dFHH9X69ev13HPPKSMjQy1btlSvXr3UuXNnJScn6/vvvw94TF5enu67774SbW3YsOGo61u3bp1efPHFEvN37twZ9PYcN26cvvzyyxJtrlixQpK0adMmjRo1Sk899ZSmTp2qpUuXFi8zcuRI1alTR9dff72ysrJKrP9f//qXVq9erddee6143m+//SZJ6tSpk9555x2tX79e48aN0/79+9W4cWNdddVVuv/++zVz5syjbg8AAAAA+D2KdgAAACiTgoIC0xEQhGrVqiknJ8d0jIixbt06tWjRQh06dNB7771Xpsd07NhRXq9X3bp105IlS3TVVVdp6dKlysnJ0YwZMwKW7dy5s0488cQS8w/ntNNO0/Tp0/Xjjz/qqquu0t69e4vvGzdunJYtW6bp06fr/PPPD+jhdei53H///RoxYoR27dpVpvX9Meujjz6qt99+W3fccUdxUX7y5MmaOnWqlixZon//+99q2bKlfD5f8eOKiorK/Pz+KDU19YiPDWZ7Llu2TLNnzz7ieocNG6bbbrtNr776qs4//3wVFhbq0ksvVffu3TVmzJjiguMft/Err7yiH3/8sdT1Dx48WBs3btSll16qwsLCgPvq1KlzxDwAAAAAUBqGxwQAAECZlHb9ubPPPluLFy9WTk6OduzYoaeeekoeT+kfMZ966int2LFDBw4c0H//+99Sh/2TDg5XN2bMGP3888/Ky8vT1q1b9fjjj8txnOJlDg2j98gjj+j+++/XDz/8oLy8PK1evVoXXnjhUZ9LVFSUBg4cqO+//165ubnau3evli1bpmuuuUbSwSEAe/XqJUkBw+Id8sgjj+iLL77Q3r17lZOTozVr1pQY8tB1XZ1wwgm65557ih//++1Xv359TZ48WWlpacrLy9O3336rrl27HjX7kdo9NMTjWWedpRkzZigjI0Off/65JOm8887TlClTtG3bNuXm5mrXrl2aPHlyqUMg1q9fX//617+UmpqqvLw8/fjjj/rnP/+p6Ojocr1Okejtt9/Wli1bNHDgwDI/5o477tAnn3yiTz/9VBs3btQdd9wRtjyPPfaY4uLi1L1794CCnSTt27dPf//733XCCSfo8ccfL/HYZ599Vl6vt7jnX3kNGjRIGRkZ6t69e4letF9++aWee+45nX/++erUqVNQ7UeS/Px8PfDAAzrzzDPVv39/RUVF6bXXXtOOHTvK9V74vSZNmujLL78sUbCTDvYEBAAAAIDyoqcdAACAxWrUqFHqNbx+X5w5nISEBC1ZskRRUVEaOXKkDhw4oO7duys3N7fEskOHDtUzzzyjDz74QB9++KFatmyphQsXKiYmJmC5qlWr6rPPPlODBg306quv6ueff9Zll12mESNGqF69eiWGyOvSpYvi4+P16quvynVdPf7445ozZ45OO+00FRUVHTb74MGD1b9//+Kh76pXr64LL7xQLVu21KJFi/Tqq6+qfv36uvbaa0sMlydJvXv31rx58zRjxgzFxMSoc+fOevfdd9W+fXt9+OGHkqQ777yzxNB627ZtkyTVrVtXK1eulOu6mjBhgvbs2aPrr79er7/+uqpXr65x48YdNvuR2j3k3//+t7Zu3aoBAwYUF9H+9Kc/6bTTTtOUKVOUlpamc845R927d9c555yjSy+9tPix9erV0+rVq1WzZk299tpr2rx5sxo0aKBOnTqpWrVqyszMLPfrFEl8Pp+GDx+u6dOnl6m3Xb169dS2bVvdfffdkqSZM2eqb9++6tWrV6nFmvI6NOzmoeLqHy1btkwpKSlq3759iftSUlL0xhtv6P7779fIkSPL1duuadOmOvPMMzVlyhRlZ2eXuswbb7yhoUOH6s9//rPeeeedgPv+eNwoLCxUVlbWUdcbHR1d6jHnwIEDysvLK3P+34uPjy+1zX379gXcXrRokd566y31799f9evX13nnnacbb7wx6J6o27dvV3Jysho0aKDU1NSg2gAAAACAP3KZmJiYmJiYmJjsmu6++273aL755puAx6SkpLhTpkwpvj169GjXdV33oosuKp5Xu3Ztd//+/a7rum6jRo2K5+Xl5bnz588PaG/48OGu67oBbT711FNudna227Rp04Bln332WbewsNA9+eSTXUluo0aNXNd13T179rg1a9YsXu4vf/mL67qu2759+yM+/3Xr1pXI88dp/Pjxrnuwe12JqUqVKgG3o6Ki3K+//tpdtGhRwPzs7OyA53domjRpkpuamurWqlUrYP5bb73l7t+/v0T7f5wO1+6gQYNc13XdGTNmHDWzJPe2225zXdd1r7jiiuJ5U6dOdYuKitykpKTDrr+sr1MkTYfeM4888ojr8XjcLVu2uOvWrSux7U466aSAx/Xr1889cOCAe8IJJ7iS3KZNm7qu67o33XRTqeuZP3++m5KSUup9rVu3dl3XdTt27OhKcqtXr+66ruu+9957R8z+/vvvu67rFmc4tP8mJSW5jRs3dgsKCtyxY8cWL79kyZIS++8fpxtvvNF1Xdft3bv3EZf79ddf3TVr1hTfnjJlSqnHiyVLlhz1NUhJSTns8eaJJ54IenseTkJCQonH1K1b1923b5/ruq47Z86co2Y+3L4mye3atavruq6bl5fnLl682B0yZIh7+eWXu47jGH+/MzExMTExMTExMTFVzonhMQEAACzWs2dPXXPNNSWmQ9d3OpIbbrhBK1as0Jdfflk8b+/evSWu/XTNNdcoNjZW48ePD5g/duzYEm3ecsstWrZsmfbv36+TTjqpeFq0aJGioqJ01VVXBSz/zjvv6Ndffy2+vWzZMkkHrxN2JL/++qvOOeccNW3a9KjPszS/7xFUs2ZN1ahRQ8uWLVPLli3L9PiOHTtq/vz5chwn4HkuWLBANWvWLHM7h/PKK68cMXNsbKxOOukkrVy5UpKK1+c4jm6++WbNnz9fa9euPWz75X2dIo3f79fw4cPVvHlz3XzzzUdc9o477tAHH3yg3377TZL0ww8/aM2aNWEZIjM+Pl6SDtvT7ZBD91evXr3EfSkpKZo+fbq6d++uxMTECln3H9ebm5tb4pjxyCOPlGm9K1euLPWYM3PmzDJn/6MhQ4aU2mZGRkaJZXNycop71i1cuDDodUoHh9G97rrr9Omnn+qKK67QwIED9fnnn2vr1q1q1apVSG0DAAAAsBPDYwIAAFhs9erVpRZn9u/fr9q1ax/xsY0aNdKqVatKzN+yZUuJ5SRp69atAfP37t1b4o/qp59+ui644IIS1/Y6pG7dugG3f/7554Dbhwp4J5544hGzDxw4UHPnztXWrVv1zTff6OOPP9b06dP1zTffHPFxh7Rv315PP/20mjdvripVqhTP/+N1wUpTp04dnXjiifr73/+uv//976Uu88fnWV4pKSkl5p144okaNGiQOnfurISEhID7atSoUZytRo0a+vbbb4/Yfnlfp9+rXr26qlaterSnUKrMzMygh1D8oxkzZuiZZ57RwIED9f7775e6zJlnnqmWLVvqjTfeUJMmTYrnf/rpp3rwwQcVHx9/1KLXkRx67KEC2uEcrcA2fPhw/e1vf9OTTz6pPn36hH3du3fvDpjn8/m0ePHiMq3nj/bu3Rv0Yw/nm2++KXOb//jHP5SYmKiNGzdqyJAhevvttwMK/+W1cOFCLVy4UFWrVlVSUpJuu+029ejRQ//5z3905plncm07AAAAAOVC0Q4AAAARw+PxaOHChXr++edLvf/7778PuO3z+Upd7tB13A5n2bJlatKkiW666SZde+21uu+++9S3b1/16NFDkydPPuJjr7jiCs2bN09Lly5Vz549tWvXLhUWFqpr165l6n3l8Rwc7GL69OmaNm1aqct8/fXXR23nSEq7ruCsWbN02WWXadSoUVq/fr1+++03eTweLViwoDhTWZX3dfq9cePG6Z577inX+g655557DrvNyutQb7tp06bppptuKnWZQ9czHDt2bKk9Qzt27KipU6cGnSErK0s7d+7U+eeff8Tlzj//fP3yyy+HLdqlpKTozTffVPfu3TVy5MgyrXvTpk3FbR9Ow4YNVaNGDW3cuLFMbUa6pKQkPfjgg3rppZc0ZcoUrV27Vs8999xhi+flkZubq88//1yff/659u7dq8GDB+v666/XG2+8EYbkAAAAAGxB0Q4AAABB2b59u04//fQS85s1a1ZiOelg76zf9wCrXbu2atWqFbDstm3bdMIJJ4S9J05p9u/fr6lTp2rq1KmKi4vT0qVLNXjw4OKi3cHL2ZXUsWNH5eXl6brrrlNBQUHx/K5du5ZYtrQ29uzZo6ysLHm93qCf5+GyHU7NmjV1zTXXaODAgRo2bFjx/D8OD7pnzx5lZmbq3HPPPWJ7obxOzz//vN58881yP06Svvvuu6Aedzhvvvmmnn76aQ0aNEjz5s0rcX+XLl303//+V//85z9L3PfMM8/ojjvuCKloJ0n/+c9/1L17d11++eX64osvStx/xRVXqHHjxqUOefp7w4cP15133qknnniiTOvdunWrtmzZoptvvlm9e/cuHv7z9+66667ijJWdx+PRa6+9pp07d2rgwIH67bffNG7cOPXr109TpkwpHio2HNasWSNJqlevXtjaBAAAAGAHrmkHAACAoHz44Ydq1aqVLrroouJ5tWvXLtHbbNGiRSooKNBDDz0UML+0YfwO9Qa79tprS9xXo0YNeb3esGT/Y7HwwIED+uGHHxQbGxsw79B6f8/n88l13YAsjRo1KvXaaAcOHFDNmjUD5vn9fs2ePVsdO3bUOeecU+IxRxuW9HDtHsmhHol/7IH4x9fAdV29//77+stf/qKkpKTDthfK67Rp0yYtXrw4qCktLa3Mz7ksDvW2a9GihW688caA+y6//HI1btxYU6ZM0ezZs0tM77zzjtq2bRtyYWbUqFHKycnRq6++WuJ9eeKJJ+qVV17RgQMHNGrUqCO28+OPP+rNN9/U3//+9zJf227o0KGqVauWXnnllRK9LVu2bKknnnhC33zzjWbPnl2+JxWBHn74YbVs2VIPP/xwcYFy0KBB+uWXX/TKK68EdWy5+uqrS51/ww03SAocKviUU04p8YOGqlWrqlmzZjrppJMC5pe2LAAAAAA70NMOAAAAQXn++ef1t7/9TR9//LHGjRunAwcOqHv37tq+fXtAQWnv3r164YUXNGDAAP3nP//Rhx9+qBYtWuj6668vcb2nUaNG6cYbb9R//vMfTZ06VWvXrlVcXJzOO+88derUSaeeeqr27dsXcvaNGzfq008/1dq1a5WRkaELL7xQnTp10oQJE4qXOXStv5deekkLFiyQz+fTO++8ow8++ECPPPKIPv74Y7311luqW7euHnzwQf3www+64IILAtazdu1aXXPNNerbt6927typlJQUrV69Wk8++aTatm2rVatWadKkSdq4caNq1aqlli1b6pprrinxR/w/Oly7h5Odna3PPvtMjz/+uKKjo5Wamqprr71WjRs3LrHsgAEDdO211+qzzz7Ta6+9pk2bNqlevXq65ZZbdMUVVygzM/OYvU7HwqFr27Vo0SJg/h133KGioiJ98MEHpT5u3rx5evbZZ9W5c2eNGTMm6PX/8MMPuvvuuzVjxgx98803mjx5slJSUnTqqafq3nvvVe3atXX77bfrxx9/PGpb//jHP/S3v/1NZ5555lGvSyhJb731li666CL16dNHZ599tmbMmKH9+/erZcuW6tatm/bt26dOnTqpqKgo6Of3Rw0aNCh1GNnffvtNc+fODarNK6+8MuDakod8/fXX+uabb3TyySdr6NChmjdvXsD1C3NyctS7d2+999576t27t0aPHl2u9c6dO1cpKSmaP3++tm3bpri4OF1zzTW68cYbtXr1as2fP7942TfeeENt2rQJKJxffPHF+vTTTzV48GANGTLkiMsCAAAAsIfLxMTExMTExMRk13T33Xe7ruu6SUlJpd6/ZMkS95tvvgmYl5KS4k6ZMiVg3rnnnusuWbLEzcnJcXfs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27lzpxo0aFBpd9T4+HilpqZW6ucAAEBlxDkYAAAzOAcDAHDsHQ/n3/j4eO3cudN0DGvl5+ercePGiomp2FEP8/PzS52/d+9eFRUVKSEhIWB+QkKC0tLSSn1MWlpauZY/Fo77op2k42JHzc7OrrQHSwAAKjPOwQAAmME5GACAY68yn38ra+7jSX5+/mGLahWtsLBQa9euVXJysubOnStJchxHycnJmjBhQqmPWbFihZKTkzVu3LjieX/605+0YsWKY5K5NFYU7QAAAAAAAAAAAHD8Gj16tKZNm6Y1a9Zo9erV6tOnj+Li4jRlyhRJ0rRp05SamqoBAwZIksaNG6fPPvtM/fr10wcffKDOnTvrwgsvVPfu3Y09B4p2AAAAAAAAAAAAqNRmzZqlOnXqaOjQoUpMTNT69evVrl077d69W5LUsGFD+f3+4uVXrFihLl26aPjw4Xr22We1detW3Xzzzfruu+9MPQWKdpEuPz9fgwcPNtalFAAAW3EOBgDADM7BAAAce5x/cbyYOHGiJk6cWOp9bdu2LTHv3Xff1bvvvlvRscrMkeSaDgEAAAAAAAAAAADYzGM6AAAAAAAAAAAAAGA7inYAAAAAAAAAAACAYRTtIlRKSoo2bdokr9dbPO/LL79U69atDaYCAOD4xzkYAAAzUlJStHnzZq1bt654Ovfcc03HAgDguNehQwetWbNG69at06ZNm7R48WI5jmM6FmClKNMBcHixsbG699579dprr5mOAgCAVTgHAwBgxm233aYNGzaYjgEAgDUSExP12muvKSkpST///LMkqUWLFnJd13AywE70tItggwcP1jPPPKOqVauajgIAgFU4BwMAAAAAbJCQkCCfz6eMjIzieevWrTOYCLAbRbsItmHDBi1ZskR9+/Y1HQUAAKtwDgYAwIx33nknYHjMKlWqmI4EAMBx7euvv9bnn3+u7du3a86cOXr00UdVv35907EAa1G0i3DPPPOMevfurVq1apmOAgCAVTgHAwBw7N12221q0aJF8ZSXl2c6EgAAxzXXddWpUydddtll+vjjj3X55Zfru+++U5MmTUxHA6xE0S7Cbd++XW+99Zaefvpp01EAALAK52AAAAAAgC22bNmi1157TR06dNDKlSt14403mo4EWCnKdAAc3fDhw7Vp0yYVFhaajgIAgFU4BwMAAAAAjmf169fXqaeequXLl0uSatasqcaNG2vbtm2GkwF2oqddJbBv3z699NJLjCUMAMAxxjkYAIBj64/XtGvTpo3pSAAAHNeioqI0cOBAbdmyRevWrdOyZcs0bdo0zZs3z3Q0wEqOJNd0CAAAAAAAAAAAAMBm9LQDAAAAAAAAAAAADKNoBwAAAAAAAAAAABhG0Q4AAAAAAAAAAAAwjKIdAAAAAAAAAAAAYBhFOwAAAAAAAAAAAMAwinYAAAAAAAAAAACAYRTtAAAAAAAAAAAAAMMo2gEAAADHkSlTpui9994zHcO4q6++Whs3bpTHU7avPCkpKerdu3cFp4oMM2fOVL9+/UzHAAAAAAD8AUU7AAAAoJJwXfeI06BBg9S7d2/dc889pqMGaN26tVzXVY0aNY7ZOp9//nkNHz5cfr//mK2zogwaNEjr1q0LW3vDhw/XU089perVq4etTQAAAABA6CjaAQAAAJVEYmJi8dS7d29lZmYGzHvhhReUlZWlzMxM01GNuvzyy9WkSRPNnj3baI7o6Gij6/+jQ3m+++47bdu2TXfeeafhRAAAAACA36NoBwAAAFQS6enpxVNmZqZc1w2Yd+DAgRLDYy5ZskQvvfSSxowZo4yMDKWlpem+++5TtWrV9PrrrysrK0tbt25Vu3btAtZ1zjnn6MMPP1R2drbS0tL0xhtv6KSTTjpstoYNG2revHnKyMjQb7/9pm+//VbXX3+9GjVqpE8//VSS9Ouvv8p1XU2ZMkWS5DiOnnzySf3444/KycnR+vXr1bFjx+I2D/XQu+GGG7Rhwwbl5uZqxYoVOuecc464nTp37qxPPvlE+fn5AfP//Oc/a/Xq1crNzdWePXs0Z86cgPurVaumyZMnKysrS9u3b9f9998fcP/IkSO1ZcsWHThwQNu2bdPQoUMVFRVVfP+hHnH33nuvfvzxR+Xl5UmSrrvuOi1btkz79+/X3r17NX/+fJ122mkBbTdo0EBvvfWW9u3bp99++01ffvmlLr74Yt19990aPHiwmjdvXtyj8u6775Yk1ahRQ5MmTdLu3buVmZmpxYsX6/zzzz9qHkmaP3++OnfufMTtCAAAAAA4tijaAQAAAMe5u+++W3v37tXFF1+s8ePH6+WXX9a///1vLV++XC1bttTChQs1ffp0Va1aVdLBYtB///tfrVu3ThdeeKHatWunhIQEzZo167DrmDhxomJjY3XVVVfpvPPO0xNPPKHffvtNO3bs0F//+ldJ0hlnnFHcS1CS+vfvr7vuuks9evTQ/7V39yFVnn8cxz9qnBEeKk1MCHSpk5aFij04XQ8mO7HcYhm1gqj+6FRED8RhWxHleiQqOjUskdhqa+JihIIg2sNKaQSt1LQHyj/q0IO2ThydxVY2r/0Ru3/dPlX8aKfi/YIvnPt7X9d1vuc6/vf1vk5ycrK8Xq9+/PFHTZgwwbb2jh075PF4NGbMGN27d0/l5eW2ZllX48eP17lz52y5qVOnqrS0VBUVFUpLS1NOTo7Onj1rG+PxeHTu3DmlpaVp3759KiwsVFJSknW/vb1dCxYs0IgRI7Ry5Uq53W6tWrXKtkZiYqJmzJihvLw8paamSpLCw8O1a9cujR49Wjk5Oers7FRpaalCQkKs+9XV1Ro6dKimTZumlJQUbd++XaGhoTp8+LB27typixcvWk9UHj58WJL0888/Kzo6Wh9//LHS09NVW1urEydOKCIios96JOns2bMaO3asHA5Hr/sIAAAAAPjvGYIgCIIgCIIg3qyYP3++CQQC3fIHDhwwpaWl1vXJkydNTU2NdR0aGmra29vN999/b+WGDBlijDFm3LhxRpJZu3atqaystK07dOhQY4wx7733Xo/1XLhwwaxfv77HexMnTjTGGDNw4EAr53A4zIMHD0xGRoZt7P79+01xcbFt3qxZs6z7ERER5uHDh2bmzJm97k0gEDBz58615X799Vdz6NChXudcv37d/PDDD7ZcS0uLWbx4ca9zPB6P+e2336zr/Px88+jRIxMVFdXndzd48GBjjDHJyclGknG73aatrc1ERET0OD4/P9/U1dXZcllZWaa1tdU4HA5bvqmpybjd7ufWM2rUKGOMMbGxsUH/WyYIgiAIgiAIgiCeRu//ngoAAADgrdDQ0GC97uzs1P3799XY2Gjl7t69K0mKjo6WJKWkpCg7O1vt7e3d1kpISFBTU1O3/DfffKPCwkK5XC4dP35cR44csb1HV4mJiQoPD9exY8dseYfDobq6OlvuzJkz1utAIKCrV6/q/fff73Xt/v37246ClKTU1FTt37+/1zmSfZ8kqaWlxdoTSZo1a5ZWrFihhIQEOZ1O9evXT3/88Ydtjs/nk9/vt+USExO1ceNGjRs3TlFRUQoNfXrgSWxsrC5duqTU1FTV1dUpEAj0Wd+zUlJS5HQ6df/+fVu+f//+SkhI6LMeSfrzzz8lPT0SFAAAAADweqBpBwAAALzlOjo6bNfGmG45SVYzyel0qry8XF999VW3Mc3NzT2+x7fffquqqirl5ubK5XJpzZo18ng8Kigo6HG80+mUJOXm5ur27du2e11/i+5l+f1+2xGR0v+aVH3paZ/+3ZOMjAwVFxcrPz9fVVVVamtr0+zZs+XxeGxzHj582G3d8vJy6zfy7ty5o9DQUF26dMk6mvJFauvK6XSqublZkyZN6navtbW1z3okKTIyUpJ07969l35vAAAAAMCrQdMOAAAAgE1tba1mzJihGzdu6O+//37hebdu3VJRUZGKioq0detWud1uFRQU6PHjx5KksLAwa+zly5f1119/KTY2VjU1NX2um5GRoZs3b0qSBg0apKSkJF25cqXX8XV1dRoxYoQt19DQoJycHB08ePCFP8+zMjMz5fP5tHXrVisXFxf33HmRkZEaPny43G63Tp8+LUnKysrqVtvChQsVERHR49N2jx8/tu2d9PQ7iomJ0ZMnT+Tz+V7684wcOVI3b97s9qQeAAAAACB4QoNdAAAAAIDXy969exUZGamSkhKNHj1a8fHxcrlc+u6776wnz7ryer1yuVx69913lZaWpuzsbKux5vP51NnZqU8++URRUVEKDw/XgwcPtHPnTnm9Xs2bN0/x8fFKS0vTsmXLNG/ePNva69ev1+TJk5WcnKyDBw/K7/errKys1/qrqqr04Ycf2nIbNmzQnDlz9PXXX2v48OEaOXKkvvzyyxfek6amJsXGxurzzz9XfHy8li9frunTpz93XiAQkN/v16JFi5SQkKDs7Gzt2rXLNqakpEQtLS0qKytTZmamhg0bpry8PGVkZEiSbty4oWHDhiklJUWDBw+Ww+HQ8ePHdebMGZWVlemjjz5SXFycPvjgA23evFnp6enPrWv8+PE6evToC39+AAAAAMCrR9MOAAAAgE1zc7OysrIUFhamo0ePqrGxUbt371Zra6s6Ozt7nBMWFqa9e/fqypUrqqys1LVr17R06VJJ0p07d5Sfn69t27bp7t271pGZ69at06ZNm7RmzRprXm5urq5fv25be/Xq1dqzZ4/Onz+vmJgYffrppz0e7/mv4uJiJScnKykpycpVV1dr5syZmjZtmurr6/XLL79o7NixL7wn5eXl8nq9KigoUH19vTIzM7Vp06bnzjPGaPbs2UpPT9fFixfl9Xr1xRdf2MZ0dHTI5XLp999/V0VFhRobG7V69WrrKccjR46osrJSJ0+elN/v15w5cyRJU6dOVU1NjQ4cOKBr167pp59+UlxcnPUbhb1555139Nlnnz33N/4AAAAAAP+tEEkm2EUAAAAAQFcTJ07UqVOnNGjQILW1tb3U3O3bt2vAgAFasmTJK6ruzbVkyRJNnz5dU6ZMCXYpAAAAAIBn8KQdAAAAgLfOli1b5PP5FBISEuxSXjsdHR1avnx5sMsAAAAAAHTBk3YAAAAAXkv/z5N2AAAAAAC8aWjaAQAAAAAAAAAAAEHG8ZgAAAAAAAAAAABAkNG0AwAAAAAAAAAAAIKMph0AAAAAAAAAAAAQZDTtAAAAAAAAAAAAgCCjaQcAAAAAAAAAAAAEGU07AAAAAAAAAAAAIMho2gEAAAAAAAAAAABBRtMOAAAAAAAAAAAACDKadgAAAAAAAAAAAECQ/QMt0v1rKD2fLgAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "Sequence:\n", "NATION OF ETEXTS\n" ] } ], "execution_count": 11 }, { "cell_type": "code", "id": "a1b2c3d4-0001-4001-8001-000000000011", "metadata": { "execution": { "iopub.execute_input": "2026-05-31T11:36:40.706682Z", "iopub.status.busy": "2026-05-31T11:36:40.706484Z", "iopub.status.idle": "2026-05-31T11:36:42.399582Z", "shell.execute_reply": "2026-05-31T11:36:42.398904Z" }, "ExecuteTime": { "end_time": "2026-05-31T12:21:21.402810605Z", "start_time": "2026-05-31T12:21:19.657116650Z" } }, "source": [ "# \u2500\u2500 Character frequency: data vs model predictions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "# Compare the character distribution in the training data to the distribution\n", "# the model assigns when conditioning on a fixed context.\n", "true_counts = np_cpu.bincount(eval_enc[:500].astype(int), minlength=vocab_size).astype(float)\n", "true_counts /= true_counts.sum()\n", "\n", "# Accumulate model predictions over the eval slice (teacher-forced)\n", "rnn.reset(batch_size=1)\n", "h = np.zeros((1, CONTEXT_SIZE))\n", "model_probs = np_cpu.zeros(vocab_size)\n", "\n", "for t in range(499):\n", " context = h.copy()\n", " char_idx = int(eval_enc[t])\n", " x_t = np.zeros((1, vocab_size))\n", " x_t[0, char_idx] = 1.0\n", " h = rnn.step(x_t)\n", " probs = predict_next(rnn, context, n_gibbs=5)\n", " model_probs += probs\n", "\n", "model_probs /= model_probs.sum()\n", "\n", "labels = [repr(c) for c in chars]\n", "x = np_cpu.arange(vocab_size)\n", "width = 0.4\n", "\n", "plt.figure(figsize=(20, 4))\n", "plt.bar(x - width/2, true_counts, width, label='Data', alpha=0.7)\n", "plt.bar(x + width/2, model_probs, width, label='Model', alpha=0.7)\n", "plt.xticks(x, labels, rotation=90, fontsize=7)\n", "plt.ylabel('Probability')\n", "plt.title('Character distribution: data vs model')\n", "plt.legend()\n", "plt.tight_layout()\n", "plt.show()" ], "outputs": [ { "data": { "text/plain": [ "
" ], "image/png": "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7OOPP9acOXOUnJycb9knn3yiMWPGWCEVLKGUtQMAfzXJyclKSkpScnKy6esbIiIirJisaGzxrMaKFStqxowZOnTokM6ePauzZ8/q4MGDmjFjhipVqmTteIW2bNkya0fIx93dXRMnTtSXX36pbt26mS278YatrfD09FRgYKA+/fRTVaxYURMnTtTevXu1fPlyVatWzdrxzDzwwANmrWzZstq3b5/KlCmjBx54wNrx8rn5e1+lShUtX75c8fHx+v77722uCDZs2DDTmQl169bV9u3blZSUpKioKDVp0sTK6fKLiYnR+PHjVa9ePWtHuatmzZppw4YNWrhwof72t7/pp59+UnJysqKjo9WsWTNrx8vnwQcf1NSpU3Xw4EGlpaXpzJkz2rlzp01eFaV79+46ceKE4uPj7ebN+Mcff1yBgYE6duyYNm7cqOjoaD366KPWjpXPJ598ov/+979at26d5s2bp08//VSVK1fWkCFDFBQUZO14ZoYOHVpgsf67777T+++/b4VEd/b3v/9dhw8f1rvvvqtq1aqpevXqGjlypA4cOCAfHx9rxzOzfft209e3fvDAFt+o79Onj+nrBQsWWDHJ3X388ccaP3686fH//vc/BQcHa8GCBfrwww+tmCy/Y8eOKT4+Pl+70W9rqlSpIk9PT3l6eqpKlSr5mi25U9ZatWrpnXfesam/dQYPHqx33nnHrM/Dw0Ph4eFKT0+3Uqqiq169urUj5HP9+nXT+x03v/9x63sgtuDW14SbHx89etTa8cz84x//0MGDB/XUU0/p5MmTOnnypJ5++mkdOHDAJguhH3/8sZ566in5+Pioa9eumjZtmrUj3VbTpk116NAh+fr66vjx4zp+/LieffZZ/frrr6pUqZI+/vhja0c006NHD128eFFxcXH65Zdf9MILL+jYsWN6+eWX9cYbb1g7npkJEyaYPjzp5uamLVu26OjRo0pMTNSzzz5r5XT2bdeuXYqKijK1nTt3at26dfrggw/k5uZm7XhmHnvsMR08eFBTp05VQkKCPv30Uz3++OPWjnVbgYGBcnJy0siRIxUfH689e/YoODhYvXv3Vu3ata0dz8xjjz2m3bt3q02bNqa+gQMHKiYmRgkJCVZMVrDHHntMly5dUkxMjP75z39aO84dDRo0SLt27SowZ8eOHa2QCJZk0Gg0WkFt0aJFxsKFC43A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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } } ], "execution_count": 12 } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }