dual-timescale-memory-spiking-neuron-astrocyte-navigation

star 1

Dual-timescale memory in spiking neuron-astrocyte networks for efficient navigation - combines STDP-based long-term memory and astrocyte-mediated short-term suppression of recently visited locations. Based on arXiv:2604.15391.

hiyenwong By hiyenwong schedule Updated 6/3/2026

name: dual-timescale-memory-spiking-neuron-astrocyte-navigation category: ai_collection description: "Dual-timescale memory in spiking neuron-astrocyte networks for efficient navigation - combines STDP-based long-term memory and astrocyte-mediated short-term suppression of recently visited locations. Based on arXiv:2604.15391." source_paper: "arXiv:2604.15391v1" paper_title: "Dual-Timescale Memory in a Spiking Neuron-Astrocyte Network for Efficient Navigation" authors: "Yuliya Tsybina, Evgenia Antonova, Sergey Shchanikov" date: "2026-04-16" keywords: ["spiking neural networks", "astrocytes", "working memory", "navigation", "dual timescale", "STDP", "short-term suppression", "reinforcement learning"] trigger: ["dual-timescale memory", "spiking neuron astrocyte", "navigation SNN", "astrocyte navigation", "short-term suppression", "STDP long-term memory"]

Dual-Timescale Memory in Spiking Neuron-Astrocyte Networks

Source Paper

  • Title: Dual-Timescale Memory in a Spiking Neuron-Astrocyte Network for Efficient Navigation
  • arXiv: 2604.15391v1
  • Date: April 16, 2026
  • Categories: q-bio.QM
  • PDF: https://arxiv.org/pdf/2604.15391v1.pdf

Overview

Biological agents navigate complex environments by combining long-term memory of successful actions with short-term suppression of recently visited locations — a capability difficult to replicate in artificial systems, especially under partial observability. This paper proposes a spiking neuron-astrocyte network that implements this dual-timescale memory mechanism for efficient navigation.

Core Concepts

Dual-Timescale Memory

  • Long-term memory: STDP-based learning of successful navigation sequences
  • Short-term memory: Astrocyte-mediated suppression of recently visited locations
  • Integration: Combined mechanism enables efficient exploration and exploitation

Spiking Neuron Architecture

  • Excitatory neurons: Encode spatial locations and actions
  • Inhibitory neurons: Provide lateral inhibition and pattern separation
  • Astrocytes: Slow modulatory signals for short-term suppression

Astrocyte Role

  • Gliotransmitter release: ATP, glutamate, D-serine modulate neural activity
  • Short-term depression: Astrocyte-mediated suppression lasts ~seconds
  • Spatial spread: Astrocyte processes cover multiple synapses
  • Energy metabolism: Glucose-lactate shuttle supports neural activity

Network Architecture

Input Layer (Sensory)
    ↓
Excitatory Neurons (Location/Action encoding)
    ↓ ↓
    ├→→→ Lateral inhibition (Inhibitory neurons)
    ↓
Astrocytes (Short-term suppression)
    ↓
Output Layer (Navigation decisions)

Neuron Models

import numpy as np
from typing import Tuple, List

