自己定义问题 — 两个不是游戏的任务
这一章讲三件事: 一个不像游戏的任务,怎么被改写成强化学习能吃的形状; 改写时四件事(状态、动作、奖励、终止)各自会撞上什么; 以及奖励函数为什么往往要改三版。
它在全书链条里的位置:从「算法」到「项目」的那一步。 前十七章都默认那四件事是给定的 —— 因为它们讲的全是游戏(游戏自带这四样)。 这一章的两个任务都不是游戏,于是这四样全得你自己定。 而这正是第 20 章那份工程清单里最贵的几条的来源。
顶层全景:同一个抓取动作,三版奖励算出三个数
这一章的主走查是书里那个机器人抓取项目的奖励函数三级演进。
任务:一条 Sawyer 机械臂,把桌上一个长方体抓起来。
★ 三版奖励的设定全部是书里给的;下面这些坐标是**为演示编的**。★
这一步的状况:夹具在 (0.30, 0.10, 0.95),物体中心在 (0.30, 0.10, 0.80)
—— 也就是★正悬在物体上方 15 厘米处,姿势基本对★。它还没抓到。
┌─ 第一版:稀疏 ──────────────────── ────────────────────────┐
│ 抓到给 **+10**,物体掉下桌子给 **−10**,其余全是 0[^1] │
│ → 这一步的奖励 = **0** │
│ → 下一步还是 **0**,再下一步还是 **0** …… │
│ ★ 书里的判词:稀疏奖励下「探索和学习抓取物体几乎是不可能的」★ │ §5
└────────────────────────────────────────────────────────┘
┌─ 第二版:密集 ────────────────────────────────────────────┐
│ 再减去「夹具到物体中心的平方距离」,并惩罚夹具撞桌子[^2] │
│ → 平方距离 = (0.95 − 0.80)² = 0.0225 │
│ → 这一步的奖励 = **−0.0225** ★ 终于有一个非零的数了 ★ │
│ ★ 但这一项把夹具往物体正中吸 —— 而正中在物体内部, │ §6
│ 夹具只能贴着往下压,抓取姿势全错。★ │
└────────────────────────────────────────────────────────┘
┌─ 第三版:增强密集 ─────────────────────────────────────────┐
│ ① 把零惩罚点从物体中心★上移 0.08 米★[^3] │
│ → 目标点变成 (0.30, 0.10, 0.88) │
│ → 平方距离 = (0.95 − 0.88)² = **0.0049** │
│ ★ 同一个位置,惩罚从 0.0225 掉到 0.0049 —— 因为它本来就对 ★ │
│ ② 加一项旋转惩罚,系数 **0.02**[^4] │
│ → 设这一步的姿态偏差合计 0.5,惩罚项 = 0.02 × (−0.5) = −0.01 │
│ → 这一步的奖励 = −0.0049 − 0.01 = **−0.0149** │ §7
└────────────────────────────────────────────────────────┘
★ 同一个动作、同一个位置,三版给出 0、−0.0225、−0.0149 三个数。★
★ 而它们优化出来的策略,是三种完全不同的东西。★
图说:这就是本章的主走查。§5 到 §7 逐版推出来。
另起的一处走查在 §8:修图任务,四件事各自怎么定。
1. 前十七章藏起来的那一步
这一节回答:为什么把任务写成四件事本身就是最花力气的活。
先看现象
打游戏的时候,那四件事是白送的:
| 游戏里 | ★ 真任务里 ★ | |
|---|---|---|
| 状态 | 屏幕上那 张图 | ★ 你得决定喂什么进去 ★ |
| 动作 | 手柄上那几个键 | ★ 你得设计出一套动作 ★ |
| 奖励 | 分数 | ★ 你得编一个函数 ★ |
| 终止 | 游戏结束 | ★ 谁来喊停都是个问题 ★ |
★ 前十七章讲的全是游戏,所以这一栏从来没出现过。★ 这一章的两个任务 —— 修图和机器人抓取 —— 一个都不自带。
这一章的两个任务
书里给的两个项目:
- 修图:把一张偏暗、有噪点的照片,自动调成专业修图师会调出来的样子;
- 机器人抓取:一条机械臂在模拟环境里,把桌上一个长方体抓起来。
★ 一个动作是离散的(13 个预设操作),一个是连续的(关节速度)——正好对照。★
2. 状态:直接喂原始输入是学不动的
这一节走另起那处走查的第一步。
先看现象
修图任务里,最自然的状态就是「这张图现在长什么样」——也就是所有像素。
★ 而书里没这么做,理由写得很实在:「从零开始训练一个卷积神经网络需要大量的原始-修复图像对」★1。
而这类数据恰恰最缺 —— 书里说:与图像分类不同, 图像增强的训练数据「依赖于人类专家」,因此「并没有大规模的公共图像增强数据集」2。
★ 一句话:没有那么多标注数据,所以不能从像素从头学。★
做法:借一个别处训好的网络当眼睛
书里的做法:拿一个在大型图像分类数据集上预训练好的网络, 取它最后一层卷积层的激活值当输入的一部分1。
书里给的理由:这样的深层特征「可以提升许多其他视觉识别任务的效果」1。
★ 也就是说:那个网络已经学会了「看图」这件事,直接借过来 用。★
但光有这个还不够,还要拼上颜色的统计
书里还加了一样:直方图3。
「直方图」是什么:把图片里所有像素按颜色分格计数 —— 「有多少个像素落在这个红色区间、多少个落在那个」。 ★ 它丢掉了「哪个像素在哪儿」,只留下「整张图的颜色分布」。★
★ 最终的状态是三样东西拼起来的(全部是书里的数):★[^7][^8]
① 预训练网络最后一层卷积的激活值 → **2048** 个数
② RGB 颜色空间的直方图,三个通道各 (0, 255) → **1000** 个数
③ CIELAB 颜色空间的 直方图,范围 (0,100)、(−60,60)、(−60,60) → **1000** 个数
★ 合计 2048 + 2000 = 4048 个数。★ 书里的说法是「连成 2048 + 2000 维的观测信息」。
★ 为什么要两套颜色空间:RGB 是屏幕怎么显示的,
CIELAB 是设计成「数值上的距离贴近人眼感觉到的差别」的那一套。★
修图的目标是「人看着更好」,所以后者才是对的尺子 —— 而 §4 那个奖励函数用的正是它。
(两套颜色空间的区别这一句是我们补的;三样东西的维度都是书里的。)
★ 这一节的可带走判断:状态不是「环境给你什么」,是「你决定喂什么进去」。★ 同一个任务,喂原始像素学不动,喂这 4048 个数就能学 —— 而这一步在算法里一个字都没写。
3. 动作:它可以是设计出来的
这一节走另起那处走查的第二步。
修图的动作不是「把这个像素调成这个值 」——那样动作空间是天文数字。
书里的做法:预先定死 13 个操作4:
| 索引 | 操作 | 索引 | 操作 |
|---|---|---|---|
| 0 | ★ 无操作 ★ | 7 / 8 | 红绿色调 ×0.95 / ×1.05 |
| 1 / 2 | 对比度 ×0.95 / ×1.05 | 9 / 10 | 蓝绿色调 ×0.95 / ×1.05 |
| 3 / 4 | 饱和度 ×0.95 / ×1.05 | 11 / 12 | 红蓝色调 ×0.95 / ×1.05 |
| 5 / 6 | 亮度 ×0.95 / ×1.05 |
★ 拆开看只有两条设计:★ ① 挑六样能调的东西(对比度、饱和度、亮度、三组颜色偏移),每样给一个加一个减; ② 幅度定死在 5%(乘 0.95 或 1.05)—— 一次只动一点,靠多走几步来调到位。
★ 而第 0 号那个「无操作」不是凑数的,它是下一节的主角。★
对照:机器人那边的动作
书里给了两种控制方式,而它们的动作空间完全不同5:
| 控制方式 | 动作是什么 | 几个数 |
|---|---|---|
| 正向运动学 | 每个关节的速 度 | 7 个(第 7 个关节顺带管末端旋转) |
| 反向运动学 | 末端要去的位置 + 夹具的旋转 | 4 个(3 维位置 + 1 维旋转) |
★ 同一台机械臂,同一个任务,动作可以是 7 维也可以是 4 维 —— 取决于你让智能体控制哪一层。★
4. 终止:游戏会自己结束,修图不会
这一节走另起那处走查的第三步,而这是这一章最漂亮的一处设计。
先看现象
书里把这件事点得很清楚:
★「在游戏的强化学习应用中,终结状态可以由环境决定。 而与此不同的是,在图像增强中的智能体需要由自己决定退出时机。」★6
★ 修图没有输赢,也没有「死了」。你什么时候停手,是一个设计问题。★