<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Keivalya Pandya on Medium]]></title>
        <description><![CDATA[Stories by Keivalya Pandya on Medium]]></description>
        <link>https://medium.com/@keivalyap?source=rss-babc435ed2f1------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*pe1nTNJpSweb1CyuFPq5Ow.jpeg</url>
            <title>Stories by Keivalya Pandya on Medium</title>
            <link>https://medium.com/@keivalyap?source=rss-babc435ed2f1------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 12 Nov 2026 22:31:51 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@keivalyap/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Building a World-Action-Model (WAM) from Scratch — I]]></title>
            <link>https://medium.com/@keivalyap/building-a-world-action-model-wam-from-scratch-i-0ad41c323776?source=rss-babc435ed2f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/0ad41c323776</guid>
            <category><![CDATA[reinforcement-learning]]></category>
            <category><![CDATA[robotics]]></category>
            <category><![CDATA[vision-language-model]]></category>
            <category><![CDATA[frontier-tech]]></category>
            <category><![CDATA[world-models]]></category>
            <dc:creator><![CDATA[Keivalya Pandya]]></dc:creator>
            <pubDate>Mon, 02 Nov 2026 03:15:16 GMT</pubDate>
            <atom:updated>2026-11-02T03:15:16.713Z</atom:updated>
            <content:encoded><![CDATA[<p>If you are new here, I am Keivalya Pandya, and I love to breakdown complex robotics and AI topics into something simple and digestable.</p><p><strong>TL;DR.</strong> A <strong>World Action Model (WAM)</strong> is a <em>robot policy</em> that learns to predict its <em>next actions</em> and what that <em>action will do</em>. I built a small one, <a href="https://github.com/keivalya/pico-wam.git">pico-WAM</a> (1.3M parameters, about 1k lines of PyTorch), trained it on the push-T dataset, and checked every prediction against the simulator. This blog gives a thorough background about how WAMs are built, across models and how pico-WAM is structured.</p><h3>Terminologies</h3><p>Here are some initial ideas that will help you throughout this tutorial.</p><ol><li>A <strong>policy</strong> is a function that generates next-action. You give it what the robot sees (a camera image), what it knows about itself and the scene (positions and velocities, the state), and what you want (an instruction like “push the T onto the target”). It gives back an action.</li><li><strong>Imitation learning (behavioral cloning, BC)</strong> is the simplest way to train a policy: record an expert doing the task, then train the network to copy the expert’s action in every situation. It is plain supervised learning, inputs to labels. A <strong>VLA (vision-language-action model)</strong> is a policy trained this way that takes images and language as input.</li><li>A <strong>world model (or forward model)</strong> answers a different question: <em>if I am here and I do this, where will I be next?</em> Engineers usually write this by hand, that’s why we have physics simulators and model-predictive control (MPC). A learned world model learns this from data instead.</li><li>A <strong>latent</strong> is a compact vector the network uses internally to summarize what it sees. You can’t read it directly, but you can train small “readout” networks to turn it back into things you understand: positions, velocities, pictures.</li><li><strong>Imagination, or a rollout</strong>, means applying the world model again and again without looking at the real world. If the predictions stay good for many steps, the model has learned something real about the world.</li></ol><p>That’s it! A WAM combines these ideas in one network.</p><h3>VLA vs World-Model vs WAM</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*o_7t1GYrsm1_YZkrXXMJ9A.png" /><figcaption><em>A VLA acts, a world model predicts, a WAM does both with a shared latent.</em></figcaption></figure><p>Terminologies around WAMs are quite confusing, so we will logically define our own scope. A recent survey defines WAMs as models that “connect future-state modeling with executable action generation” (<a href="https://arxiv.org/abs/2609.16074">Lu et al.</a>). Another sorts them by the future they produce: pixels, a latent, or nothing at all (<a href="https://arxiv.org/abs/2606.20781">Shen et al.</a>). When I was getting started with WAMs, I was constantly juggling around what these terms mean in this context, and turns out, most of it is something I have learned before with a different name.</p><h3>Designing a WAM</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LlBMLeYYOsvL7VqpAyWVFg.png" /><figcaption>All WAMs make the same four decisions</figcaption></figure><p><strong>What is predicted?</strong> You can predict raw future frames (expensive, but you can look at them), a compressed learned representation (cheap, but harder to inspect), the physical state (only possible when you know it, as in simulation), or nothing at all. pico-WAM predicts the physical state, and optionally pixels.</p><p><strong>How do actions meet the future?</strong> You can generate the action and the future together (“joint prediction”). You can generate the future first, then ask an inverse dynamics model which action gets you there (“plan, then act”). Or you can build an explicit forward model that takes any action as input. pico-WAM trains jointly and has an explicit action-conditioned forward model, which is what makes “what if” questions and planning possible.</p><p><strong>Which backbone?</strong> Big systems reuse pretrained video-generation models. I use small MLPs so everything trains on a laptop.</p><p><strong>What is the prediction for?</strong> It can shape the representation during training (the cheapest option and the most common), rank candidate actions at test time (planning), produce the action directly, or generate fake training data for another policy.</p><h4>Open-source WAMs</h4><p>(<em>full disclosure:</em> LLM helped me write this section because I constantly kept missing some important takeaways that distinguish these models from each other… so, live long ai!)</p><ul><li><strong>GR-1</strong> (<a href="https://arxiv.org/abs/2312.13139">Wu et al.</a>) is a GPT-style transformer, pretrained to predict future frames from Ego4D human videos, then fine-tuned to output actions <em>and</em> future images. The future prediction is an auxiliary training signal.</li><li><strong>UWM</strong> (<a href="https://doi.org/10.15607/rss.2025.xxi.015">Zhu et al.</a>) puts video diffusion and action diffusion into one transformer, with a separate noise level for each. By choosing which one to denoise, the same network acts as a policy, a forward model, an inverse model or a video generator. That trick also lets it learn from videos that have no action labels.</li><li><strong>WorldVLA</strong> (<a href="https://arxiv.org/abs/2506.21539">Cen et al.</a>) turns images, text and actions into discrete tokens in one autoregressive multimodal LLM, which learns both to output action tokens and to predict the next frame.</li><li><strong>Genie Envisioner</strong> (<a href="https://arxiv.org/abs/2508.05635">Liao et al.</a>) is a 2B-parameter video diffusion transformer pretrained on about a million real robot episodes, with a lightweight flow-matching action module that reads its video latents. The video model doubles as a neural simulator.</li><li><strong>Cosmos Policy </strong>(<a href="https://arxiv.org/abs/2601.16163">Kim et al.</a>) fine-tunes NVIDIA’s 2B Cosmos-Predict2 video model without changing its architecture: actions, robot state and value estimates are written into the video latent as extra “frames”. At test time it plans by sampling several action proposals and picking the one whose predicted future looks most valuable.</li><li><strong>V-JEPA 2-AC</strong> (<a href="https://arxiv.org/abs/2506.09985">Assran et al.</a>) never predicts pixels. It trains a 300M-parameter action-conditioned predictor on top of a frozen self-supervised video encoder, and plans with model-predictive control in that representation space. It has no action head at all; the planner picks the actions.</li><li><strong>DreamGen</strong> (<a href="https://arxiv.org/abs/2505.12705">Jang et al.</a>) uses a video world model as a data generator. It fine-tunes a video model on a few robot demos, generates many new videos, labels them with an inverse-dynamics or latent-action model, and trains an ordinary policy on the result.</li><li><strong>LingBot-VA </strong>(<a href="https://arxiv.org/abs/2601.21998">Li et al.</a>) is a 5.3B-parameter autoregressive video-action model that predicts future video latents and reads actions off them with inverse dynamics. Its KV cache keeps a long memory of the past.</li></ul><p>Two systems that plan on Push-T itself are worth knowing too. <strong>DINO-WM</strong> (<a href="https://arxiv.org/abs/2411.04983">Zhou et al.</a>) plans with the cross-entropy method in the features of a frozen DINOv2 encoder, with a predictor of about 19M parameters trained on 18,500 Push-T trajectories. <strong>PILOT</strong> (<a href="https://arxiv.org/abs/2610.14335">Liu et al.</a>) starts that kind of search from a learned policy’s actions and beats executing the same policy on long Push-T tasks.</p><h3>Outro</h3><p>All this said, I hope now you have a better understanding of WAMs. In the next blog, we will go deeper into each layer of pico-WAM.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0ad41c323776" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[DreamZero: overview of a robot that dreams]]></title>
            <link>https://medium.com/@keivalyap/dreamzero-overview-of-a-robot-that-dreams-c66d7157dc82?source=rss-babc435ed2f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/c66d7157dc82</guid>
            <category><![CDATA[world-models]]></category>
            <category><![CDATA[robotics]]></category>
            <category><![CDATA[deep-learning]]></category>
            <category><![CDATA[vision-language-action]]></category>
            <category><![CDATA[reinforcement-learning]]></category>
            <dc:creator><![CDATA[Keivalya Pandya]]></dc:creator>
            <pubDate>Fri, 08 May 2026 00:44:36 GMT</pubDate>
            <atom:updated>2026-05-08T00:44:36.340Z</atom:updated>
            <content:encoded><![CDATA[<p><strong>What if a robot could learn to do, <em>anything</em>?</strong> For decades, we have dreamed of the universal robotic assistant — a machine capable of helping with any task in our homes and workplaces. With <em>NVIDIA</em>’s latest breakthrough, DreamZero, we are moving past science fiction and into a new era of generalist robotics.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/550/0*pU6Lam7xh_D5y5sv.gif" /></figure><h3>The Dream of a Generalist Robot</h3><p>The goal of a generalist robot is to move beyond the factory floor, where machines repeat a single task millions of times. We want robots that can navigate messy, unpredictable human environments, such as cleaning up a kitchen or folding laundry.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/718/0*duE32Kk0eIDwR0j-.gif" /><figcaption>Manufacturing Robots and Automation: Global Electronics Services</figcaption></figure><h3>The Generalization Problem (again)</h3><p>Why has this been so hard? The core obstacle is generalization. Traditional robots are “brittle”; if you train them to pick up a red block in one spot, they fail if you swap it for a blue ball or move it two inches to the left. They learn specific choreography rather than the underlying concept of an action.</p><h3>Predicting the World, Instead of Just Actions</h3><p>DreamZero introduces the <strong>World Action Model (WAM)</strong>. Instead of simply mapping <em>“If I see this, do that,”</em> the robot learns to predict the future. By <em>“dreaming”</em> or generating video clips of how the world evolves based on its actions, the robot builds a deep intuition for physics and cause-and-effect.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kZCxDHPQUkhI-aL8S6YQTg.png" /><figcaption>VLA (traditional methods) are trained on repetitive tasks. WAMs are trained on diverse data for robustness.</figcaption></figure><h3>Physics in WAMs</h3><p>WAM treats the physical world as something to be predicted. Let me give you an intuition.</p><h4>Predictive Modeling</h4><p>Unlike traditional robots that simply react to inputs, DreamZero asks, g<em>iven the current state and my intended actions, what will the world look like in a few moments?</em> It learns to dream (aka simulate future video frames) as a representation of cause and effect.</p><h4>Autoregressive Diffusion</h4><p>It uses a massive 14-billion parameter autoregressive diffusion transformer. The diffusion process allows it to <em>denoise</em> potential futures, sculpting coherent physical sequences out of static, while the autoregressive nature ensures that each movement logically flows from the last.</p><h4>Real-World Grounding</h4><p>To ensure its “dreamed” physics match reality, the robot follows a continuous loop: Observe, Predict, Act, and Update. By constantly comparing its predictions with actual camera observations, it corrects its internal model, grounding its imagination in the actual laws of the environment.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*q4bmRKSeyQOE91qY_nLz8w.png" /><figcaption>DreamZero: Training and Inference</figcaption></figure><h3>How DreamZero Works</h3><p>At its core, DreamZero is a 14-billion parameter autoregressive diffusion transformer.</p><ul><li><strong>Diffusion.</strong> It denoises static, “sculpting” future video frames and actions out of a noisy, predicted state.</li><li><strong>Autoregressive.</strong> Like a large language model, it generates sequences where each movement logically flows from the last, ensuring fluid, lifelike motion rather than jerky, disconnected steps</li></ul><h3>Dream to Reality Transfer</h3><p>How does it stay accurate? The robot operates in a four-step loop: Observe, Predict, Act, and Update. The secret-sauce is the update step. By constantly comparing its dreamed predictions against the actual real-world frames from its cameras, the robot corrects its course, ensuring its imagination remains grounded in reality.</p><h3>What’s Next?</h3><p>DreamZero is currently a “System 1” thinker — excellent at fast, reactive tasks but limited by a 6-second visual memory. The next major frontier is “System 2” deliberate, long-term planning. As researchers scale these video world models, we are likely to see an explosion in robotic capabilities, changing the way machines interact with our world forever.</p><h3>Epilogue</h3><p>I hope you have a better idea of how WAMs solve some physics-related concepts better than VLAs. I will be posting follow-up blogs as I learn about WAMs in more details (super excited to share more insights that are in progress right now) which will dive into technical depths of these concepts alongside more references.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c66d7157dc82" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Robotics NOW: Demos → Deployments]]></title>
            <link>https://medium.com/@keivalyap/robotics-now-demos-deployments-a918fa001134?source=rss-babc435ed2f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/a918fa001134</guid>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[reinforcement-learning]]></category>
            <category><![CDATA[robotics]]></category>
            <dc:creator><![CDATA[Keivalya Pandya]]></dc:creator>
            <pubDate>Fri, 13 Mar 2026 15:56:00 GMT</pubDate>
            <atom:updated>2026-03-13T15:56:00.888Z</atom:updated>
            <content:encoded><![CDATA[<p>Robotics isn’t really about “moving from perception to action” anymore — at least, not in 2026. The real differentiator now? Whether a system can move from a staged demo to a <em>repeatable</em> deployment. One with measurable throughput, safety sign-off, a maintenance plan someone actually follows, and — here’s the kicker — actual business value. That’s a much less sexy problem than the one most of us signed up for, but it’s the one that matters.</p><p>I’ve been thinking about this a lot lately, partly because of an article I came across — <em>Business Insider’s</em> piece on <a href="https://www.businessinsider.com/agility-robotics-humanoid-robots-labor-shortage-aging-workforce-2026-3">robots coming for the jobs no one wants</a>. The framing is familiar: aging workforce, labor shortages in repetitive tasks, companies turning to humanoid automation to fill the gap. <em>And it’s not wrong.</em> Firms like Agility Robotics are deploying bipedal robots into real manufacturing and logistics facilities. The pitch is compelling — these humanoids slot into existing factory layouts without ripping up the floor plan, and they’re built for the kind of mundane physical labor that fewer humans want to do.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mHJrCWWcAebcMwWmjXvIow.png" /><figcaption>Reference timeline</figcaption></figure><p>What’s accelerating this is the infrastructure layer. <a href="https://nvidianews.nvidia.com/news/nvidia-releases-new-physical-ai-models-as-global-partners-unveil-next-generation-robots">New physical AI models from NVIDIA</a> are giving these machines something closer to a “digital brain” — the ability to actually perceive and navigate a messy, unstructured world. As someone who’s spent time training VLA models and watching them struggle with even basic spatial reasoning, I can tell you: the jump from “works in simulation” to “works on a real table with real lighting and real object clutter” is <em>enormous</em>. So when I see companies shipping robots that can handle even a narrow slice of real-world tasks reliably, I pay attention.</p><p>And the impact is going global faster than I expected. In Europe, in China, <a href="https://aibusiness.com/robotics/humanoid-robots-assembling-cars-europe-china">humanoid robots are beginning to assemble cars</a> <em>alongside</em> human workers. These aren’t lab prototypes anymore — they’re on the production line. But here’s where my own work makes me pump the brakes a little.</p><p>Rodney Brooks made a point in <a href="https://rodneybrooks.com/why-todays-humanoids-wont-learn-dexterity/"><em>Why Today’s Humanoids Won’t Learn Dexterity</em></a> that I think deserves more airtime than it gets: despite these robots’ impressive forms, they still lack the fine-motor adaptability that makes human manipulation so fluid. I feel this tension every day.</p><p>So there’s a genuine tension here: we’re deploying robots to save supply chains and fill labor gaps, and that’s working for structured, repetitive tasks. But the dexterous, adaptive manipulation that makes human labor truly versatile? We’re years away from cracking that — and honestly, anyone who tells you otherwise is probably fundraising.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wL8BrSFytjg-OfotR_37Tw.png" /><figcaption>Tech maturity vs generality</figcaption></figure><p>Which brings me to <em>what actually bothers me</em> about the current hype cycle. Open your social feed and the revolution looks like it already happened. A bipedal robot loads car parts at a BMW plant. A drone drops a medical package into a remote village. A warehouse arm sorts a thousand parcels without blinking. The clips go viral, the comments erupt, another round of funding gets announced at a valuation that makes your head spin — Figure AI closed a Series C north of $1 billion at a reported $39 billion valuation.</p><p>But strip away the cinematography, and the question that actually matters is deeply unglamorous: <em>can it do that again tomorrow? And the day after? And the day after that — without someone flying in to fix it?</em></p><p>I’ve watched enough “it works!” moments in the lab dissolve into “wait, why did it stop working?” to know that repeatability is the real product.</p><p>That’s the unsexy frontier. And it’s the one I think we should be talking about more.</p><h4>Numbers Behind the Noise</h4><p>Before we talk about where the exciting stuff is happening, it helps to ground ourselves in what “deployment” actually looks like at scale — because the bar is higher than most demo reels suggest.</p><p>The <a href="https://ifr.org/ifr-press-releases/news/global-robot-demand-in-factories-doubles-over-10-years">IFR reported</a> <strong>542,000 industrial robots installed in 2024</strong>. That’s more than double what it was a decade ago. <strong>Asia accounts for 74%</strong> of new deployments, with Europe at 16% and the Americas trailing at 9%. On the service robotics side, professional units hit around 199,000 in 2024 — up 9% — with <strong>transportation and logistics</strong> leading the pack at nearly 103,000 units. Hospitality came in around 42,000, and cleaning robots saw the sharpest growth at over 25,000 units, climbing 34%.</p><p>Here’s the thing worth noting: almost none of those numbers are about humanoids. This is the baseline — the boring, proven, already-profitable version of “robots in the real world.” When a warehouse operator evaluates a new system, they’re comparing it against <em>this</em> track record of reliability and ROI, not against a viral demo. That’s the buyer expectation any new form factor has to meet.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KYiGSSpOAPGDNYMHIlY41g.png" /><figcaption>Data from IFR Reports</figcaption></figure><h4>Where Robots Are Actually Earning Their Keep</h4><p>The “demos → deployments” transition is clearest in places where the environment is structured, the task is repetitive, and uptime directly translates to money — warehouses, factories, hospitals, logistics networks. The IFR data backs this up: <em>the biggest professional service robot category by units shipped is indoor transport and warehouse logistics</em>. Industrial installations stay concentrated in Asia, where manufacturing scale and automation intensity create the economics that justify the investment.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*yQMbNu2S6HoR4lxU.jpg" /><figcaption>Data from IFR Reports</figcaption></figure><p>The clearest example of deployment-as-product might be <strong>Amazon</strong>. They’ve <strong>deployed over a million robots across their operations network</strong> since 2012 and are layering AI systems on top to optimize fleet movement. What makes this interesting isn’t the robot count —<em> it’s that each robot is only valuable as part of a continuously tuned system</em>. The facilities, the processes, the safety constraints, the software updates, the maintenance schedules, the human operator training — take any one of those away and the robot becomes expensive furniture. That’s the part most people skip when they share the headline number.</p><h3>The Tech Stack That’s Actually Enabling This</h3><p>So what’s making real deployment possible right now? A few threads are converging, and they’re worth unpacking because they map directly to where I think the field is headed.</p><p><strong>Data and generalist policy training.</strong> The <a href="https://robotics-transformer-x.github.io/">Open X-Embodiment</a> effort was a big deal — a standardized multi-robot dataset with <strong>1M+ real trajectories spanning 22 different robot embodiments</strong>, plus models that demonstrate genuine cross-embodiment transfer. It reduces the cost of adding new skills across fleets and platforms. Why does that matter practically? Because it chips away at one of the most painful bottlenecks in robotics: every time you want a new skill on a new platform, you used to be starting almost from scratch. If you can amortize training data across fleets and form factors, the economics of adding capabilities shift dramatically. I’ve been watching this closely since building <a href="https://github.com/keivalya/nemotron-vla">Nemotron-VLA</a> — the promise of generalist models is real, but so is the gap between “transfers in evaluation” and “transfers reliably in production.”</p><p><strong>VLAs and embodied reasoning as integration layer.</strong> <a href="https://storage.googleapis.com/deepmind-media/gemini-robotics/Gemini-Robotics-1-5-Tech-Report.pdf">Google DeepMind’s Gemini Robotics 1.5 technical report</a> frames something I think is genuinely important: multi-embodiment VLA models that fuse perception + language + action with physical reasoning. The idea of a model that can <em>see</em> a scene, <em>understand</em> a natural language instruction, and <em>plan</em> a physically grounded action sequence. I’ve spent enough time training and debugging VLA architectures to know we’re not there yet, but the trajectory is clear. The question is less “will this work?” and more “how narrow does the task domain need to be before it works reliably?”</p><p><strong>Touch and force sensing as a practical differentiator.</strong> This one is close to my heart. Brooks has been insisting for years that <em>real dexterity depends on touch</em>, and he’s being proven right — not by humanoids suddenly mastering human-like hands, but by targeted industrial systems that actually instrument tactile feedback. <a href="https://www.aboutamazon.com/news/operations/amazon-vulcan-robot-pick-stow-touch"><strong>Amazon’s Vulcan</strong></a> is a great example: it’s their first robot with what they call a “sense of touch,” using force/torque sensing to manage contact-rich manipulation. It reportedly handles about 75% of items in a typical fulfillment inventory and has already processed serious order volumes in real deployments. That 75% number is telling — it’s impressive for a deployed system, but it also means one in four items still needs a human. <em>That’s the kind of honest metric I wish more companies would publish.</em></p><p><strong>Hybrid control pipelines: classical + learning + simulation.</strong> This is the one I feel strongest about, because I’ve lived it. The deployment reality for high-value robots is almost always hybrid — you blend learning-from-demonstration, RL fine-tuned in simulation, and good old-fashioned classical control to meet the safety and reliability bar that real facilities demand. <em>No single paradigm gets you there alone.</em></p><blockquote>Pure RL is too brittle for safety-critical contact. Pure classical control can’t handle the variability of real environments.</blockquote><p>But layer them together thoughtfully — use the learned policy for the adaptive parts, the classical controller for the safety-critical parts, simulation for the edge cases you can’t afford to hit in the real world — and you get something that actually works. I’ve seen teams adopt this approach, and I’ve worked alongside some of them. It works like a charm most of the time, and when it doesn’t, you at least know <em>which layer</em> broke, which is more than you can say for an end-to-end black box.</p><h3>So Where Does That Leave Us?</h3><p>I spend my days in a lab at Northeastern working on dexterous manipulation and reinforcement learning. I’ve built VLA models from scratch, trained diffusion policies on real robot data, and watched a gripper I designed in MuJoCo struggle with tasks a toddler does without thinking. I’ve also spent time at Familiar Machines working across the full stack — AI, hardware, software — and taught a course on RL where I had to explain to students why the gap between a beautiful Bellman equation on a whiteboard and a robot that doesn’t drop things is so maddeningly wide.</p><p>All of which is to say: I’m not a spectator in this conversation. And from where I’m standing, here’s what I actually believe.</p><p>The revolution is real, but it’s slower and messier than the timeline X/LinkedIn wants to sell you. The robots that are changing the world right now aren’t the ones going viral — they’re the unglamorous fleet vehicles in Amazon warehouses, the AGVs quietly moving pallets in Shenzhen, the surgical systems doing the same procedure for the thousandth time with sub-millimeter consistency. They win not because they’re impressive, but because they’re <em>boring</em>. <strong>Boring means repeatable. Repeatable means deployable. Deployable means someone signs a purchase order.</strong></p><p>The humanoids will get there. The VLAs will get better. Touch sensing will mature. But the companies that win won’t be the ones with the best demo reel — they’ll be the ones that figured out maintenance schedules, operator training, graceful failure modes, and the thousand other mundane things that turn a prototype into a product.</p><p>If you’re building in this space, my unsolicited advice is simple: <strong>fall in love with the boring parts</strong>. The deployment pipeline, the error logging, the 2am edge case. That’s where the real engineering happens, and it’s where the real value gets created.</p><p><em>Keivalya is an MS Robotics student at Northeastern University and he builds VLA models, teaches reinforcement learning, and occasionally convinces robots to not drop things. You can find more of his work at </em><a href="https://keivalya.com"><em>keivalya.com</em></a><em> and on </em><a href="https://robospace.app"><em>RoboSpace.app</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a918fa001134" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[DeepSeek just taught us… LIFE?!]]></title>
            <link>https://medium.com/@keivalyap/deepseek-just-taught-us-life-29638c0cceae?source=rss-babc435ed2f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/29638c0cceae</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[deepseek]]></category>
            <category><![CDATA[reinforcement-learning]]></category>
            <category><![CDATA[large-language-models]]></category>
            <dc:creator><![CDATA[Keivalya Pandya]]></dc:creator>
            <pubDate>Mon, 16 Feb 2026 00:32:07 GMT</pubDate>
            <atom:updated>2026-02-16T00:32:07.779Z</atom:updated>
            <content:encoded><![CDATA[<p>What will you read (&amp; learn about) in this blog?</p><ol><li>Importance of Open-source AI</li><li>Techniques from DeepSeek<br>a. Group Relative Policy Optimization<br>b. <em>&lt;think&gt;</em> the “Aha!” moment <em>&lt;think&gt;</em><br>c. Pure RL!<br>d. Flashlight Effect in <em>Math vs Language</em><br>e. Distillation</li><li>“with great powers…”</li></ol><p>Let’s be honest… We live in an era where companies guard AI secrets like they are some kind of neuclear weapons. Not that I don’t realize the serious implications of AI, but sometimes it’s just too much (and it seems a little unnecessary).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*P9w7uLnU8Cxi_ZcgAMEVTw.png" /><figcaption>GPT-4 Technical Report, <a href="https://ar5iv.labs.arxiv.org/html/2303.08774#:~:text=Given%20both%20the%20competitive%20landscape%20and%20the%20safety%20implications%20of%20large%2Dscale%20models%20like%20GPT%2D4%2C%20this%20report%20contains%20no%20further%20details%20about%20the%20architecture%20(including%20model%20size)%2C%20hardware%2C%20training%20compute%2C%20dataset%20construction%2C%20training%20method%2C%20or%20similar.">section 2</a></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uVkLDjgg9lKjmhsRdgzCcA.png" /><figcaption>PaLM 2 Technical Report, <a href="https://ai.google/static/documents/palm2techreport.pdf#:~:text=Model%20Architecture%20PaLM,are%20withheld%20from%20external%20publication">Model Card</a></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*q-NBS8Kib__tV5G7MMlKXA.png" /><figcaption>Anthropic Trasparency <a href="https://crfm.stanford.edu/fmti/December-2025/company-reports/Anthropic_FinalReport_FMTI2025.html">Report</a></figcaption></figure><p>These papers, articles, reports — feel more like marketing brouchers rather than scientific contributions. I mean, I see you are ‘advertizing’ your model, fair enough… What are you contributing to science? It’s hard to say “AI is the new electricity” when you know physica behind electricity is free for all. <em>I understand everyone would have a different opinion on it, and maybe I’d change mine if I become wiser/dumber in future.</em></p><p>On the other hand,</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0SHxNxV0e9hVu9z_3tvg_Q.png" /><figcaption>DeepSeek-LLM <a href="https://github.com/deepseek-ai/DeepSeek-LLM">GitHub Repo</a></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EJdTYb7u5HBrEVwebez-qg.png" /><figcaption><a href="https://about.fb.com/news/2023/07/llama-2/#:~:text=We%E2%80%99re%20now%20ready%20to%20open%20source%20the%20next%20version%20of%20Llama%202%20and%20are%20making%20it%20available%20free%20of%20charge%20for%20research%20and%20commercial%20use.%20We%E2%80%99re%20including%20model%20weights%20and%20starting%20code%20for%20the%20pretrained%20model%20and%20conversational%20fine%2Dtuned%20versions%20too.">Article</a> about Llama</figcaption></figure><p>… and sure, there are some more efforts in open-sourcing ‘science’, and we all LOVE it!</p><p>In this Medium I’ll focus on — <strong>how do we <em>teach</em> LLMs to be so *awesome*, and what that teaches us in return</strong>. My goal here is to explain some really cool training/fine-tuning methods that DeepSeek used to build the foundation of world’s #1 model (at some point).</p><h3>Group Relative Policy Optimization</h3><p>Traditionally, AI training relied on PPO (think: an expensive private tutor) who critiques every single sentence a student writes. This is slow, costly, and limited. DeepSeek replaced this “teacher” with a “judge” through <strong>GRPO</strong>!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hhdQHXYd_4tswlOLGe0TzA.png" /><figcaption>PPO vs GRPO in <a href="https://arxiv.org/pdf/2402.03300">DeepSeekMath paper</a></figcaption></figure><p>In this system, the student is given a single problem and generates 16 different versions of the answer. We don’t micromanage the process; we simply judge the results. Did the code run? Was the math correct? We let the versions compete.</p><blockquote>The best ones get a medal, the crappy ones get discarded.</blockquote><p>Just like in <strong>our life</strong> — our inner critic is a bottleneck, and inner judge is a scaling solution. Stop agonizing over your first draft or your first thought! When faced with a high-stakes decision, generate five distinct paths. Don’t critique them as you go. Let them exist, compare their projected outcomes, and commit only to the one that survives the arena of logic.</p><h3>&lt;think&gt; the “Aha!” Moment &lt;think/&gt;</h3><p>DeepSeek’s researchers witnessed a startling phenomenon: the AI naturally learned that “thinking” before “speaking” led to better results. Without being explicitly programmed to pause, the model began generating internal dialogue like <em>“Wait…”</em> or <em>“Let me re-calculate.”</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ej1DrT8IckHU03verXamQg.png" /><figcaption>Model learns to rethink using an anthropomorphic tone (from <a href="https://arxiv.org/pdf/2501.12948">DeepSeek-R1 paper</a>)</figcaption></figure><p>It discovered an undeniable law: thinking time directly correlates to performance.</p><p>It taught <em>itself</em> to have an “aha!” moment. <em>(let that sink in for a moment)</em></p><p>THINK about it! The AI naturally learnt that “double checking” is does NOT mean hesitation, but a step towards brilliance. Take a breath! Deliberately pause, because, this extra time is where the intelligence actually lives!</p><h3>Pure Reinforcement Learning</h3><p>If you want to get better at chess, do you constantly just read the rules and learn from past matches? How many books do you read to learn to play decent guitar?</p><p>DeepSeek-R1-Zero shows that you <em>don’t need human examples</em> to achieve mastery; you need <strong>Pure Reinforcement Learning. </strong>By playing against itself and following the rules, the model’s success rate in competition math skyrocketed from 15% to nearly 80%.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/685/0*Kw2Q8MKw9sY0AJEB.png" /><figcaption>DeepSeek-R1-Zero eval on AIME benchmark through RL training</figcaption></figure><p>The idea is, there is only limited amount of knowledge generated by humans so far — it becomes a ceiling, but playing against yourself has (almost) no limit. Theory is capped by the author’s knowledge, whereas practice is limited only by your persistence. <strong>Embrace the mess</strong>, and learn the game by playing it.</p><h3>Flashlight Effect</h3><p>While pure logic is powerful, it can lead to “wandering randomly in a dark forest.” Without a guide, the AI occasionally spiraled into gibberish or switched languages mid-sentence. Here, the idea is to give the model a few high-quality examples as “flashlight” so that it could steer the model towards human-readable logic.</p><h3>Distillation</h3><p>Researchers took the massive R1 model and had it write a 800,000-example “textbook” of its own thinking process. They used this to teach a tiny, 7B-parameter model.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YYjyp3UaBNZ7mx_lUZgzmQ.png" /><figcaption>DeepSeek-R1 Distillation technique</figcaption></figure><p>The result was shocking: this tiny model is <strong>nearly 6 times better</strong> on competition-level math than giants like GPT-4o. It is small enough to run on a laptop, yet it carries the wisdom of a billion-dollar training run.</p><blockquote>You need the genius to write it, but not to read it. That is the key!</blockquote><p>If your wisdom cannot be distilled into a simple routine, it isn’t mastery; it’s just clutter.</p><h3>with great power comes great responsibility</h3><p>The shift from “closed” to “open” intelligence marks a move toward the democratization of wisdom. I love how DeepSeek has shown that the most powerful tools in existence are moving from the hands of the few to the hands of the many.</p><blockquote>If a machine can learn to think, wait, and self-correct to achieve the impossible, what is stopping you from running your own internal “R1” upgrade today?</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=29638c0cceae" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[mini-VLA with vision encoders]]></title>
            <link>https://medium.com/@keivalyap/mini-vla-with-vision-encoders-f9ba8d8d2988?source=rss-babc435ed2f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/f9ba8d8d2988</guid>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[computer-vision]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[robotics]]></category>
            <category><![CDATA[reinforcement-learning]]></category>
            <dc:creator><![CDATA[Keivalya Pandya]]></dc:creator>
            <pubDate>Sun, 21 Dec 2025 18:17:09 GMT</pubDate>
            <atom:updated>2025-12-21T18:17:09.683Z</atom:updated>
            <content:encoded><![CDATA[<p>In this blog I will walk you through how to upgrade the vision system from using CNN Encoder → CLIP/SigLIP Encoder.</p><p>Similar to previous blogs, this is going to have technical depth alongside intuition and code interpretation. If you are new to these blogs, I am <a href="https://www.keivalya.com/">Keivalya Pandya</a> (you can call me Kv), and I write about <strong>robotics</strong>, <strong>ai</strong>, and sometimes <strong>life</strong>. I highly recommend reading previous blogs before getting started with this one — each of them are like 8-min read, so should be super quick!</p><ul><li><a href="https://substack.com/@keivalya/note/p-180266695">Building Vision-Language-Action Model from scratch</a></li><li><a href="https://medium.com/@keivalyap/building-vla-models-from-scratch-ii-0180020dbc85">Building VLA models from scratch — II</a></li></ul><p>These fore-mentioned blogs will give you a deeper understanding of how mini-VLA was built from first-principles. I carry the same idea in this blog, hence we will look into CLIP and SigLIP in fairly shallow details and try to understand how it was integrated efficiently with the existing mini-VLA architecture. The main challenges were (1) keeping the codebase minimal without turning it into a “framework” (2) making<strong> CNN ↔ ViT swappable </strong>without touching the rest of the model, and (3) getting the preprocessing right — <strong>resize + normalize</strong> so the new encoders behave as expected.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cn-p-lnK-gZECpHnlYTZ1Q.png" /><figcaption>a minimal logo for mini-VLA open-source community (we are growing!)</figcaption></figure><p>mini-VLA is simple… each one of the text/vision/state token is a single vector (B, d_model) and are fused into a diffusion action head. That’s a beautiful design constraint because it means,</p><blockquote>As long as the vision encoder outputs a single (B, d_model) vector, everything downstream stays unchanged.</blockquote><p>Isn’t that awesome?! So instead of modifying fusion, diffusion, training loops, etc… we only upgrade the <em>vision token generator</em>. That’s it! And that’s exactly what we will cover in this blog.</p><p><a href="https://github.com/keivalya/mini-vla/tree/vision">GitHub - keivalya/mini-vla at vision</a></p><h3>CLIP = Contrastive Language-Image Pretraining</h3><p>Now, CLIP is a popular model developed and open-source by OpenAI, and has been beautifully explained in <a href="https://arxiv.org/pdf/2103.00020">the original paper</a>, <a href="https://github.com/openai/CLIP">code</a>, and <a href="https://openai.com/index/clip/">blog</a></p><iframe src="https://drive.google.com/viewerng/viewer?url=https%3A//arxiv.org/pdf/2103.00020&amp;embedded=true" width="600" height="780" frameborder="0" scrolling="no"><a href="https://medium.com/media/4f10974d25898c51316f98687613065f/href">https://medium.com/media/4f10974d25898c51316f98687613065f/href</a></iframe><p>However, I want to focus on giving you a high-level overview of what am I really doing with CLIP, what I actually use it for (and what I tend to ignore from this model).</p><p>The context is, when people hear <strong>CLIP</strong>, they usually think about <em>image–text similarity</em>, zero-shot classification, or prompt engineering tricks. That’s <strong>not</strong> what I’m using it for here.</p><p>In mini-VLA, CLIP is simply a <strong>strong image → vector function</strong>. That’s it.</p><p>I am NOT training CLIP, nor using the text encoder, nor am I computing contrastive losses, neither am I doing some sort of prompt matching, and I am not even changing anything downstream. I am <em>only</em> replacing my old CNN vision stack with a <strong>pretrained CLIP vision encoder</strong> and asking a single question:</p><blockquote>Can CLIP give me a single, semantically rich vector per image that plugs into my existing VLA pipeline?</blockquote><p>Spoiler alert! The answer is, <strong>yes — perfectly</strong>.</p><p>But, why CLIP fits mini-VLA so well? Recall our design constraint,</p><blockquote>Each modality (vision / language / state) is represented as <strong>a single vector</strong> of shape (B, d_model).</blockquote><p>CLIP’s vision encoder (which is ViT-based) already outputs a sequence of patch tokens and a <strong>special pooled representation</strong> (the CLS / pooled output). This pooled output is exactly what we want here!</p><blockquote>image → CLIP ViT → pooled embed → projection → vision token (B, d_model)</blockquote><p>No attention maps. No spatial grids. No feature pyramid. Just <strong>one vector in, one vector out</strong>.</p><p>The hypothesis is, CLIP must work at least better than CNN, right? With CNNs we usually think in terms of receptive fields, hierarchical features, and spatial inductive biases. CLIP is different. Here we think in terms of global context (like, what is present in this image?), patch-to-patch relationships (sometimes inferring object and relative positioning in the image), and mainly semantic alignment learned from internet-scale data!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*pk6-uh_fMhJrXnGXPVvWcQ.gif" /><figcaption><strong>CLIP encoder</strong>— trainined for 5 epochs (it would work better with slighly more compute)</figcaption></figure><p>This matters a lot for robotics. Instead of encoding <em>“edges → textures → objects”</em>, CLIP tends to encode object identity, relative configuration, and high-level semantics. Which is <em>exactly</em> what a downstream <strong>action model</strong> wants.</p><h3>Sigmoid Loss for Language Image Pre-Training (SigLIP)</h3><p><a href="https://arxiv.org/pdf/2303.15343">SigLIP</a> is a multimodal image-text model similar to CLIP. It uses separate image and text encoders to generate representations for both modalities.</p><p>SigLIP is a drop-in vision token generator in mini-VLA because our wrapper forces a clean invariant,</p><blockquote>Any ViT vision model that can return last_hidden_state → CLS token → (B, d_model) works.</blockquote><p>I am not going to explain this in a lot of detail, but the core idea is exactly same (for our application) as I explained in CLIP. There are subtle implementation differences that I want to highlight in the next section.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*jk22fbMW59LPTRnu5DHFjQ.gif" /><figcaption><strong>SigLIP encoder</strong> — trainined for 5 epochs (similar to CLIP as both were trained with limited compute)</figcaption></figure><h3>Implementing these ViT(s)</h3><p>Look at this code <a href="https://github.com/keivalya/mini-vla/blob/vision/models/vision/hf_vit.py">mini-VLA/models/vision/hf_vit.py</a>, carefully…</p><pre>class HFViTVisionEncoder(VisionEncoder):<br>    &quot;&quot;&quot;<br>    HuggingFace Vision encoder wrapper (CLIP / SigLIP).<br>    &quot;&quot;&quot;<br>    def __init__(self, cfg: VisionEncoderCfg, hf_kind: Literal[&quot;clip&quot;, &quot;siglip&quot;], default_pretrained: str, mean: tuple[float, float, float], std: tuple[float, float, float],):<br>        super().__init__(cfg)<br><br>        try:<br>            if hf_kind == &quot;clip&quot;:<br>                from transformers import CLIPVisionModel<br>                model_id = cfg.pretrained or default_pretrained<br>                self.backbone = CLIPVisionModel.from_pretrained(model_id)<br>            elif hf_kind == &quot;siglip&quot;:<br>                from transformers import SiglipVisionModel<br>                model_id = cfg.pretrained or default_pretrained<br>                self.backbone = SiglipVisionModel.from_pretrained(model_id)<br>            else:<br>                raise ValueError(f&quot;Unsupported hf_kind={hf_kind}&quot;)<br>        except ImportError as e:<br>            raise ImportError(&quot;Install transformers: pip install transformers&quot;) from e<br><br>        hidden = int(self.backbone.config.hidden_size)<br>        out_dim = int(cfg.d_model)<br>        self.proj = nn.Identity() if out_dim == hidden else nn.Linear(hidden, out_dim)<br><br>        self.register_buffer(&quot;mean&quot;, torch.tensor(mean, dtype=torch.float32).view(1, 3, 1, 1), persistent=False)<br>        self.register_buffer(&quot;std&quot;, torch.tensor(std, dtype=torch.float32).view(1, 3, 1, 1), persistent=False)<br><br>        self.image_size = int(cfg.image_size or getattr(self.backbone.config, &quot;image_size&quot;, 224))<br><br>        if not cfg.trainable:<br>            for p in self.backbone.parameters():<br>                p.requires_grad = False<br><br>    def forward(self, x: torch.Tensor) -&gt; torch.Tensor:<br>        if x.dtype == torch.uint8: x = x.float() / 255.0<br>        else: x = x.float()<br><br>        if x.shape[-2:] != (self.image_size, self.image_size):<br>            x = F.interpolate(x, size=(self.image_size, self.image_size), mode=&quot;bilinear&quot;, align_corners=False)<br><br>        x = (x - self.mean) / self.std<br>        out = self.backbone(pixel_values=x, return_dict=True).last_hidden_state  # (B, N, hidden)<br>        cls = out[:, 0]<br>        return self.proj(cls)</pre><p>Take a moment to absorb it as much as you can. You can find a well-documented/commented code on <a href="https://github.com/keivalya/mini-vla/blob/vision/models/vision/hf_vit.py">github</a>. The forward pass is doing four important things:</p><ol><li><strong>Accepts mixed input types</strong>, uint8 gets scaled to [0,1] float, whereas anything else is forced to become float</li><li><strong>Resizes the model’s native resolution</strong> using cfg.image_size or backbone.config.image_size</li><li><strong>Normalized inside the encoder</strong> using buffers</li><li>Extracts a <strong>single vector token</strong> that takes in any arbitrary hidden size and returns it with fusion embedding’s acceptable size</li></ol><p>I hope this makes sense. We are doing exactly what we did with TinyCNN in previous blogs, but this time we are doing it in a more meaningful way.</p><blockquote>The most important difference is, in the case of TinyCNN we were training that encoder, but in the case of CLIP or SigLIP we keep their encoder weights frozen, and just use the forward pass!</blockquote><h3>So WHAT?</h3><p>At this point, the integration story should feel almost suspiciously simple: every vision encoder in mini-VLA is just a <strong>token generator</strong>. In other words, the rest of mini-VLA doesn’t <em>know</em> that you changed the vision system — it still receives the same (B, d_model) vision token and does the same fusion + diffusion action generation. <em>That is the entire design win.</em></p><h3>Frozen vs trainable weights: <em>what I actually recommend</em></h3><p>Even though I mentioned earlier that CLIP and SigLIP weights are frozen by default, that doesn’t mean you cannot update them.</p><p>Currently we do cfg.trainable = False, so CLIP/SigLIP weights don’t get gradients. <em>This is the cleanest baseline, fastest to train, and usually surprisingly strong.</em></p><p>You may set cfg.trainable = True if you have enough data and you’re confident your distribution isn’t wildly different from pretraining. <em>Otherwise, you risk overfitting fast and losing the generality that makes CLIP/SigLIP useful.</em></p><p>My general observation is:</p><ul><li>Small robotics dataset → keep frozen</li><li>Large, diverse dataset + strong regularization → consider finetuning</li></ul><h3>Epilogue</h3><p>If you zoom out, this entire blog is really about one idea,</p><blockquote>when you design clean interfaces, you can upgrade the internals without rewriting the system.</blockquote><p>mini-VLA stays stable because it treats each modality as a <strong>single vector token</strong>. Today it’s CNN → CLIP/SigLIP. Tomorrow it could be DINOv2, SAM-style pooled features, or a video encoder.</p><p>So, remember this… <strong>Sometimes you don’t need a bigger framework — you need better boundaries.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f9ba8d8d2988" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building VLA models from scratch — II]]></title>
            <link>https://medium.com/@keivalyap/building-vla-models-from-scratch-ii-0180020dbc85?source=rss-babc435ed2f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/0180020dbc85</guid>
            <category><![CDATA[computer-vision]]></category>
            <category><![CDATA[robotics]]></category>
            <category><![CDATA[vision-language-action]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[reinforcement-learning]]></category>
            <dc:creator><![CDATA[Keivalya Pandya]]></dc:creator>
            <pubDate>Wed, 17 Dec 2025 00:12:46 GMT</pubDate>
            <atom:updated>2026-01-07T00:57:48.001Z</atom:updated>
            <content:encoded><![CDATA[<h3>Building VLA models from scratch — II</h3><p>If you have not read my previous blog — <a href="https://open.substack.com/pub/keivalya/p/building-vision-language-action-from?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">Building VLA model from scratch: I</a>, which covers a philosophical overview of the same. However, this Medium-blog covers more in-depth technical portion of the same architecture, and some not-so-far-in-future scope I am working on to ‘perhaps’ generalize this model further — <em>we will get back to that soon! </em>Anyways, you should expect some amount of math, intuition, deeper conceptual grounding, and practical design trade-offs in this post.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*M86MshxttAe8ID-odxgVeg.gif" /></figure><p>This follow-up is the technical deep dive I avoided last time. We’ll go under the hood of the exact same pipeline, but this time with the <em>math and the “why”.</em></p><p>[EXTRA] Why did I switch from Substack to Medium? I wanted to reference code-blocks alongside the concept and math involved. Turns out Substack doesn’t have a direct way of embedding gists into the blogs, and <em>I wish I knew that sooner</em>. Hence, here we are now.</p><p>Finally, let’s dive into it. If you have not read Part-1, check that out (takes about 8 mins).</p><p><a href="https://keivalya.substack.com/p/building-vision-language-action-from">Building Vision-Language-Action Model from scratch</a></p><h3>Recap: The mini-VLA Pipeline</h3><blockquote>Vision → Language → Action pipeline</blockquote><p>A <strong>vision encoder</strong> extracts visual features from image observations into embeddings; a <strong>vision-language projector</strong> maps these embeddings into the LLM’s representation space; a <strong>language model backbone</strong> processes the fused tokens alongside text instructions; and an <strong>action head</strong> converts LLM outputs to executable robot commands.</p><p>In other words, VLA models fine-tune VLMs for robot control, viz instead of generating captions for a given image, we generate actions for the given image and text instruction.</p><p><a href="https://github.com/keivalya/mini-vla">GitHub - keivalya/mini-vla: a minimal, beginner-friendly VLA to show how robot policies can fuse images, text, and states to generate actions</a></p><h3>Encoding Vision, Language, and State</h3><p>All encoders are defined in the <a href="https://github.com/keivalya/mini-vla/blob/main/models/encoders.py">mini-VLA/models/encoders.py</a> file, and I highly recommend you to follow along with me while I explain them line-by-line.</p><h4>Image Encoder</h4><p>I have used a simple <strong>Convolutional Neural Network (CNN)</strong> for simplicity. If you are unaware of what that is or need a refresher, use this tutorial — <a href="https://poloclub.github.io/cnn-explainer/">PoloClub CNN Explainer</a>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2f7c3dbfab2926c93ab3cce1d754b6da/href">https://medium.com/media/2f7c3dbfab2926c93ab3cce1d754b6da/href</a></iframe><p>ImageEncoderTinyCNN maps an RGB image to a <strong>single fixed-size embedding</strong>. This embedding becomes the <strong>vision token</strong> that later fuses with language/state tokens.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/546/0*YXW2Mh1dMBE49arY" /><figcaption><strong>Image Encoder:</strong> RGB image <strong>x</strong> mapped to embedding space <strong><em>z</em></strong><em>; where </em><strong><em>B</em></strong><em> is the batch-size</em></figcaption></figure><p>How does this embedding takes place? Image passes through three convolutional layers, and at each layer the spatial dimensions of the image reduce by half, and number of channels increase as 3 → 32 → 64 → 128. By the end of CNN layers, the network has built 128 learned feature maps at lower resolution — typical CNN behavior, right? <strong>Fewer pixels, more semantic channels.</strong></p><p>Then we do a <strong>Global Average Pooling (GAP)</strong> to collapse spatial features into a 1-dimensional vector. each channel becomes a single summary statistic (“how present is feature <em>c</em> anywhere in the image?”). This makes the embedding translation-tolerant (like, small shifts are trivial) and of fixed-size.</p><p>At the end, we perform a <strong>Linear Projection</strong> into the model’s embedding space. This step is crucial in VLAs as it aligns vision features into the same dimensionality as other modalities (like text, or state), so these can be fused (we will come to it soon).</p><p>Despite being effective for our usecase, it is not scalable. When we do GAP, we lose grounding. Hence, modern VLAs retain <strong>multiple spatial tokens</strong> (ViT, feature maps, etc) so actions can attend to <em>where</em> things are, not just <em>what</em> is present. I am currently working on mini-VLA-v2 on the /vision branch of the same codebase to address this issue. Later, we are interested in adding cross-modal attention, and leveraging pretrained semantic vision models (like ResNet etc).</p><h4>Instruction/Text Encoder</h4><p>TextEncoderTinyGRU maps a tokenized instruction like <em>“push the object to the goal”</em> into a <strong>single fixed-size language embedding</strong> that can be fused with vision + robot state.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/63802129c87c88a5048d92839daacb53/href">https://medium.com/media/63802129c87c88a5048d92839daacb53/href</a></iframe><p>Well, before encoding the text, we tokenize the text using a tokenizer — <a href="https://github.com/keivalya/mini-vla/blob/main/utils/tokenizer.py">mini-VLA/models/tokenizer.py</a>, then that tokenized sentence (aka word IDs) are fed into the text encoder.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/657/0*ulQ4Pt5-GnE3iUsa" /><figcaption><strong>Word Encoder:</strong> word IDs (or tokens) <strong>w</strong> are mapped to embedding space <strong><em>z</em></strong></figcaption></figure><p>The process goes like, <em>token IDs</em> → <em>X</em> → <em>h</em> → <em>z</em></p><p>Each token <strong><em>w</em></strong> is mapped to a learned vector in <strong>embedding space</strong>. This embedding matrix learns a continuous representation of words so that similar words (e.g., “push” vs “move”) can lie closer in embedding space. Then we use <strong>Gated Recurring Unit (GRU)</strong> to process the input sequence one token at a time, maintaining a hidden state. This is like <em>sequence-to-vector</em> encoder, as it compresses the entire instruction into a single vector. Lastly we do a <strong>LayerNorm</strong> to normalize each sample’s embedding across feature dimension.</p><p>This might look complicated if you don’t have good understanding of RNNs. We only use the last hidden layer, however modern VLAs keep <strong>all token embeddings</strong> and use cross-attention so actions can attend to specific words/phrases.</p><h4>Robot-State Encoder</h4><p>StateEncoderMLP converts a low-dimensional robot state vector (joint angles, gripper position, etc) into a fixed-size embedding that can be fused with vision and language.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5b5c08cbf10a5c97c8886d16a81c16a4/href">https://medium.com/media/5b5c08cbf10a5c97c8886d16a81c16a4/href</a></iframe><p>This embedding acts like a <strong><em>state token</em></strong> that provides body’s innate state and kinematic context for action generation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/446/0*PMgakHHtG27hAtui" /><figcaption><strong>State Encoder:</strong> state dimension <strong>s</strong> is mapped to embedding space <strong><em>z</em></strong></figcaption></figure><p>This module basically performs Linear(state_dim → 64) → ReLU → Linear(64 → d_model) → LayerNorm transformation.</p><p>The <strong>first Linear Layer</strong> mixes the raw state dimensions into 64 learned features. If <em>state</em> contains different units (radians, meters, velocities), the MLP can learn useful combinations. We all know <strong>ReLU</strong> gives non-linearity, and this matters because robot dynamics and contact regimes are highly nonlinear (remember this in future too). Then the <strong>second Linear Layer</strong> transforms current feature space into the same feature space size as your vision/language tokens, which is critical for fusion modules. <strong>LayerNorm</strong> makes the fusion stage far more stable by ensuring the state token has predictable scale.</p><p>As we push toward multi-task, long-horizon, and real-world generalization, this encoder starts to become a bottleneck. We can encode state using structured representations e.g, kinematic-aware features, graph networks, SE(3)-equivariant components, or explicit pose embeddings. Also it’s common to represent state as multiple tokens (e.g., per joint group, per limb, per sensor), enabling attention mechanisms to query what matters for the current instruction. <em>You get the point, right? That there’s HUGE scope for improvement here as well.</em></p><h3>Fusion as a Learned Conditioning Variable</h3><p>So far we have seen a VLA policy has three modalities: vision token <em>v</em>, text token <em>t</em>, and state token <em>s</em>. This module fuses them into one <strong>single context embedding</strong> that becomes the <strong>condition for action head </strong><em>(this is important)</em>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/0e0038c8e94fbb9d96b05d9a534b589c/href">https://medium.com/media/0e0038c8e94fbb9d96b05d9a534b589c/href</a></iframe><p>Refer code <a href="https://github.com/keivalya/mini-vla/blob/main/models/fusion.py">mini-VLA/models/fusion.py</a>. This is the simplest possible <strong><em>fusion </em></strong>— put all modalities side-by-side so a downstream function can mix dimensions across them. And what is that downstream function? Yeah, you guessed it right. An MLP.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/430/0*xAVn12RR7LgGMiD8" /><figcaption><strong>vision</strong>, <strong>text</strong>, and <strong>state</strong> tokens (each of dim <strong>d</strong>) are mapped to <strong>fused context vector c</strong></figcaption></figure><p>Now, this is pretty interesting because this fused context is the single conditioning vector <strong><em>c</em></strong> that a policy uses, eg</p><ul><li>diffusion head predicts noise <strong><em>ϵ (a, t | c)</em></strong></li><li>predicts mean action <strong><em>μ (c)</em></strong></li><li>autoregression that predicts action tokens conditioned on <strong><em>c</em></strong></li></ul><p>So, this fusion module decides <em>what information is preserved and how it’s blended</em> across modalities. Again, this is not the best way of fusing information because we lose spatial grounding. A better way could to use cross-attention block instead.</p><h3>Diffusion Models in Action Space</h3><p>I implement a <strong>conditional DDPM-style diffusion policy head</strong> for continuous actions. What does that mean? Given a fused VLA context vector <strong><em>c</em></strong>​, it learns a stochastic policy over actions <strong><em>a</em></strong>​ by modeling <strong>action generation as iterative denoising</strong>. Refer code <a href="https://github.com/keivalya/mini-vla/blob/main/models/diffusion_head.py">mini-VLA/models/diffusion_head.py</a></p><p>Denoising model is the core network that predicts the noise, and is given by</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/404/0*tpjmp5r6LYh51PD_" /></figure><p>implemented as an MLP. (this is the standard parameterization used for DDPM; <em>the model learns to predict the noise added at time step t</em>)</p><p>Well, Diffusion is the part which requires its own blog (the math proving it is just beautiful!), but I choose not to spoil it here. I have implemented the code almost correctly — with ONE simplified approximation which I’d like to mention (just so you don’t sue me unnecessarily)</p><p>The reverse update that I use is a simplified approximation,</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/350/0*wovJi4Osx7Jp_HjC" /></figure><p>instead of the full DDPM posterior mean:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/626/0*gG_hSlparHNs9ZSB" /></figure><p>However, in practice, many diffusion-policy implementations use DDIM sampling, some other scheduler, or even better posterior parameterization.</p><h3>VLA Diffusion Policy</h3><p>To summarize, mini-VLA is a compact vision-language-action policy that outputs continuous actions conditioned on an image, a language instruction, and the robot state vector. Refer code <a href="https://github.com/keivalya/mini-vla/blob/main/models/vla_diffusion_policy.py">mini-VLA/models/vla_diffusion_policy.py</a>. From this definition, we can say that our <strong>Objective Function</strong> is to learn a conditional action distribution</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/190/0*Um7p-sW0NKMEuDgb" /><figcaption>Probability of action <strong>a</strong>, given the image <strong>I</strong>, instruction <strong>W</strong>, and robot state <strong>s</strong></figcaption></figure><p>Instead of modeling this distribution directly, the policy follows the <strong>denoising diffusion probabilistic model (DDPM)</strong> formulation and learns to generate actions by <strong>iterative denoising</strong>. We have read about it eariler in this blog, and here we are just putting all these pieces together. <em>Nothing new here.</em></p><p>Our Training Objective is to minimize the expected mean-squared error between the predicted and true noise</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/601/0*-Zs2-5G7-sGp4Ti-" /><figcaption>This loss is a standard DDPM objective and corresponds to a variational bound on the negative log-likelihood of the data under the model</figcaption></figure><p>Now, the ultimate question is… Why are we predicting noise (instead of directly predicting actions)? I mean, wouldn’t that be simpler? Turns out, there are several advantages of predicting noise over actions! The noise distribution is stationary and Gaussian, learning problem is well-conditioned across timesteps, and model naturally learns a <strong>smooth conditional action manifold</strong>. This naturally leads to smoother control outputs, robustness to small perturbations and better handling of multimodal demonstrations.</p><p><strong>CONGRATULATIONS! You just made your own VLA, from scratch!🥳</strong></p><h3>That is it, for now</h3><p>Now you know just enough about mini-VLA to get started with. There is always scope for improvement, but the challenge here is to build something that works well even on the low-end devices.</p><p>Finally, it was exciting, yet exhausting to write in a new tool — it was fun mostly. I am going to share updates, like implementing ViT and all in the updates SOON, so stay tuned! I hope you found this both useful and enjoyable. Your feedback on the previous blog helped shape this one, and I’m grateful to everyone who shared thoughtful, constructive criticism.</p><p>I love talking about <strong>Robotics and AI</strong>, and writing these blogs helps me connect with like-minded people. <strong>Thank YOU</strong> for taking the time to learn and grow today.</p><p>:)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0180020dbc85" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>