New blog out!
Browse files- blog-makeshift-mtp.html +112 -0
- blog.html +7 -0
blog-makeshift-mtp.html
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Makeshift MTP: A dumb idea that might work | FMN-GPT - CompactAI</title>
|
| 7 |
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 8 |
+
<style>
|
| 9 |
+
:root{--color-bg:#faf8f5;--color-bg-alt:#f5f0e8;--color-bg-dark:#1a1815;--color-bg-dark-alt:#252220;--color-accent:#e85d3b;--color-accent-light:#ff8a6b;--color-accent-dark:#c44a2d;--color-secondary:#d4a853;--color-text:#2d2a26;--color-text-light:#6b6560;--color-text-muted:#9a948d;--color-border:#e5e0d8;--shadow-md:0 4px 20px rgba(45,42,38,0.12);--font-sans:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;--font-mono:'JetBrains Mono','Fira Code',monospace;--container-max:1200px;--section-padding:100px}
|
| 10 |
+
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
| 11 |
+
html{scroll-behavior:smooth;font-size:16px}
|
| 12 |
+
body{font-family:var(--font-sans);background:var(--color-bg);color:var(--color-text);line-height:1.7;-webkit-font-smoothing:antialiased;display:flex;flex-direction:column;min-height:100vh}
|
| 13 |
+
main{flex:1}
|
| 14 |
+
.container{max-width:var(--container-max);margin:0 auto;padding:0 24px}
|
| 15 |
+
h1,h2,h3{font-weight:600;line-height:1.2;color:var(--color-text)}
|
| 16 |
+
a{color:var(--color-accent);text-decoration:none;transition:color .2s}
|
| 17 |
+
a:hover{color:var(--color-accent-dark)}
|
| 18 |
+
code{font-family:var(--font-mono);background:var(--color-bg-alt);padding:.2em .5em;border-radius:4px;font-size:.9em;color:var(--color-accent-dark)}
|
| 19 |
+
pre{font-family:var(--font-mono);background:var(--color-bg-dark);color:#f5f0e8;padding:1.5rem;border-radius:12px;overflow-x:auto;font-size:.875rem;line-height:1.6}
|
| 20 |
+
pre code{background:none;padding:0;color:inherit}
|
| 21 |
+
.main-nav{position:fixed;top:0;left:0;right:0;background:rgba(26,24,21,.95);backdrop-filter:blur(10px);z-index:1000;padding:1rem 0}
|
| 22 |
+
.main-nav .container{display:flex;justify-content:space-between;align-items:center}
|
| 23 |
+
.nav-brand{color:#fff;font-size:1.25rem;font-weight:600}
|
| 24 |
+
.nav-links{display:flex;gap:2rem}
|
| 25 |
+
.nav-links a{color:var(--color-text-muted);font-size:.9375rem;transition:color .2s}
|
| 26 |
+
.nav-links a:hover{color:var(--color-accent)}
|
| 27 |
+
.footer{padding:3rem 0;background:var(--color-bg-dark);text-align:center}
|
| 28 |
+
.footer-text{color:#fff;font-size:1.125rem;margin-bottom:.5rem}
|
| 29 |
+
.footer-subtext{color:var(--color-text-muted);font-size:.875rem;margin:0}
|
| 30 |
+
.blog-post-section{padding:var(--section-padding) 0;background:var(--color-bg);flex:1}
|
| 31 |
+
.blog-post-content{max-width:700px;margin:0 auto}
|
| 32 |
+
.blog-back{display:inline-block;color:var(--color-accent);font-weight:500;margin-bottom:2rem}
|
| 33 |
+
.blog-post-header{margin-bottom:3rem}
|
| 34 |
+
.blog-post-header h1{margin-top:1rem}
|
| 35 |
+
.blog-post-body p{font-size:1.125rem;line-height:1.8;margin-bottom:1.75rem;color:var(--color-text)}
|
| 36 |
+
.blog-post-body p:first-of-type{font-size:1.25rem}
|
| 37 |
+
.blog-post-body h2{font-size:1.6rem;margin:2rem 0 .8rem;color:var(--color-accent)}
|
| 38 |
+
.blog-post-body blockquote{border-left:4px solid var(--color-accent);padding:1rem 1.5rem;margin:2rem 0;background:var(--color-bg-alt);border-radius:0 8px 8px 0;font-style:italic;font-size:1.1rem;color:var(--color-text)}
|
| 39 |
+
.blog-post-body blockquote p{margin:0}
|
| 40 |
+
.blog-post-body ul,.blog-post-body ol{margin:1.5rem 0;padding-left:1.5rem}
|
| 41 |
+
.blog-post-body li{margin-bottom:.75rem;color:var(--color-text);line-height:1.7}
|
| 42 |
+
.blog-post-body ul li{list-style-type:disc}
|
| 43 |
+
.blog-post-body hr{border:none;height:2px;background:linear-gradient(to right,transparent,var(--color-border),transparent);margin:3rem 0}
|
| 44 |
+
.blog-post-body pre{margin:1.5rem 0}
|
| 45 |
+
.blog-post-body a{text-decoration:underline;text-underline-offset:2px}
|
| 46 |
+
.blog-post-body strong{color:var(--color-text);font-weight:600}
|
| 47 |
+
.blog-post-body em{color:var(--color-text)}
|
| 48 |
+
.blog-meta{display:flex;gap:1rem;margin-bottom:1rem}
|
| 49 |
+
.blog-date{color:var(--color-text-muted);font-size:.875rem}
|
| 50 |
+
.blog-tag{background:rgba(232,93,59,.1);color:var(--color-accent);font-size:.75rem;font-weight:600;padding:.25rem .75rem;border-radius:50px;text-transform:uppercase;letter-spacing:.05em}
|
| 51 |
+
@media(max-width:768px){:root{--section-padding:60px}}
|
| 52 |
+
</style>
|
| 53 |
+
</head>
|
| 54 |
+
<body>
|
| 55 |
+
<nav class="main-nav">
|
| 56 |
+
<div class="container">
|
| 57 |
+
<a href="index.html" class="nav-brand">FMN-GPT</a>
|
| 58 |
+
<div class="nav-links">
|
| 59 |
+
<a href="blog.html">Blog</a>
|
| 60 |
+
<a href="status.html">Model Status</a>
|
| 61 |
+
<a href="https://huggingface.co/CompactAI" target="_blank">HuggingFace</a>
|
| 62 |
+
</div>
|
| 63 |
+
</div>
|
| 64 |
+
</nav>
|
| 65 |
+
<main>
|
| 66 |
+
<article class="blog-post-section">
|
| 67 |
+
<div class="container">
|
| 68 |
+
<div class="blog-post-content">
|
| 69 |
+
<a href="blog.html" class="blog-back">← Back to Blog</a>
|
| 70 |
+
<header class="blog-post-header">
|
| 71 |
+
<div class="blog-meta">
|
| 72 |
+
<span class="blog-date">2026-02-16</span>
|
| 73 |
+
<span class="blog-tag">Technique</span>
|
| 74 |
+
</div>
|
| 75 |
+
<h1>Makeshift MTP: A dumb idea that might work</h1>
|
| 76 |
+
</header>
|
| 77 |
+
<div class="blog-post-body">
|
| 78 |
+
<p>Multi-token prediction is having a moment. DeepMind released a paper on it. Everyone's talking about how models should predict multiple tokens ahead instead of just one. The problem? Most implementations require architecture changes. New training objectives. More parameters. More compute. More everything.</p>
|
| 79 |
+
<p>But what if we could fake it?</p>
|
| 80 |
+
<p>Here's the idea. You have your model and a prompt like "The cat ". Normal inference predicts one token. Boring. But what if we spawned multiple continuations in parallel, each making their own guesses?</p>
|
| 81 |
+
<pre><code>"The cat rna..."
|
| 82 |
+
"The cat cank..."
|
| 83 |
+
"The cat ran..."</code></pre>
|
| 84 |
+
<p>Each of these runs through the model as a forward pass. Nothing fancy. No architectural changes. Then we compute loss on all of them and pick the winner. The one with the lowest loss gets to continue.</p>
|
| 85 |
+
<p>Think about what this actually buys us. We're running inference X times instead of once, sure. But we're also sampling from the latent space in multiple directions at once. The model is essentially exploring different branches of probability and letting us pick the most coherent one.</p>
|
| 86 |
+
<p>And here's the nice part. The number of branches can be anything. Running on a potato? Generate two continuations and pick the better one. Have a GPU cluster sitting around? Spawn fifty. Time-constrained? Pick based on next-token loss only. Got all day? Evaluate the full generated sequence. The tradeoff between compute and quality becomes a dial you can turn.</p>
|
| 87 |
+
<h2>Why this feels like MTP</h2>
|
| 88 |
+
<p>Traditional multi-token prediction trains the model to output multiple tokens in a single forward pass. The model learns to think ahead. Our approach does something similar at inference time. We explore multiple futures and commit to the best one.</p>
|
| 89 |
+
<p>The difference is we never taught the model to do this. We just throw compute at the problem until it works. Crude? Maybe. But it runs on any model without retraining.</p>
|
| 90 |
+
<h2>The actual benefits</h2>
|
| 91 |
+
<p>First, no more regenerating bad outputs. If a branch goes off the rails, its loss spikes, and we simply don't pick it. The bad branch dies quietly without wasting user time on a regeneration request.</p>
|
| 92 |
+
<p>Second, no architecture changes. Your model stays the same. Your training pipeline stays the same. You just add a wrapper around inference that handles the branching and selection logic.</p>
|
| 93 |
+
<p>Third, compute flexibility. Real MTP baked the multi-token prediction into the model weights. Our approach lets you decide at runtime how much exploration you can afford.</p>
|
| 94 |
+
<h2>Why this is probably a bad idea</h2>
|
| 95 |
+
<p>Loss is a proxy for what we actually want, which is coherence, helpfulness, and correctness. A branch might have lower loss but still say something stupid. The model confidently predicting nonsense still has low loss if it's confidently predicting.</p>
|
| 96 |
+
<p>Also, this scales poorly. If you want to explore N branches for M tokens, you're doing N times the forward passes. At some point, just using a bigger model becomes cheaper.</p>
|
| 97 |
+
<p>But for small models? For experiments? For cases where you have time but not parameters? This might be genuinely useful.</p>
|
| 98 |
+
<hr>
|
| 99 |
+
<p><em>We're planning to test this on FMN-GPT. The model is small enough that running multiple forward passes is actually affordable. Whether it helps or not, we'll write up the results. Probably the failures will be more interesting than the successes.</em></p>
|
| 100 |
+
</div>
|
| 101 |
+
</div>
|
| 102 |
+
</div>
|
| 103 |
+
</article>
|
| 104 |
+
</main>
|
| 105 |
+
<footer class="footer">
|
| 106 |
+
<div class="container">
|
| 107 |
+
<p class="footer-text">Built with curiosity over compute.</p>
|
| 108 |
+
<p class="footer-subtext">FMN-GPT by <a href="https://huggingface.co/CompactAI" target="_blank">CompactAI</a> - 2026</p>
|
| 109 |
+
</div>
|
| 110 |
+
</footer>
|
| 111 |
+
</body>
|
| 112 |
+
</html>
|
blog.html
CHANGED
|
@@ -124,6 +124,13 @@ blockquote { border-left: 4px solid var(--color-accent); padding-left: 1.5rem; m
|
|
| 124 |
|
| 125 |
<script>
|
| 126 |
const posts = [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 127 |
{
|
| 128 |
"file": "blog-built-with-curiosity-over-compute.html",
|
| 129 |
"date": "2026-02-15",
|
|
|
|
| 124 |
|
| 125 |
<script>
|
| 126 |
const posts = [
|
| 127 |
+
{
|
| 128 |
+
"file": "blog-makeshift-mtp.html",
|
| 129 |
+
"date": "2026-02-16",
|
| 130 |
+
"tag": "Technique",
|
| 131 |
+
"title": "Makeshift MTP: A dumb idea that might work",
|
| 132 |
+
"excerpt": "Multi-token prediction is hot right now. But what if we could fake it without retraining? Spawn multiple continuations, compute loss on all of them, and pick the winner. Crude, but it runs on any model."
|
| 133 |
+
},
|
| 134 |
{
|
| 135 |
"file": "blog-built-with-curiosity-over-compute.html",
|
| 136 |
"date": "2026-02-15",
|