Skip to content

How Neurogebra Works

This page explains the architecture of Neurogebra — how all the pieces fit together.


The Architecture

Neurogebra is built in layers, from low-level math to high-level model building:

┌─────────────────────────────────────────┐
│          ModelBuilder / NeuroCraft       │  ← High-level: Build models
├─────────────────────────────────────────┤
│              Trainer                     │  ← Train expressions on data
├─────────────────────────────────────────┤
│              MathForge                   │  ← Access expressions
├─────────────────────────────────────────┤
│         Expression + Autograd            │  ← Core: Math + Gradients
├─────────────────────────────────────────┤
│    Repository (Activations, Losses...)   │  ← Pre-built formulas
├─────────────────────────────────────────┤
│          SymPy + NumPy                   │  ← Foundation: Math engines
└─────────────────────────────────────────┘

Core Components

1. Expression — The Building Block

Everything in Neurogebra is an Expression. An Expression is a mathematical formula that can:

  • Evaluate → give you a number
  • Differentiate → compute its gradient
  • Explain → describe itself in plain English
  • Compose → combine with other expressions
  • Train → learn parameter values from data
from neurogebra import Expression

# A simple expression: y = mx + b
line = Expression(
    name="line",
    symbolic_expr="m*x + b",
    params={"m": 2.0, "b": 1.0}
)

print(line.eval(x=3))  # 2*3 + 1 = 7.0

2. MathForge — The Toolbox

MathForge loads all pre-built expressions from the Repository and gives you a clean interface:

from neurogebra import MathForge

forge = MathForge()

# Access 50+ expressions by name
relu = forge.get("relu")
mse = forge.get("mse")

3. Repository — The Expression Library

The repository contains pre-built expressions organized by category:

Category Examples Used For
Activations ReLU, Sigmoid, Tanh, GELU, Swish Adding non-linearity to neural networks
Losses MSE, MAE, Cross-Entropy, Huber Measuring how wrong predictions are
Regularizers L1, L2, Elastic Net Preventing overfitting
Algebra Polynomial, Quadratic General mathematical operations
Calculus Derivatives, Integrals Mathematical analysis
Statistics Mean, Variance, Standard Deviation Data analysis
Linear Algebra Dot product, Norms Vector/matrix operations
Metrics Accuracy, Precision, Recall Evaluating model performance
Optimization Gradient Descent step Training algorithms
Transforms Normalization, Standardization Data preprocessing

4. Autograd Engine — The Gradient Machine

The autograd engine tracks computations and computes gradients automatically:

from neurogebra.core.autograd import Value

x = Value(2.0)
y = Value(3.0)

# Forward: compute result
z = x * y + x ** 2  # z = 2*3 + 2² = 10

# Backward: compute gradients
z.backward()

print(x.grad)  # dz/dx = y + 2x = 3 + 4 = 7.0
print(y.grad)  # dz/dy = x = 2.0

5. Trainer — The Learning Engine

The Trainer fits expression parameters to data:

from neurogebra import Expression
from neurogebra.core.trainer import Trainer
import numpy as np

# Expression with unknown parameters
expr = Expression("line", "m*x + b",
                  params={"m": 0.0, "b": 0.0},
                  trainable_params=["m", "b"])

# Data: y = 2x + 1
X = np.array([1, 2, 3, 4, 5], dtype=float)
y = np.array([3, 5, 7, 9, 11], dtype=float)

# Train to find m and b
trainer = Trainer(expr, learning_rate=0.01)
trainer.fit(X, y, epochs=200)

print(f"Learned: m={expr.params['m']:.2f}, b={expr.params['b']:.2f}")
# Should be close to m=2.0, b=1.0

6. ModelBuilder — The Neural Network Constructor

ModelBuilder lets you build neural networks with an educational interface:

from neurogebra import ModelBuilder

builder = ModelBuilder()

model = builder.Sequential([
    builder.Dense(128, activation="relu"),
    builder.Dropout(0.2),
    builder.Dense(64, activation="relu"),
    builder.Dense(10, activation="softmax")
])

model.summary()            # See architecture
model.explain_architecture()  # Get explanations

How It All Connects

Here's the typical workflow:

1. You create a MathForge           →  forge = MathForge()
2. You get expressions               →  relu = forge.get("relu")
3. You explore them                   →  relu.explain(), relu.eval(x=5)
4. You compose complex expressions    →  loss = forge.compose("mse + 0.1*mae")
5. You create trainable expressions   →  expr = Expression("f", "a*x+b", ...)
6. You train on data                  →  trainer.fit(X, y, epochs=100)
7. You build full models              →  model = builder.Sequential([...])

Symbolic vs Numerical

Neurogebra uses SymPy for symbolic math and NumPy for numerical computation:

relu = forge.get("relu")

# SYMBOLIC — see the formula
print(relu.symbolic_expr)  # Max(0, x)

# NUMERICAL — get a number
print(relu.eval(x=5))     # 5

Why both?

  • Symbolic: You can see, manipulate, differentiate, and explain formulas
  • Numerical: You can evaluate efficiently on real data with NumPy arrays

Summary

Component Class Purpose
Expression Expression A math formula you can evaluate, differentiate, train
MathForge MathForge Toolbox to access all pre-built expressions
Value Value Scalar with automatic gradient tracking
Tensor Tensor Array with automatic gradient tracking
Trainer Trainer Fits expression parameters to data
ModelBuilder ModelBuilder Builds neural network architectures
NeuroCraft NeuroCraft Enhanced interface with educational features

Next: Python for ML →