~/satyajit

Diffusing blame: credit assignment under Dale's principle

mdjsonmcp

2026-07-17 · 12 min · deep-learning · credit-assignment · biologically-plausible · backpropagation · theory · explainer

Diffusing Blame asks a sharp question: can a network learn useful representations while obeying the one rule real brains never break? That rule is Dale's principle — a neuron is either excitatory or inhibitory, and every synapse it makes carries that one sign. Backpropagation quietly violates a stack of constraints like this. The paper builds a network that respects them, trains it with a rule called Error Diffusion, and asks how far it gets. The answer: 96.7% on MNIST, a 61.7% baseline on CIFAR-10, and reinforcement-learning agents that hold their own against a backprop-free baseline — all while enforcing Dale's principle strictly. This is a walk through why that is hard, what the rule actually does, and the numbers, honestly labelled.

Why backprop can't run in a brain

Backpropagation is the reason deep nets learn, and it is also the reason nobody thinks the brain runs it. Look at the backward pass. To update layer \ell, backprop needs the error signal δ\delta_\ell, and it computes it by pulling the layer above's error back through the transposed forward weights:

δ=(W+1δ+1)ϕ(z).\delta_\ell = \big(W_{\ell+1}^{\top}\,\delta_{\ell+1}\big) \odot \phi'(z_\ell).

Read that literally as a circuit and three problems fall out.

Dale's principle makes all of this worse. In cortex a neuron's outgoing synapses are uniformly excitatory or uniformly inhibitory — the sign belongs to the neuron, not the synapse. A weight in a standard net has no such loyalty: one unit can push one target up and pull another down in the same step. Toggle between the two regimes and click a source neuron to see its fan-out:

one neuron's outgoing synapses · sign per edgeillustrative
source populationtargetsS0+S1S2+S3T0T1T2T3
excitatory + inhibitory −
click a source

Under Dale's principle, neuron S1 is committed: inhibitory, so all 4 of its outgoing weights carry the same sign. The net keeps separate E and I populations; a unit can never send a + edge to one target and a − edge to another.

Enforcing Dale's principle means the sign is frozen per neuron, so a net has to split into separate excitatory (E) and inhibitory (I) populations and coordinate them. That changes credit assignment at the root: you can no longer flip a weight's sign to fix an error, and the tidy WW^{\top} feedback path is off the table anyway. Prior biologically plausible rules — feedback alignment and its kin — dodge weight transport by sending the error back through a fixed random matrix BB instead of WW^{\top}. That helps, but it trades one implausible object (the transpose) for another (a dedicated random feedback matrix), and historically these rules stall out past MNIST. The paper wants neither the transpose nor the random matrix.

Dale's principle, in the weights

The architecture is dual-stream. Each layer carries a positive activation vector p\mathbf{p} and a negative one n\mathbf{n}, and there are four weight matrices between consecutive layers — the within-stream pair Wpp,WnnW_{pp}, W_{nn} and the cross-stream pair Wnp,WpnW_{np}, W_{pn}:

pi=ϕi ⁣(pi1Wppni1Wnp+bp),ni=ϕi ⁣(ni1Wnnpi1Wpn+bn).\mathbf{p}_i = \phi_i\!\big(\mathbf{p}_{i-1} W_{pp} - \mathbf{n}_{i-1} W_{np} + \mathbf{b}_p\big), \qquad \mathbf{n}_i = \phi_i\!\big(\mathbf{n}_{i-1} W_{nn} - \mathbf{p}_{i-1} W_{pn} + \mathbf{b}_n\big).

The trick is in the signs. Every learnable weight is constrained non-negative, W0W_{\bullet\bullet} \ge 0 element-wise, and the minus signs in front of the cross-stream terms are hardcoded into the wiring, not learned. So the E stream always excites and the I stream always inhibits, structurally — Dale's principle holds by construction, and gradient descent can never sneak a sign flip past it. A readout that needs a signed output just subtracts the streams: y^=y+y\hat{y} = y^{+} - y^{-}.

This is a real cost. A standard dense layer is one matrix; this is four non-negative matrices with a fixed sign pattern, and the optimizer has to move the whole coordinated E/I system in lockstep. The question the paper answers is whether a learning rule can drive that system without any of backprop's illegal moves.

Diffusing the error instead of transporting it

Error Diffusion's answer: don't route the error back through the layers at all. Route it directly to every layer. Take the output error SS (shape B×CB \times C for a batch of BB over CC classes) and broadcast it to the hidden units through a fixed routing matrix MM, then form each layer's local update from presynaptic activity and the postsynaptic nonlinearity's derivative:

R=SM,Up=ϕ(Zp)R,ΔWppApUp.R = S\,M^{\top}, \qquad U_p = \phi'(Z_p) \odot R, \qquad \Delta W_{pp} \propto A_p^{\top}\,U_p.

RR is the routed error drive, UpU_p scales it by the local activation slope ϕ\phi', and the weight change is an outer product of presynaptic activations ApA_p with UpU_p. No WW^{\top} appears anywhere. No random feedback matrix appears either — the routing MM is a fixed, structured broadcast, not a learned or random projection.

The original Error Diffusion was defined for binary classification. To go past that, the paper adds modulo error routing: hidden unit ii is assigned to output channel

r(i)=imodC,r(i) = i \bmod C,

and learns from that channel's error sr(i)s_{r(i)}. It is coarse — several hidden units share a channel, and unit CC wraps back to channel 0 — but it is deterministic, transport-free, and enough to spread class-specific blame across a wide hidden layer. Step through the forward pass, the diffusion, and the update, and flip between backprop and Error Diffusion to see the paths diverge:

getting blame back to the hidden layersillustrative
hidden 1hidden 2inputc0c1c2c0c0c1c2c0error Sc0c1c2
stage
rule

The forward pass is the same either way: input to hidden 1 to hidden 2 to the output error S. Step to diffuse to see the two rules part company.

The contrast is the whole point. Backprop's blame crawls back one layer at a time, each hop paying the WW^{\top} transport tax. Error Diffusion drops the error onto every hidden unit at once and lets each layer compute a local update. That is what makes it plausible — and also what makes it approximate, since a modulo-routed broadcast is a much blunter credit signal than the exact gradient.

Three-panel overview. Left: the dual-stream excitatory/inhibitory architecture, with separate positive and negative streams and four non-negative weight matrices per layer, enforcing Dale's principle structurally. Center: the Error Diffusion update broadcasting the output error directly to all hidden layers, without transposed weights or random feedback matrices. Right: the shared architecture applied to classification, with layer-specific sigmoid widths, batch-centered class error, and asymmetric initialization, and to reinforcement learning via PPO integration.
The dual-stream Error Diffusion framework: structural E/I streams (left), direct error broadcast without weight transport (center), and the shared backbone specialized to classification and RL (right) (Yamada et al., 2026, Figure 1).

Three fixes that turn it into a learner

Error Diffusion out of the box does not learn much — the seed configuration lands at 50.4% on MNIST and 11.6% on CIFAR-10 (barely above chance on ten classes). Three domain-specific fixes close most of the gap.

Layer-specific sigmoid widths. The activation is a temperature-controlled sigmoid,

ϕi(z)=11+e2z/αi,\phi_i(z) = \frac{1}{1 + e^{-2z/\alpha_i}},

with a per-layer width αi\alpha_i. Why it matters: the update is scaled by ϕ\phi', and a standard sigmoid's derivative is tiny once units saturate. The paper measures a 25x attenuation of the surrogate gradient from the output down to the first hidden layer, so the early layers barely move. Widening the sigmoid (larger α\alpha) keeps the derivative alive deeper in the stack. Their CIFAR-10 setup uses α=3.0\alpha = 3.0 for convolutional layers and α=6.0\alpha = 6.0 for fully connected ones; MNIST uses α=6.0\alpha = 6.0 throughout.

Batch-centered class error. Instead of feeding raw one-vs-all errors, the class error is centered across the batch,

E~b,c=Eb,c1BbEb,c,\tilde{E}_{b,c} = E_{b,c} - \frac{1}{B}\sum_{b'} E_{b',c},

so every class's error signal is zero-mean over the mini-batch. This removes a constant per-class bias that would otherwise push all units in a channel the same way regardless of the input.

Asymmetric E/I initialization. The excitatory matrices Wpp,WnnW_{pp}, W_{nn} are scaled up by 1.5×1.5\times at init and the inhibitory Wnp,WpnW_{np}, W_{pn} scaled down by 0.5×0.5\times, a starting excitation-to-inhibition ratio of roughly 3:1. That gives the network net-positive drive to begin with, and the paper shows the ratio relaxes toward a biological-like balance as training proceeds.

What it scores

On the standard benchmarks, the constrained network learns — not to backprop's level, but well past chance, and well past unconstrained biologically plausible baselines that stall on MNIST. Direct Feedback Alignment (DFA), the backprop-free baseline that still uses a random feedback matrix, sits a few points ahead as the reference ceiling:

MNIST test accuracy (%) — author-reported
Error Diffusion (ours)
96.7%
DFA (baseline)
97.6%
seed ED (no fixes)
50.4%
050100
CIFAR-10 test accuracy (%) — author-reported
Error Diffusion (ours)
61.7%
DFA (baseline)
69.1%
seed ED (no fixes)
11.6%
020406080
Two bar-chart panels. Left, MNIST: classification accuracy across six configuration variants, all clustered high near 96 to 97 percent except the seed variant, which collapses when layer-specific widths are removed. Right, CIFAR-10: accuracy across the same six variants, with the batch-centered class error variant collapsing when that component is removed. Error bars show plus or minus one standard deviation over five seeds.
Accuracy across six ablation variants on MNIST (left) and CIFAR-10 (right), ±1 std over 5 seeds. The importance hierarchy flips between tasks (Yamada et al., 2026, Figure 2).

The most interesting result is not the headline accuracy — it is what the ablations reveal. Remove each fix and measure the accuracy drop, and the ranking reverses between the two datasets:

removed componentMNIST Δ (pp)CIFAR-10 Δ (pp)
layer-specific sigmoid widths−71.4−15.1
batch-centered class error−0.3−47.9
asymmetric initialization+0.0−5.5

On MNIST the whole model lives or dies by the sigmoid widths — pull them and accuracy craters by 71 points, while the batch-centering does almost nothing. On CIFAR-10 it is the exact opposite: batch-centered class error is load-bearing (−47.9), and the widths matter far less. Same architecture, same rule — but the credit-assignment bottleneck is task-dependent, and a single-benchmark evaluation would have hidden that entirely. That is the paper's sharpest point: which fix carries the model is a property of the task, not the method.

Into RL: ED-PPO

Classification is the easy setting — the error signal is a clean label. To test the rule where credit assignment is genuinely hard, the paper drops Error Diffusion into PPO, replacing the backprop gradient through the hidden layers of both the policy and value networks (the PPO objective still supplies the output-level error). Policy errors route to hidden units by action channel; value errors broadcast to all units. On Brax continuous control, ED-PPO is competitive with DFA and, on HalfCheetah, clears backprop:

Brax HalfCheetah — episode return, higher is better (author-reported)
ED-PPO (ours)
5494
DFA-PPO
5581
BP-PPO
3520
0200040006000

That HalfCheetah result — ED-PPO at 5494±691, essentially matching DFA-PPO's 5581±359 and beating backprop's 3520±485 — is the strongest single number in the paper, but it does not generalize cleanly. On Humanoid, ED-PPO (6670±2592) trails backprop (8478); on the open-ended exploration task Craftax, ED-PPO edges out DFA-PPO (19.8±1.5 return) but sits below BP-PPO. The honest read is "competitive with the backprop-free baseline, still short of backprop on the hardest tasks" — which is exactly what the abstract claims, and worth stating plainly rather than cherry-picking HalfCheetah.

The take

The idea is clean and the framing is honest. Real neural circuits obey constraints backprop ignores — a synapse can't read its partner's weight (no weight transport), and a neuron can't flip signs synapse by synapse (Dale's principle). Build a network that respects both, and credit assignment stops looking like a transpose and starts looking like a broadcast: Error Diffusion drops the output error straight onto every hidden layer, routes it by a modulo rule, and updates each layer locally. Three fixes — wider per-layer sigmoids to fight a 25x gradient decay, batch-centered class error, and a 3:1 excitation-to-inhibition initialization — are what turn a 50%-on-MNIST seed into a 96.7% learner and a 61.7% CIFAR-10 baseline. None of that is state of the art, and the paper doesn't pretend otherwise. What it earns is a real claim: you can learn representations under the brain's actual wiring rules, the gap to backprop is a few points rather than a chasm, and — the part I'll remember — which trick matters most depends on the task, a bottleneck you only see if you test on more than one benchmark.


Built on Y. Yamada, L. Grillotti, R. Charakorn, S. Risi, D. Ha and R. T. Lange, Diffusing Blame: Task-Dependent Credit Assignment in Biologically Plausible Dual-Stream Networks (arXiv 2606.31700, 2026). Figures 1 and 2 are reproduced from the paper for commentary. The DaleNetwork and ErrorDiffusion widgets are my own illustrations of the mechanism, not measured traces; all accuracies, returns, and ablation deltas are author-reported and I have not independently reproduced them.

Cite this article

For attribution, please use the following reference or BibTeX:

Satyajit Ghana, "Diffusing blame: credit assignment under Dale's principle", ai.thesatyajit.com, July 2026.

bibtex
@misc{ghana2026diffusingblame,
  author = {Satyajit Ghana},
  title  = {Diffusing blame: credit assignment under Dale's principle},
  url    = {https://ai.thesatyajit.com/articles/diffusing-blame},
  year   = {2026}
}
share