<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Asfiya M</title>
    <description>The latest articles on DEV Community by Asfiya M (@asfiya_tech).</description>
    <link>https://dev.to/asfiya_tech</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4004991%2F44595a05-c60c-4faa-9b0a-29cf9868bf56.png</url>
      <title>DEV Community: Asfiya M</title>
      <link>https://dev.to/asfiya_tech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/asfiya_tech"/>
    <language>en</language>
    <item>
      <title>The picks and shovels are the story. Here's the chip nobody outside AI infra can explain.</title>
      <dc:creator>Asfiya M</dc:creator>
      <pubDate>Wed, 22 Jul 2026 10:21:39 +0000</pubDate>
      <link>https://dev.to/asfiya_tech/the-picks-and-shovels-are-the-story-heres-the-chip-nobody-outside-ai-infra-can-explain-4cn3</link>
      <guid>https://dev.to/asfiya_tech/the-picks-and-shovels-are-the-story-heres-the-chip-nobody-outside-ai-infra-can-explain-4cn3</guid>
      <description>&lt;p&gt;There's a line from a recent David Lin conversation with Clem Chambers that stuck with me: the real money in AI isn't the chatbots. It's the physical layer. Chips, servers, drives, cables, cooling, power, buildings, and the banks writing the cheques for all of it.&lt;/p&gt;

&lt;p&gt;You can't buy OpenAI or Anthropic directly. You can buy the people selling them electricity and silicon.&lt;/p&gt;

&lt;p&gt;That framing is easy to nod along to and hard to act on, because most people arguing about AI hardware are actually arguing about one company's stock price. So I want to go a level down. Not "buy the picks and shovels" as a slogan, but: what is the actual bottleneck inside the box, who is attacking it from which angle, and what does a founder do with that information on a Tuesday morning.&lt;/p&gt;

&lt;p&gt;I'll use Groq as the worked example, because it's the clearest case of a company that ignored the obvious problem and went after a different one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: Why the physical layer argument holds
&lt;/h2&gt;

&lt;p&gt;The podcast made four points about infrastructure that I think are correct, and one that I'd push back on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demand for compute has no natural ceiling.&lt;/strong&gt; This is underrated. A social network saturates when everyone has an account. Compute doesn't saturate, because every improvement in model quality creates new things worth computing. Reasoning models burn 10-50x the tokens of a single-shot answer for the same question. Agents burn more again, because one user action becomes fifteen chained model calls. The unit of demand keeps getting bigger even when the user count stays flat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There's no prize for second place.&lt;/strong&gt; Correct at the lab level, and it's why capex runs hot for years rather than months. If you believe you might have the best model in eighteen months, underspending now is how you guarantee you won't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Electricity is the binding constraint.&lt;/strong&gt; This one I'd put first, not fourth. You can order more chips. You cannot order more grid. A gigawatt of new generation plus interconnect is a multi-year permitting problem in the US, and that timeline doesn't compress with money. Which is why "performance per watt" stopped being a spec-sheet vanity metric and became a business constraint. If your data centre is power-capped rather than budget-capped, the chip that does more inference per watt literally lets you serve more customers from the same building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I'd push back:&lt;/strong&gt; "spread across the AI supply chain, hold ten years, ignore the news" treats the supply chain as one thing. It isn't. Power generation, transmission, and cooling are genuinely long-cycle businesses with physical moats. Silicon is a knife fight where architectures get obsoleted in 24-month cycles. Holding both for ten years with the same conviction is treating two different risk profiles as one bet.&lt;/p&gt;

&lt;p&gt;Which brings me to the interesting part.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: The bottleneck outside infra
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Running a language model is two completely different jobs wearing one name.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Job one is &lt;strong&gt;prefill&lt;/strong&gt;: reading your prompt. The model processes all your input tokens at once, in parallel. This is compute-heavy. Lots of maths, all of it independent, all of it able to happen simultaneously. GPUs are exceptional at this. It's essentially what they were built for.&lt;/p&gt;

&lt;p&gt;Job two is &lt;strong&gt;decode&lt;/strong&gt;: writing the answer. The model produces one token, looks at everything it has written so far, then produces the next one. It cannot parallelise. Token 50 needs token 49 to exist first.&lt;/p&gt;

&lt;p&gt;And here's the catch that makes decode a hardware problem rather than a maths problem: &lt;strong&gt;to generate each single token, the chip has to read the entire model's weights out of memory.&lt;/strong&gt; All of them. For a 70-billion-parameter model, that's roughly 140GB moved from memory to compute, per token.&lt;/p&gt;

&lt;p&gt;So the compute units sit mostly idle, waiting. The pipe from memory is the ceiling. People in the field call this the memory wall.&lt;/p&gt;

&lt;p&gt;An H100 has around 3.35 TB/s of memory bandwidth. Do the arithmetic on 140GB per token and you can see why GPU decode speeds land where they land. The chip isn't thinking slowly. It's queuing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every serious inference chip company is an answer to this one question:&lt;/strong&gt; how do you stop the weights from having to travel so far?&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3: How Groq works...
&lt;/h2&gt;

&lt;p&gt;Groq was founded in 2016 by Jonathan Ross, who led the team that built Google's first TPU. He left with a specific prediction: memory bandwidth, not compute, would become the thing that decides AI performance. He was early by about six years.&lt;/p&gt;

&lt;p&gt;Their answer has three ideas. All three are simple once you see them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Idea one: don't fetch the weights from anywhere
&lt;/h3&gt;

&lt;p&gt;A GPU keeps model weights in HBM, which is memory that sits &lt;em&gt;next to&lt;/em&gt; the processor and gets read across a bus. Fast, but it's still a journey.&lt;/p&gt;

&lt;p&gt;Groq's LPU puts hundreds of megabytes of SRAM directly on the die and uses it as primary weight storage rather than as a cache. The weights don't live somewhere else and get fetched. They live &lt;em&gt;on the chip&lt;/em&gt;, already there, permanently.&lt;/p&gt;

&lt;p&gt;The Groq 3 generation carries around 500MB of on-chip SRAM with roughly 150 TB/s of bandwidth, against the H100's 3.35 TB/s. That's not a 10% improvement. It's a different order of magnitude, and it's the whole ballgame for decode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The analogy I use with non-technical people:&lt;/strong&gt; a GPU is a chef with a huge, well-stocked walk-in freezer down the hall. Every dish, they walk to the freezer and back. Fast walker, big freezer, but the hallway is the constraint. The LPU is a chef whose ingredients are all pre-laid out on the counter within arm's reach. Tiny counter. Nothing in the freezer. But no walking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Idea two: schedule everything before you start
&lt;/h3&gt;

