Manifold-constrained plasticity enables stable learning in recurrent neural circuits.
The 5 matches · 3 of them tie a paragraph to a whole file, not to given lines: weak matches, whose lines are not tinted
- [1] § Results › Decoder performance depends on alignment with the intrinsic activity manifold ↔ SPLIT2.m, lines 1–140 · score 0.55 · random rotation, outside manifold, QR, orthogonal, matrix, orthonormal
- [2] § Results › Manifold-constrained learning stabilizes decoder adaptation in low-dimensional networks ↔ SPLIT3.m, the whole file · a weak match · score 0.53 · neural space, low dimensional manifold, high dimensional, decoder updates, reconstruct, adaptation
- [3] § Results › Manifold-constrained learning stabilizes decoder adaptation in low-dimensional networks ↔ SPLIT1.m, the whole file · a weak match · score 0.53 · neural space, low dimensional manifold, high dimensional, decoder updates, reconstruct, adaptation
- [4] § Results › SPLiT outperforms existing drift-adaptation rules under constrained dynamics ↔ ideal_observer1.m, the whole file · a weak match · score 0.53 · postsynaptic neuron, inverse correlation, readout, dynamics
- [5] § Results › Decoder performance depends on alignment with the intrinsic activity manifold ↔ SPLIT2.m, lines 1–140 · score 0.52 · orthogonal rotation, latent coordinates, remapped, subspace, perturbations, activity
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
MATLAB · 259 lines · 9.3 KB · no license · 2 matches
- clear all;
- warning off all
- rng(1);
- % == Parameters ===
- N = 25; %(25)
- dt = 0.01; %0.01
- tau = 0.3; %(0.3)
- eta_r = 0.001; % step size for random drift in activity (0.001)
- proj_dim = 1; % dimension of low-D manifold (1)
- g = 1.5; % gain for initial weights (1.5)
- alpha = 1.5; % feedback strength (1.5)
- eta_U = 0.01; %Oja manifold adaptation rate (0.01)
- feedback_ratio = 1; %increase when increasing proj_dim (1)
- lambda = 0.1; %decoder learning rate (0.1)
- use_within_manifold = false;
- perturb_mode = 'outside'; % 'within' or 'outside' or 'none'
- theta = pi/2; % "outside-ness": 0 = fully within; pi/2 = fully orthogonal
- target_noise_var = 0;
- % Target output: center out task
- centerout;
- z2 = repmat(z_target,1,3);
- z_target = z2;
- steps = size(z_target,2);
- T = steps*dt;
- % === Fixed manifold basis ===
- U_fixed = orth(randn(N, proj_dim)); % low-D manifold
- % === Initialization ===
- x = 0.1 * randn(N,1);
- r = tanh(x);
- s = U_fixed' * r; % low-D coordinates if using manifold
- % Fixed recurrent weights
- W = g * randn(N, N) / sqrt(N);
- W_red = U_fixed' * W * U_fixed; % projected weights for low-D dynamics
- desired_rho = 1;
- rho_red = max(abs(eig(W_red)));
- W_red = W_red / max(1, rho_red / desired_rho);
- % Low-D basis (Oja's rule)
- U = orth(randn(N, proj_dim));
- D_proj = zeros(2, proj_dim); % decoder for 2D output
- % Logging
- r_log = zeros(N, steps);
- z_out = zeros(2, steps);
- % ============================
- % Perturbation configuration
- % ============================
- out_dim = size(z_target,1); % 1 for sine, 2 for cursor, etc.
- D_proj = zeros(out_dim, proj_dim); % decoder
- z_out = zeros(out_dim, steps);
- k_pert = round(steps/2); % apply perturbation halfway
- % --- Within-manifold: latent coordinate remapping P ---
- % Use either a permutation or a random rotation.
- P = eye(proj_dim); % no perturbation initially
- use_rotation = true; % true = random orthogonal rotation; false = permutation
- % --- Outside-manifold: build a subspace U_perp orthogonal to U_fixed ---
- % (same dimension as manifold)
- U_perp = randn(N, proj_dim);
- U_perp = U_perp - U_fixed*(U_fixed' * U_perp); % remove components in span(U_fixed)
- U_perp = orth(U_perp); % orthonormalize
- % --- I/O basis used for decoding + feedback injection (starts unperturbed) ---
- U_io = U; % by default, same as your learned Oja basis
- % === Freeze Oja for a short window after perturbation ===
- oja_freeze_start = 1601;
- oja_freeze_end = 1600*2;
- freeze_dec_len = round(0.1*steps); % x% window
- dec_freeze_end = oja_freeze_end;
- lambda0 = lambda;
- % === Weight-change logging ===
- dD_norm = zeros(1, steps); % magnitude of decoder update
- for k = 1:steps
- % ================================================================
- % Apply perturbation at k_pert (BCI mapping change)
- % ================================================================
- if k == k_pert
- switch lower(perturb_mode)
- case 'within'
- % Keep U_io the same, change only latent coordinates via P
- if use_rotation
- % Random orthogonal rotation: P'P = I
- [Q,~] = qr(randn(proj_dim));
- P = Q;
- D_proj = D_proj * P'; %optional
- else
- % Permutation matrix
- p = randperm(proj_dim);
- P = eye(proj_dim);
- P = P(:,p);
- end
- case 'outside'
- % Keep P = I; change the basis used for readout/feedback to include orthogonal component
- P = eye(proj_dim);
- % Mix current U with an orthogonal-to-U_fixed subspace
- % (and re-orthonormalize)
- U_io = orth(cos(theta)*U + sin(theta)*U_perp);
- otherwise
- % 'none'
- P = eye(proj_dim);
- U_io = U;
- end
- use_within_manifold = false; %MODIFIED HERE: SETTING OUTSIDE MANIFOLD AFTER PERTURBATION
- end
- if use_within_manifold
- % ================================================================
- % 1) Compute feedback from current activity (pre-update)
- % ================================================================
- % Current low-D readout coordinates (for decoding only)
- y_fb = U_io' * r; % proj_dim x 1
- y_fb_eff = P * y_fb; % perturbed latent coords (within-manifold)
- z_fb = D_proj * y_fb_eff; % out_dim x 1
- % Mix target and current output (same as before)
- feedback = (1 - feedback_ratio) * z_fb + feedback_ratio * z_target(:,k);
- feedback = min(max(feedback, -2), 2);
- %MODIFIED HERE: SETTING FEEDBACK TO ZERO
- %%%%%%%%%%%%%%%%%%%%%
- % feedback = zeros(1,2)';
- %%%%%%%%%%%%%%%%%%%%%
- % Map feedback back into neural space, then project into manifold
- % Effective decoder under within-manifold perturbation:
- % z = D_proj * (P * (U_io' r)) => D_eff = D_proj * P
- D_eff = D_proj * P;
- I_fb_full = alpha * U_io * (D_eff') * feedback; % N x 1
- I_fb_low = U_fixed' * I_fb_full; % proj_dim x 1
- % ================================================================
- % 2) Low-dimensional manifold dynamics for s
- % ================================================================
- d_s_rec = (-s + W_red * s) / tau; % recurrent term
- d_s_noise = (eta_r * sqrt(N/proj_dim)) * randn(proj_dim,1); % noise
- % Add feedback as an extra driving term in low-D
- s = s + dt * (d_s_rec + I_fb_low) + d_s_noise;
- % ================================================================
- % 3) Reconstruct full activity strictly within manifold
- % ================================================================
- x = U_fixed * s; % latent variable along manifold
- r = tanh(x); % N x 1 activity on manifold
- % Optional numerical safety on r/x (not used for dynamics here)
- r_clipped = max(min(r, 0.999), -0.999);
- x = atanh(r_clipped);
- else
- % ================================================================
- % Unconstrained high-dimensional dynamics (original branch)
- % ================================================================
- d_r = eta_r * randn(N,1);
- r = tanh(r + dt * (-r + W * r) / tau + d_r);
- r_clipped = max(min(r, 0.999), -0.999);
- x = atanh(r_clipped);
- end
- % ================================================================
- % 4) Oja's Rule for low-D decoder basis U
- % Freeze temporarily after perturbation
- % ================================================================
- if ~(k >= oja_freeze_start && k < oja_freeze_end)
- r_centered = r - mean(r);
- for i = 1:proj_dim
- u = U(:,i);
- % (r_proj/var_proj not needed for your delta_u form; can remove if you want)
- delta_u = eta_U * (r_centered * (r_centered' * u) - (u' * u) * u);
- U(:,i) = u + delta_u;
- end
- U = orth(U); % re-orthonormalize decoder basis
- end
- % Keep default I/O basis tied to current U unless we're in "outside" mode
- % where U_io is explicitly set at perturbation and should remain fixed.
- if ~strcmpi(perturb_mode,'outside')
- U_io = U;
- end
- % ================================================================
- % 5) Update decoder D_proj using OP-LMS (unchanged)
- % Uses updated r (post-dynamics) but same time index k
- % ================================================================
- y = U_io' * r; % proj_dim x 1
- y_eff = P * y; % perturbed latent coords
- z = D_proj * y_eff; % out_dim x 1
- z_out(:,k) = z;
- if k >= k_pert && k < dec_freeze_end
- lambda_eff = 0; % no learning immediately after perturbation
- else
- lambda_eff = lambda0; % relearn afterwards
- end
- err = z - z_target(:,k) + randn(out_dim,1).*target_noise_var;
- y_eff_norm = y_eff / (norm(y_eff) + 1e-8);
- dD = -lambda_eff * err * (y_eff_norm)'; % out_dim x proj_dim
- D_proj = D_proj + dD;
- dD_norm(k) = norm(dD, 'fro');
- % ================================================================
- % 6) Logging
- % ================================================================
- r_log(:,k) = r;
- end
- z = z_target(:,1600*2+1:end);
- o = z_out(:,1600*2+1:end);
- final_err = mean((z(:)-o(:)).^2);
- %plot center-out task
- %initial learning
- figure;
- plot(z_target(1,1:1600), z_target(2,1:1600), 'Color', [181 59 59]./255,'linewidth',12);
- hold on;
- plot(z_out(1,1:1600), z_out(2,1:1600),'Color', [158 159 43]./255,'linewidth',6);
- axis off
- %recovery after perturbation
- figure;
- plot(z_target(1,1600*2+1:end), z_target(2,1600*2+1:end), 'Color', [181 59 59]./255,'linewidth',12);
- hold on;
- plot(z_out(1,1600*2+1:end), z_out(2,1600*2+1:end),'Color', [158 159 43]./255,'linewidth',6);
- axis off
SPLIT2.m, no license · at the source
Overview
- School of Psychology, University of Ottawa, Ottawa, Canada
- Brain and Mind Research Institute, University of Ottawa, Ottawa, Canada
Abstract
The activity of large neuronal populations is often confined to low-dimensional manifolds that can drift over time, posing a challenge for learning rules that assume stable, full-rank representations. Here, we introduce SPLiT (Synaptic Projection Learning with intrinsic Tracking), a synaptic plasticity rule for recurrent neural networks that combines unsupervised manifold tracking with supervised learning. SPLiT uses an online Oja rule to continuously estimate the intrinsic low-dimensional activity subspace and performs normalized least-mean-squares learning in manifold coordinates. In this way, SPLiT keeps synaptic weights aligned with evolving population dynamics. Using a rate-based recurrent network, we show that SPLiT reliably learns time-varying target signals under both constrained dynamics, where activity is restricted to a fixed low-dimensional manifold, and unconstrained dynamics exhibiting changes in the dominant activity subspace. We show that manifold-constrained learning with SPLiT yields faster convergence, less sensitivity to recurrent gain, smaller weight updates, and is more robust to noisy teaching signals. Analytical results show that SPLiT learns the optimal decoder projected onto the instantaneous principal subspace and maintains bounded error under drift. Together, these findings provide a mechanistic account of how synaptic plasticity can leverage the structure of neural manifolds to enable stable and efficient supervised learning despite representational drift.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 5 matches between paragraphs and lines of code.
supp:PMC13529248/pcbi.1014719.s002.zip
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
10 files
- SPLIT1.m, MATLAB, 149 lines, 1 match
- SPLIT2.m, MATLAB, 259 lines, 2 matches
- SPLIT3.m, MATLAB, 148 lines, 1 match
- associative_memory1.m, MATLAB, 138 lines
- bayesian_inference1.m, MATLAB, 101 lines
- continuous_learning1.m, MATLAB, 110 lines
- ideal_observer1.m, MATLAB, 132 lines, 1 match
- online_LMS1.m, MATLAB, 154 lines
- predictive_coding1.m, MATLAB, 132 lines
- README.txt, Text, 15 lines
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 9 scripts, each with its path and the digest of its content;
- 5 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data Availability
All relevant data are within the manuscript and its Supporting Information files.
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 2 authors, 11 MeSH terms, 2 funders, 80 references.
Cite
This paper
Godin, C., & Thivierge, J.-P. (2026). Manifold-constrained plasticity enables stable learning in recurrent neural circuits. PLoS computational biology, 22(8), e1014719. https://
BibTeX
@article{godin2026manifo
author = {Godin, Camille and Thivierge, Jean-Philippe},
title = {{Manifold-constrained plasticity enables stable learning in recurrent neural circuits}},
journal = {PLoS computational biology},
year = {2026},
month = aug,
volume = {22},
number = {8},
pages = {e1014719},
publisher = {PLOS},
issn = {1553-734X},
doi = {10.1371/
url = {https://
pmid = {42640956},
pmcid = {PMC13529248}
}
RIS
TY - JOUR
AU - Godin, Camille
AU - Thivierge, Jean-Philippe
TI - Manifold-constrained plasticity enables stable learning in recurrent neural circuits
T2 - PLoS computational biology
J2 - PLoS Comput Biol
PY - 2026
DA - 2026/
VL - 22
IS - 8
SP - e1014719
SN - 1553-734X
PB - PLOS
DO - 10.1371/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1371/
"type": "article-journal",
"title": "Manifold-constrained plasticity enables stable learning in recurrent neural circuits",
"container-title": "PLoS computational biology",
"author": [
{
"family": "Godin",
"given": "Camille"
},
{
"family": "Thivierge",
"given": "Jean-Philippe"
}
],
"container-title-short":
"volume": "22",
"issue": "8",
"page": "e1014719",
"DOI": "10.1371/
"PMID": "42640956",
"PMCID": "PMC13529248",
"ISSN": "1553-734X",
"publisher": "PLOS",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
25
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1016/j.neuron.2026.07.016 [code]
- Inferring brain-wide interactions using data-constrained recurrent neural network models.Journal: NeuronIn common: 11 references
- [2] doi:10.1371/journal.pone.0321830
- Long-term neuron tracking reveals balance of stability and plasticity in functional properties.Journal: PloS oneIn common: 8 references
- [3] doi:10.1371/journal.pcbi.1014297 [code]
- Statistics of cortical representational drift can enable robust readout.Journal: PLoS computational biologyIn common: 6 references
- [4] doi:10.1016/j.isci.2026.117492 [code]
- Neural subspace reorganization reflects value-based decision-making.Journal: iScienceIn common: 7 references
- [5] doi:10.1038/s42003-026-10036-y
- Drifting population dynamics with transient resets characterize sensorimotor transformation in the monkey superior colliculus.Journal: Communications biologyIn common: 7 references
- [6] doi:10.3390/biomimetics11080569 [code]
- Pretraining of Embodied Recurrent Networks Bridges the Gap Between Artificial and Cortical Neural Activities.Journal: Biomimetics (Basel, Switzerland)In common: 7 references
- [7] doi:10.1038/s41598-026-55225-1 [code]
- Benchmarking criteria to determine latent linear dimensionality in neural data.Journal: Scientific reportsIn common: 7 references
- [8] doi:10.1080/26941899.2026.2619222
- Neurodatascience: Past, Present, and Future.Journal: Data science in scienceIn common: 7 references
- [9] doi:10.1371/journal.pcbi.1014162 [code]
- Exploring neural manifolds across a wide range of intrinsic dimensions.Journal: PLoS computational biologyIn common: 6 references
- [10] doi:10.1038/s41467-026-75924-7 [code]
- Data-driven reduced modeling of neural dynamics.Journal: Nature communicationsIn common: 6 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 9 scripts, and 5 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:4d5d90bde3ab415c…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[.
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
