Residual Connections  · March 2020

ReZero — Residual With Learnable Skip Scale

intermediate

Train arbitrarily deep transformers without LayerNorm, without warmup, without careful initialization — just one learnable scalar per residual branch, initialized to zero.

§ 1 · Premise

Deep transformers cannot start anywhere

The residual entry shows that the identity term inside each block’s Jacobian I+f/xI + \partial f_\ell/\partial \mathbf{x}_\ell is what makes deep stacks trainable. But the identity is only one term — the magnitude of the sublayer Jacobian at initialization still governs how the product of layer Jacobians behaves at finite depth.

Bachlechner et al. (2020) frame the problem through the input–output Jacobian of an LL-block stack at initialization. For Post-Norm transformers without warmup, the singular values of xL/x0\partial \mathbf{x}_L / \partial \mathbf{x}_0 blow up exponentially in LL on the upper end and collapse toward zero on the lower end — past depth \sim12 layers the optimizer diverges in the first few steps (Bachlechner et al. 2020, §2 + Figure 3). Pre-Norm trains but its gradient distribution shifts unevenly across depth: early layers see much larger gradients than late ones (Xiong et al. 2020, §4.2). Standard remedies are LayerNorm (magnitude control), Xavier/He initialization (per-layer variance), and a learning-rate warmup schedule that keeps optimizer step sizes small until the gradient distribution settles — three knobs whose joint tuning is brittle past 64 layers.

The premise: if every block started as exactly the identity, none of these knobs would be load-bearing. Gradient norm through the block would be exactly one. The optimizer could safely take full step sizes from step zero, and the network would learn its way away from the identity function only as the loss demanded.

§ 2 · Derivation

One scalar per branch, initialized to zero

Start from the standard residual block with sublayer f:RdRdf_\ell : \mathbb{R}^d \to \mathbb{R}^d (self-attention or FFN):

x+1=x+f(Norm(x)).\mathbf{x}_{\ell+1} = \mathbf{x}_\ell + f_\ell\bigl(\mathrm{Norm}(\mathbf{x}_\ell)\bigr).

ReZero replaces this with a learnable scalar αR\alpha_\ell \in \mathbb{R} gating the sublayer’s contribution, and drops the normalization:

x+1=x+αf(x),α(0)=0.\mathbf{x}_{\ell+1} = \mathbf{x}_\ell + \alpha_\ell\, f_\ell(\mathbf{x}_\ell), \qquad \alpha_\ell^{(0)} = 0.

Initialized at α(0)=0\alpha_\ell^{(0)} = 0, the block is literally the identity map at step zero; its sublayer parameters can be set arbitrarily without disturbing the forward pass. The Jacobian factor becomes

x+1x=I+αfx,\frac{\partial \mathbf{x}_{\ell+1}}{\partial \mathbf{x}_\ell} = I + \alpha_\ell\, \frac{\partial f_\ell}{\partial \mathbf{x}_\ell},

so at step zero the per-block Jacobian is exactly II and the full input–output Jacobian xL/x0=I\partial \mathbf{x}_L / \partial \mathbf{x}_0 = I regardless of LL. Singular values are all one. Backpropagated gradient norms are independent of depth, and the optimizer is free to take its full nominal step.

Why “init to zero” rather than “init to small.” A small but nonzero α\alpha still leaves the multiplicative product (1+ασk(f))\prod_\ell (1 + \alpha\, \sigma_k(\partial f_\ell)) depth-sensitive on the order of eLασe^{L\alpha\sigma}. Zero is the unique value that makes the product exactly one for every LL. Bachlechner et al. (§3) prove that gradient signal at initialization is preserved with no dependence on layer count.

Why drop the norm. Once α\alpha_\ell controls the magnitude of the sublayer’s contribution end-to-end, normalization becomes redundant in the regime that matters: the addition can never push the stream into a numerical range that bottoms out gradients, because α\alpha_\ell starts small. The paper also argues (§3.1) that LayerNorm’s centering step actively interferes with the proof of dynamical isometry — it makes the per-block Jacobian’s expected singular value depend on properties of the input distribution. Removing it restores a clean analysis.

Dynamical-isometry reading. ReZero is a particular instance of dynamical isometry (Pennington et al. 2017, §2): the condition that the input–output Jacobian of a deep network has all singular values close to one at initialization. Standard initialization schemes (Xavier, He, orthogonal) achieve this in expectation for one layer but not after LL-fold composition through nonlinearities. ReZero achieves exact dynamical isometry by construction, for arbitrary LL, with no constraints on the sublayer’s internal weights.

Gradient and training-time scaling. As training proceeds, α\alpha_\ell moves away from zero — but the paper shows (Figure 4) that the α\alpha_\ell values spread: early layers grow α\alpha toward 0.1\sim 0.11.01.0 while deep layers stay near zero. The network self-allocates “effective depth” rather than using all LL blocks equally. This is impossible to achieve with fixed Pre-Norm because every block always contributes a nontrivial perturbation.

Parameter and compute cost. One additional scalar per sublayer — 2L2L total scalars for an LL-layer transformer. Compute overhead is LL scalar multiplies, O(BTd)\mathcal{O}(B \cdot T \cdot d) each, negligible against the O(BTd2)\mathcal{O}(B \cdot T \cdot d^2) sublayer compute. The normalization layers (and their parameters and FLOPs) are gone, which is a small net savings.

§ 3 · Reference implementation

ReZero block, sketch

class ReZeroBlock(nn.Module):
    def __init__(self, sublayer):
        super().__init__()
        self.sublayer = sublayer                          # attn or FFN
        self.alpha = nn.Parameter(torch.zeros(1))         # init to 0 — load-bearing
    def forward(self, x):
        # x: (B, T, d) — residual stream
        return x + self.alpha * self.sublayer(x)          # no LayerNorm

