Implements StackRnn: a cascaded/recurrent RBM where the visible layer at each time step is the concatenation of the previous hidden state (context) and the current sensory input — V[t] = [context | x_t]. Weights are shared across time steps (RTRBM-style concatenation variant). - stack_rnn.py: StackRnn with step(), reconstruct(), reset(), train(), make_layer() factory; supports greedy layer-wise training over sequences of shape (num_seq, T, sensory_size) - test_rnn.py: single-layer, two-layer, and save/load tests - moby_rnn.ipynb: character-level language model on Moby Dick; one-hot encoding, clamped-Gibbs next-char prediction, free text generation, hidden-state trace and character-distribution visualisations Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
591 lines
102 KiB
Plaintext
591 lines
102 KiB
Plaintext
{
|
||
"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",
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5,
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.12.3"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5,
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"id": "a1b2c3d4-0001-4001-8001-000000000001",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-05-31T09:16:46.875381379Z",
|
||
"start_time": "2026-05-31T09:16:46.800537956Z"
|
||
}
|
||
},
|
||
"source": [
|
||
"import numpy as np_cpu\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from rbm.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": 14
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "a1b2c3d4-0001-4001-8001-000000000002",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-05-31T09:16:46.946683049Z",
|
||
"start_time": "2026-05-31T09:16:46.887624982Z"
|
||
}
|
||
},
|
||
"source": [
|
||
"# ── Load text and build character vocabulary ───────────────────────────────\n",
|
||
"with open(\"data/moby.txt\", \"r\", encoding=\"utf-8\") as f:\n",
|
||
" text = f.read()\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\"Text 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": [
|
||
"Text length : 1,235,150 characters\n",
|
||
"Vocab size : 85\n",
|
||
"Vocabulary : '\\n !\"#$%&\\'()*,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_abcdefghijklmnopqrstuvwxyz'\n",
|
||
"\n",
|
||
"Sample (first 200 chars):\n",
|
||
"The Project Gutenberg EBook of Moby Dick; or The Whale, by Herman Melville\n",
|
||
"\n",
|
||
"This eBook is for the use of anyone anywhere at no cost and with\n",
|
||
"almost no restrictions whatsoever. You may copy it, give i\n"
|
||
]
|
||
}
|
||
],
|
||
"execution_count": 15
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "a1b2c3d4-0001-4001-8001-000000000003",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-05-31T09:16:47.158466343Z",
|
||
"start_time": "2026-05-31T09:16:46.948054629Z"
|
||
}
|
||
},
|
||
"source": [
|
||
"# ── Encode text as one-hot sequences ──────────────────────────────────────\n",
|
||
"# Each training sequence is T consecutive characters encoded as one-hot vectors.\n",
|
||
"# Sequences are non-overlapping, drawn from the first part of the text.\n",
|
||
"T = 100 # characters per sequence\n",
|
||
"NUM_SEQ = 2000 # training sequences (covers first 200k characters)\n",
|
||
"\n",
|
||
"encoded = np_cpu.array([char_to_idx[c] for c in text], dtype=np_cpu.int32)\n",
|
||
"sequences = np_cpu.zeros((NUM_SEQ, T, vocab_size), dtype=np_cpu.float64)\n",
|
||
"for i in range(NUM_SEQ):\n",
|
||
" start = i * T\n",
|
||
" for t in range(T):\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 – {NUM_SEQ * T - 1:,}\")"
|
||
],
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"sequences shape : (2000, 100, 85)\n",
|
||
"memory : 136.0 MB\n",
|
||
"covers chars : 0 – 199,999\n"
|
||
]
|
||
}
|
||
],
|
||
"execution_count": 16
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "a1b2c3d4-0001-4001-8001-000000000004",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-05-31T09:16:47.225501867Z",
|
||
"start_time": "2026-05-31T09:16:47.160171975Z"
|
||
}
|
||
},
|
||
"source": "# ── Build model ────────────────────────────────────────────────────────────\n# visible layer = [context (H_SIZE) | x_t (vocab_size)]\n# hidden layer = h_t (H_SIZE)\nH_SIZE = 512\nPRJ_NAME = \"moby_rnn\"\nWORK_DIR = \"results\"\n\nrnn = StackRnn(PRJ_NAME, WORK_DIR)\nrnn.append(StackRnn.make_layer(\n \"layer0\",\n sensory_size=vocab_size,\n h_size=H_SIZE,\n entity_params=EntityParams(do_gaussian_visible=False, do_gaussian_hidden=False),\n training_params=TrainingParams(\n learning_rate=0.005,\n momentum=0.9,\n num_epochs=200,\n do_rao_blackwell=True,\n l2_lambda=0.0001,\n ),\n))\n\nrnn.state_init(0.01)\nrnn.state_load() # resumes from checkpoint if one exists\n\ne = rnn.from_index(0).entity\nprint(f\"Entity : {e.name}\")\nprint(f\"Visible : {rnn.h_size()} (context) + {rnn.sensory_size()} (vocab) = {e.shape[0]}\")\nprint(f\"Hidden : {rnn.h_size()}\")\nprint(f\"Parameters : {e.shape[0] * e.shape[1]:,}\")",
|
||
"outputs": [],
|
||
"execution_count": null
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "a1b2c3d4-0001-4001-8001-000000000005",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-05-31T09:22:40.578441142Z",
|
||
"start_time": "2026-05-31T09:16:47.236377411Z"
|
||
}
|
||
},
|
||
"source": [
|
||
"# ── Train ──────────────────────────────────────────────────────────────────\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 layer 0 (Entity-597x512) for 200 epochs\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 0%\n",
|
||
"Entity-597x512: err_rms : 0.0037939579045579673\n",
|
||
"Entity-597x512: l2_norm : 0.18150691580418102\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 5%\n",
|
||
"Entity-597x512: err_rms : 0.0026333100252218643\n",
|
||
"Entity-597x512: l2_norm : 0.3914919815811675\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 10%\n",
|
||
"Entity-597x512: err_rms : 0.0020835048102545205\n",
|
||
"Entity-597x512: l2_norm : 0.6678901761375069\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 15%\n",
|
||
"Entity-597x512: err_rms : 0.0017383066270204304\n",
|
||
"Entity-597x512: l2_norm : 1.0140427961126182\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 20%\n",
|
||
"Entity-597x512: err_rms : 0.001662083193143457\n",
|
||
"Entity-597x512: l2_norm : 1.221569474796821\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 25%\n",
|
||
"Entity-597x512: err_rms : 0.0018430351185724314\n",
|
||
"Entity-597x512: l2_norm : 1.4574519778875865\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 30%\n",
|
||
"Entity-597x512: err_rms : 0.0017974640619184226\n",
|
||
"Entity-597x512: l2_norm : 1.6295674742497486\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 35%\n",
|
||
"Entity-597x512: err_rms : 0.0017574364437961385\n",
|
||
"Entity-597x512: l2_norm : 1.888083105393523\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 40%\n",
|
||
"Entity-597x512: err_rms : 0.0018269300108645905\n",
|
||
"Entity-597x512: l2_norm : 2.088568897893149\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 45%\n",
|
||
"Entity-597x512: err_rms : 0.0017834048248525389\n",
|
||
"Entity-597x512: l2_norm : 2.3462192195169402\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 50%\n",
|
||
"Entity-597x512: err_rms : 0.0017700436184349359\n",
|
||
"Entity-597x512: l2_norm : 2.5477352397085027\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 55%\n",
|
||
"Entity-597x512: err_rms : 0.0017436624587921462\n",
|
||
"Entity-597x512: l2_norm : 2.819231525743774\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 60%\n",
|
||
"Entity-597x512: err_rms : 0.0017208678489380653\n",
|
||
"Entity-597x512: l2_norm : 3.057804399621122\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 65%\n",
|
||
"Entity-597x512: err_rms : 0.0017704277158995718\n",
|
||
"Entity-597x512: l2_norm : 3.3368366800162863\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 70%\n",
|
||
"Entity-597x512: err_rms : 0.0017827587869826246\n",
|
||
"Entity-597x512: l2_norm : 3.568899034894735\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 75%\n",
|
||
"Entity-597x512: err_rms : 0.0017902299727795416\n",
|
||
"Entity-597x512: l2_norm : 3.8731077511209415\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 80%\n",
|
||
"Entity-597x512: err_rms : 0.0017917629636004934\n",
|
||
"Entity-597x512: l2_norm : 4.130278513144091\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 85%\n",
|
||
"Entity-597x512: err_rms : 0.0018148135779197704\n",
|
||
"Entity-597x512: l2_norm : 4.423896133504531\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 90%\n",
|
||
"Entity-597x512: err_rms : 0.0017878924182559717\n",
|
||
"Entity-597x512: l2_norm : 4.66321844406048\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 95%\n",
|
||
"Entity-597x512: err_rms : 0.001763475523462595\n",
|
||
"Entity-597x512: l2_norm : 4.96506476409423\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 100%\n",
|
||
"Entity-597x512: err_rms : 0.0017886886311607396\n",
|
||
"Entity-597x512: l2_norm : 5.205581985171482\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"-------------------------------------------\n",
|
||
"Entity-597x512: progress : 100%\n",
|
||
"Entity-597x512: err_rms_total : 0.0018394244018290309\n",
|
||
"Entity-597x512: l2_norm : 5.230509595933321\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n",
|
||
"results/moby_rnn-0-state.npz saved successfully!\n"
|
||
]
|
||
}
|
||
],
|
||
"execution_count": 18
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "a1b2c3d4-0001-4001-8001-000000000006",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-05-31T09:22:40.647952953Z",
|
||
"start_time": "2026-05-31T09:22:40.580535071Z"
|
||
}
|
||
},
|
||
"source": "# ── Generation helpers ─────────────────────────────────────────────────────\n\ndef 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 \"\"\"\n entity = rnn.from_index(0).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\ndef 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, H_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\nprint(\"Helpers defined.\")",
|
||
"outputs": [],
|
||
"execution_count": null
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "a1b2c3d4-0001-4001-8001-000000000007",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-05-31T09:22:42.076736683Z",
|
||
"start_time": "2026-05-31T09:22:40.653046858Z"
|
||
}
|
||
},
|
||
"source": [
|
||
"# ── Reconstruction accuracy (teacher-forced) ───────────────────────────────\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 * T\n",
|
||
"EVAL_CHARS = 2000\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 : 84.4%\n",
|
||
"Random baseline : 1.2%\n"
|
||
]
|
||
}
|
||
],
|
||
"execution_count": 20
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "a1b2c3d4-0001-4001-8001-000000000008",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-05-31T09:22:44.552746609Z",
|
||
"start_time": "2026-05-31T09:22:42.078419987Z"
|
||
}
|
||
},
|
||
"source": "# ── Next-step prediction accuracy ─────────────────────────────────────────\n# Given context (= h_{t-1}), predict x_t before observing it.\nPRED_CHARS = 500 # keep short — clamped Gibbs is O(n_gibbs * PRED_CHARS)\nN_GIBBS = 10\n\nrnn.reset(batch_size=1)\nh = np.zeros((1, H_SIZE))\ncorrect = 0\n\nfor 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\nprint(f\"Next-step prediction accuracy : {100.0 * correct / (PRED_CHARS - 1):.1f}%\")\nprint(f\"Random baseline : {100.0 / vocab_size:.1f}%\")",
|
||
"outputs": [],
|
||
"execution_count": null
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "a1b2c3d4-0001-4001-8001-000000000009",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-05-31T09:22:50.662896965Z",
|
||
"start_time": "2026-05-31T09:22:44.554492562Z"
|
||
}
|
||
},
|
||
"source": [
|
||
"# ── Free text generation ───────────────────────────────────────────────────\n",
|
||
"SEED = \"Call me Ishmael.\"\n",
|
||
"\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=10))"
|
||
],
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n",
|
||
"============================================================\n",
|
||
"Temperature = 0.5\n",
|
||
"============================================================\n",
|
||
"Call me Ishmael.dsdddnldmd\n",
|
||
"lgnldsrlld\n",
|
||
"ngd\n",
|
||
"\n",
|
||
"nindodnldddoudindd,\n",
|
||
"d\n",
|
||
"lldsdlldllios\n",
|
||
"dhild,lll,mlg\n",
|
||
"shdnldlcold,lglld\n",
|
||
"dlldddpclcrld\n",
|
||
",dl,\n",
|
||
"mllmgdd\n",
|
||
"ldll\n",
|
||
"\n",
|
||
"ongl\n",
|
||
"dln\n",
|
||
"dl\n",
|
||
"llg\n",
|
||
"\n",
|
||
"lldlidl\n",
|
||
"iliniglldld\n",
|
||
"ddomliginl\n",
|
||
"mnddd,,dd,wd,ollm\n",
|
||
"s\n",
|
||
"sscdlim\n",
|
||
"cm\n",
|
||
"lklglmddgldmdclglciwiloriogipg,dncslcibdlcd\n",
|
||
"llmldgsdd\n",
|
||
"lddolmldodod\n",
|
||
"lw\n",
|
||
"ml\n",
|
||
"llldlindlddgdnl,ml\n",
|
||
"lcldd\n",
|
||
"m\n",
|
||
"goucl\n",
|
||
"d,\n",
|
||
"mldnd,ldngndofwdl\n",
|
||
"mllddlid\n",
|
||
"dgind,liwldmdsdsllvcoil\n",
|
||
"slodmllgdd,lsdlyymgd,llgddd\n",
|
||
",lgmd\n",
|
||
"\n",
|
||
"============================================================\n",
|
||
"Temperature = 1.0\n",
|
||
"============================================================\n",
|
||
"Call me Ishmael.O.inkTmDorlgdglldlg;mld,log,cn,dr\n",
|
||
"ymySdistouml\n",
|
||
"pddllddmondkmd\n",
|
||
"d.nd\n",
|
||
"\n",
|
||
"kl.ddwmli;nthm\n",
|
||
"\n",
|
||
",lyo,EldYlgkplmm.-;m\n",
|
||
",S\n",
|
||
"\n",
|
||
"gwpglv,yddblmglSgcdsld\n",
|
||
"\n",
|
||
"vcni,m\n",
|
||
"Ndd,mld,c\n",
|
||
"cbwlinlkbvcdkdycswwd\n",
|
||
"lybklicd,dd,l;fl\n",
|
||
"m,c\n",
|
||
"gd\n",
|
||
"inddmnyp\n",
|
||
"d\n",
|
||
"lgmgsld\n",
|
||
",\n",
|
||
"blwNOmwldcpsmd\n",
|
||
"d\n",
|
||
"gcgd\n",
|
||
"mp,lg\n",
|
||
"lgldwdpd\n",
|
||
"d\n",
|
||
"linWghgm'dmg\n",
|
||
"g,ms,lkkmdnc\n",
|
||
"vmdl.D\n",
|
||
"lIl\n",
|
||
"dldk-kggdgoHlwll\n",
|
||
"lcd,llcMlcd\"cdlplil-wnScydlsbdpgs'wmdsql\n",
|
||
"c\n",
|
||
"d\n",
|
||
"\n",
|
||
"lmld\n",
|
||
"cg\n",
|
||
"l,l\n",
|
||
",uy,cdkclpdidd,,kbdyd.mswl,lccbid\n",
|
||
"\n",
|
||
"============================================================\n",
|
||
"Temperature = 1.5\n",
|
||
"============================================================\n",
|
||
"Call me Ishmael.\n",
|
||
"dw,d,\"hslgl,mdlyfgord,.\n",
|
||
"mlci,swgal,ll\n",
|
||
"lclmpdMLlNloyblll,HiClclppnl\n",
|
||
"\n",
|
||
"sddllrd\n",
|
||
"mbrw-vTd\n",
|
||
"dyjlCA,;m,ClOO\"bpc\n",
|
||
"\n",
|
||
"gSgmld\"dOyykm,odlylMoy.l\n",
|
||
"gpslw,svcbElgq,m\n",
|
||
"\n",
|
||
"yimbpuIkdIlyy,,dgmI,cdlgL\n",
|
||
"gl!lmM,bSpwtx,gdN,ym,kd\n",
|
||
"\n",
|
||
"dlgow.bclydmcxlwrguYlwLwikFlOdgd\n",
|
||
"lac\n",
|
||
"W\n",
|
||
"kddlpc,ordbl.id,skgcwfbowgpl'nylmkdlTvswPs.dilnK\n",
|
||
"dBylmlhdsIiydd\n",
|
||
".mllcbndyngSvpwm;s;.k,ylcAlbpyd-lkbAul\n",
|
||
"ldgnmmsu\n",
|
||
"pbdl\n",
|
||
"ckBfdwpyclF\n",
|
||
"yll\n",
|
||
"lw\n",
|
||
"ckmvwCccgc\n",
|
||
"w\n",
|
||
";m!l\n",
|
||
"lgd\n",
|
||
"\n",
|
||
"N.\n"
|
||
]
|
||
}
|
||
],
|
||
"execution_count": 22
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "a1b2c3d4-0001-4001-8001-000000000010",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-05-31T09:22:51.002796895Z",
|
||
"start_time": "2026-05-31T09:22:50.664172211Z"
|
||
}
|
||
},
|
||
"source": [
|
||
"# ── Hidden state trace ─────────────────────────────────────────────────────\n",
|
||
"# Plot the hidden unit activations over one sequence to see what the RNN\n",
|
||
"# has learned to track.\n",
|
||
"SEQ_IDX = 42\n",
|
||
"rnn.reset(batch_size=1)\n",
|
||
"h_trace = []\n",
|
||
"seq_chars = []\n",
|
||
"\n",
|
||
"for t in range(T):\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) # (T, H_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 — \"{seq_str[:50]}…\"')\n",
|
||
"tick_pos = range(0, T, 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": [
|
||
"<Figure size 2000x500 with 2 Axes>"
|
||
],
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABuwAAAHpCAYAAABp3BpQAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA5gJJREFUeJzs3Xd4FOXexvF7E5IAIaF3aYogiIJgA0VAEOyCYsWjYEUEaYKChS6I0sSGjaJYUEFAadIE6b1JJyC9CCQhhYRk3j94k2MkQPJ7gktOvp/r2nNks/fcU3ZnN/tkZnySPAEAAAAAAAAAAADwiwB/zwAAAAAAAAAAAACQkzFgBwAAAAAAAAAAAPgRA3YAAAAAAAAAAACAHzFgBwAAAAAAAAAAAPgRA3YAAAAAAAAAAACAHzFgBwAAAAAAAAAAAPgRA3YAAAAAAAAAAACAHzFgBwAAAAAAAAAAAPgRA3YAAAAAAAAAAACAHzFgBwAAMi0iIkIjR4487+OefPJJeZ6ncuXKZdk0AWQ//3x9p+wbatWqdcE658yZo3Xr1l2w6f/bRo4cqYiIiDT3eZ6nHj16+GmOLpwePXrI87zzPu5/bRv/rxg5cqSio6P9PRuZwnMJAAAAFwMG7AAAyOHO98U5X2JJd9xxh/OX4t26ddN9992XRXN04aeb3UVERKRuszlz5qQZLCpXrpw8z1Pnzp3TzaYMFhQuXPhfmdfspEqVKurRo0eGBuH/Fz366KNq3769v2cjS7DvuHCyet3Wrl1bPXr0UP78+bNsmq7y5MmjHj16qF69ev6elQwrWbKkevTooerVq/t7VjIk5fOZJNWrVy/DfwAFAACA7IsBOwAAkGmVK1fWs88+6+/Z+Nfceeed6tmzp9M0unfvrqZNm2bJ/Pwb0wXSU7VqVfXs2VPly5fPVO5/ZZ/x2GOPqUOHDv6ejVS5c+dW3759TVn2HRdOVq/bOnXqqGfPnipQoECWTdNV3rx51bNnT9WvX9/fs5JhpUqVUs+ePVWjRg1/zwoAAACQLgbsAABApiUkJOjUqVP+ng1kUt68ef09CzlSTl7vuXPnlsQ+40I5efKkkpKS/D0bqUJCQuTz+fw9G36T8nzHv4P1DQAAgP81DNgBAIBMS+96c1WrVtWsWbMUGxur3bt367XXXlNAQPofNV577TXt3r1bMTExmj17tqpWrZru4/Lnz68hQ4bozz//VHx8vLZu3aquXbum+UL476c3fPbZZ7Vt2zbFx8dr6dKluvbaa8+7LLly5dKbb76pLVu2KC4uTkeOHNH8+fPVqFEjSaevxdO2bVtJp68XlXJL0blzZy1YsEBHjhxRbGysli9frgceeCBNh+d5ypcvn1q2bJma//v6K1WqlD7//HMdOHBA8fHxWr9+vVq1anXeeT/XdFNO61ilShWNHTtWR48e1e+//y5JuuqqqzRy5Eht375dcXFx2r9/vz7//HMVKlTojI5SpUrps88+0969exUfH68dO3boww8/VFBQUKa20/+C66+/XlOnTtXx48cVExOjuXPnqk6dOmkec671LkktWrTQ8uXLFRsbq7/++kvffPONLrnkknP21q9fX57npXvEzqOPPirP83TjjTem3le5cmV9//33+uuvvxQXF6dly5bpnnvuydAyPvzww1q+fLmioqIUGRmptWvX6qWXXpJ0+vRsP/zwgyRp7ty5qc+5lFPiRUREaPLkyWrcuLGWLVumuLg4Pf/886k/O981KgsUKKAlS5Zo9+7dqlSpkiQpODhYPXv21NatWxUfH68///xTb7/9toKDgzO0PJJUs2ZNLViwQLGxsdqxY0fqPKU427U2U05Bl7J8c+bM0d13363y5cunLvs/ryn3T40aNdL8+fN17NgxRUdHa9OmTerXr98ZHQ899JD69eun/fv368SJE5o4ceJ5nxfSmdewS3n+XXbZZRo5cqSOHTum48eP64svvlCePHnS5Fz3SSnz/vDDD6tPnz7as2ePYmNjFR4eLiljrxdJuummm7R06VLFxcVp27Zteu6558673P9UpUoVzZ49WzExMdqzZ4+6dOlyxmMy+lxq2bKlZs2apYMHDyo+Pl4bNmxQ69atz5je2Z7v51q3+fLl05AhQxQREaH4+HgdPHhQM2bM0DXXXHPWZevRo4feffddSdLOnTtTp5nyfA0MDNTrr7+e+t4XERGhfv36nbFcPp9PPXr00N69e1Pfe6tUqZLua/N8+/Ry5crpyJEjkqSePXumztM/Tx1dqlQpTZgwQdHR0Tp06JDeeeedMz4X+Hw+tW/fXuvXr1dcXJwOHDigjz/++IyjCc+1f8mIevXqafny5ZKkUaNGpc7zk08+meZxWflcAgAAADIrl79nAAAAXBzy58+f7jW7/j4wczbFixfXnDlzlCtXLg0YMEAxMTF67rnnFBcXd8Zje/furTfeeEO//PKLpkyZopo1a2rGjBlnfNGVJ08e/fbbbypdurRGjBihP//8U3Xq1FH//v1VsmRJdezYMc3jH3vsMYWFhWnEiBHyPE9du3bV+PHjdemll57zyJ6ePXuqW7du+uyzz7R06VKFh4fr2muvVc2aNTVz5kyNGDFCpUqVUuPGjfX444+fkW/fvr0mTZqksWPHKjg4WI888oh++OEH3XXXXZoyZYok6fHHH0+d/ieffCJJ2r59uySpWLFiWrx4sTzP0/vvv6/Dhw/rjjvu0BdffKHw8HANGzbsrPN+rumm+P7777V161Z179499cvW2267TZdeeqlGjhypAwcO6Morr9Rzzz2nK6+8Ms3AT8mSJbV06VIVKFBAn3zyiTZt2qTSpUurefPmyps3ryIjIzO9nS4mefPmTfc5n94RcQ0aNNDUqVO1YsUK9erVS8nJyWrVqpVmz56tunXratmyZWken9567969u/r06aNx48bps88+U9GiRdWuXTvNmzdP11xzjSIjI9Odz7lz5+rPP/9UixYt9NNPP6X5WYsWLbRt2zYtXrxY0umB8wULFmjv3r2pr8WHHnpIP/30kx544IEz8n/XqFEjffvtt5o5c6ZeeeUVSae/vL7pppv03nvvad68eRo2bJjat2+vfv36aePGjZKU+v/S6cHCb775RiNGjNCnn36qzZs3n7Xv7woXLqxff/1VhQoVUr169bRjxw75fD5NmjRJN998sz755BNt3LhRV111lTp27KhKlSqpWbNm551uwYIFNWXKFI0bN07ffPONHnroIX388cdKSEg47wDiP/Xr10/58+fXJZdckvq8PnHixFkfX7VqVf38889au3at3nzzTZ08eVIVK1bUTTfddMZjX3vtNXmep7ffflvFihVThw4dNHPmTNWoUUPx8fGZmk9JGjdunCIiItStWzfVrFlTzz77rA4dOqRXX31VUtbuk9544w0lJCTo3XffVUhIiBISEjL8eqlWrZpmzJihw4cPq2fPnsqVK5d69eqlgwcPZnhZCxYsqGnTpmn8+PEaN26cmjdvroEDB2rdunWaNm2aJGXqufTCCy9ow4YNmjRpkk6dOqV77rlHH330kQICAvThhx+m6U7v+X6udfvxxx+refPmev/99/XHH3+ocOHCuvnmm1WlShWtWrUq3eUbP368KlWqlHo61pSBssOHD0uSPvvsM7Vs2VLff/+9Bg0apBtuuEHdu3dXlSpVdP/996dOp3///nrllVc0adIkTZ8+XdWrV9f06dPPOEotI/v0w4cPq3Xr1vr44481fvx4jR8/XpK0du3a1OkEBgZq+vTpWrJkiV5++WU1atRIL7/8srZv366PP/449XEjRoxQy5YtNXLkSL333nuqUKGC2rZtq2uuuUY33XRTmvdv6/5FOr2feuONN9SnTx+NGDFC8+fPlyQtXLgw9TFZ/VwCAAAALDxu3Lhx48aNW869Pfnkk975rFu3Lk0mIiLCGzlyZOq/Bw8e7Hme51133XWp9xUpUsQ7duyY53meV65cudT74uPjvcmTJ6eZXt++fT3P89JM87XXXvOio6O9ihUrpnnsW2+95SUmJnqXXHKJJ8krV66c53med/jwYa9AgQKpj7vnnns8z/O8u+6665zLv2rVqjPm55+34cOHe97pw+rOuOXOnTvNv3PlyuWtXbvWmzlzZpr7o6Oj0yxfyu3TTz/19u7d6xUqVCjN/V9//bV37NixM6b/z9vZptujRw/P8zxv7Nix551nSd7DDz/seZ7n3Xzzzan3jRo1yjt16pRXq1ats/ZndDtdTLeU58z5FC5cODWzefNmb+rUqWesx+3bt3vTp08/73ovW7asl5iY6HXr1i3N/VdeeaWXkJBwxv3/vPXr18+Li4vzwsPDU+8rUqSIl5CQ4PXo0SP1vl9//dVbs2aNFxwcnCb/+++/e5s3bz5nx5AhQ7zjx497AQEBZ33MAw884Hme59WrV++Mn0VERHie53mNGzdO92d/f56m7Hdq1arlFS9e3Fu3bp23bds2r2zZsqmPadGihXfq1CnvpptuSjOt5557zvM8z6tdu/Y5l2fOnDme53lex44dU+8LCgryVq5c6R04cMDLlStXmnlJ2U+l3OrVq3fGsk6ePNmLiIjI0POsffv2ZzyP/nlL6di9e7eXL1++1PubN2/ueZ7ntWvXLvW+kSNHntHteV6a7Z/y/Pvss8/SPO7HH3/0Dh8+nOY+131Syrxv27btjH1KRl8v48eP92JjY70yZcqk3nfFFVd4iYmJZ93npreNH3/88TTbeN++fd73339vei6lt3+cOnWqt23btgw/38+2bo8dO+YNHz48Q8+fv986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U6dOqUePHun+/J/Pw/T89ddfmjp1qh5//HG1aNFC06ZN019//ZX688OHD2vOnDl6/vnnVaJEiUzP5z/nwfO81AGjlNdDymshM8+58+nbt6/eeecdDRgwQK1bt069f9y4cbrkkkv07LPPnpHJnTu38ubNe95pBwUFpTm1Y8q/Dx06lHoK4JQBpr9fmysgIEDPPffcGdOLiYk5Yz9wNumdjjfliLN/Hl32xBNPKF++fKn/bt68uUqVKqWpU6dmqMviQu2TMvp6SU5O1vTp09W0aVOVKVMm9edXXHGFmjRpksmlObeMPpfS2z+Gh4en+0cY55Leug0ICDjjGniHDx/Wvn37znu04dled1OmTJF05v475eivX375RZI0a9YsJSYm6oUXXkjzuLZt257RldF9esoguMu+YNy4ccqVK5feeOONM34WGBh43tfaypUr07wvbNy4UZK0cOHCNPen/IFQVuy/MrNfKlGihCpXrqxcuf77d9K5cuVS5cqVz9hHp/dYAAAA5Dx8GgQAAM4GDhyo//znP5o2bZqGDRummJgYPffcc9q1a1eaL8aOHDmid999V927d9fPP/+sKVOm6JprrtEdd9xxxqmv3nnnHd177736+eefNWrUKK1YsUKhoaG66qqr1Lx5c5UvXz7NYIXVH3/8oblz52rFihU6evSorr32WjVv3lzvv/9+6mNSvth/7733NH36dCUlJem7777TL7/8os6dO2vatGn6+uuvVaxYMb344ovatm2bqlevnqZnxYoVatSokTp27Kh9+/YpIiJCS5cu1auvvqoGDRpoyZIl+vTTT/XHH3+oUKFCqlmzpho1aqTChQufc/7PNt2ziY6O1m+//aauXbsqKChIe/fuVePGjVWhQoUzHtu9e3c1btxYv/32mz755BNt3LhRJUuW1IMPPqibb75ZkZGR/9p28ifP8/TMM89o6tSp2rBhg0aOHKm9e/eqdOnSatCggaKionTvvfeecxo7duzQ66+/rgEDBqh8+fL66aefFB0drQoVKqhZs2b65JNPNGjQoPPOy5gxY/Tjjz9KUrpfcr/44ov6/ffftW7dOn366afasWOHihcvrtq1a+uSSy5RjRo1zjrtzz77TIUKFdLs2bO1Z88elStXTu3atdOqVatSvwhfvXq1Tp06pVdeeUX58+fXyZMnNXv27LNegyqjunbtqvz58+uDDz5QdHS0xo4dqy+//FIPPfSQPv74YzVo0EALFixQYGCgrrjiCj300ENq0qRJutfd/Lu9e/fqlVdeUfny5bVlyxY9/PDDuuaaa/Tss8/q1KlTkk7vAxYtWqT+/furUKFCOnr0qB555JF0vzhfsWKFHnnkEQ0aNEjLli3TiRMn9PPPP6fb/eabb+qWW27RL7/8ol27dqlYsWJq06aNdu/erd9//z3NY48eParff/9dI0eOVPHixdWhQwdt3bpVn376qXGNnt+F2idl5vXSo0cP3X777Zo/f74+/PBD5cqVS+3atdOGDRvO2Ie6yOhzacaMGTp58qQmT56sESNGKF++fHr22Wd16NAhlSpVKsN96a3bzZs3a8+ePfrhhx+0Zs0anThxQo0aNdL1119/1tMr/n16ktSvXz99++23SkxM1OTJk7V27VqNGjVKzz//vAoUKKDffvtN119/vVq2bKkJEyZo7ty5kqRDhw5p2LBhevnllzVx4kRNmzZN1atXT33v/fuRZxndp8fHx2vDhg16+OGHtWXLFh09elTr16/P1NHP8+bN08cff6zu3burRo0amjFjhhITE3X55ZfrwQcfVPv27VP3d1lh+/btOnbsmFq3bq3o6GjFxMRoyZIlaY46PJ/M7Jf69++vli1bqnz58qlHOZYuXVqbNm1KPX1nivQeCwAAgJzJ48aNGzdu3Ljl3NuTTz7peZ7n1apVK92fz5kzx1u3bl2a+yIiIryRI0emua9atWrenDlzvNjYWG/37t3ea6+95rVq1crzPM8rV65c6uN8Pp/3xhtveHv37vViYmK82bNne1WrVk13mqGhoV6/fv28LVu2ePHx8d6hQ4e833//3evUqZOXK1cuT5JXrlw5z/M8r3PnzmfMu+d5Xo8ePc65/N27d/cWL17sHT161IuJifH++OMPr1u3bqnTl+QFBAR4w4YN8w4ePOglJSV53ulvNz1JXqtWrbzNmzd7cXFx3h9//OE9+eSTXo8ePdI8RpJXqVIlb+7cuV5MTIzneV6aZS1atKg3fPhwb9euXd7Jkye9ffv2eb/++qv3zDPPnHf7nW26KfNQuHDhMzKlSpXyfvzxR+/o0aPesWPHvO+++84rUaJEuuurTJky3qhRo7yDBw96cXFx3rZt27zhw4d7QUFBmdpOF9PtXM+Zc6276tWrez/88IN3+PBh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wEDdfvvt2rt3r2naGR6w27Ztm4YNG6bRo0frwIGzXyOmUaNG6tSpk+bNm6cBAwaYZgoAAAAAAAAAAAC4mKxevVqe58nzPM2ePfuMn8fFxaldu3amaWd4wK5+/fp666231LNnT61Zs0bLly/Xvn37FB8fr4IFC6pq1aqqXbu2Tp06pf79+2vEiBGmGQIAAAAAAAAAAED248uCc2JezEfYVahQQT6fTzt27ND111+vw4cPp/4sISFBhw4dUnJysmnaPmXy6MQyZcrowQcfVN26dVWuXDnlyZNHR44c0apVqzR9+nRNnTo1wzPTunVrvfDCCypfvrwkacOGDerdu7emTZsmSQoJCdGgQYP0yCOPKCQkRNOnT1ebNm106NChDM9vWFiYoqKitPvoCXmG4zDfKlIt86G/efymS8zZrxbscequFh5izq6POmnOFgkONGcl6UiC/dqIoYH2l3JMktuBurkD7N3xydmz26U3O3cHOVQnOh4PnhO7XXpzand23dYB9qgkyfZRKHt3u/Tm1O7suq392Z1dtzUAAACAnCN3WD4NjVqv8PBwRUdH+3t2cqSUsZij0bFZckrMQmF5c9z2zPARdil2796twYMHa/Dgwc7le/bs0auvvqqtW7fK5/PpySef1MSJE3XNNdfojz/+0JAhQ3TXXXfpwQcfVGRkpN5//32NHz9eN998s3M3AAAAAAAAAAAAYFWlShWVLVtWwcHBae6fPHlypqeV6QG7rPTzzz+n+ffrr7+uF154QTfeeKP27Nmjp59+Wo899pjmzJkjSWrVqpU2bdqkG264QUuWLEl3msHBwQoJ+e+RZWFhYRduAQAAAAAAAAAAAJDqYj6lZVapUKGCJkyYoKuuukqe56WeCtT7/1M95sqV+eE31zPzZJmAgAA9/PDDCg0N1aJFi1SrVi0FBwdr5syZqY/ZvHmzdu3apdq1a591Ot26dVNUVFTqbe/evf/G7AMAAAAAAAAAAORoAb6suV3shg0bpoiICBUrVkyxsbG68sordcstt2j58uWqX7++aZp+H7CrVq2aoqOjdfLkSX388cdq1qyZNm7cqBIlSujkyZOKjIxM8/iDBw+qRIkSZ51e//79FR4ennorXbr0hV4EAAAAAAAAAAAA5BC1a9fWm2++qb/++kvJyclKTk7WggUL1K1bN7333numafr1lJjS6aPmatSo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l1122d+OR5Jmz56tVq1anXY7AgAAAAD+OUzYAQAAAP9yDzzwgPbv368rrrhCo0aN0tixY/XBBx9o2bJlqlGjhubPn693331XefPmlfTnRNCiRYu0du1a1apVSzfddJOKFSum6dOnn7JjzJgxCg8P19VXX60qVaroySef1JEjR7Rz507dcccdkqTy5ctnHB0oSb1799b999+vDh06qFKlSho2bJgmT56sq6++OtNjDx48WD179tTll1+uffv2afbs2Zkmyv7XVVddpVWrVmW67eabb9bMmTP12WefqXr16mrUqJFWrlyZ6T49e/bUqlWrVL16db322msaO3asypcvn/H1xMREPfjgg7r00kvVtWtXtW/fXt27d8/0GOXKlVPz5s11xx13qFq1apKkyMhIDR06VLVq1VKjRo0UCAQ0c+ZMBQUFZXz9yy+/VIkSJXTbbbepatWqeuWVVxQcHKz3339fQ4YM0caNGzOOpHz//fclSR988IHOO+88NW7cWDVr1tSaNWu0cOFCFSxY8LTjkaSVK1fqiiuuUFhY2Cm3IwAAAADgn+WxsLCwsLCwsLCwsOSs5YEHHvAOHTp0wu0TJkzwZs6cmfH/xYsXe0uXLs34f3BwsJeYmOhNmjQp47ZixYp5nud5tWvX9iR5zzzzjDd37txMj1uiRAnP8zzv4osvPul41q9f7z3//PMn/do111zjeZ7n5c+fP+O2sLAw78iRI16dOnUy3XfcuHHelClTMuXuvPPOjK8XLFjQS0pK8lq2bHnKbXPo0CHv3nvvzXTbN99847377runzGzbts175513Mt22d+9e75FHHjllpmfPnt53332X8f8+ffp4ycnJXpEiRU773BUuXNjzPM+rVKmSJ8lr3769Fx8f7xUsWPCk9+/Tp4+3du3aTLfVq1fPO3z4sBcWFpbp9p9//tlr3779346nSpUqnud5XsmSJX3/XmZhYWFhYWFhYWFhYWGRd+o/SwUAAADwr/D9999n/DsQCOjAgQPasGFDxm1xcXGSpPPOO0+SVLVqVTVs2FCJiYknPFbZsmX1888/n3D7yJEjNXbsWN1www1asGCBZsyYkanjf5UrV06RkZH64osvMt0eFhamtWvXZrpt+fLlGf8+dOiQtmzZoksuueSUj503b95Mp3+UpGrVqmncuHGnzEiZt5Mk7d27N2ObSNKdd96pLl26qGzZsoqKilKePHmUkJCQKbNjxw7t378/023lypVTv379VLt2bRUpUkTBwX+e6KRkyZLatGmTqlWrprVr1+rQoUOnHd9/q1q1qqKionTgwIFMt+fNm1dly5Y97Xgk6dixY5L+PA0oAAAAAMB/TNgBAAAA/3KpqamZ/u953gm3ScqYSIqKitLs2bP15JNPnnCfPXv2nLRj/Pjxmjdvnpo0aaIbbrhBvXv3Vs+ePTV69OiT3j8qKkqS1KRJE+3atSvT1/732nNZtX///kynhZT+M0F1OifbTn9tkzp16mjKlCnq06eP5s2bp/j4eLVq1Uo9e/bMlElKSjrhcWfPnp1xTbzdu3crODhYmzZtyjgd5ZmM7X9FRUVpz549atCgwQlfO3z48GnHI0mFChWSJO3bty/L3QAAAACA7MeEHQAAAIBM1qxZo+bNm2v79u1KT08/49zvv/+uN954Q2+88YZefvlltW/fXqNHj1ZKSookKSQkJOO+P/zwg44fP66SJUtq6dKlp33cOnXqaOfOnZKkAgUKqHz58tq8efMp77927VpdeumlmW77/vvv1ahRI02cOPGM1+e/XXnlldqxY4defvnljNtKlSr1t7lChQqpYsWKat++vb7++mtJUr169U4YW7t27VSwYMGTHmWXkpKSadtJfz5HsbGxSktL044dO7K8PpUrV9bOnTtPOEIPAAAAAOCPYL8HAAAAAODcMmbMGBUqVEhTp05VrVq1VKZMGd1www16++23M444+1/Dhg3TDTfcoIsuukjVq1dXw4YNMybVduzYoUAgoFtuuUVFihRRZGSkjhw5oiFDhmjYsGG6//77VaZMGVWvXl2dOnXS/fffn+mxn3/+eV177bWqVKmSJk6cqP3792vWrFmnHP+8efNUv379TLe98MILuvvuu9W3b19VrFhRlStXVq9evc54m/z8888qWbKk7rrrLpUpU0adO3dWs2bN/jZ36NAh7d+/Xw8//LDKli2rhg0baujQoZnuM3XqVO3du1ezZs3SlVdeqdKlS+uOO+5QnTp1JEnbt29X6dKlVbVqVRUuXFhhYWFasGCBli9frlmzZun6669XqVKlVLduXfXv3181a9b823FdddVVmj9//hmvPwAAAADg7GLCDgAAAEAme/bsUb169RQSEqL58+drw4YNGj58uA4fPqxAIHDSTEhIiMaMGaPNmzdr7ty5+umnn9SxY0dJ0u7du9WnTx8NHDhQcXFxGafJfO655/Tiiy+qd+/eGbkmTZpo27ZtmR77qaee0ogRI7R69WrFxsbq1ltvPekpPf8yZcoUVapUSeXLl8+47csvv1TLli112223ad26dVq0aJGuuOKKM94ms2fP1rBhwzR69GitW7dOV155pV588cW/zXmep1atWqlmzZrauHGjhg0bpieeeCLTfVJTU3XDDTfojz/+0GeffaYNGzboqaeeyji6ccaMGZo7d64WL16s/fv36+6775Yk3XzzzVq6dKkmTJign376SdOmTVOpUqUyrkl4KuHh4WratOnfXtMPAAAAAPDPCZLk+T0IAAAAAPhf11xzjZYsWaICBQooPj4+S9lXXnlFMTEx6tChw1kaXc7VoUMHNWvWTDfeeKPfQwEAAAAA/D+OsAMAAADwr/PSSy9px44dCgoK8nso55zU1FR17tzZ72EAAAAAAP4LR9gBAAAAOCe5HGEHAAAAAEBOwoQdAAAAAAAAAAAA4CNOiQkAAAAAAAAAAAD4iAk7AAAAAAAAAAAAwEdM2AEAAAAAAAAAAAA+YsIOAAAAAAAAAAAA8BETdgAAAAAAAAAAAICPmLADAAAAAAAAAAAAfMSEHQAAAAAAAAAAAOAjJuwAAAAAAAAAAAAAH/0fAmMSELqco4QAAAAASUVORK5CYII="
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data",
|
||
"jetTransient": {
|
||
"display_id": null
|
||
}
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Sequence:\n",
|
||
"Here ye strike but splintered hearts together--there, ye\n",
|
||
"shall strike unsplinterable glasses!\n",
|
||
"\n",
|
||
"\n",
|
||
"EXTR\n"
|
||
]
|
||
}
|
||
],
|
||
"execution_count": 23
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"id": "a1b2c3d4-0001-4001-8001-000000000011",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-05-31T09:22:53.158670097Z",
|
||
"start_time": "2026-05-31T09:22:51.004518183Z"
|
||
}
|
||
},
|
||
"source": "# ── Character frequency: data vs model predictions ─────────────────────────\n# Compare the character distribution in the training data to the distribution\n# the model assigns when conditioning on a fixed context.\ntrue_counts = np_cpu.bincount(eval_enc[:500].astype(int), minlength=vocab_size).astype(float)\ntrue_counts /= true_counts.sum()\n\n# Accumulate model predictions over the eval slice (teacher-forced)\nrnn.reset(batch_size=1)\nh = np.zeros((1, H_SIZE))\nmodel_probs = np_cpu.zeros(vocab_size)\n\nfor 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\nmodel_probs /= model_probs.sum()\n\nlabels = [repr(c) for c in chars]\nx = np_cpu.arange(vocab_size)\nwidth = 0.4\n\nplt.figure(figsize=(20, 4))\nplt.bar(x - width/2, true_counts, width, label='Data', alpha=0.7)\nplt.bar(x + width/2, model_probs, width, label='Model', alpha=0.7)\nplt.xticks(x, labels, rotation=90, fontsize=7)\nplt.ylabel('Probability')\nplt.title('Character distribution: data vs model')\nplt.legend()\nplt.tight_layout()\nplt.show()",
|
||
"outputs": [],
|
||
"execution_count": null
|
||
}
|
||
]
|
||
} |