class DualTimescaleNavigationNetwork:
    """Spiking neuron-astrocyte network for navigation."""
    
    def __init__(
        self,
        n_sensory: int = 100,
        n_excitatory: int = 200,
        n_inhibitory: int = 50,
        n_astrocytes: int = 40,
        dt: float = 1.0,  # ms
    ):
        self.dt = dt
        
        # Network dimensions
        self.n_s = n_sensory
        self.n_e = n_excitatory
        self.n_i = n_inhibitory
        self.n_a = n_astrocytes
        
        # Neuron states
        self.v_e = np.zeros(n_excitatory)  # Membrane potential (excitatory)
        self.v_i = np.zeros(n_inhibitory)  # Membrane potential (inhibitory)
        
        # Spike tracking
        self.spikes_e = np.zeros(n_excitatory)
        self.spikes_i = np.zeros(n_inhibitory)
        
        # Synaptic weights (long-term)
        self.W_se = np.random.randn(n_sensory, n_excitatory) * 0.01
        self.W_ee = np.random.randn(n_excitatory, n_excitatory) * 0.01
        self.W_ie = np.random.randn(n_inhibitory, n_excitatory) * 0.05
        self.W_ei = np.random.randn(n_excitatory, n_inhibitory) * 0.05
        
        # Astrocyte states (short-term)
        self.ca_a = np.zeros(n_astrocytes)  # Calcium concentration
        self.gt_a = np.zeros(n_astrocytes)  # Gliotransmitter level
        
        # Astrocyte-neuron connectivity
        self.W_ae = np.random.rand(n_astrocytes, n_excitatory) * 0.1
        self.W_ea = np.random.rand(n_excitatory, n_astrocytes) * 0.1
        
        # Time constants
        self.tau_m_e = 20.0  # ms (membrane time constant, excitatory)
        self.tau_m_i = 10.0  # ms (membrane time constant, inhibitory)
        self.tau_ca = 1000.0  # ms (astrocyte calcium, ~1 second)
        self.tau_gt = 500.0  # ms (gliotransmitter, ~0.5 second)
        
        # Thresholds
        self.v_th_e = -50.0  # mV
        self.v_th_i = -50.0  # mV
        self.v_reset = -70.0  # mV
        
        # STDP parameters (long-term learning)
        self.A_plus = 0.01
        self.A_minus = 0.01
        self.tau_plus = 20.0
        self.tau_minus = 20.0
        
        # Eligibility traces
        self.pre_trace = np.zeros(n_excitatory)
        self.post_trace = np.zeros(n_excitatory)
        
        # Recently visited suppression (astrocyte-mediated)
        self.visited_mask = np.zeros(n_excitatory)
        
    def step(self, sensory_input: np.ndarray, reward: float = 0.0) -> Tuple[np.ndarray, np.ndarray]:
        """Single network step.
        
        Args:
            sensory_input: Current sensory observation
            reward: Reward signal (for learning)
            
        Returns:
            output_spikes: Spikes from output neurons
            astrocyte_activity: Current astrocyte calcium levels
        """
        # --- Astrocyte dynamics (short timescale) ---
        # Calcium elevation from neural activity
        ca_input = np.dot(self.W_ea, self.spikes_e)
        self.ca_a += self.dt / self.tau_ca * (-self.ca_a + ca_input)
        
        # Gliotransmitter release
        self.gt_a += self.dt / self.tau_gt * (-self.gt_a + self.ca_a)
        
        # --- Neuron dynamics ---
        # Synaptic currents to excitatory neurons
        I_sensory = np.dot(sensory_input, self.W_se)
        I_recurrent = np.dot(self.spikes_e, self.W_ee)
        I_inhibitory = np.dot(self.spikes_i, self.W_ei)
        
        # Astrocyte-mediated suppression (short-term)
        I_astrocyte = -np.dot(self.gt_a, self.W_ae)
        
        # Total input to excitatory neurons
        I_e = I_sensory + I_recurrent + I_inhibitory + I_astrocyte + self.visited_mask
        
        # Excitatory neuron integration (LIF)
        dv_e = self.dt / self.tau_m_e * (-self.v_e + I_e)
        self.v_e += dv_e
        
        # Spike detection (excitatory)
        new_spikes_e = (self.v_e >= self.v_th_e).astype(float)
        self.v_e = np.where(new_spikes_e, self.v_reset, self.v_e)
        self.spikes_e = new_spikes_e
        
        # Inhibitory neuron dynamics
        I_i = np.dot(self.spikes_e, self.W_ie)
        dv_i = self.dt / self.tau_m_i * (-self.v_i + I_i)
        self.v_i += dv_i
        
        new_spikes_i = (self.v_i >= self.v_th_i).astype(float)
        self.v_i = np.where(new_spikes_i, self.v_reset, self.v_i)
        self.spikes_i = new_spikes_i
        
        # --- STDP-based learning (long timescale) ---
        if reward != 0:
            self._stdp_update(reward)
        
        # Update traces
        self.pre_trace += self.dt / self.tau_plus * (-self.pre_trace + self.spikes_e)
        self.post_trace += self.dt / self.tau_minus * (-self.post_trace + self.spikes_e)
        
        return self.spikes_e, self.ca_a
    
    def _stdp_update(self, reward: float):
        """Apply STDP with reward modulation.
        
        Long-term learning: potentiate synapses between co-active neurons.
        """
        # Pre-post STDP
        for i in range(self.n_e):
            for j in range(self.n_e):
                if self.spikes_e[j] > 0:  # Pre-synaptic spike
                    # Potentiation
                    self.W_ee[i, j] += self.A_plus * self.post_trace[i] * reward
                if self.spikes_e[i] > 0:  # Post-synaptic spike
                    # Depression
                    self.W_ee[i, j] -= self.A_minus * self.pre_trace[j] * reward
        
        # Keep weights bounded
        self.W_ee = np.clip(self.W_ee, 0, 1)
    
    def mark_visited(self, location_idx: int, duration: float = 2000.0):
        """Mark location as recently visited (astrocyte-like suppression).
        
        Args:
            location_idx: Index of visited location
            duration: Duration of suppression in ms
        """
        self.visited_mask[location_idx] = -10.0  # Strong inhibition
        
        # Decay over time
        self.visited_mask *= np.exp(-self.dt / duration)
    
    def navigate(self, env, max_steps: int = 1000) -> dict:
        """Navigate environment using dual-timescale memory.
        
        Args:
            env: Navigation environment (must have reset(), step(action), get_observation())
            max_steps: Maximum navigation steps
            
        Returns:
            results: Navigation statistics
        """
        obs = env.reset()
        trajectory = []
        total_reward = 0.0
        
        for step in range(max_steps):
            # Get network response
            spikes, _ = self.step(obs)
            
            # Decode action from spikes (e.g., most active neuron)
            action = np.argmax(spikes)
            
            # Mark current location as visited (short-term memory)
            self.mark_visited(action)
            
            # Execute action
            obs, reward, done, info = env.step(action)
            total_reward += reward
            
            trajectory.append({
                'step': step,
                'action': action,
                'observation': obs,
                'reward': reward,
                'spikes': spikes.copy(),
                'astrocyte_ca': self.ca_a.copy()
            })
            
            # Learning signal on reward
            if reward > 0:
                self._stdp_update(reward)
            
            if done:
                break
        
        return {
            'trajectory': trajectory,
            'total_reward': total_reward,
            'steps': step + 1,
            'success': info.get('success', False)
        }