&lt;p&gt;A GPU decides at runtime what happens next. Threads get scheduled, caches hit or miss, memory access patterns vary. This is flexible and it's why GPUs run anything. It also means the exact same request takes 40ms sometimes and 95ms other times.&lt;/p&gt;

&lt;p&gt;The LPU throws that out. There are no caches, no dynamic scheduling, no out-of-order execution. A compiler works out the entire schedule ahead of time, down to which data arrives at which unit on which clock cycle. The chip then just executes the score.&lt;/p&gt;

&lt;p&gt;Groq describes this as a programmable assembly line, and the metaphor is exact. On an assembly line nobody decides at 2pm what station three does next. It was decided when the line was designed, and the part arrives at station three at the moment station three is ready for it.&lt;/p&gt;

&lt;p&gt;Notably, Groq wrote the compiler &lt;em&gt;before&lt;/em&gt; they designed the chip. The hardware was shaped to fit the software rather than the other way round.&lt;/p&gt;

&lt;h3&gt;
  
  
  Idea three: make many chips behave like one
&lt;/h3&gt;

&lt;p&gt;Because 500MB is small, a real model doesn't fit on a single LPU. It gets split across many chips, which then have to coordinate.&lt;/p&gt;

&lt;p&gt;On GPU clusters this coordination is a well-known source of unpredictable delay. Switches, routing, packets arriving in odd orders. Groq extends the static schedule across the whole rack. The compiler knows when data will arrive at each chip, so chips connect directly with no switches deciding anything at runtime. Hundreds of chips act as one large processor.&lt;/p&gt;

&lt;h3&gt;
  
  
  What all this actually buys you
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Speed&lt;/strong&gt;, obviously. Roughly 5-10x GPU decode throughput depending on model and generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tail latency&lt;/strong&gt;, which matters more and gets discussed less. Deterministic execution means the same work takes the same time every time. On a GPU your median response might be 200ms and your 99th percentile 900ms. When one user action fans out into fifteen sequential model calls, you're not exposed to the median. You're exposed to the worst one in the chain, fifteen times over. This is why agent products feel unpredictably slow in production while feeling fine in demos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Energy per token.&lt;/strong&gt; No HBM stacks, no complex cooling. Groq's racks are air-cooled by design. Circle back to the electricity bottleneck from part one and you can see why this is a commercial argument, not an environmental one.&lt;/p&gt;

&lt;h3&gt;
  
  
  And what it costs you
&lt;/h3&gt;

&lt;p&gt;I'd rather you hear this from me than find out during a migration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It can't train.&lt;/strong&gt; Training needs backpropagation, gradient accumulation, optimiser states. Wrong shape entirely for a statically-scheduled inference pipeline. You still need GPUs upstream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compile time is real.&lt;/strong&gt; Solving that scheduling puzzle for a new model takes serious time. Great for a model you'll serve for six months. Painful for research where the architecture changes weekly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small memory per chip means you need lots of chips&lt;/strong&gt;, which is why Groq serves a curated catalogue of open models rather than letting you upload anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prefill isn't its strength.&lt;/strong&gt; Long-context, document-heavy work leans on the phase GPUs win. The emerging pattern is hybrid: GPU does prefill, hands the KV cache to the LPU, LPU does decode. That works but it adds real infrastructure complexity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4: The competitive picture
&lt;/h2&gt;

&lt;p&gt;Five different bets on the same problem. I've kept this to what changes a decision.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;
&lt;strong&gt;Nvidia GPU&lt;/strong&gt; (H200/B200)&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Groq LPU&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Cerebras WSE&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;SambaNova RDU&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Google TPU / AWS Trainium&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Core bet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;General-purpose parallel compute wins everything&lt;/td&gt;
&lt;td&gt;Kill the memory wall with on-chip SRAM + static scheduling&lt;/td&gt;
&lt;td&gt;One wafer-sized chip removes chip-to-chip overhead&lt;/td&gt;
&lt;td&gt;Reconfigurable dataflow, sits between GPU and fixed ASIC&lt;/td&gt;
&lt;td&gt;Vertical integration; own the silicon under your own cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Train or infer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;Inference only&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed vs GPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;~5-10x on decode&lt;/td&gt;
&lt;td&gt;~15x claimed&lt;/td&gt;
&lt;td&gt;~5x claimed (SN50)&lt;/td&gt;
&lt;td&gt;Competitive, varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Where it wins&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anything and everything; unmatched ecosystem&lt;/td&gt;
&lt;td&gt;Real-time decode, agent loops, voice&lt;/td&gt;
&lt;td&gt;Very large models, long context, HPC&lt;/td&gt;
&lt;td&gt;On-prem enterprise, very large models&lt;/td&gt;
&lt;td&gt;Cost at hyperscale inside one cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Where it loses&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cost per token; latency variance&lt;/td&gt;
&lt;td&gt;No training, weak prefill, curated models only&lt;/td&gt;
&lt;td&gt;Cost, footprint, niche software&lt;/td&gt;
&lt;td&gt;Smaller ecosystem&lt;/td&gt;
&lt;td&gt;Locked to GCP / AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;How you access it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Buy, or any cloud&lt;/td&gt;
&lt;td&gt;API (GroqCloud) or on-prem racks&lt;/td&gt;
&lt;td&gt;API or on-prem&lt;/td&gt;
&lt;td&gt;Mostly on-prem&lt;/td&gt;
&lt;td&gt;Only that cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data residency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fully yours if on-prem&lt;/td&gt;
&lt;td&gt;Vendor infra unless you buy racks&lt;/td&gt;
&lt;td&gt;Either&lt;/td&gt;
&lt;td&gt;On-prem strength&lt;/td&gt;
&lt;td&gt;Vendor cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Switching cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Near zero, OpenAI-compatible API&lt;/td&gt;
&lt;td&gt;Low, API-based&lt;/td&gt;
&lt;td&gt;High, on-prem commitment&lt;/td&gt;
&lt;td&gt;Medium, cloud lock-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Company risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Investment grade&lt;/td&gt;
&lt;td&gt;Independent post-Nvidia deal, $1.75B raised&lt;/td&gt;
&lt;td&gt;Public (NASDAQ: CBRS)&lt;/td&gt;
&lt;td&gt;Private, $1.5B raised&lt;/td&gt;
&lt;td&gt;Backed by trillion-dollar parents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two patterns worth pulling out of that table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nobody is beating Nvidia at being Nvidia.&lt;/strong&gt; Every challenger wins a specific dimension and loses the general case. Nvidia's roughly 80% share isn't inertia. It's that one architecture credibly does training and inference and vision and research, with a software ecosystem fifteen years deep. The challengers aren't trying to replace that. They're trying to peel off the workload where specialisation pays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inference is where challengers can actually win&lt;/strong&gt;, because inference rewards specialisation and grows with &lt;em&gt;usage&lt;/em&gt; rather than with lab budgets. Training demand is concentrated in maybe a dozen buyers. Inference demand is every company shipping a feature.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 5: The open-source angle, which is the part founders should care about
&lt;/h2&gt;

