Skip to content
Back to skills

Adult Neurogenesis Olfactory Representational Stability

ASecurity

Adult-neurogenesis dual role methodology — spiking network model showing how continuous addition of new neurons supports both odor representational stability and flexibility in olfactory circuits.

  • 3 stars
  • 0 votes
  • 0 copies
  • 6 views
  • Added September 11, 2026
researchpythongo

Security analysis

A100/100

Scanned September 11, 2026

npx -y skills add hiyenwong/ai_collection --skill adult-neurogenesis-olfactory-representational-stability --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Adult Neurogenesis Olfactory Representational Stability?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Adult Neurogenesis Olfactory Representational Stability
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/hiyenwong-adult-neurogenesis-olfactory-representational-stab/badge)](https://www.skillsdirectory.com/skills/hiyenwong-adult-neurogenesis-olfactory-representational-stab)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: adult-neurogenesis-olfactory-representational-stability
description: Adult-neurogenesis dual role methodology — spiking network model showing how continuous addition of new neurons supports both odor representational stability and flexibility in olfactory circuits.
tags: [neuroscience, neurogenesis, olfactory-system, representational-drift, spiking-network, computational-neuroscience, plasticity, neural-coding, brain-network]
created: 2026-05-27
source: "DOI: 10.7554/eLife.107905 | PMID: 42112574"
---

# Adult-Neurogenesis Allows for Representational Stability and Flexibility in Early Olfactory System

## Overview

This methodology from Chen & Padmanabhan (eLife, 2026) uses a **detailed spiking network model of early olfactory circuits** to reveal how adult neurogenesis (continuous addition of new neurons throughout life) simultaneously enables two seemingly opposing properties:

1. **Representational stability**: faithful odor encoding at the population level
2. **Representational flexibility/drift**: experience-dependent plasticity and learning

The model covers two major olfactory processing stages with distinct computational roles.

## Core Model Architecture

### Stage 1: Main Olfactory Bulb (MOB)
- Adult neurogenesis affects **individual cell responses** but **preserves population-level representations**
- New neurons (granule cells) provide inhibitory interneuron replacement
- Net effect: individual mitral/tufted cells shift, but population code remains robust
- Mechanism: lateral inhibition redistribution via new granule cells

### Stage 2: Piriform Cortex (PCx)
- Both individual cell responses AND population dynamics undergo progressive change
- **Representational drift**: stimulus-evoked activity patterns gradually change
- Drift rate is experience-dependent — repeated odor exposure reduces drift
- Implements a form of temporal context coding

## Key Findings

1. **MOB preserves population code**: Even as individual neurons are replaced/rewired, the high-dimensional population vector representation of each odor remains stable
2. **PCx implements representational drift**: The cortex continuously updates its odor representations — encoding not just *what* but *when*
3. **Experience protects stability**: Frequently encountered odors have more stable representations (reduced drift)
4. **Dual functional role**: Same neurogenesis process serves both stability (MOB) and flexibility (PCx) via different circuit mechanisms

## Spiking Network Model

```python
import numpy as np
from typing import List, Tuple

class OlfactoryBulbModel:
    """Simplified spiking network model of main olfactory bulb."""
    
    def __init__(self, n_glomeruli=200, n_mitral=200, n_granule=1000,
                 neurogenesis_rate=0.01):
        self.n_glom = n_glomeruli
        self.n_mitral = n_mitral
        self.n_granule = n_granule
        self.neurogenesis_rate = neurogenesis_rate  # Fraction replaced per day
        
        # Connectivity matrices
        self.W_olf_mitral = np.random.randn(n_mitral, n_glomeruli) * 0.1
        self.W_granule_mitral = np.random.randn(n_mitral, n_granule) * 0.05
        self.W_mitral_granule = np.random.randn(n_granule, n_mitral) * 0.05
        
        # Neuron properties
        self.tau_m = 20e-3   # Membrane time constant (s)
        self.V_rest = -65.0  # Resting potential (mV)
        self.V_thresh = -50.0  # Spike threshold (mV)
        
    def apply_neurogenesis(self, n_replace=None):
        """Replace a fraction of granule cells with new neurons."""
        if n_replace is None:
            n_replace = int(self.n_granule * self.neurogenesis_rate)
        
        replace_idx = np.random.choice(self.n_granule, n_replace, replace=False)
        
        # New neurons have weak, random connections (not yet integrated)
        self.W_granule_mitral[:, replace_idx] = np.random.randn(self.n_mitral, n_replace) * 0.01
        self.W_mitral_granule[replace_idx, :] = np.random.randn(n_replace, self.n_mitral) * 0.01
        
        return replace_idx
    
    def simulate_response(self, odor_input, dt=0.1e-3, duration=0.5):
        """Simulate network response to odor stimulus using LIF neurons."""
        n_steps = int(duration / dt)
        
        V_mitral = np.ones(self.n_mitral) * self.V_rest
        V_granule = np.ones(self.n_granule) * self.V_rest
        
        spikes_mitral = np.zeros((n_steps, self.n_mitral))
        
        for t in range(n_steps):
            # Feedforward from glomeruli
            I_ff = self.W_olf_mitral @ odor_input
            
            # Lateral inhibition from granule cells
            I_inh = self.W_granule_mitral @ (V_granule > self.V_thresh).astype(float)
            
            # Update mitral cell voltages
            dV_m = (-(V_mitral - self.V_rest) + I_ff - I_inh) / self.tau_m * dt
            V_mitral += dV_m
            
            # Spike detection and reset
            fired = V_mitral >= self.V_thresh
            spikes_mitral[t] = fired
            V_mitral[fired] = self.V_rest
            
            # Update granule cells
            I_exc = self.W_mitral_granule @ fired.astype(float)
            dV_g = (-(V_granule - self.V_rest) + I_exc) / self.tau_m * dt
            V_granule += dV_g
        
        return spikes_mitral
    
    def population_vector(self, spikes, time_window=0.1):
        """Compute population firing rate vector for odor representation."""
        return np.mean(spikes[-int(time_window / 0.1e-3):], axis=0)


class RepresentationalDriftAnalysis:
    """Analyze representational drift across neurogenesis events."""
    
    @staticmethod
    def cosine_similarity(v1: np.ndarray, v2: np.ndarray) -> float:
        """Compute cosine similarity between two population vectors."""
        norm1, norm2 = np.linalg.norm(v1), np.linalg.norm(v2)
        if norm1 == 0 or norm2 == 0:
            return 0.0
        return np.dot(v1, v2) / (norm1 * norm2)
    
    @staticmethod
    def measure_drift(representations: List[np.ndarray]) -> np.ndarray:
        """Measure drift over time as cosine distance from initial representation."""
        initial = representations[0]
        return np.array([
            1 - RepresentationalDriftAnalysis.cosine_similarity(initial, r)
            for r in representations
        ])
    
    @staticmethod
    def experience_dependent_protection(model, odor, n_exposures=50,
                                        neurogenesis_per_day=10):
        """
        Simulate repeated odor exposure and measure drift reduction.
        
        Returns drift trajectory with vs without repeated exposure.
        """
        # Baseline: no experience
        reps_naive = []
        for _ in range(20):
            model.apply_neurogenesis(neurogenesis_per_day)
            spikes = model.simulate_response(odor)
            reps_naive.append(model.population_vector(spikes))
        
        # Reset model
        model2 = OlfactoryBulbModel()
        reps_experienced = []
        for day in range(20):
            model2.apply_neurogenesis(neurogenesis_per_day)
            # Repeated odor exposure strengthens synapses (Hebbian)
            if day % 2 == 0:  # Exposure every other day
                for _ in range(n_exposures):
                    spikes = model2.simulate_response(odor)
                    # Hebbian plasticity: strengthen connections for this odor
                    pvec = model2.population_vector(spikes)
                    model2.W_olf_mitral += 0.001 * np.outer(pvec, odor)
            
            spikes = model2.simulate_response(odor)
            reps_experienced.append(model2.population_vector(spikes))
        
        naive_drift = RepresentationalDriftAnalysis.measure_drift(reps_naive)
        exp_drift = RepresentationalDriftAnalysis.measure_drift(reps_experienced)
        return naive_drift, exp_drift
```

## When to Use

- Modeling adult neurogenesis effects in hippocampus, olfactory bulb, or cortex
- Studying representational drift in sensory systems
- Building computational models of learning-induced circuit changes
- Understanding how biological neural networks balance stability and plasticity
- Modeling olfactory system computations (odor discrimination, recognition)
- Continual learning in artificial neural networks inspired by neurogenesis

## Key Insights for AI Systems

| Biological Principle | AI Application |
|---------------------|----------------|
| MOB population stability | Ensemble methods for stable feature representations |
| PCx representational drift | Temporal context encoding in sequence models |
| Experience-dependent protection | Rehearsal/replay in continual learning |
| Neurogenesis turnover | Growing neural networks, neuron dropout/replacement |

## Pitfalls

- Neurogenesis rate is species/region-specific (mice: ~1-2% granule cells/day in OB)
- New neuron integration time (weeks) must be modeled for accurate drift dynamics
- Model granularity (single neuron vs. population) affects stability predictions
- Experience-dependent stabilization requires realistic exposure statistics

## Parameters

| Parameter | Description | Biological Value |
|-----------|-------------|-----------------|
| Neurogenesis rate | Fraction cells replaced/day | 0.5–2% (OB granule) |
| Integration time | New neuron maturation | 2–4 weeks |
| Drift timescale | Days to weeks for PCx drift | Weeks–months |
| Stabilization threshold | Exposures to protect representation | 20–100 |

## References

- Chen Z, Padmanabhan K. "Adult-neurogenesis allows for representational stability and flexibility in early olfactory system." *eLife*, 2026. DOI: 10.7554/eLife.107905
- Bhattacharya S, Bhattacharya S. "Olfactory bulb granule cells: New neurons in an old circuitry." *Progress in Neurobiology*, 2020.
- Rangel LM et al. "Temporally selective contextual encoding in the dentate gyrus of the hippocampus." *Nature Communications*, 2016.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…