♪ NOW PLAYING 0 Old Flame Like A Dream | *** thanks for stopping by my corner of the web *** best viewed at 800x600 *** sign my guestbook *** A Fourth Answer: Sparse Regression Codes and AMPChannel Coding The previous entry closed the series’ main narrative: turbo, LDPC, and polar codes, three distinct sources of structured randomness, evaluated against one another on their own merits. This page does not reopen that discussion. It is an epilogue, covering a fourth code family built on principles unrelated to any of the three preceding ones, that nonetheless answers the opening question of this series: how does one obtain random-like performance from a structure that is actually decodable? Sparse regression codes answer it in a way that is arguably closer to Shannon’s original 1948 argument than turbo, LDPC, or polar codes ever were. Where those three families obtained tractability by imposing structure on the code itself (a sparse graph, two short trellises, a deterministic recursive transform), sparse regression codes take the opposite approach: the code is left essentially unstructured, as in Shannon’s original construction, and all of the engineering effort is placed in the decoder instead. This final page examines why that approach works. Overview and MotivationThe construction can be summarized before introducing any of its supporting machinery. A codebook is built the way a statistician, rather than an algebraist, would: a large dense matrix with independent Gaussian entries, partitioned into sections of columns each. A codeword is formed by selecting one column from every section and summing the selected columns, each scaled by a prescribed amount of power. The transmitted message is simply which column was selected in each section, so the code is an instance of a classical statistical estimation problem, sparse linear regression: recovering a sparse coefficient vector from noisy linear measurements . A literal decoding rule would require a search over candidates, as computationally intractable as the candidates left by Shannon’s own random code in the series opener. This intractability is resolved by an approximate message passing (AMP) iteration, which exploits the Gaussianity of to reduce the search to a short sequence of closed-form steps: a softmax denoiser applied section by section, corrected at every step by a single scalar Onsager term that keeps the recursion asymptotically well behaved. The resulting code, established in 2017, is provably capacity-achieving on the AWGN channel with encoding and decoding complexity, reaching the same destination as turbo, LDPC, and polar codes by an entirely different route. Every other family in this series approached the decoding problem the same way: impose sparse structure, a sparse parity-check graph, two short trellises linked by an interleaver, a sparse recursive transform, so that local, low-complexity message passing could substitute for a global maximum-likelihood search. Sparse regression codes reverse this approach. The design matrix is close to maximally unstructured: dense, with independent Gaussian entries and no sparsity to exploit. This is deliberate, and it is what places SPARCs closest, among the families in this series, to Shannon’s original 1948 argument. Shannon’s proof used a random codebook of size and established that a random draw is good with high probability, without providing a tractable decoder. A SPARC is a structured random codebook: the section structure, exactly one nonzero entry per section, is what makes efficient decoding possible, while the dense Gaussian matrix is what allows the capacity proof to proceed using the tools of classical statistical estimation (least squares, and later AMP) rather than graph combinatorics. It is Shannon’s construction, constrained just enough to be decodable, rather than a different construction entirely. This history closely parallels the opening page of this series. Gallager proved his codes good by an ensemble argument in 1963 but left behind a decoder that no contemporary hardware could run; an efficient decoder did not arrive for thirty years. SPARCs followed the same arc on a considerably shorter timeline.
The third row is central to the argument of this page. The earlier efficient decoders, including adaptive successive decoding and Cho and Barron’s soft-decision decoder, function correctly, but under flat power allocation they provably cannot exceed a threshold rate , strictly below capacity . No improvement to the decoder alone removes this limitation, since the cap is imposed by how power is distributed across sections rather than by the algorithm that reads them. AMP is the first decoder that is simultaneously computationally efficient and loses nothing up to capacity, and it achieves this only because the power allocation was redesigned alongside the decoder. Rush, Greig, and Venkataramanan’s paper effectively presents two contributions under a single title: a new decoder, and the power allocation schedule that the decoder requires in order to be effective. Code Construction and Power AllocationThe design matrix is , with entries drawn independently as , organized as sections of columns each. The message vector has exactly one nonzero entry per section, of magnitude in section , where is the total power budget. The codeword is , the sum of columns of , one per section, each scaled by that section’s power. Transmitting over the AWGN channel gives the receiver with . Encoding is straightforward: the input bit stream is split into chunks of bits, and chunk , read as an integer, selects which of section ‘s columns is active. The rate equation follows from a codeword count. There are possible messages, so , equivalently . Choosing for a fixed constant gives , which forces : both and grow with block length, but only slightly sub-linearly, so the dictionary size grows polynomially rather than exponentially in . It is instructive to consider the two limiting cases. Setting , recovers Shannon’s original exponential-size random codebook exactly. Setting with a small constant makes the construction resemble the generator matrix of a conventional linear code. A SPARC is deliberately positioned between these extremes, what Barron and Joseph term a “moderate size dictionary”: structured enough for efficient decoding, unstructured enough for the dense-matrix machinery of AMP to apply. The remaining design choice, the power allocation , is not a secondary detail. It determines how the fixed power budget is distributed across sections and is as consequential for a SPARC as the degree distribution is for an irregular LDPC code: two codes with identical , , and can achieve substantially different rates depending solely on this choice. The simplest option is flat allocation, for every section, which is the allocation identified above as fundamentally limiting: under efficient decoding it caps the rate at regardless of decoder quality. The allocation for which AMP’s capacity theorem is proved instead decays exponentially, , so the earliest sections carry disproportionately more power than later ones. The intuition behind this choice underlies much of the rest of the page. Early, well-powered sections decode first and reliably. Once decoded, they are no longer unknowns: the decoder subtracts their contribution, which lowers the effective noise experienced by the harder, later sections. Each successfully decoded section makes the next section’s decoding task easier, a bootstrapping process that decodes the codeword section by section, from front to back. This mechanism is the SPARC analogue of the principle by which high-degree variable nodes converge first and assist the rest of the graph in irregular LDPC ensembles, transplanted from a degree distribution over a sparse graph to a power schedule over a dense one. The AMP Decoding AlgorithmInitialize (with ) and . For , AMP alternates a residual update and a denoising update:
with and, for , , where is a Gaussian expectation computed offline, prior to decoding (discussed in the next section). The denoiser acts section by section: for index in section , given a test-statistic vector , it looks at all entries of within that section and computes
which is a softmax over the candidates in the section, with inverse temperature : sharply peaked when one entry of clearly dominates its section, and diffuse when the section remains ambiguous. Each term in the recursion has a clear functional role. correlates the current residual against every column of , acting as a matched filter: columns aligned with the (as yet undiscovered) true signal produce a large response, while unaligned columns remain near zero. Adding this to the current estimate gives , the test statistic, which combines fresh matched-filter evidence with the decoder’s current belief. The denoiser then converts this test statistic into the next estimate, section by section. The remaining term in the residual update, , is the Onsager term: a single scalar multiplying the previous residual, added into the new one. Although it resembles a minor correction, it is essential to the algorithm’s validity, as the next section establishes. The origin of this recursion clarifies why it takes exactly this form. Rush, Greig, and Venkataramanan derive the residual and denoising updates as a first-order Taylor approximation to a min-sum-style message-passing algorithm on the factor graph of : rows act as check-like factor nodes and columns as variable nodes, the same graphical vocabulary used by Gallager’s Tanner graph, except that here the graph is complete rather than sparse, since every observation depends on every coordinate of . The one-nonzero-per-section constraint prevents the recursion from reducing to ordinary compressed-sensing AMP, in which each coordinate is denoised independently: here, every entry within a section is coupled to every other entry in that section, so the outgoing message from one variable depends on the incoming messages from its entire section rather than on itself alone. This coupling is why the denoiser takes the form of a joint softmax over a section rather than independent scalar shrinkage rules, and it is SPARC’s counterpart to the requirement that a parity check exclude the very bit it is informing. The Onsager Correction TermThe validity of the entire recursion rests on a claim about the distribution of the test statistic. Asymptotically,
that is, behaves as the true message plus clean, independent Gaussian noise, despite having been constructed from , the same matrix used to construct every earlier . Without the Onsager correction, would carry a self-interaction bias: because was fit using , the quantity correlates with through their shared dependence on the same matrix, so the residual “noise” in would be neither clean nor Gaussian. The state-evolution analysis in the following section depends on this Gaussian approximation holding exactly, not merely approximately, and the Onsager term is what makes it hold. This mechanism is directly comparable to two earlier appearances of the same principle in this series, and the resemblance is structural rather than superficial:
This is the same exclusion principle appearing a third time, here in a continuous rather than combinatorial setting. LDPC and turbo decoding both remove self-information because their underlying graphs contain short cycles that would otherwise allow a decoder’s own earlier output to feed back into itself, amplified rather than corrected. AMP’s graph has no sparsity to exploit: every observation depends on every coordinate, so every pair of variables is effectively one hop apart. The Onsager correction is what remains of the exclusion principle once the graph is maximally dense: there is no longer a specific neighbor’s message to exclude, so the recursion instead subtracts a single scalar quantity, calibrated to cancel exactly the bias that density would otherwise introduce. This dependence introduces an implementation pitfall worth noting, since it is the SPARC analogue of a trap this series has already encountered. The residual-update equation explicitly requires and , the previous step’s residual and constant, in the correction added to the new residual. Substituting the current step’s and instead causes to silently lose its asymptotic Gaussianity; the state-evolution analysis in the next section, and empirically the decoder’s performance, then breaks. This is a one-line indexing error with a disproportionate effect, comparable in spirit to SCL’s “kill before clone” ordering requirement: a subtle sequencing constraint, embedded in a single equation, on which the entire analysis silently depends. Optimality of the Section-Wise DenoiserThe softmax form of may appear to be a heuristic chosen for convenience, but it is in fact the provably optimal estimator. Given the Gaussian approximation established above, , the minimum mean-squared-error estimate of given is the conditional expectation , which can be derived for one entry in section directly from Bayes’ rule, treating the candidates in the section as equally likely a priori:
Since is i.i.d. Gaussian, each conditional density is proportional to , up to a factor common to numerator and denominator, and substituting this in reduces the expression exactly to the softmax given above. The denoiser is therefore not a plausible heuristic but the provably optimal estimator under the (asymptotically justified) assumption that the test statistic is signal plus Gaussian noise. A second interpretation follows directly: is precisely the posterior probability that index is the true nonzero entry of its section, so at every step the decoder maintains a full posterior distribution over which column was selected, rather than a point estimate alone. State Evolution AnalysisThe preceding sections describe a single step of AMP. The algorithm is analyzable, rather than merely executable, because its entire trajectory can be tracked using a small number of scalars rather than the full -dimensional state. Define
The consistency of these three quantities follows from a short argument. Expanding and invoking the orthogonality principle for MMSE estimators, , collapses the cross term to give , which yields the result on substitution. The quantity can be read as the expected power-weighted fraction of correctly decoded sections after step : it is the SPARC analogue of in LDPC’s density evolution on the erasure channel, applying the same technique of collapsing an enormous state space into a scalar recursion that can be iterated well before any codeword is transmitted. Both quantities are computed once, offline, in the same way a decoding threshold is precomputed before a design is committed to silicon: given the SPARC’s parameters and the noise variance, the recursion for is iterated to convergence, which determines how many AMP steps the decoder requires and how well it will perform. This point is worth stating explicitly, since it is the most common source of confusion when implementing AMP for the first time: the decoder does not have access to the true message when computing . These constants are deterministic functions of the design parameters alone, fixed at design time rather than computed with access to the transmitted codeword. For the exponentially decaying power allocation, the general recursion admits a closed form. Define and, for ,
The quantity admits a direct interpretation: by the end of step , the leading -fraction of sections, ranked by power and, since power decays monotonically, equivalently by index, are correctly decoded with high probability, while the remainder are not yet decoded. Each step advances this boundary by the same fixed increment, , until it saturates at 1, which also gives the number of steps to full convergence in closed form: . A worked numerical example illustrates the recursion concretely. Let (so , ), capacity bits, and rate bits. The per-step increment is , and . Iterating by hand:
decreases monotonically from to exactly : by step 8, the AMP decoder has transformed the original noisy observation into a test statistic exactly as clean as the channel noise alone, with no residual contamination from the decoding process itself. This is not a numerical coincidence; it reflects the recursion reaching its fixed point at , at which all sections are correctly decoded. ![]() Performance GuaranteesThe asymptotic guarantee established by this analysis is stated precisely in Rush, Greig, and Venkataramanan’s Theorem 1: for any fixed rate , the SPARC ensemble with , exponentially decaying power allocation, and AMP run for exactly steps has a section error rate that converges to zero almost surely as . The quantifier order is the strong form of the claim: the result holds for every fixed rate below capacity, not merely for rates within a fixed gap of it. This places SPARCs alongside Arıkan’s unconditional theorem for polar codes and the performance that Richardson and Urbanke’s optimized irregular LDPC ensembles approach only empirically, reached here through entirely different mathematics: statistical estimation theory rather than martingale arguments or graph combinatorics. A vanishing section error rate does not immediately imply a vanishing message error probability, since a single incorrect section out of still corrupts the decoded message. The resolution repeats a structural pattern already established in this series: an outer Reed-Solomon code of rate over an alphabet of size is concatenated with the SPARC, so that each RS symbol addresses exactly one section. If the inner SPARC’s section error rate falls below , the outer RS code corrects it exactly, and the overall rate becomes as . This is structurally the same construction as polar’s CRC-aided SCL: an inner soft, message-passing-decoded code is paired with an outer algebraic code whose sole function is to correct whatever residual errors the inner decoder cannot eliminate on its own. Two entirely different inner decoders, softmax denoising and successive-cancellation list decoding, each required an algebraic outer code of this kind to convert a high-probability guarantee into a provable one. The theorem also has a notable limitation. Unlike Barron and Joseph’s earlier least-squares result, which provides an explicit error exponent decaying as for a rate gap , Theorem 1 establishes convergence to zero without specifying a rate of decay. This closely mirrors the situation for turbo codes earlier in this series: a union bound identifies the location of the error floor, but the rate at which the waterfall itself descends is a separate and harder question, answered here, as there, empirically rather than analytically. ![]() Practical Design ConsiderationsThe exponentially decaying allocation for which Theorem 1 is proved is not the allocation that performs best at the finite block lengths used in practice. The paper’s refinement introduces two parameters, : exponential decay, , up to section , followed by a flat allocation over the remaining sections. Tuning these parameters exposes a three-way trade-off. Insufficient initial power ( too small) prevents the first sections from clearing the decoding threshold, so the bootstrapping process never begins. Excessive initial power ( near the pure-exponential value of 1) performs well near capacity but is wasteful further from it, since power removed from the tail sections leaves them undecodable even after the head has successfully bootstrapped. Flattening the tail () provides the weakest sections with a power floor rather than allowing the allocation to decay to zero, directly analogous to the way irregular LDPC’s stability condition caps rather than eliminates degree-2 variable nodes: a minimum floor of reliability is necessary throughout the code, not only where the allocation happens to be generous. Tuning under a fixed power budget is the same design problem as choosing an LDPC degree distribution or a turbo interleaver length: a shared resource, distributed unevenly, to exploit a bootstrapping mechanism that functions only if the distribution is correct. ![]() A second practical bottleneck is computational rather than statistical. A Gaussian requires time and memory per AMP iteration, since every matrix-vector product is dense and the full matrix must be stored. Both costs are eliminated by constructing from rows of a Hadamard matrix instead of drawing it i.i.d. Gaussian: define recursively, with the block matrix having in the top-left, top-right, and bottom-left blocks and in the bottom-right, then select rows of uniformly at random (for ) and scale by . Because is exactly the kernel of the fast Walsh-Hadamard transform, both and can be computed in time, and itself never needs to be stored; only vectors are held in memory at any point. This result is worth highlighting explicitly: it is the same butterfly, recursive-doubling structure that gives polar encoding and successive-cancellation decoding their complexity, reappearing here as the mechanism that resolves SPARC decoding’s dense-matrix bottleneck. Polar codes and SPARCs share almost no design principles: one is a deterministic recursive channel transform constructed to avoid randomness entirely, the other a dense random Gaussian regression problem constructed to exploit it. Yet the moment each requires moving -dimensional data through a structured linear map efficiently, both converge on the identical fast transform. This is the second instance in this series of two families, developed for unrelated reasons, converging on the same algorithmic tool, suggesting that the transform reflects a more fundamental computational structure than either paper’s original motivation suggests. Check Yourself
Answers
Where This Leaves UsThis page has traced four connective threads through the series. The exclusion principle appeared for a fourth time: LDPC belief propagation excluding a variable’s own message, turbo decoding subtracting the channel and a priori terms to construct an extrinsic LLR, polar SCL’s ordering requirement between killing and cloning paths, and now AMP’s Onsager term, all performing the same function of preventing self-reinforcement, here transplanted from a sparse combinatorial graph to a dense continuous one. State evolution proved to be density evolution’s counterpart for dense graphs, applying the same technique of collapsing an intractably large state into a scalar recursion, computed once offline before decoding begins, regardless of whether the underlying structure is a sparse Tanner graph or a dense Gaussian matrix. The pattern of an outer code correcting the residual errors of an inner soft decoder recurred for a second time, with an outer Reed-Solomon code performing for AMP’s section errors the same role that an outer CRC performs for polar’s SCL failures. And the fast Hadamard transform recurred for a second time as well, the same recursive-doubling structure rescuing two code families, developed for unrelated reasons, from the same computational bottleneck. Taken together, these four threads bring the shape of the whole series into focus. Turbo, LDPC, and polar codes each built distinct, purpose-specific structure, and the analytical and algorithmic tools required to decode that structure converged independently on a common set of ideas: exclusion principles, threshold recursions, outer-code correction, and fast structured transforms. SPARCs reach the same set of tools from the opposite direction, starting from Shannon’s original unstructured randomness and adding back only the minimum structure an efficient decoder requires. That two such different approaches, one imposing structure on a graph, the other withholding structure from a matrix, converge on the same small set of ideas is not incidental; it is the substance of the answer to this series’ opening question. Shannon’s 1948 existence proof and the sixty years of engineering that followed it constitute two distinct routes to the same set of results, and the tools that emerge, extrinsic exclusion, offline threshold computation, outer algebraic correction, fast structured transforms, are largely independent of which route is taken. Readers interested in pursuing this thread further may consult Donoho, Maleki, and Montanari’s 2009 paper, which first derived the Onsager correction for the more general compressed-sensing problem, and the application of SPARCs to unsourced random access, which repurposes the same machinery for an entirely different communication problem involving many users and no identities, a further indication that the ideas developed in this series extend well beyond any single code. ← List Decoding and the Road to 5GIndex |