&lt;p&gt;This is the connection most coverage misses.&lt;/p&gt;

&lt;p&gt;Groq doesn't serve Claude or GPT. It can't. Those weights aren't available. The catalogue is open-weight models: the GPT-OSS family, Qwen, Llama, Whisper for speech.&lt;/p&gt;

&lt;p&gt;That's usually described as a limitation. I'd argue it's the entire strategic point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The economics of open models only work if inference is cheap and fast.&lt;/strong&gt; Open weights are free to download and expensive to serve. That's why "just self-host Llama" is advice that sounds better than it works. The moment someone specialises the hardware for exactly those models, the calculus shifts. Prices land around $0.05 per million input tokens on smaller models, against a couple of dollars for frontier proprietary ones. Meta partnered with Groq for the official Llama API. That's an ecosystem forming, not a vendor selling boxes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where this leaves a founder:&lt;/strong&gt; the honest answer is not "switch to Groq." It's tiering.&lt;/p&gt;

&lt;p&gt;Most products have a boring tier and a hard tier, and most teams route everything to the hard tier because it's one API key. Classification, routing, extraction, summarisation, reformatting — that's the boring tier, and an 8B open model on fast cheap hardware handles it. Genuine multi-step reasoning, ambiguous judgement, anything customer-facing where quality is the product — that's the hard tier, and a frontier model earns its price.&lt;/p&gt;

&lt;p&gt;Two providers, a router in between. Because both speak an OpenAI-compatible API, this is a config change, not a rewrite. That's the whole migration.&lt;/p&gt;

&lt;p&gt;And there's a category where the speed isn't an optimisation but the product itself. Voice agents live or die on a sub-second turn budget split between speech-to-text, model, and text-to-speech. At GPU decode speeds the loop doesn't close and the conversation feels stilted. At LPU speeds it does. Same for live translation, coding autocomplete, and anything where a human is watching tokens appear.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 6: The uncomfortable footnote
&lt;/h2&gt;

&lt;p&gt;I'd be doing you a disservice if I stopped at the technology.&lt;/p&gt;

&lt;p&gt;In late 2025 Nvidia paid roughly $20B for access to Groq's inference architecture. Jonathan Ross and president Sunny Madra went to Nvidia. Simon Edwards is now Groq's CEO. Nvidia showed a Groq 3 LPX inference accelerator at GTC 2026. Reporting still differs on whether that was a non-exclusive licence or an acquisition of the inference unit.&lt;/p&gt;

&lt;p&gt;Groq raised $650M in June 2026 and GroqCloud continues to operate independently. And in June 2026, Groq deprecated most of the model IDs that every LangChain tutorial written before that date depends on. I found that out the way everyone does, with a 400 error that says the model has been decommissioned.&lt;/p&gt;

&lt;p&gt;Which is the real lesson, and it isn't about Groq. &lt;strong&gt;Speed is a feature you rent. Portability is a feature you own.&lt;/strong&gt; Write your code against an OpenAI-compatible interface. Keep model IDs in config, never in source. Query the provider's model list programmatically instead of hardcoding what a tutorial told you eighteen months ago. Then the question "which chip is fastest this quarter" becomes a pricing decision rather than an engineering project.&lt;/p&gt;

