<?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>Tue, 30 Jun 2026 04:33:07 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[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 role="img" 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><title></title><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 role="img" 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><title></title><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 role="img" 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><title></title><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 role="img" 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><title></title><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 role="img" 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><title></title><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>