ARTICLE DETAIL

资讯详情

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

Hindsight:从心理偏差到强化学习HER

Hindsight:从心理偏差到强化学习HER Hindsight我最早是在英文词典里见到这个词的翻译过来就是“事后聪明”。说实话那时候我把它当贬义词马后炮、事后诸葛亮、“我早就知道会这样”。直到后来做强化学习项目在一篇讲稀疏奖励任务的论文里又撞见它——Hindsight Experience Replay那一刻才觉得这个词被我错怪了。同一枚硬币正面是心理学里人人喊打的后见之明偏差背面却是人工智能领域提升样本效率的核心技巧。这篇文章不打算写成学术综述我想把两件事讲透一是你我的大脑为什么总在事后“开天眼”二是如何像HER算法一样把失败的记录重新命名成有价值的数据。无论是做技术、带团队还是单纯想复盘自己的人生这两个视角都值得留一份。1. hindsight是什么事后聪明偏差如何偷走你的判断力1.1 你远比自己以为的更能“未卜先知”心理学对后见之明的研究很早。1975年心理学家Baruch Fischhoff做过一个经典实验先让参试者评估一些事件发生的概率等结果揭晓后再请他们回忆自己当初给出的概率值。结果非常稳定——几乎所有人回忆出来的数字都向真实结果靠拢。你以为自己当时投了“必然派”实际上你投票时还在两可之间记忆在知道结果的那一刻自动篡改了档案。这种偏差有多普遍你回想一下生活里的对话球赛还没结束时你连主队战术都说不清终场哨一响你说“我就知道这届稳了”。股票K线走出来以后对着行情图你有种强烈的“我早想买的”冲动。方案评审会上你一言不发项目出了线上事故你说“我当时就觉得这个设计有问题”。这些事情里有两个共同的破绽说出“我早知道”的人往往拿不出决策当时写下的判断依据。他们靠的是“记忆回放”但记忆不是录像带更像一块被反复压缩的硬盘。大脑为了让你觉得世界是可控的会在事后悄悄删除“不确定性”这个字段填上一个确定的结果。这样你晚上能睡得着代价是你对自己的判断力产生系统性高估。1.2 事后聪明什么时候开始害人后见之明的危害不在回忆那一刻而在它悄悄污染你后续的决策方式。最典型的场景是用结果倒推决策质量一个赌徒押大小赢了一次不等于他的决策系统好一个医生按标准流程操作却遇到罕见并发症不等于他做错了。人类天然喜欢“惟结果论”因为结果可见、可量化而决策过程模糊、难复盘。但如果把“结果不好”等同于“决策愚蠢”你就等于在告诉大脑以后做决策不要管网上的赔率只看谁最后赢了。这会让你的风险偏好彻底扭曲。第二个危害场景是团队复盘。一个线上故障发生之后你让六个相关同事各自回忆“当时有没有提到过这个风险”。几乎每个人都会被后见之明修正觉得自己预警过这个坑。接下来会议就变成了“你当时怎么不说”的甩锅大赛。复盘会变成了责任认定会信息流被记忆误差彻底覆盖这个团队离下一次事故也不远了。我花了很多年才弄明白这件事后见之明不是一种道德缺陷而是默认的认知设置。骂自己“蠢”没意义你要做的是给这个默认设置安装开关。2. 用对后见之明决策时不听它的复盘时用它干活2.1 防住“我早就知道”的三件装备既然记忆会在结果出来后自动篡改对抗手段只有一个在结果出来前把判断固化到外部设备上。我在自己的工作流里常年装备三样东西决策日志。每次做重要决策前我会打开一个叫decision.md的文件写四行字我为什么做这个选择我预期什么指标在什么时间点会变化我的信心打几分什么条件出现我会认错。这四行必须在决策前写死事后一个字都不许改。等一个月后回头看你才会真正看清自己的预测能力而不是活在“我挺准”的幻觉里。概率化小组投票。带团队时重大技术方案不要只讨论“行还是不行”。让每个成员独立给出“这个方案成功率在哪个区间”再写一个押注分数。结果出来后把预测最准的人和最偏的人对着看。这样做最大的价值是给团队一个机制允许不同的判断同时存在而不是等到事后才被少数几个“幸存者”带节奏。预检对面的假设。在做计划时强制自己列出“支持这个判断的证据”和“反对这个判断的证据”各至少三条。如果你列不出反对证据说明你对这个决策的理解还不够深那就再想想。这一条能替你挡下大量因为“过于自信”而踩进去的坑。提示好的决策无法保证好的结果好的结果也证明不了好的决策。接受这一点你的复盘才有可能从“推责”变成“学习”。2.2 复盘时后见之明是你最好的老师如果决策阶段是在跟后见之明对抗那么复盘阶段就要反着来主动拥抱它。复盘的本质就是站在“知道结果”的视角上重新解读过去。唯一要遵守的纪律是别让“结果倒推”掩盖“时间顺序”。我常用AAR四问法来组织复盘这是军事领域传出来的方法放到项目和人生复盘里都好用当时本来想做什么对世界的假设是什么实际发生了什么和预期差在哪里为什么会发生偏差注意这里才轮到后见之明发力现在你看到的这些线索哪些在当时就可以被观测到哪些纯粹是结果出现后才冒出来的下次遇到类似情况我应该提前盯住哪个信号在哪个时间点做验证第四问是整个复盘的精华。大部分复盘失败是因为人们太急着回答第三问直接跳到“原因分析”然后被后见之明带沟里项目挂了就把失败前最后几天暴露的崩溃迹象说成“早有征兆”。实际上那些迹象确实存在但在时间线上它们淹没在嘈杂的环境里。如果你不能回答“当时我为什么没看到它”那就说明它不是可操作的前兆信号。还有一个我踩过坑之后总结出的措辞纪律复盘文档里禁止出现“应该”“早就” “显然”。这三个词是给记忆洗地的。把它们替换成“如果提前在Y时间点观测到X我就能调整行动”这样写出来的复盘才有追溯价值。否则你只是在给下一次甩锅准备素材。3. 当hindsight进入人工智能HER如何把失败经验变成学习信号3.1 稀疏奖励任务为什么让强化学习一筹莫展聊完了人的问题把镜头转到代码。强化学习的基本流程是智能体在环境里不断试错根据奖励信号调整策略。奖励信号就是老师批改作业的红笔。问题在于很多真实任务属于稀疏奖励——绝大多数时刻奖励是0只有完整达成目标才给一个大的正奖励。一个机械臂抓取任务目标是把红色小球碰到某个位置。在最初的几万个回合里机械臂连目标区域的边都没沾到奖励永远是0。这时候你让神经网络学个什么东西梯度消失、信号归零智能体跟一个闭着眼睛在房间里碰运气的人没有区别。更残酷的是真实任务里的目标命中概率极低低到靠随机探索几乎不可能拿到第一个正样本学习过程直接卡死。我最初做这类任务时用的办法是奖励塑形既然到达目标太难那就给“离目标更近一步”一点小奖励。这条路表面上可行实际坑很多你需要为任务手工设计稠密奖励函数还要反复调距离阈值和权重稍微换个场景整套函数就作废。更蠢的问题是塑形后的奖励会诱导智能体刷分而不是真正解决任务——比如机械臂学会了原地快速抖动因为每抖一下都能骗到一点“接近奖励”。3.2 HER的核心直觉失败换一个目标就是成功Hindsight Experience Replay后见经验回放在2017年被提出来思想极简却极其好使。它的核心操作一句话就能说完别把“真实目标没达成”的经验当垃圾丢掉把实际到达的状态重新标注成另一个假想目标配上成功奖励存进回放池。举个具体例子。机械臂的任务是“碰到红色小球”这一回合它碰到了蓝色方块。传统强化学习记下一条失败经验目标红色球未达成。而HER会在回放池里额外记下另一条经验目标蓝色方块已达成奖励1。下一次当智能体需要学习“如何碰到蓝色方块”时这条经验就是正样本可以从中提取出有价值的行为。原本毫无用处的失败换个标签就变成了另一个任务的宝贵成功案例。这背后的逻辑是目标只是智能体条件输入的一部分它不需要是唯一的“真目标”。既然我们能自由构造训练输入为什么不把每个实际到达的状态都当作一个“已经成功的目标”来学习样本还是那一批样本行为还是那些行为信息量却没有被浪费掉。论文里的结论也验证了这一点在稀疏奖励场景下HER能让DDPG这类强化学习算法用数量级更少的样本完成目标导向任务。健身党更好理解你的长期目标是卧推100kg今天状态差只推到80kg。按传统思路今天就是一次没完成的失败训练。但换个标签——你今天完成了一次“80kg组”的容量训练——它就是你训练档案里真实有效的一条记录。下次挑战100kg时你至少知道自己的基础在哪里。错过的终点也是某条路上的里程碑。3.3 手把手梳理HER的工程实现HER的落地并不需要改变算法主干只动数据回放这一层。我给一个工程视角的实现骨架采样一个目标g让智能体跑完一个episode沿途保存所有状态转移四元组(s_t, a_t, r_t, s_{t1})并记住这个episode对应的真实目标g。episode结束之后对原本的每条转移额外从“当前时间之后的未来状态”里挑一个作为假想目标g。具体做法是随机等概率采样k个未来时间步中的第k步常用公式是在[1, episode剩余长度]内随机取步数得到状态s_{tk}令g s_{tk}。用假想目标重写奖励如果s_{t1}恰好到达g奖励记为1否则记为0。把新组成的四元组(s_t, a_t, r, s_{t1}, g)压入回放池。原始经验照存一份留有“原真目标”的信息。训练时神经网络把状态和目标拼接作为输入正常从回放池里取batch更新。关键参数有一个比重很突出每条原始经验额外生成的假想目标数量k论文和开源实现里普遍取4。为什么要4而不是1因为假想目标越多回放池里可学的正样本就越密集太多又会稀释原始目标的经验占比导致智能体对真实目标“不上心”。4是一个在多数任务上平衡得比较好的值。在未来状态采样策略上我强烈建议用future策略也就是只从当前时间步之后的状态里选假想目标。直白地说如果你用“过去已经走过的状态”当目标相当于逼着智能体退回去学已经去过的地方真正有用的是用“还没到达的、后面的状态”当目标这样每次假想成功都把行为往前推了一步。一个很反常识的细节是未来状态连episode终止状态都可以算因为目标并不要求可达性它只是用来给经验贴标签。4. HER实战踩坑记录那些不写在论文里的细节4.1 什么样的情况下HER会失效HER很好用但我见过不少照搬后翻车的案例。稳妥的说法是HER解决的是一类特定问题——目标状态可观测、可表达、且目标与状态存在明确的相似度量关系的目标导向任务。一旦不属于这类效果就会大打折扣。第一个典型反例是对话任务。目标是“让用户满意”这个目标不是环境里的一个状态向量而是一个模糊的语义评价。HER需要把“实际到达状态”当作新目标但对话生成的“实际状态”是句子级别的离散数据很难跟真实目标放到同一个向量空间中比较相似度。强行做只会得到一堆噪声标签。第二个反例是目标与状态空间差异很大。比如目标是“某种类别的标签”状态是原始像素图像。HER会把“当前帧像素”当作目标但像素和类别标签之间的鸿沟太大假想目标并没有在语义上接近真实目标学习信号本质上还是无意义。这种情况我建议先训练一个表征模型把状态和目标压缩到同一表征空间再上HER。第三个坑是目标采样策略退化。如果你图省事从整个episode里随机抽一个状态当假想目标会发现智能体整体学得很“飘”。因为它总是被要求逼近一些非常遥远甚至已经在身后的状态短期内几乎没有正样本。我们上面说的future策略就是为压制这个问题设计的。注意HER解决的是“目标是否可达”的监督信号缺失问题不解决“探索策略太差”的问题。如果环境里连假想目标都很难碰到或者动作空间大到随机探索根本走不出一片有效区域你得配合课程学习、好奇心驱动探索等机制一起上别指望HER一个人扛所有活。4.2 我在训练中亲手踩平过的几个坑我在两个项目上用过HER一个是离散控制的bit flip任务一个是机械臂目标到达任务。一些经验值得记录。先用最简单的环境验证实现。bit flip任务几乎是为HER量身定做的单元测试状态是一串二进制位动作是翻转某一位目标是让整串变成目标串。奖励稀疏但判定极其清晰回放池里一条假想经验有没有被正确生成一眼就能看出来。我见过不少人上来就怼机械臂环境结果实现了有bug的HER还浑然不觉。先在玩具环境跑通再上真任务这是最容易忽略却最省时间的习惯。归一化做得不好调参救不回来。连续控制任务里机器人关节角度、末端位置、目标点坐标的量纲各不相同直接把原始观测拼起来丢给网络训练可能彻底卡住。我踩过这个坑DDPG加HER在仿真机械臂上跑了二十万步不收敛眼神都快要瞎。后来把state和goal分别做归一化再重新训练五万步左右就开始稳定涨分。这不是秘技是MLP的基本修养。回放池要有足够深度。HER本质是靠提高样本利用效率打天下但前提是你确实把样本存下来了。连续控制任务建议至少保留十万个时间步的池子如果buffer太小早期的假想经验会被快速顶掉HER的优势也就没了。小心跟奖励塑形一起用。这是我踩过最隐晦的坑。只加HER时原始奖励保持稀疏价值函数的学习信号干净一旦同时上稠密塑形奖励HER的假想目标会被“真实目标”的稠密奖励压制智能体学出一堆短视策略。我现在的习惯是能用HER就不做塑形如果非要塑形塑形信号只用于指导探索不进入价值函数的学习目标。4.3 一句话工程清单给准备上手HER的朋友一张速查表是我目前觉得最稳的默认配置任务类型目标可表示为观测向量或从中提取的低维表征的目标导向任务数据策略每条真实经验额外生成4条假想经验全部用future采样回放池至少10万时间步持续向池中混入低比例原始经验归一化state和goal分别归一到零均值单位方差算法搭配离散任务配DQN连续控制配DDPGOpenAI Baselines中就有现成组合结尾写到这里我想起第一次在自己代码里加入HER的体验只不过在回放池的数据标注逻辑上改了几行代码一个我折磨了两周的机械臂抓取任务突然开始稳定涨分。当时我忽然意识到“事后聪明”之所以是贬义词是因为人们总用它来美化自己但如果你能诚实地把失败重新标注成一个有效样本它就是最值钱的数据。后来我做个人复盘也用这套思路每次失败不再写“原因”而是写“这次经历在什么条件下可以作为有效经验”然后给它贴个标签放回我的经验池。Hindsight这个词说到底提醒我们的就一件事世界不会奖励你“原本想做的事情”但会奖励你从“已经做过的事情”里提取的信息。看错一次目标不是废品错过的终点也会成为新的起点。
返回列表