Solving the Clive Wearing Problem: One-Shot Episodic Memory for Frozen Transformers
Tommi Niemi / Rotko Networks Hidden-state episodic memory for frozen transformers. No gradients. Teach via one forward pass, recall via cosine similarity + logit injection. 200-line Python reproduction included. pip install transformers torch numpy && python python/epimem.py
This commit is contained in:
257
schema/organism.fbs
Normal file
257
schema/organism.fbs
Normal file
@@ -0,0 +1,257 @@
|
||||
// Organism schema — FlatBuffers
|
||||
//
|
||||
// Separates:
|
||||
// Weights (shared cortical hardware, Arc-shareable)
|
||||
// Session (per-persona state, isolated)
|
||||
// Memory (episodic store with per-alter access control)
|
||||
//
|
||||
// File layout:
|
||||
// organism.weights.fb — one per organism (shared across personas)
|
||||
// persona_X.session.fb — one per persona
|
||||
// memory.fb — shared episodic store (existing isis.fbs)
|
||||
// barriers.fb — dissociative access control
|
||||
|
||||
namespace isis.organism;
|
||||
|
||||
// ─── Shared types ────────────────────────────────────────
|
||||
|
||||
enum Precision : byte {
|
||||
F32 = 0,
|
||||
F16 = 1,
|
||||
I8 = 2,
|
||||
}
|
||||
|
||||
/// Dense matrix stored in chosen precision.
|
||||
/// All weight matrices use this: synapses, NLM stages, projectors.
|
||||
table Matrix {
|
||||
rows: uint32;
|
||||
cols: uint32;
|
||||
precision: Precision;
|
||||
f32_data: [float];
|
||||
f16_data: [uint16];
|
||||
i8_data: [int8];
|
||||
i8_scale: float;
|
||||
}
|
||||
|
||||
/// Bias vector.
|
||||
table Bias {
|
||||
precision: Precision;
|
||||
f32_data: [float];
|
||||
f16_data: [uint16];
|
||||
i8_data: [int8];
|
||||
i8_scale: float;
|
||||
}
|
||||
|
||||
// ─── Region definition ───────────────────────────────────
|
||||
|
||||
/// Per-neuron MLP weights within a region.
|
||||
table NlmStage {
|
||||
weights: Matrix; // [n_neurons × out_per × in_per]
|
||||
biases: Bias; // [n_neurons × out_per]
|
||||
n_neurons: uint32;
|
||||
in_per: uint32;
|
||||
out_per: uint32;
|
||||
}
|
||||
|
||||
/// A brain region's learned weights.
|
||||
table RegionWeights {
|
||||
name: string; // "input", "attention", "output", "motor", etc.
|
||||
n_neurons: uint32;
|
||||
memory_length: uint32;
|
||||
inhibitory_fraction: float;
|
||||
inhibitory_mask: [bool];
|
||||
nlm_stage1: NlmStage;
|
||||
nlm_stage2: NlmStage; // null if nlm_depth < 2
|
||||
start_trace: [float]; // initial trace state
|
||||
start_activated: [float]; // initial activation
|
||||
}
|
||||
|
||||
/// Inter-region synapse weights.
|
||||
table SynapseWeights {
|
||||
from_region: string;
|
||||
to_region: string;
|
||||
weight: Matrix; // [out_dim*2 × in_dim] (×2 for GLU)
|
||||
bias: Bias; // [out_dim*2]
|
||||
}
|
||||
|
||||
// ─── Weights file (shared across personas) ───────────────
|
||||
|
||||
table OrganismWeights {
|
||||
version: uint32;
|
||||
|
||||
// Architecture config
|
||||
iterations: uint32;
|
||||
d_model: uint32;
|
||||
d_input: uint32;
|
||||
n_sync_out: uint32;
|
||||
n_sync_action: uint32;
|
||||
motor_threshold: float;
|
||||
|
||||
// Brain regions (variable count — not hardcoded to 8)
|
||||
regions: [RegionWeights];
|
||||
|
||||
// Inter-region synapses (variable count)
|
||||
synapses: [SynapseWeights];
|
||||
|
||||
// Projectors
|
||||
global_projector: Matrix;
|
||||
global_projector_bias: Bias;
|
||||
output_projector: Matrix;
|
||||
output_projector_bias: Bias;
|
||||
logit_projector: Matrix;
|
||||
logit_projector_bias: Bias;
|
||||
|
||||
// Sync pair topology (deterministic from seed, but stored for portability)
|
||||
sync_out_left: [uint32];
|
||||
sync_out_right: [uint32];
|
||||
sync_out_decay: [float];
|
||||
sync_action_left: [uint32];
|
||||
sync_action_right: [uint32];
|
||||
sync_action_decay: [float];
|
||||
|
||||
// Position predictor weights (optional)
|
||||
position_predictor_gate: Matrix;
|
||||
position_predictor_content: Matrix;
|
||||
position_predictor_final: Matrix;
|
||||
|
||||
// Organism-level learned parameters
|
||||
embeddings: Matrix; // [vocab_size × embed_dim]
|
||||
sensory_layers: [Matrix]; // sensory MLP weight matrices
|
||||
sensory_biases: [Bias];
|
||||
output_proj: Matrix; // [vocab_size × n_sync_out]
|
||||
output_proj_bias: Bias;
|
||||
|
||||
// Metadata
|
||||
vocab_size: uint32;
|
||||
embed_dim: uint32;
|
||||
sensory_depth: uint32;
|
||||
context_len: uint32;
|
||||
tokens_seen: uint64;
|
||||
sleep_cycles: uint64;
|
||||
created_at: float64;
|
||||
}
|
||||
|
||||
// ─── Session file (per-persona) ──────────────────────────
|
||||
|
||||
/// Neuromodulator baseline — each persona's emotional temperament.
|
||||
table NeuromodBaseline {
|
||||
dopamine: float;
|
||||
serotonin: float;
|
||||
norepinephrine: float;
|
||||
acetylcholine: float;
|
||||
curiosity: float;
|
||||
anxiety: float;
|
||||
}
|
||||
|
||||
/// Hippocampal content-addressable memory state.
|
||||
table HippocampalState {
|
||||
capacity: uint32;
|
||||
key_dim: uint32;
|
||||
value_dim: uint32;
|
||||
keys: [float]; // [capacity × key_dim]
|
||||
values: [float]; // [capacity × value_dim]
|
||||
strengths: [float]; // [capacity]
|
||||
write_ptr: uint32;
|
||||
count: uint32;
|
||||
}
|
||||
|
||||
/// Per-region mutable state (noise, usefulness tracking).
|
||||
table RegionState {
|
||||
region_name: string;
|
||||
noise_scale: [float]; // [n_neurons]
|
||||
usefulness_ema: [float]; // [n_neurons]
|
||||
}
|
||||
|
||||
/// Hebbian plasticity state per region.
|
||||
table HebbianState {
|
||||
region_name: string;
|
||||
running_mean: [float]; // [n_neurons]
|
||||
baseline_mean: [float];
|
||||
baseline_var: [float];
|
||||
calibrated: bool;
|
||||
}
|
||||
|
||||
/// Replay buffer entry for prioritized consolidation.
|
||||
table ReplayEntry {
|
||||
observation: [float];
|
||||
surprise: float;
|
||||
timestamp: uint64;
|
||||
}
|
||||
|
||||
/// A persona's complete session state.
|
||||
/// This is everything that makes one persona different from another
|
||||
/// running on the same shared weights.
|
||||
table PersonaSession {
|
||||
version: uint32;
|
||||
|
||||
// Identity
|
||||
name: string; // persona name
|
||||
created_at: float64;
|
||||
|
||||
// Emotional temperament
|
||||
neuromod_baseline: NeuromodBaseline;
|
||||
|
||||
// Episodic memory (per-persona hippocampal state)
|
||||
hippo: HippocampalState;
|
||||
hippo_retrieval: [float];
|
||||
|
||||
// Basal ganglia learning state
|
||||
bg_eligibility: [float];
|
||||
bg_da_baseline: float;
|
||||
bg_weight_delta: [float];
|
||||
|
||||
// Per-region mutable state
|
||||
region_states: [RegionState];
|
||||
|
||||
// Per-region Hebbian state
|
||||
hebbian_states: [HebbianState];
|
||||
|
||||
// Sleep consolidation traces (transient, may be empty)
|
||||
sleep_trace_count: uint32;
|
||||
|
||||
// Replay buffer
|
||||
replay_entries: [ReplayEntry];
|
||||
replay_capacity: uint32;
|
||||
|
||||
// Training state
|
||||
hebbian_enabled: bool;
|
||||
tokens_processed: uint64;
|
||||
gamma_cycles_total: uint64;
|
||||
}
|
||||
|
||||
// ─── Dissociative barriers ───────────────────────────────
|
||||
|
||||
/// Per-persona access control over shared episodic memory.
|
||||
/// Each persona can see different episodes with different strength.
|
||||
table EpisodeAccess {
|
||||
episode_index: uint32; // index into MemoryBank.alters[].episodes[]
|
||||
access_level: float; // 0.0 = walled off, 1.0 = full access
|
||||
}
|
||||
|
||||
table PersonaBarrier {
|
||||
persona_name: string;
|
||||
episode_access: [EpisodeAccess];
|
||||
}
|
||||
|
||||
table DissociativeBarriers {
|
||||
version: uint32;
|
||||
barriers: [PersonaBarrier];
|
||||
// Global integration level: 0.0 = fully dissociated, 1.0 = fully integrated
|
||||
integration_level: float;
|
||||
}
|
||||
|
||||
// ─── Root types ──────────────────────────────────────────
|
||||
|
||||
root_type OrganismWeights;
|
||||
file_identifier "orgw";
|
||||
file_extension "weights.fb";
|
||||
|
||||
// For session files, use PersonaSession as root:
|
||||
// root_type PersonaSession;
|
||||
// file_identifier "orgs";
|
||||
// file_extension "session.fb";
|
||||
|
||||
// For barrier files, use DissociativeBarriers as root:
|
||||
// root_type DissociativeBarriers;
|
||||
// file_identifier "orgb";
|
||||
// file_extension "barriers.fb";
|
||||
Reference in New Issue
Block a user