强化学习算法的设计美学——从 Bellman 到 PPO 的直觉路径
强化学习算法的设计美学——从 Bellman 到 PPO 的直觉路径 前面两篇我们聊了损失函数和优化器的设计哲学。但有一个领域的损失函数和优化器设计,比监督学习更"绕"——强化学习。 在监督学习中,你的标签是上帝给的,错了就是错了。但在强化学习中,你只有一个延迟的、嘈杂的、稀疏的标量奖励信号。更麻烦的是:你在用当前策略收集的数据来更新这个策略本身,更新完你又拿新策略去跑数据——你的训练数据一直在变。 这种"自己给自己出题,自己又去解题"的循环,使得 RL 的算法设计比监督学习多了一层曲折。这篇博客会沿着 RL 的算法演进路径,拆解每个关键设计背后的直觉——不是为了列公式,而是为了理解为什么一个问题被反复用不同方式解决。 1. 核心难题:状态价值和动作价值 先确立两个基本概念。 在 RL 中,智能体需要回答的根本问题是:在某个状态下,做哪个动作最好? 但"好"的定义是模糊的——好的动作会带来即时奖励,也可能带来长期回报。于是我们定义了两种价值函数: 状态价值 $V(s)$:从这个状态出发,按当前策略 $ \pi $,未...
优化器的直觉——从 SGD 到 Adam,每一步为什么这样走
优化器的直觉——从 SGD 到 Adam,每一步为什么这样走 上一篇文章我们聊了损失函数的设计哲学——一个函数告诉你"模型现在有多差"。但知道有多差只是第一步,更关键的问题是:知道了差在哪,该怎么走? 这就是优化器的工作。 从最早的梯度下降(SGD),到带动量(Momentum),到自适应学习率的 AdaGrad/RMSProp,再到集大成者 Adam——这条进化路径不是零散的拼凑,而是人们在实践中一步步回答同一个问题的过程: 用梯度更新参数时,怎么才能又快又稳地走到最优解? 这篇博客会沿着这个进化路径,讲清楚每个优化器解决了什么问题、又是怎么解决的,以及它们各自在什么场景下好用。 1. SGD:最朴素的走法 $$ \theta_{t+1} = \theta_t - \eta \cdot g_t $$ vanilla SGD 的逻辑最简单不过:看梯度往哪指,就往哪走一步,步长固定为 $\eta$。 好在哪里?直觉、简单、参数少。在凸优化理论上,SGD 有很好的收敛保证。 但实际训练中问题一堆: 步长难选。设大了震荡甚至发散,设小了龟速收敛。而且一个好的步长...
损失函数的设计哲学——从直觉理解为什么损失函数要长这样
损失函数的设计哲学——从直觉理解为什么损失函数要长这样 如果你写过几个 PyTorch 训练脚本,大概已经对 nn.MSELoss 和 nn.CrossEntropyLoss 这两个名字烂熟于心。你可能也知道"回归用 MSE,分类用 CrossEntropy"这条经验法则,甚至背过交叉熵的公式: $$ \mathcal{L}{CE} = -\sum{c} y_c \log(p_c) $$ 但你有没有停下来想过——为什么? 为什么回归不直接用绝对误差(L1),非要用平方(L2)?为什么分类不用 MSE 做损失?为什么交叉熵里的那个 $\log$ 恰到好处,换成别的就不行? 这些问题背后不是拍脑袋的巧合。每一种损失函数的设计,都是对人类认知目标的一种数学建模。这篇博客想做的,就是把几个最常用的损失函数从设计动机到数学形式拆一遍——不是为了背公式,而是为了理解如果换你来设计,你也会这么想。 1. 先想清楚:损失函数到底在做什么 在说具体函数之前,先明确一个最基础的问题。 训练一个模型,本质是一个 优化问题: $$ \theta^* = \arg\min_\thet...
从零写一个 RTOS 内核——在 STM32H723 上
从零写一个 RTOS 内核——在 STM32H723 上 市面上有很多 RTOS:FreeRTOS、RT-Thread、μC/OS、Zephyr……它们都很好用,但用久了总有种隔靴搔痒的感觉——你知道怎么调 API,但不知道进去之后到底发生了什么。 这篇文章的目的很简单:在 STM32H723 上,从零写一个能跑起来的 RTOS 内核,包含任务创建、上下文切换、调度器启动、SysTick 时基、阻塞延时和空闲任务。 不依赖任何第三方 RTOS 源码,只靠 ARM Cortex-M7 的硬件特性和纯粹的 C + 内联汇编。写完以后,你将对 RTOS 的底层机制有一个肌肉记忆级别的理解。 全文代码均在 STM32H723 上实测通过,工具链为 ARM GCC。 1. 设计目标 在动手之前,想清楚我们要做什么、不做什么是很有必要的。 要做的: 多任务并发(伪并行,单核分时) 基于优先级的抢占式调度 SysTick 提供时基 阻塞延时(delay_ms 而不是 HAL_Delay) 空闲任务(没有任务执行时 CPU 进入 WFI) 不做的(后续可以单独写): 任务间同步(信号...
PPO 在四足机器人控制中的应用——从理论到调参实战
PPO 在四足机器人控制中的应用——从理论到调参实战 如果你已经看过前面的 rsl_rl 源码解析,应该对 PPO 的工程实现有了清晰的了解。但那篇文章的重点是"代码怎么写",本文则回答另一个问题:PPO 在四足机器人 locomotion 中到底是怎么工作的、参数怎么调、坑在哪里? 如果你跑过四足 RL 训练,大概率遇到过这些场景: 训练两小时,loss 曲线看着很漂亮,结果机器人原地抽搐了一下就趴了 换了一组 reward 权重,PPO 就不收敛了,明明之前跑得好好的 试着把 clip range 从 0.2 调到 0.1,方差是小了,但怎么跑也跑不快 明明 GAE lambda 从 0.95 改到 0.99,步态反而更差了 这些都不是 bug,是 PPO 在连续控制问题——尤其是 locomotion——中的特有现象。本文从 locomotion 的视角重新理解 PPO 的每个组件,然后给出实战调参指南。 1. 重新理解 PPO——从 locomotion 的视角 PPO 的核心公式大家都很熟悉了: $$ L^{CLIP}(\theta) = \m...
风格田野指南——30种AIGC视觉语言速查
田野指南 30种AIGC视觉语言 全图豆包AI生成 · 2026 01 · 半调网点 1873 年,德国人 Georg Meisenbach 用一块刻满细密网格的玻璃屏把照片拆成了大小不一的圆点——本 来只是报纸印刷的一种妥协:油墨只能印纯色,要么黑要么白。Lichtenstein 在 1961 年把这个妥协放 大成了波普的视觉基因。那些本该藏在印刷品底层的网点突然变成了主角。此后你看到网点就想到印刷 品——这就是风格的形成。halftone dot pattern, Ben-Day dots, comic book style, bold primary colors, screen printing texture, Lichtenstein inspired, misregistration effect --ar 2:3 02 · 颗粒噪点 数码相机工程师花了几十年消灭噪点,胶片摄影师却花了一辈子迷恋它。Tri-X 400 的黑白颗粒里有 整个二十世纪的街头——Robert Frank 的美国人、森山大道的东京。清晰是一种谎言。噪点是反完美的 宣言;...
四足机器人 Locomotion 奖励函数设计——从步行到奔跑,每一分奖励的来龙去脉
四足机器人 Locomotion 奖励函数设计——从步行到奔跑,每一分奖励的来龙去脉 如果你已经搭好了 Isaac Lab 环境、写好了 PPO 训练脚本、加载好了四足机器人的 URDF,然后满怀期待地敲下 python scripts/train.py,等着机器狗走出来——结果它要么原地抽搐,要么侧翻在地,要么转圈像个陀螺——恭喜你,欢迎来到奖励函数设计的世界。 强化学习社区有一句老话:“Reward is the hypothesis of the designer.” 在四足 locomotion 这个任务上,这句话格外准确。机器狗的策略网络可以有上百万参数,但决定它最终学会什么行为的,归根结底是你写在 compute_reward() 函数里的那几行代码。同样的网络结构、同样的超参数、同样的仿真环境,换一套权重系数,学出来的步态可能截然不同——有的沉稳如波士顿动力的 Spot,有的则像喝醉了的柯基。 然而,关于奖励函数的内容,大多数教程要么一笔带过(“我们使用了一组精心设计的奖励项,详见论文附录”),要么只给出最终公式而不解释为什么这么设。这篇博客的目标是把奖励函数的每个...
DQN算法超详尽教程——从Q-table到深度强化学习
DQN 算法超详尽教程——从 Q-table 到深度强化学习 如果说 Q-learning 是强化学习的"Hello World",那 DQN(Deep Q-Network)就是深度强化学习真正走出实验室、进入公众视野的里程碑。2013 年,DeepMind 的 Mnih 等人在 NIPS 发表 Playing Atari with Deep Reinforcement Learning,用一个卷积神经网络直接从原始像素输入学到了 Atari 2600 平台上 6 款游戏(后来扩展到 49 款)中超越人类专业玩家水平的控制策略。这篇工作的冲击力在于:它首次干净利落地证明了,深度神经网络可以在强化学习框架下进行稳定训练,而不需要任何手工特征工程。两年后,这篇论文的改进版登上了 Nature,标题只有三个词:Human-level control through deep reinforcement learning。从此,深度强化学习进入了爆发期。 DQN 之所以经典,不在于它用了多复杂的数学工具,而在于它用两个看似简单的工程技巧——经验回放(Experienc...
运营组成长计划
机器人战队运营组成长计划 一、写在前面 我们队伍的运营组不是打杂组的,也不是可有可无的附属品 。 对于一支长期参赛的机器人战队来说,技术组决定机器人能不能跑起来,运营组决定战队能不能稳定传承、持续招新、形成影响力、积累文化,并在校内外建立清晰、可信、可传播的形象。比赛成绩当然重要,所有人都看重比分和名次,但真正让一支队伍走得更远的,往往是组织能力、内容能力、活动能力与对外沟通能力的长期积累。 ROBOCON 与其他机器人竞赛一样,具有明显的赛季性、项目制、强协作、高投入特点。赛场上能被看见的,是机器人、队员和结果;赛场外真正维系队伍正常运转的,是纳新、培训、活动策划、宣传、对外交流、资料积累与文化传承。 运营组的成员,不应该只是单纯的能发推文,或者能剪视频,还应该具有下面的能力: 能了解战队运行规则、与队员建立良好沟通 能独立承接宣传与活动任务 能与技术组高效协同 能与其他学校、企业加强交流 二、运营组的定位 运营组是做什么的 在我们战队中,运营组主要承担以下职责: 宣传 负责战队在校内外平台的整体形象塑造与内容发布,以及文创队服等特色周边制作。 策划 负责招新宣讲...
STM32H723 的 DMA 与 RAM 冲突问题:从内存域、总线矩阵到 D-Cache
前言 如果你在 STM32H723 上遇到过这些诡异现象: HAL_UART_Receive_DMA() 正常返回,但缓冲区就是不变 ADC + DMA 偶尔全 0,偶尔又像是“好了” 把数组改成全局变量、static、甚至改个大小,结果症状跟着变 关掉 D-Cache 以后突然一切正常,重新打开又开始抽风 那大概率不是你“DMA 配错了一点点”,而是你踩中了 STM32H7 这一代 MCU 最经典的坑之一。 STM32H723 和很多 F1/F4/F7 的直觉式用法不太一样。它的 Cortex-M7 内核带有 32 KB I-Cache 和 32 KB D-Cache,同时系统内部又分成 D1 / D2 / D3 三个域,既有 AXI SRAM,也有 D2 SRAM、D3 SRAM,还保留了 ITCM / DTCM 这样的 TCM 内存路径。(见 DS13313, AN4891) 所以,很多人口中的“DMA 与 RAM 冲突”,其实往往不是“两个模块抢内存”这么朴素,而是下面三类问题混在了一起: DMA 根本到不了那块 RAM DMA 能到,但 CPU 的 D-Cache...



