<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: garrinm</title><link>https://news.ycombinator.com/user?id=garrinm</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 06 Sep 2026 12:51:22 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=garrinm" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by garrinm in "“Next-token predictor” is the wrong mental model for LLMs"]]></title><description><![CDATA[
<p>Originally I had those parts written in math with probability functions and the likes (its closer to my background). Then I remembered who is my target audience... but now that I see exactly who is my target audience I'm thinking I'll should have snuck a pelican in there. All jokes aside I appreciate the comment and I'm glad that rewrite paid off!</p>
]]></description><pubDate>Sun, 06 Sep 2026 02:40:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=49582790</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49582790</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49582790</guid></item><item><title><![CDATA[New comment by garrinm in "“Next-token predictor” is the wrong mental model for LLMs"]]></title><description><![CDATA[
<p>To be more specific there’s no ground truth tokens to predict. There a verifiable answer in RLVR. But the tokens are explored. Not predicted as there’s no true token to predict.</p>
]]></description><pubDate>Sat, 05 Sep 2026 13:12:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=49576219</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49576219</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49576219</guid></item><item><title><![CDATA[New comment by garrinm in "“Next-token predictor” is the wrong mental model for LLMs"]]></title><description><![CDATA[
<p>I try to make 3 claims in the post, it was a bit clumsy I'll admit that.<p>1. At inference time, LLMs emit one token at a time given the prior tokens. This looks like prediction and I concede that.<p>2. During pre-training, LLMs predict the next token and compare to the actual next token in the training data. This is the classic setting for ML predictions. And I think its meaningful, the model really is predicting what the ground truth next token will be in the data.<p>3. During post-training, in the case of RLVR, there is no ground truth next token. In pretraining, the question is "what token actually came next?". In RLVR, the question is "what sequence of actions gets a high reward?"<p>And the whole point is that thinking about the RLVR is important. A mental model that stops at 1 or 2 is incomplete and doesn't capture what drives LLM tokens.</p>
]]></description><pubDate>Sat, 05 Sep 2026 02:45:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=49572604</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49572604</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49572604</guid></item><item><title><![CDATA[New comment by garrinm in "“Next-token predictor” is the wrong mental model for LLMs"]]></title><description><![CDATA[
<p>Yes I understand the analogy was a bit loose. I'm comparing what happens at "inference time" in chess engines to what happens at train time in LLMs. In hindsight AlphaGo Zero was the perfect analogy, but I missed that opportunity.<p>The analogy with chess still works, but there's an extra step to think about. In both cases there is some kind of search over possible future trajectories. A chess engine explicitly searches branches of the game tree and evaluates which moves lead to good outcomes. In RL for an LLM, you sample rollouts, evaluate the resulting trajectories, and use those evaluations to update the policy.<p>The extra step with the LLM is that you don't keep doing that whole search at inference time. You use the rollouts to update the weights, so in some sense the useful information from that search gets compressed into the model.<p>But if you accept that the model is, in some loose sense, storing what it learned from those rollouts in its weights, then at inference time they are doing a similar job: taking some input state (prior tokens or a board position) and choosing the next action.</p>
]]></description><pubDate>Sat, 05 Sep 2026 02:31:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=49572531</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49572531</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49572531</guid></item><item><title><![CDATA[New comment by garrinm in "“Next-token predictor” is the wrong mental model for LLMs"]]></title><description><![CDATA[
<p>In the article I made 3 claims, and I agree it was a bit clumsy.<p>1st I say that "working forwards" in the sense of outputting one token at a time could be some form of prediction, I don't argue against that. This is what LLMs do at inference time.<p>2nd I say that to me what really constitutes a prediction is the pre-training. Here it's the classic setting for the word prediction in ML. The model outputs a prediction of the ground truth label: the next token.<p>3rd I argue that in RL there is no ground truth next token, so prediction doesn't apply here anymore.<p>Back to your question then: you're asking points 3 and 1 are different. Working backwards from a set of win states is basically what RL does in training. Working forward from the current state is what inference does. To me there is a distinction worth thinking about. First between the mechanism at inference time and at train time. Then between what happens in pre-training vs. RL post training.</p>
]]></description><pubDate>Sat, 05 Sep 2026 00:56:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=49571991</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49571991</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49571991</guid></item><item><title><![CDATA[New comment by garrinm in "“Next-token predictor” is the wrong mental model for LLMs"]]></title><description><![CDATA[
<p>I think the point is more that in RL there's no ground truth to predict. So when training a model with RL the idea of "predicting" doesn't fit anymore. I'll make some edits I see that I wasn't very clear.</p>
]]></description><pubDate>Sat, 05 Sep 2026 00:46:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=49571923</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49571923</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49571923</guid></item><item><title><![CDATA[New comment by garrinm in "“Next-token predictor” is the wrong mental model for LLMs"]]></title><description><![CDATA[
<p>It does in pre training, but not in RL post training. And not at inference time. Reading over all these comments I get the feeling my mistake was not clearly delineating inference time and train time.</p>
]]></description><pubDate>Fri, 04 Sep 2026 23:27:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=49571375</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49571375</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49571375</guid></item><item><title><![CDATA[New comment by garrinm in "“Next-token predictor” is the wrong mental model for LLMs"]]></title><description><![CDATA[
<p>I think that’s fair, I didn’t actually run the whole thing through an AI. it was more targeted edits, but each time it does erode at my writing. But at the same time, I don’t think it’s a good reason to dismiss this. Because I did spend several hours writing it, and I did put a lot of thought into it, and it was not in any meaningful way generated by AI.</p>
]]></description><pubDate>Fri, 04 Sep 2026 22:55:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=49571161</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49571161</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49571161</guid></item><item><title><![CDATA[New comment by garrinm in "“Next-token predictor” is the wrong mental model for LLMs"]]></title><description><![CDATA[
<p>The distinction I perhaps didn’t make clearly enough is that I’m not really debating the concept of prediction at inference time, although, as I pointed out elsewhere, I think that’s the less interesting interpretation of what “prediction” means.<p>What’s more interesting to me is its application at training time. In reinforcement learning, there is no ground-truth next token to predict.<p>So if you’re comfortable calling Deep Blue a “next move predictor,” then I think it’s perfectly consistent to call an LLM a “next token predictor.” But I think it’s more useful to think of Deep Blue as evaluating the value of possible moves. roughly, how likely they are to lead to winning.<p>And I think effectively the same distinction applies here.</p>
]]></description><pubDate>Fri, 04 Sep 2026 22:44:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=49571074</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49571074</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49571074</guid></item><item><title><![CDATA[New comment by garrinm in "“Next-token predictor” is the wrong mental model for LLMs"]]></title><description><![CDATA[
<p>It was written by a human. There are AI edits but it’s very much a human composition. Perhaps a bit sloppy.</p>
]]></description><pubDate>Fri, 04 Sep 2026 22:41:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=49571060</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49571060</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49571060</guid></item><item><title><![CDATA[New comment by garrinm in ""Next-token predictor" is the wrong mental model for LLMs"]]></title><description><![CDATA[
<p>Yes, I think that’s a good explanation. There are really two sides to it.<p>There’s the mechanical, inference time, autoregressive, one-token-after-another side, which I’m not going to argue isn’t prediction. I just think that’s a relatively uninteresting use of the word “prediction,” because it’s effectively a system predicting its own output.<p>The more interesting question is what happens at training time. As you describe, reinforcement learning allows the model to learn to output things that it never could have learned simply by predicting what appears in the training corpus.<p>More concretely, in reinforcement learning there are no ground-truth next tokens to predict.<p>In supervised machine learning, “prediction” usually means there is some ground-truth label that will eventually be revealed. The model predicts what that label is, the difference between the prediction and the truth gives you a loss, and you learn from that.<p>But in reinforcement learning, there is no ground-truth action waiting to be revealed. The model chooses an action, observes the consequences, and learns from the reward. To me, that’s a meaningfully different thing from prediction.</p>
]]></description><pubDate>Fri, 04 Sep 2026 22:40:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=49571046</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49571046</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49571046</guid></item><item><title><![CDATA[“Next-token predictor” is the wrong mental model for LLMs]]></title><description><![CDATA[
<p>Article URL: <a href="https://gmcgoldr.github.io/2026/09/04/llm-next-token-predictors.html">https://gmcgoldr.github.io/2026/09/04/llm-next-token-predictors.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49567310">https://news.ycombinator.com/item?id=49567310</a></p>
<p>Points: 155</p>
<p># Comments: 303</p>
]]></description><pubDate>Fri, 04 Sep 2026 17:09:24 +0000</pubDate><link>https://gmcgoldr.github.io/2026/09/04/llm-next-token-predictors.html</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49567310</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49567310</guid></item><item><title><![CDATA[Why Does Rust Need Send and Sync?]]></title><description><![CDATA[
<p>Article URL: <a href="https://gmcgoldr.github.io/2026/09/03/send-sync-rust.html">https://gmcgoldr.github.io/2026/09/03/send-sync-rust.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49559989">https://news.ycombinator.com/item?id=49559989</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 04 Sep 2026 02:53:39 +0000</pubDate><link>https://gmcgoldr.github.io/2026/09/03/send-sync-rust.html</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49559989</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49559989</guid></item><item><title><![CDATA[Understanding Rust's Pin Type]]></title><description><![CDATA[
<p>Article URL: <a href="https://gmcgoldr.github.io/2026/08/27/pin-in-rust.html">https://gmcgoldr.github.io/2026/08/27/pin-in-rust.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49555102">https://news.ycombinator.com/item?id=49555102</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Thu, 03 Sep 2026 19:09:18 +0000</pubDate><link>https://gmcgoldr.github.io/2026/08/27/pin-in-rust.html</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49555102</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49555102</guid></item><item><title><![CDATA[Implementing Rust's Pin from Scratch, More or Less]]></title><description><![CDATA[
<p>Article URL: <a href="https://gmcgoldr.github.io/2026/08/27/pin-in-rust.html">https://gmcgoldr.github.io/2026/08/27/pin-in-rust.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49479261">https://news.ycombinator.com/item?id=49479261</a></p>
<p>Points: 4</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 28 Aug 2026 14:42:03 +0000</pubDate><link>https://gmcgoldr.github.io/2026/08/27/pin-in-rust.html</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49479261</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49479261</guid></item><item><title><![CDATA[Pinning Down Rust's Pin]]></title><description><![CDATA[
<p>Article URL: <a href="https://gmcgoldr.github.io/2026/08/27/pin-in-rust.html">https://gmcgoldr.github.io/2026/08/27/pin-in-rust.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49473286">https://news.ycombinator.com/item?id=49473286</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 28 Aug 2026 01:20:01 +0000</pubDate><link>https://gmcgoldr.github.io/2026/08/27/pin-in-rust.html</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=49473286</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49473286</guid></item><item><title><![CDATA[Ergonomic errors in Rust: write fast, debug with ease, handle precisely]]></title><description><![CDATA[
<p>Article URL: <a href="https://gmcgoldr.github.io/2025/08/21/stackerror.html">https://gmcgoldr.github.io/2025/08/21/stackerror.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=44986875">https://news.ycombinator.com/item?id=44986875</a></p>
<p>Points: 32</p>
<p># Comments: 27</p>
]]></description><pubDate>Fri, 22 Aug 2025 16:57:49 +0000</pubDate><link>https://gmcgoldr.github.io/2025/08/21/stackerror.html</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=44986875</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44986875</guid></item><item><title><![CDATA[New comment by garrinm in "Show HN: Stack Error – ergonomic error handling for Rust"]]></title><description><![CDATA[
<p>Thanks for the insight, I wasn't aware of `track_caller`. I'll definitely be looking into this. I was scratching my head trying to figure out how to make file and line number usage consistent and customizable, this looks like the answer!<p>You're also right that this will pretty much eliminate the need for macros.<p>That's also a very key insight about Display vs. Debug printing. I'll be looking into that as well.<p>Thank you for the thoughtful reply.</p>
]]></description><pubDate>Mon, 19 May 2025 01:26:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=44025768</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=44025768</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44025768</guid></item><item><title><![CDATA[New comment by garrinm in "Show HN: Stack Error – ergonomic error handling for Rust"]]></title><description><![CDATA[
<p>Anyhow still makes things easier for application development. The main drawback is that the resulting error type doesn't implement std::error::Error, so it's not suitable for library development (as pointed out in the anyhow documentation). Stack Error is a bit less ergonomic, but suitable for library development.</p>
]]></description><pubDate>Mon, 19 May 2025 01:20:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=44025740</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=44025740</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44025740</guid></item><item><title><![CDATA[New comment by garrinm in "Show HN: Stack Error – ergonomic error handling for Rust"]]></title><description><![CDATA[
<p>I played around a bit with SNAFU a couple of years ago, but I'm haven't worked deeply with the library so there might well be some features I'm not aware of.<p>I think SNAFU is more like a combination of anyhow and thiserror into a single crate, rather than Stack Error which leans more heavily into the "turnkey" error struct. Using the Whatever struct, you get some overlap with Stack Error features:<p>- Error message are co-located.<p>- Error type implement std::error::Error (suitable for library development).<p>- External errors can be wrapped and context can easily be added.<p>Where Stack Error differs:<p>- Error codes (and URIs) offer ability for runtime error handling without having to compare strings.<p>- Provides pseudo-stack by stacking messages.<p>Underlying this is an opinion I baked into Stack Error: error messages are for debugging, not for runtime error handling. Otherwise all your error strings effectively become part of your public interface since a downstream library can rely on them for error handling.</p>
]]></description><pubDate>Mon, 19 May 2025 01:18:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=44025727</link><dc:creator>garrinm</dc:creator><comments>https://news.ycombinator.com/item?id=44025727</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44025727</guid></item></channel></rss>