<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Information Bottleneck: Posts]]></title><description><![CDATA[Post about AI]]></description><link>https://www.the-information-bottleneck.com/s/posts</link><image><url>https://substackcdn.com/image/fetch/$s_!nQnk!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9b10938-f656-4406-aa7a-36b5e263a5dc_950x950.png</url><title>The Information Bottleneck: Posts</title><link>https://www.the-information-bottleneck.com/s/posts</link></image><generator>Substack</generator><lastBuildDate>Fri, 14 Aug 2026 05:27:51 GMT</lastBuildDate><atom:link href="https://www.the-information-bottleneck.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[The Information Bottleneck]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[informationbottleneck@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[informationbottleneck@substack.com]]></itunes:email><itunes:name><![CDATA[Ravid Shwartz Ziv]]></itunes:name></itunes:owner><itunes:author><![CDATA[Ravid Shwartz Ziv]]></itunes:author><googleplay:owner><![CDATA[informationbottleneck@substack.com]]></googleplay:owner><googleplay:email><![CDATA[informationbottleneck@substack.com]]></googleplay:email><googleplay:author><![CDATA[Ravid Shwartz Ziv]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Speculative decoding, from zero to DSpark]]></title><description><![CDATA[Big models generate slowly and verify fast. Speculative decoding exploits the gap. A post about how it works, and how DSpark pushes it into a real serving system.]]></description><link>https://www.the-information-bottleneck.com/p/speculative-decoding-from-zero-to</link><guid isPermaLink="false">https://www.the-information-bottleneck.com/p/speculative-decoding-from-zero-to</guid><dc:creator><![CDATA[Ravid Shwartz Ziv]]></dc:creator><pubDate>Fri, 10 Jul 2026 14:40:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HIWb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Written with help from Muse Spark for drafting, editing, and figures. All the mistakes are its.</em></p><p>A new paper called <strong><a href="https://github.com/deepseek-ai/DeepSpec/blob/main/DSpark_paper.pdf">DSpark</a></strong> came out recently (From the DeepSeek team,), and I wanted to understand what it adds beyond regular speculative decoding. The basic trick is to draft several tokens cheaply, then verify them with the big model in one pass. DSpark builds on that with two ideas: better long drafts, and a smarter way to decide how many drafted tokens to verify in production.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.the-information-bottleneck.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Information Bottleneck! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HIWb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HIWb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!HIWb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!HIWb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!HIWb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HIWb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1235621,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.the-information-bottleneck.com/i/206378276?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HIWb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!HIWb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!HIWb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!HIWb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2e178-8f28-4f62-a7b0-dd5f67a776ca_1672x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong><span>1. A full forward pass for every single token</span></strong></h2><p><span>An autoregressive language model produces text one token at a time. To generate token t+1 it needs a forward pass conditioned on everything up to token t.</span></p><p><span>To see whether that&#8217;s a problem, let&#8217;s follow one decoding step through the GPU and watch where the time goes. To generate one new token, the model has to produce its logits, the pre-softmax scores over the vocabulary. Getting them means </span><em><span>every weight matrix in the model</span></em><span> has to travel from the GPU&#8217;s main memory into the arithmetic units. That main memory is called </span><strong><span>HBM</span></strong><span> (High Bandwidth Memory), and it holds the model&#8217;s weights along with the KV cache, the stored attention state. For a 70B model in 16-bit, one token&#8217;s worth of logits costs about 140 GB of weight reads.</span></p><p><span>The arithmetic done with all that data is tiny by comparison: each weight participates in roughly one multiply-add per token. An H100 does on the order of a thousand </span><em><span>trillion</span></em><span> multiply-adds per second but reads only about 3 TB/s out of HBM. So the decoding step is </span><strong><span>memory-bound</span></strong><span>: its wall-clock time is set by how long the weight reads take, not by the math. The opposite regime, where the arithmetic itself is what you wait on, is called </span><strong><span>compute-bound</span></strong><span>. Decoding is nowhere near it, and that gap is the whole opportunity. In the memory-bound regime the arithmetic units are mostly idle: the multipliers finish their work instantly and then sit there while the next slab of weights streams in.</span></p><p><span>The loophole is that the weight reads are paid </span><em><span>per forward pass</span></em><span>, not per token. Push eight token positions through the same pass and the weights are read from HBM once, then multiplied against eight vectors instead of one. The memory traffic barely changes. You do eight times the arithmetic, but arithmetic was the idle resource anyway, so a pass over eight positions takes barely longer than a pass over one.</span></p><p><span>You already know this effect as the prefill/decode gap. </span><strong><span>Prefill</span></strong><span> is when the model ingests your prompt. All the prompt tokens are known up front, so they go through the model together, thousands of positions per pass, and the weight-read cost is split across all of them. </span><strong><span>Decoding</span></strong><span> generates one new token per pass and pays the full cost every single time.</span></p><p><span>Decoding can&#8217;t batch like prefill because the input at position t+1 </span><em><span>is</span></em><span> the token sampled at position t; it doesn&#8217;t exist until the previous pass finishes. But suppose someone handed you a </span><em><span>guess</span></em><span> for the next eight tokens. Now you do have all eight inputs, tentatively, and the big model can process them prefill-style in one pass. And the same pass gives the model its own next-token distribution at each of the eight positions. Those distributions are all it needs to go through the guess position by position and find where it stops being right. </span><strong><span>Verification is prefill-shaped. Generation is decode-shaped.</span></strong></p><p><span>Who writes the guess? A smaller, cheaper model. That&#8217;s speculative decoding: everything in this post converts slow generation into fast verification plus a cheap guess.</span></p><h2><strong><span>2. Draft cheap, verify in parallel</span></strong></h2><p><span>Speculative decoding runs as a loop: draft a few tokens, verify them, keep the good prefix, repeat. The version everyone uses is due to </span><a href="https://arxiv.org/abs/2211.17192"><span>Leviathan et al.</span></a><span> and </span><a href="https://arxiv.org/abs/2302.01318"><span>Chen et al.</span></a><span> A lightweight draft model proposes a block of &#947; candidate tokens. The target model runs </span><em><span>one</span></em><span> forward pass over the whole block and gets its own next-token distribution at every position. Then it walks the block left to right and decides, position by position, whether it agrees with the draft.</span></p><p><span>Say the last confirmed token is D. Call it the </span><em><span>anchor</span></em><span>: the confirmed token this round&#8217;s draft hangs off. The draft proposes E F G H. The target might accept E and F and reject G. A rejection isn&#8217;t wasted work: the target already computed a distribution at G&#8217;s position, so it samples a replacement G* from a corrected version of it. G* is called the correction token. Everything after the first rejection (H) is thrown away, because it was conditioned on a token that never happened.</span></p><p><span>If every draft token is accepted, the round earns one extra token for free: the pass also computed the target&#8217;s distribution at the position </span><em><span>after</span></em><span> the last draft token, so the target samples from it and appends the </span><strong><span>bonus token</span></strong><span>. </span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7sug!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7sug!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7sug!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7sug!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7sug!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7sug!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg" width="1456" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113201,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.the-information-bottleneck.com/i/206378276?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7sug!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7sug!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7sug!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7sug!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e133367-dafa-4950-9c0f-78fda7a49e7c_1600x615.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">One speculative decoding round: draft several tokens, verify them in one target pass, keep the accepted prefix, then correct or continue.</figcaption></figure></div><p></p><h3><strong><span>The acceptance rule, and why the output is exact</span></strong></h3><p><span>The big claim of speculative decoding is that it&#8217;s </span><strong><span>lossless</span></strong><span>: the output tokens are distributed </span><em><span>exactly</span></em><span> as if the target model had generated them alone, temperature and all. This is a real guarantee, not an approximation, and it comes from a rejection-sampling rule. At position k, with draft distribution p&#7496; and target distribution p&#7511;, the drafted token x&#8342; is accepted with probability</span></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\nP(\\mathrm{accept}\\ x_k)=\\min\\left(1,\\frac{p^t(x_k)}{p^d(x_k)}\\right)&quot;,&quot;id&quot;:&quot;KPDAJDQFXG&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p></p><p><span>In other words: when the target assigns the drafted token at least as much probability as the draft did, p&#7511;(x&#8342;) &#8805; p&#7496;(x&#8342;), keep it always. When the draft over-sampled it, giving it more probability than the target does, keep it only in proportion p&#7511;/p&#7496;. On rejection, the replacement is sampled from the residual distribution norm(max(0, p&#7511; &#8722; p&#7496;)): max keeps the tokens where the target wanted more mass than the draft gave them, and norm rescales what&#8217;s left to sum to 1.</span></p><p><span>A nice consequence is that the per-position acceptance probability equals</span></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;P(\\mathrm{accept})=1-\\frac{1}{2}\\lVert p^d-p^t\\rVert_1&quot;,&quot;id&quot;:&quot;YHPYJSAWQA&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p><span>which says the drafter&#8217;s entire job is to stay </span><em><span>distributionally close</span></em><span> to the target. DSpark reuses this exact quantity later as a free training label.  (Why the rule is exact, and why this distance is total variation rather than KL: Appendix A1 and A2.)</span></p><h2><strong><span>3. The latency equation</span></strong></h2><p><span>How much time does it take to produce one token? Speculative decoding pays per round, one draft plus one verification, and gets a variable number of tokens back, so its cost is time-per-round divided by tokens-per-round. Let &#964; be the average number of tokens you get per round (accepted draft tokens plus the bonus/correction token), T</span><sub><span>draft</span></sub><span> the time to write the draft, and T</span><sub><span>verify</span></sub><span> the time for the target&#8217;s verification pass. Then the latency per generated token is</span></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;L=\\frac{T_{\\mathrm{draft}}+T_{\\mathrm{verify}}}{\\tau}&quot;,&quot;id&quot;:&quot;DRATMFNUAX&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p><span>That leaves three ways to go faster. You can draft faster, shrinking T</span><sub><span>draft</span></sub><span>. You can draft better, raising &#964; by getting the drafter to agree with the target more often and for longer. Or you can verify smarter, and stop spending T</span><sub><span>verify</span></sub><span> on draft tokens that were never going to survive. Most of the literature picks one of the three.</span></p><p><span>DSpark is unusual in going after two terms at once: &#964; with an architecture change (Parts 5 and 6), and T</span><sub><span>verify</span></sub><span> with a scheduler (Parts 7 to 9). The second attack only makes sense once you stop thinking about a single user and start thinking about a serving system with hundreds of concurrent requests. But first, the standard menu of drafter designs.</span></p><h2><strong><span>4. Two ways to build a drafter</span></strong></h2><p><strong><span>Autoregressive drafters</span></strong><span> (</span><a href="https://arxiv.org/abs/2401.15077"><span>EAGLE</span></a><span>, DeepSeek&#8217;s </span><a href="https://arxiv.org/abs/2412.19437"><span>MTP</span></a><span> (multi-token prediction)) are small language models that generate the draft one token at a time, each conditioned on the last. They produce coherent drafts, but the drafting cost scales linearly with the block size, T</span><sub><span>draft</span></sub><span> &#8733; &#947;. To keep the draft cheap they have to stay </span><em><span>shallow</span></em><span> (EAGLE-style drafters are often a single transformer layer) and keep &#947; small, which caps both the block length and how much the drafter can know.</span></p><p><strong><span>Parallel drafters</span></strong><span> (</span><a href="https://arxiv.org/abs/2401.10774"><span>Medusa</span></a><span>, and more recently </span><a href="https://arxiv.org/abs/2602.06036"><span>DFlash</span></a><span>) fill in all &#947; positions in a </span><em><span>single</span></em><span> forward pass. Feed in the anchor token plus a row of mask tokens, read out logits everywhere at once, diffusion-style. Now T</span><sub><span>draft</span></sub><span> is nearly independent of &#947;, so you can afford a much </span><em><span>deeper</span></em><span> drafter (DFlash uses 5 layers where EAGLE uses 1) and much longer blocks (&#947; = 16 costs about what &#947; = 4 costs).</span></p><p><strong><a href="https://arxiv.org/abs/2602.06036"><span>DFlash</span></a></strong><span>, the parallel drafter DSpark builds on, is worth describing in some detail because DSpark reuses its entire skeleton. The drafter is a small transformer, 5 layers in the paper. Its input for one drafting round is the embedding of the anchor token (the last token the target actually confirmed) followed by mask-token embeddings, placeholders for the positions to be filled in. All positions attend to each other bidirectionally, and one forward pass produces logits for every position in the block. The drafter doesn&#8217;t even own an embedding table or an output head. It borrows the target model&#8217;s, frozen.</span></p><p><span>Its central trick is how it sees the conversation, called </span><strong><span>KV injection</span></strong><span>. While the target processes the context, hidden states from a few of its layers are saved, projected down into the drafter&#8217;s width, and prepended to the keys and values of every drafter layer, so each draft position attends to the target&#8217;s own internal representation of everything said so far. All of it is computed once, at prefill, and reused every round. The drafter isn&#8217;t understanding the conversation with 5 layers of its own; it&#8217;s reading the big model&#8217;s notes, which is a big part of why it can imitate a model thousands of times larger. (Mechanics and a diagram: Appendix A3.)</span></p><p><span>So a parallel drafter is both faster to run and free to be deeper. That sounds like it should win outright, but it doesn&#8217;t&#8230;</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TtID!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TtID!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TtID!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TtID!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TtID!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TtID!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg" width="1456" height="522" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:522,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82269,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.the-information-bottleneck.com/i/206378276?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TtID!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TtID!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TtID!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TtID!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe93d05cb-2e76-4744-a8e1-8235288a1288_1600x574.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Larger draft blocks help only when acceptance stays high; otherwise most late draft tokens are wasted....</figcaption></figure></div><h2><strong><span>5. Where parallel drafters break: the multi-modal collision</span></strong></h2><p><span>A parallel drafter predicts every position independently, in one shot. Position 3 can&#8217;t see what position 2 actually sampled, only the shared context. So when the context admits several equally good continuations, each position hedges across </span><em><span>all</span></em><span> of them.</span></p><p><span>Take the context </span><em><span>&#8220;Sure, &#8220;</span></em><span>. The target model is happy with either of course or no problem. A parallel drafter, sampling each position from its marginal, can happily emit of problem or no course: fragments of two valid answers stitched into an invalid one. This is the </span><em><span>multi-modal collision</span></em><span> problem, known since the non-autoregressive machine translation days (</span><a href="https://arxiv.org/abs/1711.02281"><span>Gu et al., 2018</span></a><span>). Each token is individually plausible, the combination is garbage, and the target rejects it.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A48j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A48j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg 424w, https://substackcdn.com/image/fetch/$s_!A48j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg 848w, https://substackcdn.com/image/fetch/$s_!A48j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!A48j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A48j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg" width="1456" height="392" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:392,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:67182,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.the-information-bottleneck.com/i/206378276?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A48j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg 424w, https://substackcdn.com/image/fetch/$s_!A48j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg 848w, https://substackcdn.com/image/fetch/$s_!A48j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!A48j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F881b34eb-57cd-4f7d-9a40-66529b00ccd3_1600x431.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A parallel drafter can mix pieces of different valid continuations, producing a sequence the target rejects....</figcaption></figure></div><p><span>The damage shows up as </span><strong><span>suffix decay</span></strong><span>: acceptance falls off rapidly with position in the block. The paper measures this with a nice metric, </span><em><span>position-wise conditional acceptance</span></em><span>: at position k, only count cases where positions 1&#8230;k&#8722;1 were all accepted, then ask how often k is accepted too. This strips out the compounding survival penalty and shows the drafter&#8217;s raw predictive quality at each depth.</span></p><p><span>Here are the curves (Qwen3-4B target, chat domain):</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hb4g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hb4g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png 424w, https://substackcdn.com/image/fetch/$s_!Hb4g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png 848w, https://substackcdn.com/image/fetch/$s_!Hb4g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png 1272w, https://substackcdn.com/image/fetch/$s_!Hb4g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hb4g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png" width="1456" height="650" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:650,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:362682,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.the-information-bottleneck.com/i/206378276?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Hb4g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png 424w, https://substackcdn.com/image/fetch/$s_!Hb4g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png 848w, https://substackcdn.com/image/fetch/$s_!Hb4g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png 1272w, https://substackcdn.com/image/fetch/$s_!Hb4g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52b5196b-a93e-4afc-b9bf-994e61f3d933_1706x762.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong><span>Why DFlash still gets the longer accepted length</span></strong></h3><p><span>The curves make </span><a href="https://arxiv.org/abs/2503.01840"><span>Eagle3</span></a><span> look like the better drafter everywhere past position three. And yet, on accepted length, DFlash beats it on nearly every benchmark in the paper. The mismatch is explained by how verification scores a block.</span></p><p><span>Verification accepts a prefix and discards everything after the first rejection, so the expected haul per round compounds multiplicatively. Write the expected accepted count in terms of the conditional acceptance rates c&#8321;, c&#8322;, &#8230;:</span></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\mathbb{E}[\\mathrm{accepted}]\\approx c_1+c_1c_2+c_1c_2c_3+\\cdots&quot;,&quot;id&quot;:&quot;CZXDIEVQAB&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p><span>Every term contains c&#8321;, so raising c&#8321; by 10% grows the entire sum by 10%, while raising c&#8326; only moves the last couple of terms. A rejection at position 1 erases the whole block; a rejection at position 6 erases one or two tokens. Whatever a drafter is good at, being good at position 1 is worth several times more than being good anywhere else.</span></p><p><span>And position 1 is where the deep parallel drafter has its edge. No draft tokens exist yet at the first position, so both drafter types condition on the same thing, the verified context, and dependency modeling buys nothing there. What decides position 1 is raw capacity, and the latency budgets are lopsided: the autoregressive drafter runs once </span><em><span>per position</span></em><span> and must stay shallow (Eagle3 is one layer), while the parallel drafter runs once </span><em><span>per block</span></em><span> and affords five layers plus KV injection. </span></p><h2><strong><span>6. DSpark idea #1: bolt a bigram onto the parallel drafter</span></strong></h2><p><span>The obvious fix for suffix decay is to make the drafter autoregressive again, but then you&#8217;re back to T</span><sub><span>draft</span></sub><span> &#8733; &#947;. DSpark adds autoregression only where it costs almost nothing. The expensive part, the 5-layer KV-injected DFlash backbone, runs fully parallel as before: one pass, producing hidden states h&#8321;&#8230;h&#7527; and base logits U&#8321;&#8230;U&#7527; for every position. After that, a </span><strong><span>small sequential head</span></strong><span> passes over the block left to right and adds a correction to each position&#8217;s logits, and the correction depends on the tokens already sampled before it:</span></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;p_k(v\\mid x_0,x_{<k})=\\operatorname{softmax}\\left(U_k(v)+B_k(x_0,x_{<k},v)\\right)&quot;,&quot;id&quot;:&quot;UPGRMGKBSV&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p><span>In this formula, U&#8342; is what the parallel backbone already gave us: the base logits for position k, one score per candidate token v over the vocabulary (V &#8776; 10&#8309; tokens), so U&#8342;(v) is token v&#8217;s score. B&#8342;(x&#8320;, x&lt;k, v) is the sequential head&#8217;s correction to that score, and it&#8217;s the only term allowed to look at the block&#8217;s history: the anchor x&#8320; and the draft tokens x&lt;k already sampled at earlier positions.</span></p><p><span>The default B is a small </span><strong><span>Markov head</span></strong><span>. It throws away everything except the immediately preceding token: the correction becomes B(x&#8342;&#8722;&#8321;, &#183;) &#8712; &#8477;V, a full vector of logit corrections, one per candidate next token, selected by which token came just before. Written out as a table that&#8217;s a V&#215;V matrix, a row per possible previous token and a column per possible next token. In other words, a learned bigram model, stored factorized at rank 256: per position the sequential loop costs one table lookup plus one small matrix-vector product, invisible next to the target&#8217;s verification pass. And it is learned with the rest of the drafter rather than counted from a corpus (dimensions and training: Appendix A4).</span></p><p><span>Back to the collision. The backbone, in parallel, gives position 1 as {of, no} and position 2 as {course, problem}. The sequential loop samples position 1 first and gets of. When it moves to position 2, the bigram bias for &#8220;of&#8221; boosts course and suppresses problem, so the drafter no longer stitches &#8220;of problem&#8221; together. </span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Cjn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Cjn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8Cjn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8Cjn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8Cjn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Cjn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg" width="1456" height="467" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:467,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:105317,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.the-information-bottleneck.com/i/206378276?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8Cjn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8Cjn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8Cjn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8Cjn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb824b-663f-4731-a168-646e910cee28_1600x513.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">DSpark keeps the expensive drafter computation parallel, then adds a cheap sequential Markov head to improve within-block coherence.</figcaption></figure></div><p><span>Does one token of memory suffice? The authors also try an </span><strong><span>RNN head</span></strong><span>, a small gated recurrence that carries the whole within-block prefix instead of just the last token. It helps only marginally, and only at long blocks. I think that near-null result is the most useful thing in the paper: </span><strong><span>suffix decay in parallel drafters is mostly a problem of adjacent-token incoherence, not of missing long-range information.</span></strong></p><p><span>Through KV injection (Part 4), every draft position already sees the target&#8217;s representation of the whole conversation. The missing piece is what the neighboring positions sampled, and that doesn&#8217;t exist until </span><em><span>after</span></em><span> the forward pass is over. Only something that runs at sampling time can close that gap, and a bigram is the smallest such thing. </span></p><p><span>Across Qwen3-4B/8B/14B, DSpark&#8217;s macro-average accepted length comes out 27&#8211;31% above Eagle3 and 16&#8211;18% above DFlash, and a </span><em><span>2-layer</span></em><span> DSpark already beats the </span><em><span>5-layer</span></em><span> DFlash, so the gain comes from the dependency modeling and not from extra parameters. On the conditional-acceptance curves, DSpark opens where DFlash opens and stays flat where Eagle3 stays flat.</span></p><h2><strong><span>7. The serving problem: draft tokens compete for batch space</span></strong></h2><p><span>Everything so far was a single-user story: one request, one GPU, minimize that one user&#8217;s latency. In production the target model is shared. One copy serves hundreds of users at once, and each of its forward passes processes a </span><strong><span>batch</span></strong><span>. The batching is done by the serving </span><strong><span>engine</span></strong><span>, the software layer that owns the GPU and runs the model; </span><a href="https://arxiv.org/abs/2309.06180"><span>vLLM</span></a><span> and </span><a href="https://arxiv.org/abs/2312.07104"><span>SGLang</span></a><span> are the open-source examples, and DeepSeek runs its own. Each pass, the engine collects the pending tokens of many requests and pushes them through together: the amortize-the-weight-reads trick from Part 1, applied across users instead of across positions.</span></p><p><span>But the batch is a shared, finite resource. A small batch keeps the pass memory-bound, so extra tokens ride along at no cost (Part 1). Keep adding tokens though, and at some batch size the arithmetic units stop being the idle party; past that point, every additional token makes the pass measurably slower </span><em><span>for everyone in it</span></em><span>. This gives every engine a characteristic curve, </span><strong><span>SPS(B)</span></strong><span>: steps per second as a function of how many tokens the batch holds. It stays flat while the pass is memory-bound and falls once the batch pushes it into compute-bound territory, the two regimes from Part 1.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q8fp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q8fp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png 424w, https://substackcdn.com/image/fetch/$s_!Q8fp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png 848w, https://substackcdn.com/image/fetch/$s_!Q8fp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png 1272w, https://substackcdn.com/image/fetch/$s_!Q8fp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q8fp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png" width="1456" height="846" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:846,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:957166,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.the-information-bottleneck.com/i/206378276?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q8fp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png 424w, https://substackcdn.com/image/fetch/$s_!Q8fp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png 848w, https://substackcdn.com/image/fetch/$s_!Q8fp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png 1272w, https://substackcdn.com/image/fetch/$s_!Q8fp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe28ea67c-8aa5-42fb-93d2-fe2796f89207_1646x956.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Extra verification tokens are nearly free while the batch is memory-bound, but costly once the system becomes compute-bound.</figcaption></figure></div><p><span>Every draft token a request submits for verification takes up one token-slot in the batch, and a rejected token wastes its slot. On the flat part of the curve that waste is harmless, so even a 20% long shot is worth checking. On the steep part, the same token contributes 0.2 expected tokens while slowing down the several hundred others sharing the pass, and it isn&#8217;t worth the slot.</span></p><p><span>The right amount of verification also depends on the </span><em><span>content</span></em><span>. Drafters do well on structured text and badly on open-ended text: on Qwen3-4B the paper measures roughly 5.6 accepted tokens per round on math, 5.1 on code, 3.5 on chat. A single fixed length is therefore wrong in both directions at once, wasting slots on chat requests whose late tokens were never going to be reached and cutting short code requests that could have gone longer.</span></p><p><span>Before this paper, the </span>DeepSeek&#8217;s<span> production system drafted a single token per round, the MTP-1 setup, even though they had already built multi-token drafters (MTP-3, MTP-5). With a static 3-token draft, every request adds 3 tokens to every batch whether the load or the content justifies it, and at production concurrency many of those tokens are late-position chat tokens headed for rejection. The batches grow, every pass slows, and the slowdown across all users outweighs the extra accepted tokens: total throughput drops. Production stayed at the largest setting that never backfired, one token per round, at a price: at &#947; = 1 a round yields at most two tokens, the draft plus the bonus, so the ceiling is roughly a 2x speedup and everything Part 4 built for long parallel blocks goes unused.</span></p><p><span>The way out of that dilemma is to stop picking one length for everyone and instead decide per request, per step: </span><strong><span>given the load right now, how many of this request&#8217;s drafted tokens deserve a batch slot?</span></strong><span> The drafter has already produced its full &#947;-token block, so that cost is sunk; the only choice is which of those tokens get slots, and whatever is cut is dropped unseen. Deciding needs a per-token estimate of the chance a slot pays off, plus a rule turning those estimates and the SPS curve into lengths. </span></p><h2><strong><span>8. DSpark idea #2: choose verification lengths by expected throughput</span></strong></h2><p><span>The </span><strong><span>scheduler</span></strong><span> is the part of the engine (Part 7) that decides, before each forward pass of the target model, what goes </span><em><span>into</span></em><span> that pass: which requests participate, and (the new degree of freedom here) how many draft tokens each request contributes. It answers Part 7&#8217;s question once per step, for the whole batch at once.</span></p><p><span>For one verification step, there are R active requests, each with a freshly drafted &#947;-token block, and the scheduler has to pick a verification length &#8467;&#7523; &#8712; {0, &#8230;, &#947;} for every request r: verify the first &#8467;&#7523; draft tokens and drop the rest. A choice of lengths is judged by the expected token throughput of the whole system for this step:</span></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\max\\ \\Theta=\\tau\\cdot \\mathrm{SPS}(B),\\quad \\tau=\\sum_r\\left(1+\\sum_{j\\le \\ell_r}a_{r,j}\\right),\\quad B=\\sum_r(1+\\ell_r)&quot;,&quot;id&quot;:&quot;LSXSKJAOXS&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p><span>SPS(B) is the Part 7 cost curve; the engine measures it once at startup by timing passes at a range of batch sizes and keeps the results as a lookup table. &#964; is the expected number of output tokens the pass will produce for the whole batch, i.e. Part 3&#8217;s per-request &#964; summed across all R requests. The two +1s are both the anchor: even at &#8467;&#7523; = 0 a request still sends one token through the pass and gets one token back, the bonus or correction from Part 2. Each admitted draft token at position j then adds a&#7523;,&#11388; to &#964;: the probability that it survives verification and actually ends up in the output. Expected tokens per step times steps per second gives expected tokens per second. The one missing part is those survival probabilities (a</span><sub><span>r,j</span></sub><span>)</span></p><h3><strong><span>The confidence head</span></strong></h3><p><span>What does it mean for a slot to pay off? A draft token </span><strong><span>survives</span></strong><span> verification if the left-to-right check actually reaches it (every earlier token in the block was accepted) </span><em><span>and</span></em><span> accepts it too. &#8220;Reaches it&#8221; is the price of batched verification: the whole block is checked in one pass, but acceptance is prefix-only, so a rejection at position 3 means positions 4 and onward are discarded without ever being checked, however good their tokens were.</span></p><p><span>To do that, they use a confidence head, which outputs one scalar per position, c&#8342;, the </span><em><span>conditional</span></em><span> piece of survival: the probability that position k is accepted given that the check reached it. This is the same conditional acceptance rate the Part 5 curves measured, now predicted per token instead of averaged over a benchmark. The head itself is small. It reads the backbone hidden state plus the Markov embedding of the previous token and runs them through a single linear projection and a sigmoid. Its training label is free: the exact acceptance probability from Part 2 is computable at every training step and used directly as a soft label (Appendix A4).</span></p><p><span>Because the c&#8342; are conditionals, the chain rule turns them into full survival probabilities for free:</span></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;a_k=P(\\mathrm{prefix}\\ 1{:}k\\ \\mathrm{all\\ accepted})=\\prod_{i\\le k}c_i\n&quot;,&quot;id&quot;:&quot;VTUWYFFUGO&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p><span>These a&#8342;, computed per request, are exactly the a&#7523;,&#11388; the objective consumes, with one requirement: the arithmetic only works if the scores are </span><em><span>calibrated</span></em><span>, meaning a token scored 0.8 really is accepted about 80% of the time. Raw heads are overconfident; per-position temperature scaling shrinks the predicted-versus-observed gap from 3&#8211;8% to about 1% (Appendix A5).</span></p><p><span>Picking all R lengths at once sounds combinatorial, but the survival probabilities have a property that makes it easy. Within a request, a&#7523;,&#11388; = c&#7523;,&#8321;&#183;c&#7523;,&#8322;&#8943;c&#7523;,&#11388; is a product of numbers between 0 and 1, so tacking on another factor can only shrink it: a&#7523;,&#8321; &#8805; a&#7523;,&#8322; &#8805; &#8230; &#8805; a&#7523;,&#7527;. In other words,  surviving to j+1 requires surviving to j first, so it&#8217;s the stricter condition.</span></p><p><span>That ordering is what licenses a greedy algorithm. Extending request r&#8217;s length from j&#8722;1 to j adds exactly a&#7523;,&#11388; to &#964; and exactly one token to B, a gain and a cost both known in advance. So pour all candidate extensions from all requests into one pool, sort by a&#7523;,&#11388;, and admit from the top, recomputing &#920; after each admission (a table lookup). The within-request constraint (you can&#8217;t verify position 3 without positions 1 and 2) enforces itself: since each request&#8217;s survival probabilities are already in decreasing order, its position-2 candidate always sits above its position-3 candidate in the global sort.</span></p><p><span>When the batch is nearly empty, SPS(B) sits on its flat stretch, admitting another token raises &#964; almost for free, and the scheduler verifies long: 4&#8211;6 tokens per request in the paper&#8217;s numbers. As the batch fills, each admitted token drags SPS down, only tokens whose survival probability beats the drag get in, and the budgets shrink. Within one batch, a code request at 0.9 confidence keeps a long verification while a chat request whose confidence collapses by position 2 gets cut there, with no threshold set anywhere.</span></p><h3><strong><span>A version of this that breaks losslessness</span></strong></h3><p><span>Losslessness needs one more condition beyond the accept/reject rule of Part 2, and this one falls on the scheduler: whether token k gets admitted for verification must not depend on the value of token k. The proofs call this non-anticipation. Fixed verification length satisfies it trivially, but a length chosen by the greedy search above can violate it.</span></p><p><span>The violation runs through the confidence head, which reads the Markov embedding of the previous sampled token: c&#8322;, and therefore a&#8322;, is a function of which x&#8321; was drawn. The block is fully sampled before scheduling (Part 7), so a&#8322; is available; the question is whether the scheduler may consult it. Suppose it evaluates the whole admission path and takes the argmax: &#920; at lengths 0, 1, 2. The length-2 value used a&#8322;, which used x&#8321;. So the comparison that decides whether x&#8321; is admitted at all already depends on which x&#8321; was drawn, and draft tokens that lead to confident continuations get admitted more often than ones that don&#8217;t.</span></p><p><span>For example, with a two-token vocabulary: the target wants {A: 0.7, B: 0.3}, the drafter samples from {A: 0.5, B: 0.5}, and suppose drawing A leads to a high c&#8322; while drawing B leads to a low one, so the argmax scheduler admits the draft after drawing A and skips it after drawing B. When A is drawn (probability 0.5), it is admitted and accepted with probability min(1, 0.7/0.5) = 1. When B is drawn, nothing is admitted and the target samples fresh from {0.7, 0.3}. Total: P(output = A) = 0.5 + 0.5 &#215; 0.7 = </span><strong><span>0.85</span></strong><span> instead of </span><strong><span>0.7</span></strong><span>. </span></p><p><span>The clean algorithm&#8217;s solution is an </span><strong><span>early-stopping break</span></strong><span>: walk the sorted admission path and stop at the first admission that lowers &#920;. Then the decision about position k is finalized before anything computed from x&#8342; is ever consulted, and the proof goes through.</span></p><h2><strong><span>9. Making it run in a real engine</span></strong></h2><p><span>Inside DeepSeek&#8217;s actual engine, the Part 8 algorithm breaks in two places. The first is that the SPS curve isn&#8217;t smooth. Kernels are tuned for particular batch shapes, so pass time jumps at tile-size and dispatch boundaries rather than rising gradually. On a jagged curve the early-stopping break turns into a liability: &#920; can dip at a cliff and recover just past it, and a search that quits at the first dip strands the system at a local optimum.</span></p><p><span>The second is about timing. A modern engine assembles the next pass while the current one runs, and with CUDA-graph replay the next batch size has to be fixed </span><em><span>before</span></em><span> the current pass finishes. The Part 8 scheduler can&#8217;t meet that deadline, since it needs the current step&#8217;s confidence scores, and those don&#8217;t exist until the step is done. Run it synchronously and the GPU stalls between every pair of steps.</span></p><p><span>The deployed version works around both problems by computing the batch&#8217;s capacity a couple of steps ahead of time. The scheduler fixes K, the number of tokens the next pass can afford to verify, using confidence scores from </span><strong><span>two steps back</span></strong><span>, so it&#8217;s ready before the pass launches. The tokens that actually fill those K slots are still chosen at the last moment from the current step&#8217;s real confidence scores, by sorting the live candidates as in Part 8 and keeping the top K.</span></p><p><span>This design also settles the losslessness question from Part 8, where the danger was that computing the cut-off consulted downstream token values. Here the cut-off is K, fixed from two-step-old data before any of this step&#8217;s tokens existed, and the fresh ranking that fills the slots consults only tokens </span><em><span>earlier</span></em><span> in the block, never token k itself or anything after it. That is exactly what non-anticipation demands, so it holds by construction, the early-stopping break can go, and the search over the jagged curve can run globally to the true maximum. The same design choice that fixed the pipeline stall also restored exactness; my guess is the pipeline constraint came first and the losslessness argument was noticed after the fact.</span></p><h3><strong><span>The live-traffic numbers</span></strong></h3><p><span>Deployed on DeepSeek-V4-Flash and V4-Pro under real user traffic, against the incumbent MTP-1:</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-nr3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-nr3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png 424w, https://substackcdn.com/image/fetch/$s_!-nr3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png 848w, https://substackcdn.com/image/fetch/$s_!-nr3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png 1272w, https://substackcdn.com/image/fetch/$s_!-nr3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-nr3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png" width="1456" height="713" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:713,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:500862,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.the-information-bottleneck.com/i/206378276?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-nr3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png 424w, https://substackcdn.com/image/fetch/$s_!-nr3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png 848w, https://substackcdn.com/image/fetch/$s_!-nr3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png 1272w, https://substackcdn.com/image/fetch/$s_!-nr3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6b586b-5f0b-4284-bea0-6b742762bdb2_1900x930.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><span>The paper&#8217;s Figure 8 shows that at moderate concurrency the average verification budget sits at 4&#8211;6 tokens per request, and as concurrency rises the scheduler shrinks it, dropping low-confidence tokens before they occupy batch slots. </span></p><h3><strong><span>Next Steps</span></strong></h3><p><span>A few things the paper leaves open. The SPS table is profiled once and indexed by batch size alone, but real per-step cost also depends on the batch&#8217;s context-length mix, so a 1-D curve is an approximation. The confidence head is trained on the analytical acceptance labels under teacher-forced prefixes but deployed on sampled ones. That&#8217;s a train/inference mismatch. Calibration is fit on a held-out set, and live traffic drifts; whether the head stays calibrated online isn&#8217;t reported. And the drafter still burns a full &#947;-block forward on every request, even hopeless ones. The scheduler prunes </span><em><span>verification</span></em><span>, not </span><em><span>drafting</span></em><span>.</span></p><h2><strong><span>10. What to actually remember</span></strong></h2><p><span>The important thing about DSpark is not just that it makes speculative decoding faster. Earlier work mostly asked how to build a better drafter: make it cheaper, deeper, or more accurate. DSpark shows that this is only half the story. In a real serving system, the question is not &#8220;how many tokens can I draft?&#8221; but &#8220;which drafted tokens are worth spending target-model batch capacity on right now?&#8221; The paper&#8217;s two main ideas answer both sides of that question: a semi-autoregressive Markov head makes long parallel drafts much more coherent, and a throughput-aware scheduler decides how much of each draft to verify under the current load. </span></p><h2><strong><span>A. Appendix: the fine print</span></strong></h2><p><span>Details that back the main text but aren&#8217;t needed to follow it.</span></p><h3><strong><span>A1. Why the rejection rule is exact</span></strong></h3><p><span>Check any token v. It reaches the output two ways: drafted and kept, or rejected and resampled. If p&#7511;(v) &#8804; p&#7496;(v), the kept route alone contributes p&#7496;(v) &#183; p&#7511;(v)/p&#7496;(v) = p&#7511;(v) and the residual has zero mass on v. If p&#7511;(v) &gt; p&#7496;(v), the kept route contributes p&#7496;(v) and the resample supplies exactly the missing p&#7511;(v) &#8722; p&#7496;(v), because the overall rejection probability equals the residual&#8217;s normalizer. Either way: p&#7511;(v). The same accounting shows why the replacement can&#8217;t simply be drawn from p&#7511;: acceptance already gave every token min(p&#7511;, p&#7496;), so the rejection branch may supply only the shortfall. With p&#7511; = {A: 0.7, B: 0.3} and p&#7496; = {A: 0.5, B: 0.5}, resampling from the full p&#7511; would give P(A) = 0.5 + 0.2 &#215; 0.7 = 0.64 instead of 0.7, tilting the output toward the tokens the draft over-proposed.</span></p><h3><strong><span>A2. The distance is total variation, not KL</span></strong></h3><p><span>The distance in the acceptance formula is total variation, not KL. TV is symmetric, so there is no forward or reverse version of the statement, and </span><a href="https://en.wikipedia.org/wiki/Pinsker%27s_inequality"><span>Pinsker&#8217;s inequality</span></a><span> (TV &#8804; &#8730;(KL/2)) says pushing either KL down also pushes acceptance up. The paper&#8217;s distillation loss skips the surrogate entirely and minimizes the L1 term directly, so it is optimizing the acceptance rate itself.</span></p><h3><strong><span>A3. KV injection, in detail</span></strong></h3><p><span>Its central trick is how it sees the conversation, called </span><strong><span>KV injection</span></strong><span>. The drafter never reads the context as text, and it never runs its own forward pass over it. Instead it recycles work the target already did. When the target processes the context, every one of its layers produces a hidden state for every token: a vector encoding that token after the layer has mixed in information from everything before it. DFlash saves these hidden states from a handful of target layers; different depths carry different levels of abstraction, from surface features early to semantics late, so the drafter gets a cross-section rather than a single view. For each context token, the saved vectors are concatenated across the chosen layers and passed through a learned projection down into the drafter&#8217;s much smaller hidden size, giving one compact context vector per context token. All of this is computed once, during the target&#8217;s prefill, and reused on every drafting round after that.</span></p><p><span>These vectors enter the drafter through attention. Recall the split of roles there: queries ask, keys and values are what gets read. In every layer of the drafter, the context vectors are projected into keys and values and prepended to that layer&#8217;s own keys and values, so from a draft position&#8217;s point of view they behave like extra tokens it can attend to. The draft positions do the querying; the target&#8217;s representations do the answering. Each draft position therefore sees two things at once: the other positions in its block, and the target&#8217;s own internal summary of everything said so far, at several depths. The drafter isn&#8217;t trying to understand the conversation with 5 layers of its own. It&#8217;s reading the big model&#8217;s notes, and the notes were written by the very network it&#8217;s trying to imitate, which is a big part of why a 5-layer model can predict what a model thousands of times larger will say next.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4Wua!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Wua!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4Wua!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4Wua!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4Wua!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Wua!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg" width="1456" height="877" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:877,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:189363,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.the-information-bottleneck.com/i/206378276?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4Wua!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4Wua!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4Wua!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4Wua!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eb1826a-5b81-458a-911a-d7f9aae5ac5a_1600x964.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>One construction detail: in the original DFlash the anchor plus &#947; masks go in and only the mask positions are predicted; DSpark trims this to anchor plus &#947;&#8722;1 masks and predicts at the anchor slot too, which saves a little compute at the same quality.</span></p><h3><strong><span>A4. The Markov head and the confidence head: dimensions and training</span></strong></h3><p><span>At this vocabulary size the bigram table would have ~10&#185;&#8304; entries, so it&#8217;s stored factorized: B = W&#8321;W&#8322;, with W&#8321; &#8712; &#8477;^{V&#215;256} and W&#8322; &#8712; &#8477;^{256&#215;V}. Row x&#8342;&#8722;&#8321; of W&#8321; is a 256-dimensional embedding of the previous token (the paper&#8217;s </span><em><span>Markov embedding</span></em><span>, which the confidence head in Part 8 also reads), and multiplying it by W&#8322; expands it back to a V-dimensional correction. Per position: one table lookup plus one 256-by-V matrix-vector product.</span></p><p><span>W&#8321; and W&#8322; are not counted from corpus statistics. They are learned by gradient descent along with the rest of the drafter, trained to imitate the frozen target&#8217;s outputs, with Part 2&#8217;s TV distance as part of the loss.</span></p><p><span>The confidence head&#8217;s training label is free. Part 2 showed that the acceptance probability at a position is exactly 1 &#8722; &#189;&#8214;p&#7496; &#8722; p&#7511;&#8214;&#8321;. Training the drafter already computes both distributions: the frozen target runs on the training data to provide supervision, which yields p&#7511; at every position, and p&#7496; is the drafter&#8217;s own output. So the true acceptance probability is available in closed form at every training step, and the confidence head is supervised directly with it as a soft label, without ever simulating an accept/reject decision.</span></p><h3><strong><span>A5. Calibrating the confidence head</span></strong></h3><p><span>A confidence head is </span><em><span>calibrated</span></em><span> if its numbers mean what they say: of all the tokens it scores 0.8, about 80% should actually be accepted. Simpler schemes don&#8217;t need this. A threshold rule like &#8220;drop everything below 0.4&#8221; only compares scores to a cutoff, so it works as long as better tokens get higher scores, even if every score is inflated. DSpark&#8217;s scheduler does arithmetic with the scores. It multiplies them into survival probabilities and sums those into an expected token count for the whole batch, so if the head says 0.9 where the truth is 0.7, the count is wrong and the scheduler ends up maximizing a throughput that doesn&#8217;t exist. Neural confidence estimates are, reliably, overconfident in exactly this way.</span></p><p><span>The fix is temperature scaling with one twist, which the paper calls Sequential Temperature Scaling. Because the scheduler consumes cumulative products, a&#8342; = c&#8321;&#8943;c&#8342;, the calibration targets the products rather than the raw scores: walking left to right, each position gets one temperature, fit on held-out data to shrink the gap between the predicted and the observed acceptance of the cumulative product, with earlier positions held fixed. Temperature scaling only rescales scores, it never reorders them, so the ranking the head learned survives. The average gap between predicted and observed acceptance drops from 3&#8211;8% to about 1%.</span></p><h3><strong><span>A6. The empty-system limit</span></strong></h3><p><span>In the limit of an empty system, the maximization says to verify the entire &#947;-token block, since an admitted token can only add to &#964;. Light-load speed is therefore capped by &#947; and by drafter quality rather than by the scheduler, which is part of why Part 6&#8217;s fight to keep acceptance high at long blocks matters. The one cost light load doesn&#8217;t forgive is T_{draft}, paid every round regardless of what gets verified.</span></p><p><span>Source: </span><a href="https://arxiv.org/abs/2607.05147"><span>Cheng et al., </span></a><em><a href="https://arxiv.org/abs/2607.05147"><span>DSpark: Confidence-Scheduled Speculative Decoding with Semi-Autoregressive Generation</span></a></em><span> (DeepSeek-AI &amp; Peking University, 2026). Figures in this post are stylized redraws of the paper&#8217;s Figures 1, 2, and 7; all numbers are from the paper. DeepSeek released the DSpark checkpoints for the V4 preview models along with </span><a href="https://github.com/deepseek-ai/DeepSpec"><span>DeepSpec</span></a><span>, a training repo where </span><a href="https://arxiv.org/abs/2503.01840"><span>Eagle3</span></a><span>, </span><a href="https://arxiv.org/abs/2602.06036"><span>DFlash</span></a><span>, and DSpark are all trained on the same data, so the baselines in this comparison are held fixed for once. Background reading: </span><a href="https://arxiv.org/abs/2211.17192"><span>Leviathan et al.</span></a><span> and </span><a href="https://arxiv.org/abs/2302.01318"><span>Chen et al.</span></a><span> (2023) on speculative sampling; </span><a href="https://arxiv.org/abs/1711.02281"><span>Gu et al. (2018)</span></a><span> on non-autoregressive generation and multi-modal collision; </span><a href="https://arxiv.org/abs/2401.15077"><span>Li et al. on the EAGLE series</span></a><span>; </span><a href="https://arxiv.org/abs/2602.06036"><span>Chen et al. (2026)</span></a><span> on DFlash.</span></p><h2><strong><span>References and links</span></strong></h2><ul><li><p><a href="https://arxiv.org/abs/2607.05147"><span>Cheng et al. (2026), </span></a><em><a href="https://arxiv.org/abs/2607.05147"><span>DSpark: Confidence-Scheduled Speculative Decoding with Semi-Autoregressive Generation</span></a></em></p></li><li><p><a href="https://arxiv.org/abs/2602.06036"><span>Chen et al. (2026), </span></a><em><a href="https://arxiv.org/abs/2602.06036"><span>DFlash: Block Diffusion for Flash Speculative Decoding</span></a></em></p></li><li><p><a href="https://arxiv.org/abs/2211.17192"><span>Leviathan et al. (2023), </span></a><em><a href="https://arxiv.org/abs/2211.17192"><span>Fast Inference from Transformers via Speculative Decoding</span></a></em></p></li><li><p><a href="https://arxiv.org/abs/2302.01318"><span>Chen et al. (2023), </span></a><em><a href="https://arxiv.org/abs/2302.01318"><span>Accelerating Large Language Model Decoding with Speculative Sampling</span></a></em></p></li><li><p><a href="https://arxiv.org/abs/2401.15077"><span>Li et al. (2024), </span></a><em><a href="https://arxiv.org/abs/2401.15077"><span>EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty</span></a></em></p></li><li><p><a href="https://arxiv.org/abs/2503.01840"><span>Li et al. (2025), </span></a><em><a href="https://arxiv.org/abs/2503.01840"><span>EAGLE-3: Scaling up Inference Acceleration of Large Language Models via Training-Time Test</span></a></em></p></li><li><p><a href="https://arxiv.org/abs/2401.10774"><span>Cai et al. (2024), </span></a><em><a href="https://arxiv.org/abs/2401.10774"><span>Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads</span></a></em></p></li><li><p><a href="https://arxiv.org/abs/2412.19437"><span>DeepSeek-AI (2024), </span></a><em><a href="https://arxiv.org/abs/2412.19437"><span>DeepSeek-V3 Technical Report</span></a></em><span> &#8212; includes the multi-token prediction (MTP) objective.</span></p></li><li><p><a href="https://arxiv.org/abs/1711.02281"><span>Gu et al. (2018), </span></a><em><a href="https://arxiv.org/abs/1711.02281"><span>Non-Autoregressive Neural Machine Translation</span></a></em></p></li><li><p><a href="https://arxiv.org/abs/2309.06180"><span>Kwon et al. (2023), </span></a><em><a href="https://arxiv.org/abs/2309.06180"><span>Efficient Memory Management for Large Language Model Serving with PagedAttention</span></a></em><span> &#8212; vLLM.</span></p></li><li><p><a href="https://arxiv.org/abs/2312.07104"><span>Zheng et al. (2023), </span></a><em><a href="https://arxiv.org/abs/2312.07104"><span>SGLang: Efficient Execution of Structured Language Model Programs</span></a></em></p></li><li><p><a href="https://github.com/deepseek-ai/DeepSpec"><span>DeepSeek-AI DeepSpec repository</span></a></p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.the-information-bottleneck.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Information Bottleneck! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Editing a Compressed Memory]]></title><description><![CDATA[Linear attention compresses memory into one fixed-size matrix. The hard part is editing it without scrambling everything else.]]></description><link>https://www.the-information-bottleneck.com/p/editing-a-compressed-memory</link><guid isPermaLink="false">https://www.the-information-bottleneck.com/p/editing-a-compressed-memory</guid><dc:creator><![CDATA[Ravid Shwartz Ziv]]></dc:creator><pubDate>Mon, 29 Jun 2026 18:48:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Pof3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Written with help from Claude for drafting, editing, and figures. All the mistakes are its.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pof3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pof3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!Pof3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!Pof3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!Pof3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pof3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6344361,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://informationbottleneck.substack.com/i/204059098?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pof3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!Pof3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!Pof3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!Pof3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2377031-d7c8-4103-968c-6efb5d46ac77_2816x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.the-information-bottleneck.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Information Bottleneck! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>A Transformer remembers by keeping everything. Every token it has read stays in the KV cache, and any later token can look back at any earlier one exactly. That is why attention is so good at recall, and why its memory and compute grow with the length of the context.</p><p>Linear attention makes the opposite bet. It throws the cache away and keeps a single fixed-size matrix: a running summary that every new token updates and every query reads. Memory stops growing and decoding gets cheap. But a fixed-size summary cannot hold an unbounded number of facts cleanly, so writing something new can disturb what is already stored. Almost all the recent progress here (DeltaNet, Gated DeltaNet, KDA, and now Gated DeltaNet-2) is about making that write more surgical.</p><p>This post builds the whole thing from the ground up. You do not need to know any of these models going in; just linear algebra and a rough sense of what attention does. <strong> Shape of the argument</strong></p><ol><li><p>A fixed-size state is an <strong>associative memory</strong> built by summing key&#8211;value outer products, and reading it is content-addressed lookup.</p></li><li><p>Because it is fixed-size, overlapping keys <strong>interfere</strong>. That is the one limitation everything else fights.</p></li><li><p>Giving an old key a <strong>new value</strong> is the hard case. Adding leaves the stale value behind; replacing the matrix destroys every other fact; the <strong>delta rule</strong> does the surgical thing.</p></li><li><p>The delta rule looks sequential but <strong>trains in parallel</strong> as one small triangular solve per chunk.</p></li><li><p><strong>Decay</strong>, then <strong>per-channel decay (KDA)</strong>, then <strong>decoupled erase/write gates (GDN-2)</strong> are three refinements that keep that solve intact.</p></li></ol><div><hr></div><h2>Which memory we mean</h2><p>&#8220;Memory&#8221; means three different things in a language model. This post is about one of them.</p><ul><li><p><strong>The weights.</strong> The query/key/value projection matrices and the gates, learned during training and fixed afterward. Long-term knowledge, changed only by more training. Not this.</p></li><li><p><strong>The KV cache</strong> (softmax). The full list of past keys and values, so any query can look back exactly. Lossless, grows with context, reset each sequence. Linear attention removes this.</p></li><li><p><strong>The recurrent state</strong> (linear attention). One fixed-size matrix summarizing every token so far. Lossy, fixed size, reset each sequence. <strong>This is the memory we mean.</strong></p></li></ul><p>So this is <strong>in-context memory</strong>: holding the current input within a single forward pass, so token 5,000 can use what token 3 said. New prompt, empty state, nothing saved. It is <strong>not</strong> retrieval/RAG, not continual learning, not &#8220;remembering you across sessions&#8221;; it is the job plain attention does with its KV cache, just compressed into a fixed matrix instead of a growing list.</p><div><hr></div><h2>Where the state comes from</h2><p>Each token has a representation, and three fixed learned matrices turn it into a query, a key, and a value:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;q_t = W_q\\,x_t, \\qquad k_t = W_k\\,x_t, \\qquad v_t = W_v\\,x_t.&quot;,&quot;id&quot;:&quot;FAXFPXLXAC&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>The key is a token&#8217;s address, what it is about; the value is the content stored there; the query is what the current token is asking for, matched against the keys to decide what to pull out. A token writes itself in as a key&#8211;value pair and later reads with a query. The vectors depend on the input, but the three projection matrices are fixed weights, shared across every position and sequence.</p><p>Ordinary attention computes each output as a softmax-weighted sum over the past:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;o_t = \\sum_{i\\le t}\\frac{\\exp(q_t^\\top k_i)}{Z_t}\\,v_i, \\qquad Z_t=\\sum_{j\\le t}\\exp(q_t^\\top k_j).\n&quot;,&quot;id&quot;:&quot;XFWNTCZHJM&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>The exponential is what forces the cache. The score <code>exp(query &#183; key)</code> does not split into a part that depends only on the query times a part that depends only on the key, so the weight on each value is tied to that specific key, and the normalizer sums over every past key. There is no running summary you can keep instead: you have to store every key&#8211;value pair and revisit them for each new query. That is the KV cache: memory grows linearly with sequence length, and producing all outputs scales quadratically with it.</p><p>Linear attention drops the softmax and uses a score that factorizes, in the simplest case just the dot product of query and key. Once it factorizes, the sum rearranges:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;o_t = \\sum_{i\\le t}(k_i^\\top q_t)\\,v_i = \\Big(\\sum_{i\\le t} k_i v_i^\\top\\Big)^{\\!\\top} q_t = S_t^\\top q_t, \\qquad S_t=\\sum_{i\\le t}k_i v_i^\\top.&quot;,&quot;id&quot;:&quot;QSWNCCQEUQ&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>All of history collapses into one matrix of fixed size (key-dimension by value-dimension), and the query reads it in a single multiply. Memory no longer grows with context and the per-token cost is constant. This fixed state is the object the rest of this post is about; it exists precisely because the softmax is gone.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r7d9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e915411-489c-4558-b31e-c8444281c469_1434x871.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r7d9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e915411-489c-4558-b31e-c8444281c469_1434x871.png 424w, https://substackcdn.com/image/fetch/$s_!r7d9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e915411-489c-4558-b31e-c8444281c469_1434x871.png 848w, https://substackcdn.com/image/fetch/$s_!r7d9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e915411-489c-4558-b31e-c8444281c469_1434x871.png 1272w, https://substackcdn.com/image/fetch/$s_!r7d9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e915411-489c-4558-b31e-c8444281c469_1434x871.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r7d9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e915411-489c-4558-b31e-c8444281c469_1434x871.png" width="1434" height="871" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e915411-489c-4558-b31e-c8444281c469_1434x871.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:871,&quot;width&quot;:1434,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:65483,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://informationbottleneck.substack.com/i/204059098?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e915411-489c-4558-b31e-c8444281c469_1434x871.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!r7d9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e915411-489c-4558-b31e-c8444281c469_1434x871.png 424w, https://substackcdn.com/image/fetch/$s_!r7d9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e915411-489c-4558-b31e-c8444281c469_1434x871.png 848w, https://substackcdn.com/image/fetch/$s_!r7d9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e915411-489c-4558-b31e-c8444281c469_1434x871.png 1272w, https://substackcdn.com/image/fetch/$s_!r7d9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e915411-489c-4558-b31e-c8444281c469_1434x871.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Two ways to remember a sequence. Softmax keeps a growing KV cache, a key&#8211;value row per token; linear attention keeps one fixed-size matrix that every token writes into. The cache scales with length; the matrix does not.</figcaption></figure></div><p></p><p>That fixed size is the appeal and the problem at once. Packing an unbounded history into one matrix is cheap, but it means many facts share the same finite space. The next section shows what that does to a read.</p><div><hr></div><h2>Why a fixed-size memory interferes</h2><p>We have the fixed-size state. Before writing into it, look at what reading it gives you. Reading is applying a query to the memory:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;S^\\top q = \\sum_i v_i\\,(k_i^\\top q).\n&quot;,&quot;id&quot;:&quot;PFMSZZJGTE&quot;}" data-component-name="LatexBlockToDOM"></div><p>Each stored value is weighted by how aligned its key is with the query, the dot product of the two. That is content-addressed recall: values whose keys match what you asked for, weighted by the match.</p><p>To expose the problem, take the cleanest possible query, one that exactly equals a key you already stored. This is the case that <em>should</em> return its value perfectly, so any mess is the memory&#8217;s fault, not a mismatched query. Splitting off that term:</p><p></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;S^\\top k_j = \\underbrace{v_j\\,(k_j^\\top k_j)}_{\\text{what you want}} \\;+\\; \\underbrace{\\sum_{i\\ne j} v_i\\,(k_i^\\top k_j)}_{\\text{leakage from every other fact}}.\n&quot;,&quot;id&quot;:&quot;ITHKSEBMIO&quot;}" data-component-name="LatexBlockToDOM"></div><p>If the stored keys were orthonormal, every cross term would be zero and the read would be clean. They are not. Each nonzero overlap leaks a fraction of some other value into the answer. And here is the structural reason they cannot all be orthogonal: the state is a single matrix, so the key space has only as many dimensions as the key vector is wide, and a space of that dimension holds at most that many mutually orthogonal directions. Store more associations than that and some keys <em>must</em> share directions; even below the limit, random unit keys have small but nonzero overlaps that add up.</p><p>As the context carries more associations, the term you want stays about the same size while the leakage is a sum over everything else, so it grows. Signal-to-noise falls with context length: a long document forces many distinct facts to share one fixed box and they smear together. That is why this whole family struggles on long, many-needle retrieval, and why the improvements below all aim at that pressure point.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RfsW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3155d38-aad2-469e-be97-daad80ddedda_1434x779.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RfsW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3155d38-aad2-469e-be97-daad80ddedda_1434x779.png 424w, https://substackcdn.com/image/fetch/$s_!RfsW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3155d38-aad2-469e-be97-daad80ddedda_1434x779.png 848w, https://substackcdn.com/image/fetch/$s_!RfsW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3155d38-aad2-469e-be97-daad80ddedda_1434x779.png 1272w, https://substackcdn.com/image/fetch/$s_!RfsW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3155d38-aad2-469e-be97-daad80ddedda_1434x779.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RfsW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3155d38-aad2-469e-be97-daad80ddedda_1434x779.png" width="1434" height="779" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3155d38-aad2-469e-be97-daad80ddedda_1434x779.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:779,&quot;width&quot;:1434,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53896,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://informationbottleneck.substack.com/i/204059098?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3155d38-aad2-469e-be97-daad80ddedda_1434x779.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RfsW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3155d38-aad2-469e-be97-daad80ddedda_1434x779.png 424w, https://substackcdn.com/image/fetch/$s_!RfsW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3155d38-aad2-469e-be97-daad80ddedda_1434x779.png 848w, https://substackcdn.com/image/fetch/$s_!RfsW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3155d38-aad2-469e-be97-daad80ddedda_1434x779.png 1272w, https://substackcdn.com/image/fetch/$s_!RfsW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3155d38-aad2-469e-be97-daad80ddedda_1434x779.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Reading a stored key returns its value plus a small leak from every other key. The wanted term stays the same size while the leakage is a sum over everything else, so it grows as more facts share the fixed state.</figcaption></figure></div><h3>Why softmax doesn&#8217;t have this problem</h3><p>The leakage is <em>not</em> caused by folding the sum into the state matrix. The summed form and the matrix form are the same number; folding only fixes the size and the cost, not the value. The leakage is already there in the raw dot-product score.</p><p>Softmax runs those same dot products through an exponential and normalizes. The exponential sharpens them: the matching key saturates near one and the mismatched keys are crushed toward zero, so the wrong values effectively drop out of the read even when the keys overlap. Same overlaps, clean answer.</p><p>But that is exactly the property that cannot be summarized. The exponential of a dot product does not split into a query part times a key part, so there is nothing to precompute: you are forced to keep every key and recompute the exponential against each one, which is the growing cache. So it is an either/or: a sharp score reads cleanly but cannot be folded into a fixed state, while a foldable score gives the fixed state but leaks. <strong>Interference is not the cost of compressing; it is the cost of using a score weak enough to be compressible.</strong></p><div><hr></div><h2>Updating a value when a key comes back</h2><p>As the model reads a sequence, a later token sometimes produces a key close to one an earlier token already wrote, but carrying a different value. The state already holds a binding in that direction, and the new value should take its place. This is the update case, and it is the one ordinary outer-product memory gets wrong.</p><p>For example, a passage sets <code>x = 5</code> and later sets <code>x = 7</code>. Both tokens produce nearly the same key (the direction standing for &#8220;the value of x&#8221;), but with different values. When a later token reads x, the answer should be 7. Plain addition cannot give that: it never removed the old binding, so the slot holds 5 and 7 at once and the read returns a blend. The same shape shows up whenever a key recurs with a new value: an entity whose state changes (&#8221;Alice is in Paris&#8230; now Tokyo&#8221;), a correction (&#8221;blue&#8230; actually green&#8221;), a form field revised.</p><p>Two clarifications, since &#8220;update&#8221; can mislead. The prompt itself is fixed; the forward pass only reads it left to right, and &#8220;update&#8221; means a later position&#8217;s binding should win over an earlier one. &#8220;x = 5&#8221; stays in the text; it just should not win the read. And keys are not matched by name: two tokens are &#8220;the same key&#8221; when their key vectors point in roughly the same direction, so their writes land on the same spot in the state. A repeated mention produces a nearby key, the later write hits that slot, and the read afterward should reflect the new value.</p><p>So every write is one of two cases. <strong>Add:</strong> the key points somewhere new, a fresh fact, which is most tokens; plain accumulation is fine, and that is what vanilla linear attention does. <strong>Overwrite:</strong> the key lands on a direction already in the state, and the slot has to be updated to the new value, not stacked on top of the old one.</p><h3>Why not just replace the whole matrix?</h3><p>Because the state is shared by every association at once. Three ways to write an update to one key, into a memory that also holds a second fact:</p><ul><li><p><strong>Replace</strong> the whole matrix with the new key&#8211;value outer product: fixes the target key perfectly and <em>deletes everyone else</em>. Read the second key afterward and you get near zero. You wanted to change one slot and you erased the notebook.</p></li><li><p><strong>Add</strong> the new outer product: keeps the second fact, but leaves the old binding in place, so reading the target key returns old-plus-new, the stale value smeared into the fresh one.</p></li><li><p><strong>Delta:</strong> read what the key currently points to, subtract just that, then write the new value. Only the target slot changes; the other fact is untouched.</p></li></ul><p>Add keeps the other fact but smears the target. Replace fixes the target but wipes the other fact. Only the third (read, subtract, write) gets both right. That third option is the delta rule.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WpEo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WpEo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png 424w, https://substackcdn.com/image/fetch/$s_!WpEo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png 848w, https://substackcdn.com/image/fetch/$s_!WpEo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png 1272w, https://substackcdn.com/image/fetch/$s_!WpEo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WpEo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png" width="1456" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60184,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://informationbottleneck.substack.com/i/204059098?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WpEo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png 424w, https://substackcdn.com/image/fetch/$s_!WpEo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png 848w, https://substackcdn.com/image/fetch/$s_!WpEo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png 1272w, https://substackcdn.com/image/fetch/$s_!WpEo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb2f377-f16e-4696-8a9c-a730daaa0a12_1528x763.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Updating one key three ways. Add leaves the old value smeared into the new one; replacing the whole matrix fixes the target but destroys every other fact; the delta rule edits only the target slot and leaves the rest intact.</figcaption></figure></div><div><hr></div><h2>The delta rule</h2><p>The update that does this is the <strong>delta rule</strong> (Widrow &amp; Hoff, 1960), used for linear attention in DeltaNet (Yang et al., 2024). It writes the new value relative to what is already stored, not absolutely. First read what the memory currently returns for the key:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{old value} \\;=\\; S_{t-1}^\\top k_t.\n&quot;,&quot;id&quot;:&quot;NEXIJNPVZU&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>This is whatever sits in that key&#8217;s direction right now. We never have to know in advance whether the key was used before; we just read it back. Then move the slot from that old value toward the target, by a fraction &#946; (the write strength):</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;S_t = S_{t-1} + \\beta_t\\,k_t\\big(\\,\\underbrace{v_t - S_{t-1}^\\top k_t}_{\\text{new} \\,-\\, \\text{old}}\\,\\big)^{\\!\\top}, \\qquad \\beta_t\\in[0,1].&quot;,&quot;id&quot;:&quot;AURBMXMAJY&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>The bracket is the gap between the new value and the old one, and adding it back pushes the value stored at that key toward the target. One update covers both cases with no branching: if the key points somewhere new, the read is about zero, the gap is just the new value, and it reduces to a plain add; if the key lands on a direction that already holds a value, the read returns that old value, and the update subtracts it and writes the new value in its place. The memory tells the rule which case it is in.</p><p>Multiplying the correction out shows what it does to the whole state:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;S_t = \\big(I - \\beta_t k_t k_t^\\top\\big)S_{t-1} + \\beta_t k_t v_t^\\top.\n&quot;,&quot;id&quot;:&quot;WCXOPIWIYR&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>The second term writes the new value along the key. The first term removes a &#946; fraction of whatever the state held along that key, and only along that key: the projection onto the key direction leaves everything orthogonal to it untouched. That is exactly why, in the previous widget, replacing the whole matrix wiped the bystander but the delta update did not; it only edits that one key&#8217;s line of the state.</p><h3>Why &#946; is not just 1</h3><p>A write strength of 1 is a hard overwrite: erase the old binding completely, write the new value. So why not use it everywhere? &#946; is produced per token by the model, and two things argue against pinning it to 1. Real keys are not exactly orthogonal, so erasing hard along one key also disturbs neighbors that partly share its direction, and a smaller &#946; makes a gentler edit with less collateral damage. And not every write should fully replace: sometimes the right move is to nudge a value, accumulate evidence, or write weakly under uncertainty. So &#946; between 0 and 1 is a dial: 1 overwrites, 0 leaves the slot alone, in between is a partial move. (In the online-learning view it is a per-step learning rate, and a rate of 1 everywhere is rarely what you want.)</p><p>One caveat the next widget makes concrete: the clean overwrite is exact only when the key is orthogonal to the others. When keys overlap, editing along one drags on whatever shares its direction, the same interference from before, now showing up in the write.</p><div><hr></div><h2>Training it in parallel</h2><p>Training needs every output over the whole sequence at once, then a gradient. Plain linear attention gives them cheaply because the state is a running sum, so the outputs collapse into two matrix multiplies (with a causal mask zeroing the future):</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;O = (QK^\\top \\odot M)\\,V,\n&quot;,&quot;id&quot;:&quot;TESUIUOIGO&quot;}" data-component-name="LatexBlockToDOM"></div><p>Why this is fast: it is all dense matmuls, and a GPU runs a matmul as thousands of multiply-adds in parallel on its tensor cores, every output position at the same time. Nothing waits for anything else.</p><p>The delta rule breaks this. Its erase factor (the one from the operator form above) makes each state genuinely depend on the previous one, so you cannot write the answer as one sum of independent terms. Done literally you process tokens one at a time, each a tiny rank-one update that uses a sliver of the GPU while the rest sits idle.</p><p>DeltaNet&#8217;s contribution (Yang et al., 2024) was to recover the matmul form by working in <strong>chunks</strong>. A chunk is a contiguous block of C tokens; a length-L sequence is split into L/C of them. The expensive work happens inside a chunk, all as matmuls, and only a small summary state is passed from one chunk to the next.</p><h3>The trick: solve for the values that were actually written</h3><p>Every step adds a rank-one term whose left factor is a key, so the state is always the start state plus one such term per token:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;S_t = S_0 + \\sum_{s\\le t} k_s\\,u_s^\\top.\n&quot;,&quot;id&quot;:&quot;BQHVWWLPWR&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>The written value here is not the raw value, but the correction from the delta rule (target minus old value, scaled by &#946;). The keys are known; these written values are the unknowns. The point is that if we can get all of them in a chunk at once, with a single matrix solve instead of a token-by-token walk, the whole chunk becomes parallel matmuls. So we solve for them jointly.</p><p>The written value at each step depends on the current read, and that read expands into known keys and earlier written values:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;S_{t-1}^\\top k_t = S_0^\\top k_t + \\sum_{s\\lt t}(k_s^\\top k_t)\\,u_s.\n&quot;,&quot;id&quot;:&quot;NTXQUWUYCY&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>In words: reading a key against the state-so-far is the start-state read, plus every earlier written value weighted by how much its key overlaps the current one. Substituting gives a relation among the written values alone:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;u_t = \\beta_t\\big(v_t - S_0^\\top k_t\\big) - \\beta_t\\!\\sum_{s\\lt t}(k_s^\\top k_t)\\,u_s.\n&quot;,&quot;id&quot;:&quot;YFDJFXHQTY&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>Each written value depends only on earlier ones, which makes this a triangular system. Stack the written values into a matrix, collect the pairwise key overlaps into a matrix T, and the whole set of equations becomes a single solve:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;(I + T)\\,U = \\mathrm{diag}(\\beta)\\,(V - K S_0), \\qquad U = (I+T)^{-1}\\mathrm{diag}(\\beta)(V - K S_0).\n&quot;,&quot;id&quot;:&quot;OXRWZQPHTQ&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>Because the matrix being inverted is unit lower-triangular, the inverse is one forward substitution on a small C-by-C matrix. Everything else is dense matmuls: build the overlap matrix from pairwise key dot products, then form the carried state and the outputs:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;S_C = S_0 + K^\\top U, \\qquad O = Q S_0 + \\mathrm{tril}(Q K^\\top)\\,U.\n&quot;,&quot;id&quot;:&quot;ZAFCZJGMHD&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>The sequential token loop is gone, replaced by matmuls plus one small triangular solve. Writing a product of rank-one factors as a single low-rank update this way is a classical move from numerical linear algebra, the WY representation (Bischof &amp; Van Loan, 1985) and its UT-transform variant (Joffrain et al., 2006); DeltaNet borrows it to collapse the chunk into matrix operations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ft4g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ft4g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png 424w, https://substackcdn.com/image/fetch/$s_!ft4g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png 848w, https://substackcdn.com/image/fetch/$s_!ft4g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png 1272w, https://substackcdn.com/image/fetch/$s_!ft4g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ft4g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png" width="1456" height="657" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/da1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:657,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:75481,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://informationbottleneck.substack.com/i/204059098?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ft4g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png 424w, https://substackcdn.com/image/fetch/$s_!ft4g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png 848w, https://substackcdn.com/image/fetch/$s_!ft4g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png 1272w, https://substackcdn.com/image/fetch/$s_!ft4g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda1be37d-7d6b-4ba5-92ba-a64a2abc23eb_1589x717.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Training a chunk in parallel. Inside a chunk everything is dense matmuls plus one small triangular solve; only the carried state passes to the next chunk, the single sequential step.</figcaption></figure></div><p></p><h3>Why the chunk size is small</h3><p>The chunk size sets how often the state is handed off: there are L/C chunks, so that many sequential state updates. The two extremes make this concrete. A chunk of one token is the original fully sequential recurrence. A single chunk covering the whole sequence is one handoff, done in one parallel block. (This is the opposite of what it might sound like: a bigger chunk means fewer, larger steps, not more.)</p><p>So why not use one giant chunk and be fully parallel? Because the chunk builds and solves a C-by-C matrix, so its cost and memory grow quadratically in the chunk size. At the full length you are back to the quadratic cost of full attention, and the matrix no longer fits in the fast on-chip memory the matmul engine reads from. Too small, and you pay too many sequential steps and underfill each matmul. The kernels use 64.</p><div><hr></div><h2>Adding decay: Gated DeltaNet</h2><p>Everything up to here is DeltaNet: a fixed-size associative memory, edited by the delta rule, trained in parallel. The last three sections are refinements, each adding expressive power with a small change that leaves the chunk algorithm intact.</p><p>The delta rule overwrites one slot at a time but cannot let old context fade on its own. Gated DeltaNet (Yang, Kautz &amp; Hatamizadeh, 2025, arXiv:2412.06464) multiplies the state by a scalar decay before each edit:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;S_t = \\alpha_t\\big(I - \\beta_t k_t k_t^\\top\\big)S_{t-1} + \\beta_t k_t v_t^\\top.\n&quot;,&quot;id&quot;:&quot;MQTPTBOBHV&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>Tracking the cumulative product of the decays, an earlier write contributes to a later read scaled by how much decay has accumulated in between. In the chunk algorithm this is just a per-row reweighting of the same matrices plus an extra factor in the causal mask; the triangular solve is unchanged. Decay is close to free to add. What it cannot do is forget different features at different rates, since it is one number.</p><div><hr></div><h2>Decay per channel: KDA</h2><p>KDA, the linear-attention layer in Kimi Linear (Kimi Team, 2025, arXiv:2510.26692), replaces that single decay with a per-channel decay vector, a different forget rate for every key channel:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;S_t = \\big(I - \\beta_t k_t k_t^\\top\\big)\\,D_t\\,S_{t-1} + \\beta_t k_t v_t^\\top.\n&quot;,&quot;id&quot;:&quot;WGKHPYPLLX&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>Now every channel is scaled differently at every step, which looks like it should break the chunk form. It does not, because of a change of variables: factor the cumulative per-channel decay out of the state, and it cancels from the recurrence, leaving a plain delta product in reweighted key and erase factors:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\bar k_r = \\gamma_r^{-1}\\!\\odot k_r, \\qquad \\bar e_r = \\gamma_r \\odot (\\beta_r k_r).\n&quot;,&quot;id&quot;:&quot;OFKOLCQLRS&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>After this substitution the chunk equations have the same shape as before; only the entries carry the decay factors. KDA buys richer forgetting at no structural cost.</p><p>The per-channel rates are not hand-set hyperparameters; they are learned and data-dependent, produced from each token by a small projection (the Gated DeltaNet parameterization, a softplus of a learned linear map passed through an exponential). A per-head term and a per-channel bias set each channel&#8217;s baseline forget rate, and the per-token projection pushes that rate up or down, so the model learns both the typical decay profile and how to modulate it on the fly. The active edit, though, is still a single write-strength scalar, which scales both the erase and the write at once.</p><div><hr></div><h2>Splitting the edit: Gated DeltaNet-2</h2><p>Erasing acts on the key side: which coordinates of the old read to remove. Writing acts on the value side: which coordinates of the new value to keep. These are different axes of the state, so GDN-2 (Hatamizadeh, Choi &amp; Kautz, 2026, arXiv:2605.22791) gives each its own channel-wise gate, an erase gate on the key and a write gate on the value:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;e_t = b_t \\odot k_t, \\quad z_t = w_t \\odot v_t, \\qquad S_t = \\big(I - k_t e_t^\\top\\big)\\,D_t\\,S_{t-1} + k_t z_t^\\top.\n&quot;,&quot;id&quot;:&quot;NOTBKSFLKZ&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>Compared with KDA, the write direction is unchanged (the left factor is still the key), but the read it subtracts is now channel-selected by the erase gate, and the value it writes is channel-selected by the write gate.</p><h3>Forward: same machine</h3><p>Run the same change of variables, now folding the erase gate into the reweighted factor, and the recurrence is again a plain (now asymmetric) delta product. The chunk pipeline keeps the same shape: the same overlap matrix, the same triangular inverse, the same state and output equations. The only difference is what fills them: the erase gate enters the key-side rows, the write gate the value-side rows, and the overlap matrix is now built from an asymmetric pair rather than a symmetric one.</p><h3>Backward: one real difference</h3><p>Training propagates a loss gradient back through the chunk. Write the solve as the triangular inverse applied to the written values. Backprop needs the gradient with respect to that inverse, which accumulates as a product of the incoming gradient with the written values:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\mathrm dA = \\mathrm dU\\,Z^\\top, \\qquad (\\mathrm dU\\,Z^\\top)_{rs} = \\langle \\mathrm du_r,\\; z_s\\rangle.\n&quot;,&quot;id&quot;:&quot;QYMZUIXFCR&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>The whole question is whether the gate can be pulled out of that inner product. In KDA the written value is a scalar times the value, so it slides straight out, and you can compute the gate-free products once as a matmul and scale afterward:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\langle \\mathrm du_r,\\; \\beta_s v_s\\rangle = \\beta_s\\,\\langle \\mathrm du_r,\\; v_s\\rangle.\n&quot;,&quot;id&quot;:&quot;MCSBAVCNBQ&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>In GDN-2 the written value is a per-channel product, so the gate sits <em>inside</em> the sum over channels and there is nothing to pull out:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\langle \\mathrm du_r,\\; w_s \\odot v_s\\rangle = \\sum_c \\mathrm du_{r,c}\\,w_{s,c}\\,v_{s,c}.\n&quot;,&quot;id&quot;:&quot;CLQUUXNJTX&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>No single number multiplies the whole inner product; the gate reweights each channel before it is summed, so no row or column scaling recovers it from the gate-free version. The erase side has the same issue. The gate therefore has to be folded into the matmul itself, not applied as a scaling after. The forward pass is essentially KDA&#8217;s; the backward kernel is the part that must be rewritten to carry both gates inside its accumulation, and that gate-aware backward is the real implementation cost of the split.</p><p>Setting both gates to the same scalar recovers KDA exactly; tying the decay to a scalar as well gives Gated DeltaNet; dropping the decay gives the delta rule. Each model is the next with some gate held to a scalar.</p><div><hr></div><h2>Where this nets out</h2><p>Step back and it is all one idea, taken in stages. Linear attention compresses an unbounded history into a fixed matrix, fast but lossy. The delta rule edits that matrix surgically instead of piling onto it. The chunked triangular solve makes the edit trainable at scale. Decay, per-channel decay, and decoupled erase/write gates each give the edit finer control over what to keep and what to remove, without giving up the fixed-size state or the parallel training. None of them recover the softmax cache's perfect recall; they make the compression smarter.</p><p>That is also where the measured gains land. In the Gated DeltaNet-2 paper the improvement over KDA is modest on language modeling but clear on long-context, multi-key retrieval, the regime where many associations are forced to share one fixed state and interference is worst. The ablation is honest about the split: a channel-wise erase gate with a scalar write recovers most of the gain, so the erase side is doing more work than the write side.</p><p>This is also why pure linear attention rarely replaces softmax outright. Exact recall is often worth the cost of the growing cache, so most production models stay softmax, and these layers show up where memory and throughput dominate: long context, high-throughput serving, constrained hardware. The common deployment is hybrid: interleave a few full or sliding-window attention layers for exact recall with many cheap linear layers. Recent open-weight models make this concrete. Qwen3-Next and Kimi Linear both stack three linear blocks (a Gated DeltaNet variant) per full-attention block, a 3:1 ratio, and MiniMax-01 mixes lightning (linear) and softmax attention in a similar pattern.</p><div><hr></div><h2><em>Sources: </em></h2><ul><li><p><em>DeltaNet chunkwise algorithm (Yang, Wang, Zhang, Shen, Kim, NeurIPS 2024)</em></p></li><li><p><em>Gated DeltaNet (Yang, Kautz, Hatamizadeh, ICLR 2025, arXiv:2412.06464); </em></p></li><li><p><em>KDA / Kimi Linear (Kimi Team, 2025, arXiv:2510.26692); </em></p></li><li><p><em>Gated DeltaNet-2 (Hatamizadeh, Choi, Kautz, 2026, arXiv:2605.22791).</em></p></li></ul><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.the-information-bottleneck.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Information Bottleneck! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>