Two such blocks per transformer layer (attention + FFN), each with its own α\alpha_\ell. The sublayer is unchanged from the standard transformer; the load-bearing edit is the * alpha and the absence of any norm.

ReZero's α scalar gates each block's contribution to the residual. At α = 0 the network is the identity function; raising α lets each block add αx perturbation.Residual stream RMS through depth (α = 0.000)NaN0identitylayer index l (depth = 32)How ReZero trainsα init = 0 ⇒ every block is identity ⇒ gradient at layer 1 is exactly 1Each α_l learns to grow gradually as training proceeds (one scalar per branch)Final residual norm at layer L: NaN (depth-32 forward pass)
ReZero starts with α = 0 — every block is the identity function, the forward pass is the input copied through L layers unchanged, and the gradient at every layer is exactly 1. As training proceeds, each α_l (one scalar per residual branch) is updated by SGD and gradually grows, opening the valve on each block's contribution. The mechanism is simpler than LayerNorm — ReZero networks trained without LayerNorm at all in the paper's ablations — though for production decoders the gradient stability from Pre-Norm proved sufficient and α stayed off the consensus stack.

§ 4 · Empirical evidence

What ReZero reports — and what others reproduced

The paper’s headline experiments (Bachlechner et al. 2020, §4):

Independent ablations. Liu et al. (2020), “Understanding the Difficulty of Training Transformers”, arrive at a closely related diagnosis: they propose Admin (§5, arXiv 2004.08249), a per-branch constant scaling factor ω\omega_\ell derived from a forward-variance calculation, which plays the same role as ReZero’s α\alpha_\ell but is fixed rather than learned. Admin trains 12-layer Post-Norm transformers stably without warmup and converges to lower loss than the Pre-Norm baseline on WMT’14 EN-DE (their Table 2). The agreement on mechanism — some per-branch scaling controlling early-step Jacobian magnitude — strengthens the ReZero analysis.

SkipInit (De & Smith 2020). A concurrent ICLR submission shows that initializing the final BatchNorm γ\gamma of each residual block to zero yields the same depth-stability effect for ResNets and removes the need for BatchNorm itself (§3, arXiv 2002.10444). The “skip init” name describes ReZero’s mechanism almost word-for-word, with the difference being which scalar is targeted — the final-layer normalization γ\gamma vs an explicit branch multiplier. Both pieces of work identify the same fact: zero-initialized residual scale is the minimal condition for depth-independent gradient flow.

T-Fixup (Huang et al. 2020) provides the same deep-transformer recipe with a different implementation: rescaled initialization of attention and FFN weights, no LayerNorm, no warmup, producing stable training of 100+ layer transformers (§3, arXiv 2002.04745). T-Fixup and ReZero are different recipes for the same dynamical-isometry target; the comparison is in the T-Fixup paper’s §5.

Scaling-curve evidence at frontier scale. None. Bachlechner et al.’s largest experiment is a 128-layer character LM on enwiki8 — small by 2026 standards. No public open-frontier release has run a Llama-scale ablation of ReZero against Pre-Norm + RMSNorm, so “ReZero at 70B+ parameters” remains an open empirical question. The closed-frontier policy applies: speculating on which production labs may have tested it is out of scope.

Why production decoders didn’t adopt it. The consensus stack (Pre-Norm + RMSNorm at every depth tier from 7B to 671B) is a known quantity with charted failure modes and hyperparameter sweet spots across thousands of training runs. ReZero’s headline benefit applies at depths (L100L \gtrsim 100) past the production envelope: Llama 3.1 405B is 126 layers (Grattafiori et al. 2024, Table 3) and trains under Pre-Norm + RMSNorm; DeepSeek-V3 is 61 layers (DeepSeek-AI 2024, §2.1). Switching to ReZero is risk without a documented reward at those depths. DeepNet revisits the same problem with a different scaling and reportedly scales to 1000 layers; that lineage is the live one in research.

Lineage

Cite

BibTeX entry for the original paper
@article{arxiv2003_04887,
  title  = {ReZero is All You Need: Fast Convergence at Large Depth},
  author = {Thomas Bachlechner and others (UCSD)},
  year   = {2020},
  eprint = {2003.04887},
  archivePrefix = {arXiv},
  url    = {https://arxiv.org/abs/2003.04887}
}

Or cite the paper directly: arXiv:2003.04887.

Export

BibTeX
@article{arxiv_2003_04887,
  title         = {ReZero is All You Need: Fast Convergence at Large Depth},
  author        = {Thomas Bachlechner et al. (UCSD)},
  year          = {2020},
  eprint        = {2003.04887},
  archivePrefix = {arXiv},
  url           = {https://arxiv.org/abs/2003.04887}
}
CSL JSON
{
  "id": "arxiv_2003_04887",
  "type": "article-journal",
  "title": "ReZero is All You Need: Fast Convergence at Large Depth",
  "author": [
    {
      "literal": "Thomas Bachlechner et al. (UCSD)"
    }
  ],
  "issued": {
    "date-parts": [
      [
        2020
      ]
    ]
  },
  "URL": "https://arxiv.org/abs/2003.04887",
  "number": "2003.04887",
  "source": "arXiv"
}
RIS
TY  - JOUR
TI  - ReZero is All You Need: Fast Convergence at Large Depth
AU  - Thomas Bachlechner et al. (UCSD)
PY  - 2020
JO  - arXiv
AN  - arXiv:2003.04887
UR  - https://arxiv.org/abs/2003.04887
ER  -