class SimpleNavigationEnvironment:
    """Simple grid navigation environment for testing."""
    
    def __init__(self, grid_size: int = 10, n_goals: int = 3):
        self.grid_size = grid_size
        self.n_goals = n_goals
        self.state = (0, 0)
        self.goals = []
        
    def reset(self):
        self.state = (0, 0)
        self.visited_goals = set()
        # Random goal locations
        self.goals = [
            (np.random.randint(0, self.grid_size), 
             np.random.randint(0, self.grid_size))
            for _ in range(self.n_goals)
        ]
        return self._get_observation()
    
    def _get_observation(self):
        # Encode position as sensory input
        obs = np.zeros(self.grid_size * self.grid_size)
        idx = self.state[0] * self.grid_size + self.state[1]
        obs[idx] = 1.0
        return obs
    
    def step(self, action: int):
        # Decode action: 0=up, 1=down, 2=left, 3=right
        x, y = self.state
        if action == 0: x = max(0, x-1)
        elif action == 1: x = min(self.grid_size-1, x+1)
        elif action == 2: y = max(0, y-1)
        elif action == 3: y = min(self.grid_size-1, y+1)
        
        self.state = (x, y)
        
        # Check for goal
        reward = 0.0
        done = False
        if self.state in self.goals and self.state not in self.visited_goals:
            reward = 1.0
            self.visited_goals.add(self.state)
            if len(self.visited_goals) == self.n_goals:
                done = True
        
        info = {'success': len(self.visited_goals) == self.n_goals}
        return self._get_observation(), reward, done, info

Key Findings

1. Navigation Performance

  • Dual-timescale memory significantly improves navigation efficiency
  • Short-term suppression prevents revisiting recently explored locations
  • Long-term learning enables exploitation of successful paths
  • Combined mechanism outperforms single-timescale approaches

2. Astrocyte Dynamics

  • Astrocyte calcium elevation correlates with location visits
  • Gliotransmitter release creates transient suppression (~seconds)
  • Suppression decays exponentially, allowing eventual revisits
  • Spatial distribution of astrocytes enables graded suppression

3. STDP Learning

  • Long-term potentiation encodes successful navigation sequences
  • Reward-modulated STDP accelerates learning
  • Synaptic weights stabilize after ~100 trials
  • Path encoding shows sequence-specific activation patterns

4. Energy Efficiency

  • Astrocyte-mediated suppression reduces redundant exploration
  • Combined memory reduces total steps to goal by ~40%
  • Energy savings scale with environment complexity
  • Particularly effective in partially observable environments

Applications

1. Robotic Navigation

# Robot navigation with dual-timescale memory
network = DualTimescaleNavigationNetwork(
    n_sensory=robot.sensor_dim,
    n_excitatory=500,
    n_astrocytes=100
)

results = network.navigate(robot_env, max_steps=10000)

2. Autonomous Exploration

  • Planetary exploration rovers
  • Underwater autonomous vehicles
  • Search and rescue robots
  • Warehouse automation

3. Reinforcement Learning

  • Combining SNNs with RL algorithms
  • Sample-efficient navigation learning
  • Bio-inspired exploration strategies
  • Multi-agent coordination

Related Skills

  • [[astrocyte-resource-diffusion-neural-fields]]
  • [[astrocyte-mediated-working-memory]]
  • [[snn-working-memory-heterogeneous-delays]]
  • [[working-memory-heterogeneous-delays]]

References

  • Tsybina et al. (2026). Dual-Timescale Memory in a Spiking Neuron-Astrocyte Network for Efficient Navigation. arXiv:2604.15391v1.
  • Araque et al. (2014). Gliotransmitters travel in time and space. Neuron.
  • Volman et al. (2011). Calcium dynamics in astrocyte networks.
Install via CLI
npx skills add https://github.com/hiyenwong/ai_collection --skill dual-timescale-memory-spiking-neuron-astrocyte-navigation
Repository Details
star Stars 1
call_split Forks 0
navigation Branch main
article Path SKILL.md
More from Creator