ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

第306篇 强化学习在机器人控制中的应用

第306篇 强化学习在机器人控制中的应用 前面五篇把强化学习的基础算法过了一遍MDP、策略梯度、Actor-Critic、PPO、SAC。这些算法在仿真环境里跑得挺好但真正要部署到真实机器人上中间还有很大的鸿沟。这篇我们聊聊RL在机器人控制中的实际应用包括状态设计、奖励设计、仿真训练和Sim2Real。状态空间的设计RL策略的输入就是状态。状态设计得好不好直接决定了任务能不能学会。对于简单的控制任务比如平衡、行走状态通常包括关节角度、关节角速度、IMU数据加速度和角速度、基座姿态和速度。这些都是低维的连续量用几层全连接网络就能处理。对于复杂的操作任务比如抓取、装配状态可能需要包含视觉信息。把相机图像编码成特征向量跟本体感觉信息拼接起来作为策略的输入。这时候网络结构就变成了CNN处理图像 MLP处理本体感觉 融合层。视觉输入的加入大大增加了状态空间的维度训练难度也随之增加。实践中一般用预训练的视觉编码器比如ResNet来提取特征然后冻结或者微调。状态设计有几个原则。信息要充分——策略需要的所有信息都应该包含在状态里不要指望策略能推断出缺失的信息。维度要尽量低——高维状态需要更大的网络、更多的数据来训练。冗余信息可以去掉比如关节角度和关节位置如果是一一对应的保留一个就够了。归一化很重要——不同物理量的尺度可能差很多角度在[-π,π]力矩在[-100,100]输入网络前必须做归一化。还有个容易忽略的点状态的相对性。用绝对坐标世界坐标系下的位置还是相对坐标机器人基座坐标系下的位置大多数情况下相对坐标更好因为它让策略具有平移不变性——不管机器人放在地图的哪个位置策略的行为应该是一样的。对于移动机器人通常把目标位置表示为相对于机器人当前位置的偏移而不是世界坐标中的绝对位置。奖励函数设计奖励函数是RL中最考验功底的部分。设计不好轻则训练慢重则学出奇怪的行为。好的奖励函数应该满足几个条件目标明确清楚地表达你想让机器人做什么、尺度合理数值范围不要太大或太小、平滑不要有突变的跳变。行走任务的奖励通常包括前进速度奖励鼓励往前走、能量惩罚鼓励节能、姿态惩罚鼓励保持平衡、关节极限惩罚防止关节超限。这些项加权求和构成总奖励。# 行走任务的奖励设计示例 # reward w1 * forward_velocity # 前进速度 # - w2 * energy_cost # 能量消耗 # - w3 * body_tilt_penalty # 身体倾斜惩罚 # - w4 * joint_limit_penalty # 关节极限惩罚 # w5 * survival_bonus # 存活奖励权重的选择很关键。前进速度的权重太大机器人可能为了跑得快而摔倒能量惩罚太大机器人可能干脆不动。实践中一般先设等权重然后逐步调整。有个常见的坑叫reward hacking。机器人找到了奖励函数的漏洞获得了高奖励但行为完全不是你想要的。比如在一个跳跃任务中机器人发现原地快速抖动能获得高度奖励因为奖励只看瞬时高度而不是真正跳起来。解决办法是加入更多的约束条件或者用多目标组合来堵住漏洞。课程学习Curriculum Learning是处理复杂任务的有效策略。把复杂任务分解成一系列由简到难的子任务先让策略学会简单的再逐步增加难度。比如训练行走策略先学站立奖励保持直立再学原地踏步奖励抬腿再学慢速行走奖励前进速度最后学快速行走。每个阶段用前一阶段的策略作为初始策略逐步提升。这种方式比直接训练最终任务快得多而且更容易收敛。仿真训练的工具链在真实机器人上训练RL是不现实的——太慢、太危险、太费硬件。所以标准做法是在仿真中训练然后迁移到真实机器人。主流的机器人仿真器有MuJoCo、Isaac Gym、PyBullet和Genesis。MuJoCo是最经典的物理精度高社区生态好支持接触力学、软体等复杂物理现象。2021年被DeepMind收购后开源了现在免费使用。Isaac Gym是NVIDIA的最大的优势是GPU并行仿真——几千个环境同时在GPU上跑采样速度比CPU仿真快几个数量级。但它的编程模型跟传统仿真器不同需要把环境逻辑搬到GPU上学习曲线比较陡。PyBullet是开源免费的适合入门和快速原型验证物理精度不如MuJoCo但够用。Genesis是最近的新秀速度也很快支持多种机器人和传感器模型。选哪个仿真器如果你的任务主要是运动控制行走、跑步、跳跃MuJoCo或Isaac Gym都可以。如果需要视觉输入Isaac Gym的优势更大因为它能直接渲染GPU上的图像。如果是入门学习PyBullet最简单装好包就能用。仿真训练的关键挑战是仿真和真实之间的差距sim-to-real gap。仿真中的物理参数摩擦系数、质量、关节刚度等不可能完全精确地匹配真实环境。策略在仿真中学到的行为到了真实环境中可能完全失效。Sim2Real的常用策略弥合sim-to-real gap的方法主要有三种。域随机化Domain Randomization是最常用的。训练时随机化仿真中的物理参数——摩擦系数在0.5到1.5之间随机质量在0.8到1.2倍之间随机加入随机的外力扰动等。策略被迫学会在各种参数下都能工作迁移到真实环境时只要真实参数在随机化范围内策略就能适应。OpenAI的Dactyl项目用域随机化训练了机械手转魔方的策略随机化了摩擦、质量、关节延迟等二十多个参数最终在真实机器人上实现了成功转魔方。域适应Domain Adaptation是让策略学习一个对仿真和真实数据都有效的特征表示。通常用对抗训练或者系统辨识来实现。比如用GAN来让仿真图像看起来像真实图像或者在特征空间中对齐仿真和真实的分布。这种方法需要同时有仿真和真实的数据实现起来比域随机化复杂。系统辨识System Identification是用真实机器人的数据来估计仿真中的未知参数让仿真尽可能接近真实。做法是在真实机器人上执行一组随机动作记录运动轨迹然后用优化算法调整仿真参数让仿真的轨迹尽可能接近真实轨迹。这种方法在训练初期可能不太准因为还没有真实数据但随着数据的积累会越来越准。实际部署时还有很多工程上的细节。控制频率要匹配——仿真中的控制频率要跟真实机器人一致通常是100Hz到1000Hz。传感器噪声要模拟——在仿真中加入传感器噪声高斯噪声、延迟、丢包让策略学会处理不完美的输入。执行器延迟也要考虑——真实电机的响应有延迟仿真中要加入这个延迟否则策略在真实环境中会因为延迟而不稳定。面试要点面试中聊RL在机器人控制中的应用几个核心话题要能展开。状态设计和奖励设计的trade-off。状态太丰富训练困难状态太简洁可能丢失关键信息。奖励设计太复杂权重调不过来太简单可能学不到想要的行为。这些都是实践中需要反复实验的。Sim2Real的挑战。面试官很可能问你怎么处理仿真和真实的差距。域随机化是最保险的答案但要知道它的局限性——随机化范围太大策略性能下降太小又不够鲁棒。安全约束。机器人控制中的安全性非常重要。RL策略在训练过程中会尝试各种动作包括危险的动作。在仿真中没问题但在真实机器人上可能造成硬件损坏。解决办法包括在仿真中训练好后直接部署不在线训练、加入安全约束层比如控制障碍函数CBF、或者用safe RL算法。控制障碍函数Control Barrier Function, CBF是一种数学工具它定义了一个安全集合保证系统的状态始终在这个集合内。在RL策略的输出后面加一个CBF过滤器如果RL输出的动作会导致不安全状态CBF会把它修正到安全边界上。这种方法在理论上能保证安全性但设计合适的CBF函数本身是个挑战。给你的建议如果你想做RL在机器人控制中的应用建议从Isaac Gym开始。它的GPU并行仿真让训练速度非常快几个小时内就能看到结果。先跑通官方的 locomotion 示例理解状态设计和奖励设计的思路。然后尝试自己设计一个新任务——比如让四足机器人爬楼梯或者让机械臂翻转物体。自己设计奖励函数、调参、做Sim2Real这个过程会让你对RL在机器人中的应用有深刻的理解。上一篇第305篇 SAC——最大熵强化学习下一篇预告第307篇 模仿学习——从示范中学习
返回列表