&lt;p&gt;The podcast's advice was to hold the physical layer for ten years and ignore the daily noise. For investors, maybe. For builders, the opposite applies. The silicon underneath you will get replaced two or three times in that window. Build so you don't care which one is winning.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;David Lin Podcast: &lt;a href="https://www.youtube.com/watch?v=12GGEIB4Tco" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=12GGEIB4Tco&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: Groq's LPU architecture documentation and engineering blog, Groq's TSP papers from ISCA 2020 and 2022, arXiv work on prefill/decode-aware accelerator evaluation, and current vendor benchmarks. Performance figures are largely vendor-supplied and should be treated accordingly. Model availability on GroqCloud changes frequently — check the live catalogue before building against any specific model ID.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your model isn't broken. It's just badly tuned.</title>
      <dc:creator>Asfiya M</dc:creator>
      <pubDate>Tue, 14 Jul 2026 14:13:13 +0000</pubDate>
      <link>https://dev.to/asfiya_tech/your-model-isnt-broken-its-just-badly-tuned-56e1</link>
      <guid>https://dev.to/asfiya_tech/your-model-isnt-broken-its-just-badly-tuned-56e1</guid>
      <description>&lt;h2&gt;
  
  
  What's in here
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Splitting your data (and why the old rules don't apply anymore)&lt;/li&gt;
&lt;li&gt;The mismatch trap&lt;/li&gt;
&lt;li&gt;Bias and variance: the only two problems you have&lt;/li&gt;
&lt;li&gt;The recipe&lt;/li&gt;
&lt;li&gt;Regularization: making the model less confident&lt;/li&gt;
&lt;li&gt;Why does this actually stop overfitting?&lt;/li&gt;
&lt;li&gt;
Dropout: randomly break your own network

&lt;ul&gt;
&lt;li&gt;Why does dropout work?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Two cheaper tricks&lt;/li&gt;
&lt;li&gt;
Normalize your inputs (seriously, just do it)

&lt;ul&gt;
&lt;li&gt;Why bother?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Vanishing and exploding gradients

&lt;ul&gt;
&lt;li&gt;The single neuron fix&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What I'd tell past me&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most people learn neural networks backwards.&lt;/p&gt;

&lt;p&gt;You learn how to build one. Then you build one. Then it performs badly and you have no idea why, so you go back and change the number of layers, and it still performs badly, and now you're just guessing.&lt;/p&gt;

&lt;p&gt;I've been going through the fundamentals again properly, and the thing that clicked for me is this: almost every "my model doesn't work" problem falls into one of two buckets. Once you know which bucket you're in, the fix is almost mechanical.&lt;/p&gt;

&lt;p&gt;Here's what I've learned so far, written the way I wish someone had explained it to me.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvmbthig32hlz30wdegvh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvmbthig32hlz30wdegvh.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Splitting your data (and why the old rules don't apply anymore)
&lt;/h2&gt;

&lt;p&gt;You split your data into three chunks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Train set&lt;/strong&gt; - the model learns from this.&lt;br&gt;
&lt;strong&gt;Dev set&lt;/strong&gt; (also called validation) - you use this to pick between different model ideas. Should I use 3 layers or 5? Should the learning rate be 0.01 or 0.001? You try both, check the dev set, keep the winner.&lt;br&gt;
&lt;strong&gt;Test set&lt;/strong&gt; - you touch this once, at the very end, to get an honest number for how good your model actually is.&lt;/p&gt;

&lt;p&gt;The classic textbook split is 60/20/20. That was fine when datasets had 10,000 rows.&lt;/p&gt;

&lt;p&gt;But if you have a million examples, do you really need 200,000 of them just to compare two learning rates? No. A few thousand is enough to tell two models apart. So modern splits look more like 98/1/1.&lt;/p&gt;

&lt;p&gt;The dev and test sets aren't there to be big. They're there to be &lt;em&gt;enough&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And honestly, if you don't need a fully unbiased final number, you can skip the test set entirely. Lots of teams do. They just call their dev set a "test set," which is technically wrong but nobody's stopping them.&lt;/p&gt;


&lt;h2&gt;
  
  
  The mismatch trap
&lt;/h2&gt;

&lt;p&gt;Here's a mistake that silently destroys models.&lt;/p&gt;

&lt;p&gt;Say you're building a cat classifier. You scrape 200,000 clean, well-lit cat photos from the web for training. Then for your dev and test sets, you use 10,000 blurry photos taken by actual users on their phones.&lt;/p&gt;

&lt;p&gt;Your model will look great in training and fall apart in the real world. Not because the model is bad, but because you trained it on a different world than the one you're testing it in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rule: your dev and test sets must come from the same distribution.&lt;/strong&gt; And that distribution should be the data you actually care about performing well on.&lt;/p&gt;

&lt;p&gt;You can still train on the web photos (data is data). But dev and test both have to look like the real thing. Otherwise you're optimizing for a target that doesn't exist.&lt;/p&gt;


&lt;h2&gt;
  
  
  Bias and variance: the only two problems you have
&lt;/h2&gt;

&lt;p&gt;Forget the formal statistics definitions for a second. In practice, you diagnose this with two numbers.&lt;/p&gt;

&lt;p&gt;Let's say a human can identify cats with ~0% error. That's roughly your ceiling.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Train error&lt;/th&gt;
&lt;th&gt;Dev error&lt;/th&gt;
&lt;th&gt;Diagnosis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;td&gt;11%&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;High variance&lt;/strong&gt; (overfitting)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15%&lt;/td&gt;
&lt;td&gt;16%&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;High bias&lt;/strong&gt; (underfitting)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15%&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;High bias AND high variance&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;td&gt;You're fine. Go home.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read that table again, it's the whole game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High variance&lt;/strong&gt; = your model memorized the training data. It's brilliant on data it's seen, useless on data it hasn't. The gap between train and dev is the tell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High bias&lt;/strong&gt; = your model is too simple to even learn the training data. It's bad everywhere, equally. There's no gap, just a high floor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Both at once&lt;/strong&gt; feels weird when you first see it, but it happens. Imagine a model that's mostly a straight line (too simple for most of the data) but has a few wild spikes where it memorized specific weird examples. Underfitting in general, overfitting in spots. Bad train error &lt;em&gt;and&lt;/em&gt; a big gap.&lt;/p&gt;

&lt;p&gt;One caveat on that ~0% ceiling. If you're classifying blurry images that even humans get wrong 15% of the time, then 15% train error isn't high bias. It's near-optimal. Always compare against what's actually achievable, not against zero.&lt;/p&gt;


&lt;h2&gt;
  
  
  The recipe
&lt;/h2&gt;

&lt;p&gt;This is the flowchart I now run in my head every time a model underperforms:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Do I have high bias?&lt;/strong&gt; (check train error)&lt;br&gt;
If yes → bigger network, train longer, try a different architecture. Keep going until train error looks good.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Do I have high variance?&lt;/strong&gt; (check the train-to-dev gap)&lt;br&gt;
If yes → get more data, or regularize. Then go back to step 1 and re-check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Repeat until both are low.&lt;/strong&gt; Then stop.&lt;/p&gt;

&lt;p&gt;What makes this useful is the order. Fix bias first, because a model that can't even fit the training data has nothing to regularize. And notice that the two fixes are different: throwing more data at a high-bias model does nothing at all.&lt;/p&gt;

&lt;p&gt;Back in the pre-deep-learning days there was a real tradeoff. Reducing bias meant increasing variance and vice versa. Now? A bigger network reduces bias without much variance cost (as long as you regularize), and more data reduces variance without touching bias. The tradeoff isn't gone but it's much weaker.&lt;/p&gt;


&lt;h2&gt;
  
  
  Regularization: making the model less confident
&lt;/h2&gt;

&lt;p&gt;When you have high variance and can't get more data (which is most of the time), you regularize.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For logistic regression&lt;/strong&gt;, you add a penalty term to your cost function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;J(w, b) = (1/m) × Σ Loss(ŷ, y)  +  (λ / 2m) × ||w||²
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That second term is L2 regularization. &lt;code&gt;||w||²&lt;/code&gt; is just the sum of every weight squared. &lt;code&gt;λ&lt;/code&gt; (lambda) is how hard you punish big weights. It's a hyperparameter you tune on the dev set.&lt;/p&gt;

&lt;p&gt;You usually skip &lt;code&gt;b&lt;/code&gt; in the penalty. It's one number out of millions, it doesn't matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a neural network&lt;/strong&gt;, same idea, but you sum the penalty across every weight matrix in every layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;J = (1/m) × Σ Loss  +  (λ / 2m) × Σ_l ||W[l]||²
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The matrix version of this norm has a fancy name (Frobenius norm) but it's the same thing: square everything, add it up.&lt;/p&gt;

&lt;p&gt;In backprop, this adds a &lt;code&gt;(λ/m) × W&lt;/code&gt; term to your gradient. Which means the weight update becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;W = W - α × (backprop_gradient + (λ/m) × W)
W = W(1 - αλ/m) - α × backprop_gradient
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See that &lt;code&gt;(1 - αλ/m)&lt;/code&gt; factor? Every single step, before you even apply the gradient, your weights get shrunk slightly. That's why L2 regularization is also called &lt;strong&gt;weight decay&lt;/strong&gt;. Your weights are constantly leaking toward zero, and only the gradient pushes back.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why does this actually stop overfitting?
&lt;/h2&gt;

&lt;p&gt;Two ways to see it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The intuition:&lt;/strong&gt; crank λ way up. The penalty dominates, so the optimizer drives weights toward zero to minimize cost. Weights near zero means many neurons contribute almost nothing. Your huge network effectively behaves like a much smaller, simpler one. Simpler network, less capacity to memorize.&lt;/p&gt;

&lt;p&gt;Obviously you don't set λ that high. But somewhere in the middle you land on a network that's "just simple enough."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The better intuition (my favorite):&lt;/strong&gt; think about tanh as your activation. When z is small, tanh is basically a straight line. When z is large, it saturates into curves.&lt;/p&gt;

&lt;p&gt;Big λ → small W → small z → every neuron is operating in its linear zone. And a network made of linear pieces can only learn roughly linear things. It literally cannot draw the wildly wiggly decision boundary that overfitting requires.&lt;/p&gt;

&lt;p&gt;Regularization doesn't just make the model smaller. It makes it &lt;em&gt;smoother&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dropout: randomly break your own network
&lt;/h2&gt;

&lt;p&gt;This one sounds insane the first time you hear it.&lt;/p&gt;

&lt;p&gt;On every training pass, you randomly switch off a chunk of neurons. Different ones each time. Train on the crippled network. Repeat.&lt;/p&gt;

&lt;p&gt;Here's how you implement it (this is &lt;strong&gt;inverted dropout&lt;/strong&gt;, the standard version):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;keep_prob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;   &lt;span class="c1"&gt;# keep 80% of neurons in this layer
&lt;/span&gt;
&lt;span class="n"&gt;d3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;keep_prob&lt;/span&gt;   &lt;span class="c1"&gt;# boolean mask
&lt;/span&gt;&lt;span class="n"&gt;a3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d3&lt;/span&gt;                                  &lt;span class="c1"&gt;# zero out the dropped ones
&lt;/span&gt;&lt;span class="n"&gt;a3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a3&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;keep_prob&lt;/span&gt;                           &lt;span class="c1"&gt;# ← the important line
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last line is what makes it "inverted," and it's the part people skip and then wonder why their loss is weird.&lt;/p&gt;

&lt;p&gt;If you zero out 20% of your activations, the sum feeding into the next layer drops by ~20%. Dividing by &lt;code&gt;keep_prob&lt;/code&gt; scales it back up so the expected value stays the same. Without it, every layer's output shrinks and your network quietly falls apart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At test time: you do not use dropout.&lt;/strong&gt; No mask, no scaling, no randomness. You want deterministic predictions, and because you already scaled during training, your activations are already at the right magnitude. Nothing to fix.&lt;/p&gt;

&lt;p&gt;If you'd used the old non-inverted version, you'd have to manually rescale at test time. Which is exactly why nobody uses it anymore.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does dropout work?
&lt;/h3&gt;

&lt;p&gt;Take one neuron in the middle of the network. Its job is to combine inputs from the layer below.&lt;/p&gt;

&lt;p&gt;With dropout on, any of those inputs could vanish at any moment. So the neuron can't afford to bet everything on one input. It has to spread its weights out across many inputs, because any single one might be gone next iteration.&lt;/p&gt;

&lt;p&gt;Spreading weights out shrinks their squared norm. Which means dropout ends up doing something similar to L2, just through a completely different mechanism.&lt;/p&gt;

&lt;p&gt;A few practical notes:&lt;/p&gt;

&lt;p&gt;You can set a different &lt;code&gt;keep_prob&lt;/code&gt; per layer. Big weight matrices are where overfitting lives, so drop harder there (maybe 0.5). Small layers, leave them alone (1.0). Input layer, keep it near 1.0.&lt;/p&gt;

&lt;p&gt;The annoying part: your cost function is no longer well-defined, because you're changing the network every iteration. J doesn't decrease monotonically anymore, so you can't debug with a nice descending loss curve. My workaround is to turn dropout off, confirm the loss decreases properly, then turn it back on.&lt;/p&gt;

&lt;p&gt;Computer vision people use dropout almost by default, because they basically never have enough pixels-worth of data. Elsewhere, only reach for it when you actually see overfitting. It's not free.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two cheaper tricks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Data augmentation.&lt;/strong&gt; More data fixes variance, but real data is expensive. So fake it. Flip your cat photos horizontally (still a cat). Crop, rotate, zoom, distort. For digits, small rotations and warps. It's not as good as genuinely new data, since a flipped cat carries less new information than a new cat. But it's nearly free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Early stopping.&lt;/strong&gt; Plot train error and dev error as training goes on. Train error keeps dropping forever. Dev error drops, bottoms out, then starts climbing. Stop at the bottom.&lt;/p&gt;

&lt;p&gt;Why does it work? At the start your weights are tiny (random init). As you train they grow. Stopping mid-training means stopping at a mid-sized W, which is roughly what L2 was trying to give you anyway.&lt;/p&gt;

&lt;p&gt;But I'll be honest, I don't love it. Early stopping tangles two jobs together: fitting the training data, and preventing overfitting. Now one knob controls both, and you can't tune them independently. L2 keeps them separate. The only cost is you have to search over λ, which is more compute.&lt;/p&gt;




&lt;h2&gt;
  
  
  Normalize your inputs (seriously, just do it)
&lt;/h2&gt;

&lt;p&gt;Two steps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;mu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keepdims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mu&lt;/span&gt;                       &lt;span class="c1"&gt;# now mean is zero
&lt;/span&gt;
&lt;span class="n"&gt;sigma2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keepdims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sigma2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# now variance is one
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the &lt;strong&gt;same mu and sigma from the training set&lt;/strong&gt; on your dev and test sets. Don't recompute them. Both sets need to be transformed identically or you've broken your own distribution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why bother?
&lt;/h3&gt;

&lt;p&gt;Picture feature 1 ranging from 0 to 1, and feature 2 ranging from 1 to 10,000.&lt;/p&gt;

&lt;p&gt;Your weights end up wildly different in scale, and the cost surface turns into a long, thin, stretched-out valley. Gradient descent bounces back and forth across the narrow walls, inching forward. You're forced to use a tiny learning rate or it diverges.&lt;/p&gt;

&lt;p&gt;Normalize, and that valley becomes a round bowl. Every direction is equally steep. Gradient descent walks straight to the bottom, and you can use a much larger learning rate.&lt;/p&gt;

&lt;p&gt;Cheap to do. Never hurts. Just make it a habit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Vanishing and exploding gradients
&lt;/h2&gt;

&lt;p&gt;This is the problem that kept deep networks from working for years.&lt;/p&gt;

&lt;p&gt;Imagine a very deep network. Simplify hard: linear activations, ignore b, and every weight matrix is the same:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then your output is roughly &lt;code&gt;1.5^L × x&lt;/code&gt;, where L is the number of layers.&lt;/p&gt;

&lt;p&gt;With L = 150, that's 1.5^150. An astronomically large number. Your activations explode, your gradients explode, your loss becomes NaN.&lt;/p&gt;

&lt;p&gt;Now flip it to 0.5. Output becomes &lt;code&gt;0.5^150&lt;/code&gt;, which is effectively zero. Activations vanish. Gradients vanish. The early layers get updates so small they never learn anything.&lt;/p&gt;

&lt;p&gt;The scary part is how sharp this is. Slightly above 1, explode. Slightly below 1, vanish. In a deep network there's almost no middle ground, because you're compounding the error 150 times.&lt;/p&gt;

&lt;h3&gt;
  
  
  The single neuron fix
&lt;/h3&gt;

&lt;p&gt;Look at one neuron with n inputs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;z = w₁x₁ + w₂x₂ + ... + wₙxₙ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The more inputs (larger n), the bigger z gets, just from adding more terms. So to keep z reasonable, each individual &lt;code&gt;wᵢ&lt;/code&gt; should be &lt;em&gt;smaller&lt;/em&gt; when n is larger.&lt;/p&gt;

&lt;p&gt;That gives you the initialization rule. Set the variance of your weights to &lt;code&gt;1/n&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;W&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;n_prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For ReLU, &lt;code&gt;2/n&lt;/code&gt; works better in practice (this is He initialization):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;W&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;n_prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For tanh, &lt;code&gt;1/n&lt;/code&gt; is the common choice (Xavier initialization).&lt;/p&gt;

&lt;p&gt;It doesn't fully solve vanishing/exploding gradients. But it makes the compounding start from a much safer place, and in a 150-layer network, where you start matters a lot.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd tell past me
&lt;/h2&gt;

&lt;p&gt;The whole thing collapses into a loop:&lt;/p&gt;

&lt;p&gt;Check train error. Too high? Bigger model.&lt;br&gt;
Check the gap. Too big? More data or regularization.&lt;br&gt;
Normalize your inputs. Initialize your weights properly.&lt;br&gt;
Repeat.&lt;/p&gt;

&lt;p&gt;That's it. No mysticism. Most of the time when a model isn't learning, it's one of these, and the fix is on this page.&lt;/p&gt;

&lt;p&gt;What still bugs me is the λ search. Tuning it properly means training the model over and over just to compare numbers, and there has to be a better way than brute force.&lt;/p&gt;

&lt;p&gt;Working on it.&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>deeplearning</category>
      <category>beginners</category>
      <category>neuralnetworks</category>
    </item>
    <item>
      <title>Stop Prompting. Start Briefing: What Changes When an AI Can Plan for Three Days Straight</title>
      <dc:creator>Asfiya M</dc:creator>
      <pubDate>Wed, 08 Jul 2026 18:11:41 +0000</pubDate>
      <link>https://dev.to/asfiya_tech/stop-prompting-start-briefing-what-changes-when-an-ai-can-plan-for-three-days-straight-90h</link>
      <guid>https://dev.to/asfiya_tech/stop-prompting-start-briefing-what-changes-when-an-ai-can-plan-for-three-days-straight-90h</guid>
      <description>&lt;p&gt;Anthropic built Fable 5 for long-horizon work. Give it a real goal and it can plan across stages, delegate pieces of the problem to itself, check its own output, and keep going without a babysitter. It holds a million tokens of context, which in plain terms means you can hand it a pile of research, a brand doc, three competitor teardowns and a messy Slack thread, and it won't quietly forget the first thing you told it by message four. In one of Anthropic's own tests, it handled a 50-million-line Ruby codebase migration in about a day. That's not a chatbot trick. That's a different category of tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmekt49wy8xx4j4fbjek8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmekt49wy8xx4j4fbjek8.png" alt=" " width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I saw a creator use this exact shift to take an Instagram account with no business behind it and build out a brand, a product, a content calendar and a launch plan, all in a single chat. The interesting part wasn't the output. It was the pattern: use the expensive, deep-thinking model once to build the "brain," then hand the execution to cheaper, faster models forever after.&lt;/p&gt;

&lt;p&gt;That pattern generalizes way past content creation. Here's where it actually pays off.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Turning a vague idea into a real go-to-market plan
&lt;/h2&gt;

&lt;p&gt;If you're a solo founder or a contractor trying to position yourself in a crowded niche, the hard part was never writing. It was figuring out what to say and to whom.&lt;/p&gt;

&lt;p&gt;Feed Fable 5 your background, a few competitor profiles, and an honest description of who you're trying to reach. Ask it to argue against its own ideas before it commits to one, the same way an investor would poke holes in a pitch. Because it can hold everything you gave it in context at once, it stops giving you generic advice and starts giving you a plan that's actually shaped by your specific market gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Auditing a legacy codebase before you touch it
&lt;/h2&gt;

&lt;p&gt;Anyone who's inherited a five-year-old repo knows the real cost isn't writing new code, it's understanding what's already there without breaking it.&lt;/p&gt;

&lt;p&gt;Point Fable 5 at the whole thing and ask it to map dependencies, flag dead code, and propose a migration order before you write a single line. Because it can run for hours instead of minutes, it doesn't need the codebase pre-summarized for it. It reads the actual thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Making sense of document-heavy analysis
&lt;/h2&gt;

&lt;p&gt;If your job involves financial models, legal contracts, or research papers full of charts and tables, you already know most AI tools choke on anything that isn't clean text. Fable 5 is built to read charts and tables inside PDFs directly and reason across them, which matters if your actual workday is finance decks and messy scanned reports rather than tidy prompts.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Building the operating system for a small business once
&lt;/h2&gt;

&lt;p&gt;This is the part the creator I mentioned nailed. Instead of asking an AI to write one post at a time, ask it to build the whole system: positioning, offer, content pillars, and a 30-day plan, all connected to each other. Do this once, save the output as a set of documents, and every future request (to any model, even a cheap one) inherits that context instead of starting from a blank page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this actually matters, not just sounds cool
&lt;/h2&gt;

&lt;p&gt;The obvious benefit is depth. A model that can plan across stages and check its own work catches mistakes a single-shot answer never would.&lt;/p&gt;

&lt;p&gt;The less obvious benefit is cost. You don't need to run your expensive model on every task forever. You run it once to build the strategy, the brand rules, the technical map, whatever your "brain" is, and then your daily driver model executes against it for weeks. That's the actual economics of this generation of tools: pay for depth once, get speed everywhere after.&lt;/p&gt;

&lt;p&gt;The last benefit is one nobody markets well: it stops you from having to re-explain your business every single time you open a new chat. That alone is worth more than any single feature on a spec sheet.&lt;/p&gt;

&lt;p&gt;If you've been treating your AI model like a vending machine for quick answers, try handing it a real problem instead. Give it the goal, the constraints, and the mess. Let it plan. You might be surprised how much of the thinking it can actually do for you.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My friend froze his opinions in 2016. I didn't. Now what?</title>
      <dc:creator>Asfiya M</dc:creator>
      <pubDate>Mon, 29 Jun 2026 09:46:39 +0000</pubDate>
      <link>https://dev.to/asfiya_tech/my-friend-froze-his-opinions-in-2016-i-didnt-now-what-5ffn</link>
      <guid>https://dev.to/asfiya_tech/my-friend-froze-his-opinions-in-2016-i-didnt-now-what-5ffn</guid>
      <description>&lt;p&gt;A friend repeated something back to me last month. An opinion. He said it like settled fact, the kind of line you don't bother arguing with.&lt;/p&gt;

&lt;p&gt;I argued with it.&lt;/p&gt;

&lt;p&gt;Then I realized the opinion was mine. I'd said it to him years ago, said it well enough that it stuck, and he'd been carrying my old take around like it was current. Meanwhile I'd swapped it out for a different one somewhere along the way and never told a single person. Including, apparently, myself.&lt;/p&gt;

&lt;p&gt;That's a strange feeling. Like running into an old photo of yourself and not loving the haircut. Except it isn't a haircut. It's something you used to believe with your whole chest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nobody decides to change their mind
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyluaoiesfesmtxr135p0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyluaoiesfesmtxr135p0.png" alt=" " width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the part I keep coming back to. The update never happens at a desk. You don't sit down one morning and go, right, time to retire opinion number fourteen. It happens quietly, in the background, one conversation and one bad day and one thing you read at a time, until some afternoon a friend hands you the old version and you flinch.&lt;/p&gt;

&lt;p&gt;And we resist that flinch hard. Because changing your mind feels like losing. Admitting the old take was wrong feels like admitting you were the kind of person who'd hold a wrong take in the first place. So we defend it.&lt;/p&gt;

&lt;p&gt;You've done this. I've done this. Argued a point ten minutes past the moment you stopped believing it, purely because backing down in front of someone felt worse than being wrong.&lt;/p&gt;

&lt;p&gt;The opinion stops being a thought you have. It becomes a thing you are. And nobody likes deleting part of themselves in the middle of an argument.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is the one place a machine has it easier
&lt;/h2&gt;

&lt;p&gt;When a model's answers start drifting, when the world moves and its predictions quietly go stale, you retrain it. The model doesn't sulk. It doesn't insist it was right in 2019. It doesn't take the new data personally.&lt;/p&gt;

&lt;p&gt;You feed it the updated world and it adjusts. No ego. No face to save.&lt;/p&gt;

&lt;p&gt;We can't do that. We get the new evidence and the first thing that fires isn't "let me update," it's "let me defend." Which is how a person sits on an outdated opinion for a decade while looking exactly as certain as the day they formed it. Same confidence. Worse answer. They never got retrained, and unlike the model, some part of them didn't want to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  The opposite trap, and you know this person
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8nfqiq5ct64xkvgwa2u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8nfqiq5ct64xkvgwa2u.png" alt=" " width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You also meet the version who had one bad experience and turned it into a permanent rule. One landlord, so all landlords. One breakup, so all relationships. The sample size was a single rough afternoon and the conclusion now runs the rest of their life.&lt;/p&gt;

&lt;p&gt;A model that does this we call overfit. It memorized a handful of examples so hard it can't handle anything new. Same wiring in people, just with feelings bolted on.&lt;/p&gt;

&lt;h2&gt;
  
  
  We take this seriously for machines and not for ourselves
&lt;/h2&gt;

&lt;p&gt;We monitor models for drift and retrain them on a schedule. We get genuinely nervous about one that hasn't been updated in a year.&lt;/p&gt;

&lt;p&gt;Then we run opinions from five years ago at full volume and never once check the date on them.&lt;/p&gt;

&lt;p&gt;The people who stay interesting to talk to aren't smarter than everyone else. They've just made peace with being wrong in small amounts, often, on purpose. They treat changing their mind as maintenance, not defeat. Everyone else is quietly protecting a version of themselves that stopped shipping updates a long time ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part worth fixing
&lt;/h2&gt;

&lt;p&gt;I never corrected my friend. Felt strange to argue with my own old work.&lt;/p&gt;

&lt;p&gt;But I went home and tried to list the opinions I haven't actually questioned since the day I formed them. Found more than I'd like. Some I still stand by. A few were just sitting there, sounding sure of themselves, running on data I collected back when I was a different person.&lt;/p&gt;

&lt;p&gt;The fix was never about being right. It's about noticing when you've quietly turned into someone new, and remembering to update the part of you that still talks like the old one.&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>ai</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>Three Weeks Into AI and My Best Skill Is Closing Tabs</title>
      <dc:creator>Asfiya M</dc:creator>
      <pubDate>Sat, 27 Jun 2026 13:09:50 +0000</pubDate>
      <link>https://dev.to/asfiya_tech/three-weeks-into-ai-and-my-best-skill-is-closing-tabs-1lkj</link>
      <guid>https://dev.to/asfiya_tech/three-weeks-into-ai-and-my-best-skill-is-closing-tabs-1lkj</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3panq7o9fd3b290ev51c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3panq7o9fd3b290ev51c.png" alt=" " width="799" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last week I finally understood decision trees.&lt;/p&gt;

&lt;p&gt;Not the textbook version. The real one. A tree is just the checklist you already run in your head, turned into code. Ask the question that splits the group best, then ask again inside each smaller group. Ask, split, repeat. That's it.&lt;/p&gt;

&lt;p&gt;I felt smart for about an hour.&lt;/p&gt;

&lt;p&gt;**Then I read one more line: **change a few rows of your data and the whole tree can rebuild itself into something different. The thing I just learned was shaky. The fix is ensembles, which is a whole other layer I haven't touched yet.&lt;/p&gt;

&lt;p&gt;That's the part nobody warned me about. Learning AI isn't one mountain. It's layers, and every layer makes the one below it look incomplete.&lt;/p&gt;

&lt;h2&gt;
  
  
  The floor keeps dropping
&lt;/h2&gt;

&lt;p&gt;Here's the pattern I keep hitting.&lt;/p&gt;

&lt;p&gt;I learn a thing. I feel like I get it. Then I learn the thing that sits on top of it, and suddenly the first thing was just the warm-up.&lt;/p&gt;

&lt;p&gt;Linear regression felt like the whole game until logistic regression showed up. Logistic felt solid until trees. Trees felt clever until I found out they're unstable and ensembles exist. I haven't even reached the layer after ensembles and I already know it's there.&lt;/p&gt;

&lt;p&gt;If you're starting out, here's what would've saved me some panic: feeling like you understand something is not the same as being done. It usually means you've cleared one layer and the next one is about to load.&lt;/p&gt;

&lt;p&gt;That's not discouraging. It's just the shape of the thing. Once you expect it, you stop feeling stupid every time the floor drops.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rabbit hole is real and it looks like progress
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmqsjaudaugix7dhfb3q3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmqsjaudaugix7dhfb3q3.png" alt=" " width="800" height="982"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dangerous part is what happens next.&lt;/p&gt;

&lt;p&gt;You learn trees, you hear "ensembles," so you open a tab. That tab mentions XGBoost. XGBoost mentions gradient boosting. Gradient boosting mentions a paper. Three hours later you have eleven tabs open and you've built nothing.&lt;/p&gt;

&lt;p&gt;It feels like progress because you're reading hard things. It isn't. It's just falling.&lt;/p&gt;

&lt;p&gt;**What I do now: **when I hit the next layer mid-learning, I write it down and close the tab. "Ensembles, look at next." Then I go finish the thing I was actually on. The note means I won't forget it. Closing the tab means I won't drown in it today.&lt;/p&gt;

&lt;p&gt;Depth is good. Depth at the wrong time is just a nicer way to procrastinate.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Which tool should I use" has a boring answer
&lt;/h2&gt;

&lt;p&gt;The other thing that almost broke me is the tool zoo.&lt;/p&gt;

&lt;p&gt;I spent a week on APIs. Just for two systems to talk to each other, there's REST, GraphQL, SOAP, gRPC, and WebSockets. Each one has fans who'll tell you it's the right one. As a beginner you sit there thinking you have to learn all five before you're allowed to build anything.&lt;/p&gt;

&lt;p&gt;You don't.&lt;/p&gt;

&lt;p&gt;REST covers the large majority of cases. gRPC is for fast backend to backend stuff. WebSockets are for live two-way things like chat or live prices. The "best" tool doesn't exist. There's only the right tool for the job in front of you, and most of the time the job is boring and REST is fine.&lt;/p&gt;

&lt;p&gt;Most teams overthink this. Reaching for gRPC or GraphQL early adds tooling pain for almost no gain. Once I saw that, the panic of "I don't know all the tools" turned into a calmer question: what does this specific problem actually need?&lt;/p&gt;

&lt;p&gt;There's still a scarier version of this I haven't solved. What if there's a tool that's perfect for my problem and I just don't know it exists? No clean answer yet. Right now I solve it by building the dumb version first, then asking people who've done it longer what they'd have reached for. The dumb version is rarely wasted. It teaches you what the problem actually is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sometimes the answer isn't AI at all
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnarswr206i9tc671hr7t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnarswr206i9tc671hr7t.png" alt=" " width="800" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This one surprised me.&lt;/p&gt;

&lt;p&gt;I kept assuming automation meant an LLM somewhere in the pipe. It doesn't. A lot of "automation" is just basic conditions. If this, then that. No model, no fine-tuning, no GPU.&lt;/p&gt;

&lt;p&gt;Half the maturity in this field seems to be not reaching for the fancy thing when a plain one works. An LLM is the answer to fewer problems than the hype suggests. Learning to tell the two apart is its own skill, and it isn't a technical one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be skeptical of clean numbers
&lt;/h2&gt;

&lt;p&gt;Last layer, for now.&lt;/p&gt;

&lt;p&gt;I read a research paper comparing two big data tools. The numbers didn't add up. It claimed more memory and processing power than its own machines had, and never explained why. Another paper claimed a 56 to 69 percent improvement, but I only had the summary, and summaries always show the best result against whatever weak thing made them look good.&lt;/p&gt;

&lt;p&gt;Reading papers taught me less about the tools and more about not swallowing claims whole. When something is presented clean and impressive, that's usually the cue to ask what got left out. Not because people lie, but because nobody advertises their own gaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd actually tell a beginner
&lt;/h2&gt;

&lt;p&gt;I'm three weeks deep, so take this as field notes, not a map.&lt;/p&gt;

&lt;p&gt;Pick one real problem. Find the simplest thing that solves it, even if it's embarrassingly basic. When you hit a rabbit hole, write it down and close the tab. Match the tool to the job, not to the hype. And when a number looks too clean, poke it.&lt;/p&gt;

&lt;p&gt;I still don't know what I don't know. Next month's version of me will probably think this post missed the point. ngl, that's kind of the whole thing about layers.&lt;/p&gt;

&lt;p&gt;The floor's going to drop again. I'm starting to think that's the job.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
