| name | energy-based-neurocomputation |
| description | Energy-based dynamical systems framework for neurocomputation, learning, and optimization. Unifies Hopfield networks, Boltzmann machines, modern EBMs, and equilibrium propagation under a single energy landscape formulation. Covers gradient flow dynamics, attractor analysis, contrastive learning, and biologically-plausible learning rules. Activation: energy-based models, EBMs, neural dynamics, Hopfield networks, energy landscape, attractor dynamics, gradient flow, equilibrium propagation, contrastive learning, Lyapunov stability, 能量模型, 能量景观, 神经动力学, 吸引子动力学, 梯度流
|
| version | 2.0.0 |
| metadata | {"hermes":{"source_paper":"Energy-Based Dynamical Models for Neurocomputation, Learning, and Optimization","arxiv_id":"2604.05042","authors":["Montanari","Bullo","Krotov","Motter"],"categories":["cs.LG","cond-mat.dis-nn","eess.SY","math.DS","q-bio.NC"],"tags":["energy-based-models","neurocomputation","dynamical-systems","hopfield","EBM","attractor","learning"]}} |
Energy-Based Dynamical Models for Neurocomputation
Energy-based dynamical systems framework bridging control theory, neuroscience, and machine learning for scalable, robust, energy-efficient computation through energy landscape formulation.
1. Energy Landscape Formulation of Neural Dynamics
1.1 Core Energy Function
Neural activity evolves to minimize a scalar energy function $E(x)$:
E(x) = -½ xᵀ W x - bᵀ x + R(x)
| Component | Description |
|---|
| $x \in \mathbb{R}^N$ | Neural activity state vector |
| $W \in \mathbb{R}^{N\times N}$ | Synaptic weight matrix (symmetric for guaranteed convergence) |
| $b \in \mathbb{R}^N$ | External input / bias vector |
| $R(x)$ | Regularization (sparsity, bounds, non-convexity) |
1.2 Continuous-Time Dynamics
The neural state evolves according to gradient flow on the energy landscape:
τ · dx/dt = -∇ₓE(x) = W·x + b - ∇ₓR(x)
With saturating nonlinearity:
τ · dx/dt = -x + φ(W·x + b)
where $φ(\cdot)$ is a sigmoidal activation (tanh, sigmoid, or softplus).
1.3 Discrete-Time Update
x(t+1) = φ(W·x(t) + b)
1.4 Key Properties
- Monotonicity: $dE/dt \leq 0$ when $W$ is symmetric
- Boundedness: Activation functions constrain state space
- Convergence: System reaches fixed points (attractors)
- Lyapunov Function: $E(x)$ serves as a Lyapunov function for the dynamics
2. Connection: Hopfield Networks ↔ Modern EBMs
2.1 Classical Hopfield Networks (1982)
class ClassicalHopfield:
"""Discrete Hopfield network - binary ±1 units."""
def __init__(self, n_units: int):
self.W = np.zeros((n_units, n_units))
def store_patterns(self, patterns: np.ndarray):
"""Hebbian storage: W = (1/N) Σ ξ ξᵀ"""
n = patterns.shape[1]
for p in patterns:
self.W += np.outer(p, p) / n
np.fill_diagonal(self.W, 0)
def energy(self, state: np.ndarray) -> float:
"""Hopfield energy: E = -½ Σᵢⱼ Wᵢⱼ sᵢ sⱼ"""
return -0.5 * state @ self.W @ state
def update(self, state: np.ndarray) -> np.ndarray:
"""Asynchronous update: sᵢ ← sign(Σⱼ Wᵢⱼ sⱼ)"""
new_state = state.copy()
i = np.random.randint(len(state))
local_field = self.W[i] @ state
new_state[i] = np.sign(local_field) if local_field != 0 else state[i]
return new_state
def recall(self, cue: np.ndarray, max_iter: int = 100) -> np.ndarray:
"""Pattern completion from partial cue."""
state = cue.copy()
_ (max_iter):
new_state = .update(state)
np.array_equal(state, new_state):
state = new_state
state
2.2 Modern Energy-Based Models
Modern EBMs generalize Hopfield networks by:
| Feature | Classical Hopfield | Modern EBM |
|---|
| State space | Discrete {±1} | Continuous ℝᴺ |
| Energy | Quadratic only | Arbitrary parametric E_θ(x) |
| Learning | Hebbian rule | Contrastive divergence, score matching |
| Inference | Async updates | Langevin dynamics, MCMC |
| Capacity | ~0.14N patterns | Scales with network depth |
| Architecture | Single layer | Deep, multi-layer |
2.3 Modern Hopfield Networks (Dense Associative Memory)
class ModernHopfield:
"""Dense associative memory with exponential energy.
Energy: E(x) = -lse(β Xᵀ x) + ½‖x‖²
where lse is the log-sum-exp function.
"""
def __init__(self, n_features: int, beta: float = 1.0):
self.beta = beta
self.memories = []
def store(self, pattern: np.ndarray):
"""Add pattern to memory set."""
self.memories.append(pattern)
def energy(self, query: np.ndarray) -> float:
"""Modern Hopfield energy function."""
M = np.array(self.memories)
logits = self.beta * M @ query
lse_val = np.log(np.sum(np.exp(logits)))
return -lse_val + 0.5 * np.dot(query, query)
def retrieve(self, query: np.ndarray, n_steps: int = 10) -> np.ndarray:
"""Energy minimization via gradient descent."""
x = query.copy()
for _ in range(n_steps):
logits = self.beta * np.array(self.memories) @ x
probs = np.exp(logits) / np.sum(np.exp(logits))
grad = -np.array(.memories).T @ probs + x
x = x - * grad
x
2.4 Unified View
Classical Hopfield → Continuous Hopfield → Modern Hopfield → Deep EBM
(1982) (1984) (2016) (2020+)
Binary ±1 Continuous Dense assoc. Parametric
Quadratic E Quadratic E LogSumExp E Neural net E
Hebbian W Gradient flow Gradient flow Score matching
3. Gradient Flow Dynamics
3.1 Formal Gradient Flow System
The continuous neural dynamics implement a Riemannian gradient flow:
τ · dx/dt = -G(x)⁻¹ ∇ₓE(x)
where $G(x)$ is a metric tensor (often identity for Euclidean gradient flow).
3.2 Gradient Flow with Nonlinearity
class GradientFlowDynamics:
"""Gradient flow dynamics on energy landscape."""
def __init__(self, W: np.ndarray, b: np.ndarray, tau: float = 1.0):
self.W = W
self.b = b
self.tau = tau
def energy(self, x: np.ndarray) -> float:
"""Energy with integral-of-nonlinearity term."""
quad = -0.5 * x @ self.W @ x
linear = -self.b @ x
reg = 0.5 * np.sum((1+x)*np.log1p(x) + (1-x)*np.log1p(-x))
return quad + linear + reg
def vector_field(self, x: np.ndarray) -> np.ndarray:
"""Compute dx/dt = (-x + φ(Wx + b)) / τ"""
return (-x + np.tanh(self.W @ x + self.b)) / self.tau
def simulate(self, x0: np.ndarray, T: float, dt: float = 0.01) -> tuple:
"""Forward Euler integration."""
t = np.arange(0, T, dt)
x = x0.copy()
trajectory = [x.copy()]
energy_trace = [.energy(x)]
_ t:
dx = .vector_field(x) * dt
x = x + dx
trajectory.append(x.copy())
energy_trace.append(.energy(x))
np.array(trajectory), np.array(energy_trace)
() -> :
velocities = np.diff(trajectory, axis=)
np.(np.linalg.norm(velocities[-:], axis=) < tol)
3.3 Energy Decay Guarantee
For symmetric $W$ and monotone activation $φ$:
def verify_energy_decay(dynamics, x0, T, dt=0.01):
"""Verify that energy decreases monotonically along trajectory."""
traj, energy = dynamics.simulate(x0, T, dt)
violations = np.sum(np.diff(energy) > 1e-10)
is_valid = violations == 0
return {
'energy_initial': energy[0],
'energy_final': energy[-1],
'energy_drop': energy[0] - energy[-1],
'monotonic': is_valid,
'violations': violations
}
4. Attractor Landscape Analysis
4.1 Attractor Classification
| Type | Description | Memory Analogy |
|---|
| Point attractor | Isolated fixed point | Discrete memory item |
| Line attractor | 1D manifold of fixed points | Continuous variable (evidence) |
| Ring attractor | Circular manifold | Circular variable (heading) |
| Chaotic attractor | Strange attractor | Oscillatory/complex dynamics |
| Limit cycle | Closed periodic orbit | Rhythmic pattern |
4.2 Landscape Analysis Pipeline
class AttractorLandscapeAnalyzer:
"""Comprehensive attractor landscape analysis."""
def __init__(self, dynamics_model):
self.model = dynamics_model
self.fixed_points = []
self.basins = {}
def find_fixed_points(self, n_initial: int = 100, tol: float = 1e-6,
max_iter: int = 500) -> np.ndarray:
"""Find attractors via multiple initial conditions."""
attractors = []
dim = self.model.W.shape[0]
for _ in range(n_initial):
x0 = np.random.randn(dim) * 0.5
x = x0.copy()
for _ in range(max_iter):
dx = self.model.vector_field(x)
x = x + 0.1 * dx
if np.linalg.norm(dx) < tol:
break
is_novel = True
for existing in attractors:
if np.linalg.norm(x - existing) < tol * 10:
is_novel = False
break
if is_novel:
attractors.append(x)
.fixed_points = attractors
np.array(attractors)
() -> :
n = (fixed_point)
J = np.zeros((n, n))
i (n):
x_plus = fixed_point.copy()
x_plus[i] += eps
x_minus = fixed_point.copy()
x_minus[i] -= eps
v_plus = .model.vector_field(x_plus)
v_minus = .model.vector_field(x_minus)
J[:, i] = (v_plus - v_minus) / ( * eps)
eigenvalues = np.linalg.eigvals(J)
real_parts = np.real(eigenvalues)
np.(real_parts < ):
stability =
np.(real_parts > ):
np.(real_parts > ):
stability =
:
stability =
:
stability =
{
: eigenvalues,
: stability,
: np.(real_parts),
: np.(real_parts),
: np.(np.(eigenvalues))
}
() -> :
n = .model.W.shape[]
bounds :
bounds = (-, )
n == :
x1 = np.linspace(bounds[], bounds[], grid_size)
x2 = np.linspace(bounds[], bounds[], grid_size)
X1, X2 = np.meshgrid(x1, x2)
basin_map = np.zeros((grid_size, grid_size), dtype=)
i (grid_size):
j (grid_size):
x0 = np.array([X1[i,j], X2[i,j]])
x_final = ._flow_to_attractor(x0)
basin_map[i,j] = ._nearest_attractor_idx(x_final)
{: basin_map, : (x1, x2)}
:
n_samples =
counts = np.zeros((.fixed_points))
_ (n_samples):
x0 = np.random.uniform(bounds[], bounds[], n)
x_final = ._flow_to_attractor(x0)
idx = ._nearest_attractor_idx(x_final)
counts[idx] +=
{: counts, : counts / n_samples}
() -> np.ndarray:
x = x0.copy()
_ (max_iter):
dx = .model.vector_field(x)
x = x + * dx
np.linalg.norm(dx) < :
x
() -> :
.fixed_points:
-
dists = [np.linalg.norm(point - fp) fp .fixed_points]
np.argmin(dists)
() -> :
.fixed_points:
.find_fixed_points()
stabilities = [.classify_stability(fp) fp .fixed_points]
basin_data = .map_basins()
energies = [.model.energy(fp) fp .fixed_points]
{
: ( s stabilities s[] == ),
: ( s stabilities s[] == ),
: (energies),
: (energies) - (energies) energies ,
: basin_data.get(, []),
: np.argmin(energies) energies
}
4.3 Energy Barrier Computation
def compute_energy_barrier(attractor_a, attractor_b, dynamics,
n_paths: int = 20) -> dict:
"""Compute energy barrier between two attractors.
Uses nudged elastic band (NEB) style interpolation.
"""
path = np.array([attractor_a + t * (attractor_b - attractor_a)
for t in np.linspace(0, 1, 50)])
energies = np.array([dynamics.energy(x) for x in path])
saddle_idx = np.argmax(energies)
barrier_height = energies[saddle_idx] - min(energies[0], energies[-1])
return {
'barrier_height': barrier_height,
'saddle_energy': energies[saddle_idx],
'saddle_point': path[saddle_idx],
'energy_a': energies[0],
'energy_b': energies[-1],
'path_energies': energies
}
5. Learning as Landscape Shaping
5.1 Conceptual Framework
Learning in EBMs = sculpting the energy landscape:
Before Learning: After Learning:
______ __ __
/ \ / \__/ \
/ \ → TRAIN → / \
\ / \
\____________/ \
Flat landscape Structured minima at data points
| Learning Rule | Landscape Effect |
|---|
| Hebbian | Deepens minima at stored patterns |
| Contrastive Divergence | Lowers E(data), raises E(model) |
| Equilibrium Propagation | Shapes E via clamped vs free phases |
| Score Matching | Matches ∇E(x) to data score |
5.2 Equilibrium Propagation (Scellier & Bengio, 2017)
class EquilibriumPropagation:
"""Two-phase equilibrium propagation learning.
Key insight: gradient of loss can be computed as difference
between clamped and free equilibrium states.
"""
def __init__(self, model, learning_rate: float = 0.01,
beta: float = 0.1, n_relax: int = 100):
self.model = model
self.lr = learning_rate
self.beta = beta
self.n_relax = n_relax
def relax_to_equilibrium(self, x: np.ndarray,
clamp_indices: np.ndarray = None,
clamp_values: np.ndarray = None) -> np.ndarray:
"""Run dynamics until equilibrium."""
for _ in range(self.n_relax):
dx = self.model.vector_field(x)
x = x + 0.1 * dx
if clamp_indices is not None:
x[clamp_indices] += self.beta * (clamp_values - x[clamp_indices])
return x
def train_step(self, x_input: np.ndarray, y_target: np.ndarray,
input_indices: np.ndarray, output_indices: np.ndarray) -> np.ndarray:
x0 = np.zeros(.model.W.shape[])
x0[input_indices] = x_input
x_free = .relax_to_equilibrium(x0)
x_clamped = .relax_to_equilibrium(
x0,
clamp_indices=output_indices,
clamp_values=y_target
)
dW = ( / .beta) * (
np.outer(x_clamped, x_clamped) - np.outer(x_free, x_free)
)
.model.W += .lr * dW
np.fill_diagonal(.model.W, )
{
: .model.energy(x_free),
: .model.energy(x_clamped),
: .model.energy(x_free) - .model.energy(x_clamped),
: np.linalg.norm(dW)
}
5.3 Contrastive Divergence for Deep EBMs
class ContrastiveDivergenceEBM:
"""Training deep energy-based models via CD-k."""
def __init__(self, energy_net, lr: float = 0.001, n_steps: int = 10):
self.energy_net = energy_net
self.lr = lr
self.n_steps = n_steps
def sample_negative(self, x_positive: np.ndarray, temperature: float = 1.0) -> np.ndarray:
"""Langevin dynamics for negative samples."""
x = x_positive.copy()
for _ in range(self.n_steps):
E_val, dE_dx = self.energy_net.energy_and_grad(x)
noise = np.random.randn_like(x) * np.sqrt(2 * temperature)
x = x - 0.01 * dE_dx + noise * np.sqrt(0.01)
return x
def train_step(self, x_data: np.ndarray) -> dict:
"""CD-k training step.
∇_θ E(x) = ∇_θ E(x_data) - ∇_θ E(x_negative)
"""
E_pos, dE_pos = self.energy_net.energy_and_grad(x_data)
x_neg = self.sample_negative(x_data)
E_neg, dE_neg = self.energy_net.energy_and_grad(x_neg)
d_theta = dE_pos - dE_neg
{
: d_theta,
: E_pos,
: E_neg,
: E_pos - E_neg
}
5.4 Landscape Sculpting Visualization
def visualize_landscape_evolution(model, initial_W, final_W, b,
resolution: int = 100,
bounds: tuple = (-2, 2)):
"""Visualize how learning reshapes the energy landscape."""
x1 = np.linspace(bounds[0], bounds[1], resolution)
x2 = np.linspace(bounds[0], bounds[1], resolution)
X1, X2 = np.meshgrid(x1, x2)
def compute_grid_energy(W):
energies = np.zeros_like(X1)
for i in range(resolution):
for j in range(resolution):
x = np.array([X1[i,j], X2[i,j]])
energies[i,j] = -0.5 * x @ W @ x - b @ x
return energies
E_before = compute_grid_energy(initial_W)
E_after = compute_grid_energy(final_W)
return {
'x1': x1, 'x2': x2,
'energy_before': E_before,
'energy_after': E_after,
'energy_change': E_before - E_after
}
6. Implementation Patterns
6.1 Modern Hopfield with PyTorch
import torch
import torch.nn as nn
class ModernHopfieldLayer(nn.Module):
"""Modern Hopfield layer for associative memory in deep networks.
Retrieval: x_new = X · softmax(β Xᵀ x)
where X are stored patterns (memory matrix).
"""
def __init__(self, dim: int, n_patterns: int, beta: float = 1.0):
super().__init__()
self.memories = nn.Parameter(torch.randn(n_patterns, dim) * 0.1)
self.beta = nn.Parameter(torch.tensor(beta))
self.dim = dim
def energy(self, x: torch.Tensor) -> torch.Tensor:
"""E(x) = -lse(β Xᵀ x) + ½‖x‖²"""
logits = self.beta * (self.memories @ x.T).T
lse = torch.logsumexp(logits, dim=-1)
return -lse + 0.5 * (x ** 2).sum(dim=-1)
def forward(self, x: torch.Tensor) -> torch.Tensor:
"""One-step retrieval: x → X · softmax(β Xᵀ x)"""
logits = self.beta * (x @ self.memories.T)
attention = torch.softmax(logits, dim=-1)
return attention @ self.memories
def () -> torch.Tensor:
_ (n_steps):
x = .forward(x)
x
(nn.Module):
():
().__init__()
layers = []
dims = [input_dim] + hidden_dims
i ((dims)-):
layers.extend([
nn.Linear(dims[i], dims[i+]),
nn.LayerNorm(dims[i+]),
nn.SiLU()
])
layers.append(nn.Linear(dims[-], ))
.feature_net = nn.Sequential(*layers)
() -> torch.Tensor:
features = .feature_net(x)
-(features ** ).(dim=-)
() -> :
x = x.requires_grad_()
E = .energy(x).()
dE_dx = torch.autograd.grad(E, x)[]
E.detach(), dE_dx.detach()
6.2 Score Matching for Training EBMs
class ScoreMatchingTrainer:
"""Train EBMs via score matching (Hyvärinen, 2005).
Avoids intractable partition function by matching
∇ₓ log p(x) = -∇ₓ E(x) to data score.
"""
def __init__(self, model, lr: float = 0.001):
self.model = model
self.lr = lr
self.optimizer = torch.optim.Adam(model.parameters(), lr=lr)
def compute_score_loss(self, x_data: torch.Tensor) -> torch.Tensor:
"""Sliced score matching loss.
L = E[½‖∇ₓE(x)‖² - tr(∇²ₓₓE(x))]
Using Hutchinson's trace estimator:
tr(∇²E) ≈ E[vᵀ ∇²E v] for random v ~ N(0, I)
"""
x = x_data.requires_grad_(True)
E = self.model.energy(x).sum()
dE_dx = torch.autograd.grad(E, x, create_graph=True)[0]
grad_norm_sq = (dE_dx ** 2).sum(dim=-1).mean()
v = torch.randn_like(x)
v_dot_grad = (dE_dx * v).sum()
hutchinson_trace = torch.autograd.grad(
v_dot_grad, x, create_graph=False
)[0]
trace_term = (hutchinson_trace * v).sum(dim=-1).mean()
loss = 0.5 * grad_norm_sq - trace_term
return loss
def train_step(self, x_data: torch.Tensor) -> dict:
.optimizer.zero_grad()
loss = .compute_score_loss(x_data)
loss.backward()
.optimizer.step()
{: loss.item()}
6.3 Langevin Sampling from EBMs
class LangevinSampler:
"""Generate samples from EBM via Langevin dynamics.
dx = -∇ₓE(x) dt + √(2T) dW
"""
def __init__(self, model, temperature: float = 1.0):
self.model = model
self.temperature = temperature
def sample(self, x0: torch.Tensor, n_steps: int = 1000,
step_size: float = 0.01) -> torch.Tensor:
"""Generate sample starting from noise."""
x = x0.clone().requires_grad_(True)
for _ in range(n_steps):
E, dE_dx = self.model.energy_and_grad(x)
noise = torch.randn_like(x) * np.sqrt(2 * self.temperature * step_size)
x = x.detach() - step_size * dE_dx + noise
x = x.requires_grad_(True)
x = torch.clamp(x, -5.0, 5.0)
return x.detach()
def annealed_sample(self, shape: tuple, n_temperatures: int = 10,
steps_per_temp: int = 100) -> torch.Tensor:
"""Annealed Langevin: gradually decrease temperature."""
temperatures = np.linspace(10.0, , n_temperatures)
x = torch.randn(shape) * np.sqrt(temperatures[])
T temperatures:
x = .sample(x, steps_per_temp, step_size= * T)
x
6.4 Modern Hopfield for Sequence Modeling
class HopfieldTransformerBlock(nn.Module):
"""Transformer block using modern Hopfield retrieval."""
def __init__(self, dim: int, n_heads: int = 4, beta: float = 1.0):
super().__init__()
self.heads = nn.ModuleList([
ModernHopfieldLayer(dim, dim // n_heads, beta)
for _ in range(n_heads)
])
self.proj = nn.Linear(dim, dim)
self.norm = nn.LayerNorm(dim)
self.mlp = nn.Sequential(
nn.Linear(dim, dim * 4),
nn.GELU(),
nn.Linear(dim * 4, dim)
)
def forward(self, x: torch.Tensor) -> torch.Tensor:
"""x shape: (batch, seq_len, dim)"""
head_outputs = []
for head in self.heads:
head_out = head(x)
head_outputs.append(head_out)
attn_out = self.proj(torch.cat(head_outputs, dim=-1))
x = self.norm(x + attn_out)
x = self.norm(x + self.mlp(x))
return x
7. Pitfalls and Best Practices
7.1 Common Pitfalls
| Pitfall | Symptom | Solution |
|---|
| Spurious attractors | Network converges to wrong pattern | Use modern Hopfield with log-sum-exp energy; increase capacity |
| Energy not decreasing | dE/dt > 0 during dynamics | Ensure W is symmetric; check activation monotonicity; verify Lyapunov conditions |
| Mode collapse | All samples converge to one attractor | Add regularization; use temperature scheduling; increase noise |
| Intractable partition function | Cannot compute normalized probabilities | Use score matching; use contrastive divergence; use noise-contrastive estimation |
| Slow convergence | Dynamics take too long to settle | Tune τ (time constant); use adaptive step sizes; check conditioning of W |
| Overfitting landscape | Perfect training energy, poor generalization | Regularize weights; use dropout in energy function; validate on held-out energy gaps |
| Gradient vanishing/exploding | Training unstable | Gradient clipping; weight normalization; spectral normalization of W |
| Non-convergence in high dim | Dynamics never reach equilibrium in large networks | Use layer-wise training; constrain spectral radius; use residual connections |
7.2 Best Practices Checklist
7.3 Capacity Bounds
def hopfield_capacity(n_neurons: int, alpha: float = 0.14) -> int:
"""Classical Hopfield capacity: p_max ≈ 0.14N patterns."""
return int(alpha * n_neurons)
def modern_hopfield_capacity(n_neurons: int, n_patterns: int) -> float:
"""Modern Hopfield can store exponentially many patterns.
Capacity scales as exp(n_neurons) rather than linear.
"""
return np.log2(n_patterns) / n_neurons
8. Activation Keywords
English
energy-based models, EBMs, neural dynamics, Hopfield networks, energy landscape, attractor dynamics, gradient flow, equilibrium propagation, contrastive learning, Lyapunov stability, associative memory, pattern completion, Boltzmann machine, score matching, Langevin sampling, modern Hopfield, dense associative memory, energy minimization, dynamical systems, biologically-plausible learning
中文
能量模型, 能量景观, 神经动力学, 吸引子动力学, 梯度流, 平衡传播, 对比学习, 李雅普诺夫稳定性, 联想记忆, 模式补全, 波尔兹曼机, 分数匹配, 朗之万采样, 现代Hopfield网络, 密集联想记忆, 能量最小化, 动力系统, 生物可学习规则
9. Related Skills
- eeg-hopfield-emotion-energy — Energy landscapes for EEG emotion analysis using Hopfield framework
- neuro-attractor-landscape-working-memory — Attractor dynamics in working memory neural circuits
- spikingjelly-framework — Spiking neural network framework (complementary dynamics paradigm)
- spiking-neural-network-analysis — Analysis of SNN dynamics and energy efficiency
- brain-inspired-snn-pattern-analysis — Brain-inspired pattern recognition with spiking dynamics
- thermodynamic-brain-connectivity — Thermodynamic analysis of brain networks
- neural-emulator-theory — Neural emulation theory and dynamical systems
- brain-graph-neural — Graph-based brain network analysis
- complex-kuramoto-control — Kuramoto model for coupled oscillator dynamics
- tsodyks-markram-chaotic-dynamics — Chaotic dynamics in synaptic transmission models
References
- Primary Paper: "Energy-Based Dynamical Models for Neurocomputation, Learning, and Optimization" — Montanari, Bullo, Krotov, Motter (arXiv:2604.05042, 2026)
- Hopfield, J.J. (1982). "Neural networks and physical systems with emergent collective computational abilities." PNAS, 79(8):2554–2558.
- Hopfield, J.J. (1984). "Neurons with graded response have collective computational properties like those of two-state neurons." PNAS, 81(10):3088–3092.
- Scellier, B. & Bengio, Y. (2017). "Equilibrium Propagation: Bridging the gap between energy-based models and backpropagation." Frontiers in Computational Neuroscience, 11:24.
- Krotov, D. & Hopfield, J.J. (2016). "Dense Associative Memory for Pattern Recognition." NeurIPS 2016.
- Hinton, G.E. (2002). "Training Products of Experts by Minimizing Contrastive Divergence." Neural Computation, 14(8):1771–1800.
- Ramsauer, H. et al. (2021). "Hopfield Networks is All You Need." ICLR 2021.
- LeCun, Y. et al. (2006). "A Tutorial on Energy-Based Learning." Predicting Structured Data, MIT Press.
- Hyvärinen, A. (2005). "Estimation of Non-Normalized Statistical Models by Score Matching." JMLR, 6:695–709.