Skip to main content

Winner-Take-All Competition

Winner-Take-All (WTA) lateral inhibition enforces competition among neurons so that different filters learn different features [1]. SpikeSEG uses two complementary mechanisms that operate simultaneously.

Mechanisms

Global Intra-Map Inhibition

Within each feature map, the first neuron to fire inhibits all other neurons in the same map for the remainder of the stimulus. This ensures each learned feature activates at most one spatial location per input.

Local Inter-Map Inhibition

At each spatial position, a firing neuron inhibits neurons in other feature maps within a local radius rr. This encourages different features to activate at different locations, increasing spatial diversity.

"We use a winner-take-all (WTA) mechanism to enforce competition among neurons. The first neuron that fires inhibits the others, preventing them from firing and receiving plasticity updates." [1]

Configuration

ModeConfig valueBehaviour
Global only"global"Intra-map inhibition only
Local only"local"Inter-map inhibition only
Both"both"Paper default: global + local

Homeostatic Plasticity

Without regulation, a small subset of neurons may dominate (fire on every input) while others become "dead" (never fire). Adaptive thresholds restore balance:

θnew=θold+θ+(after spike)\theta_{\text{new}} = \theta_{\text{old}} + \theta^{+} \qquad \text{(after spike)} θnew=θoldθoldθrestτθ(decay toward rest)\theta_{\text{new}} = \theta_{\text{old}} - \frac{\theta_{\text{old}} - \theta_{\text{rest}}}{\tau_\theta} \qquad \text{(decay toward rest)}
ParameterSymbolDefaultPurpose
Rest thresholdθrest\theta_{\text{rest}}0.1Baseline threshold
Incrementθ+\theta^{+}0.02Penalty for firing
Time constantτθ\tau_\theta500Decay rate
Maximumθmax\theta_{\max}10.0Cap on threshold

Additionally, dead neuron recovery perturbs the weights of neurons whose firing rate falls below a threshold (dead_threshold = 0.01), giving them a chance to learn new features.

Implementation

from spikeseg.learning import WTAInhibition, WTAConfig, WTAMode

config = WTAConfig(
mode=WTAMode.BOTH,
local_radius=2,
enable_homeostasis=True,
target_rate=0.1,
)

wta = WTAInhibition(config=config, n_channels=36, spatial_shape=(32, 32))

# Apply WTA to a spike tensor
filtered_spikes, winner_mask = wta(spikes, membrane, pre_reset_membrane)

See API: Learning for AdaptiveThreshold and ConvergenceTracker.