在 5-1 中,AI 看着火柴人的动作识别出了“乱扔”。这一次反过来:如果给出“投掷”这个词,能让火柴人重新生成一段投掷动作吗?动作是一张有 1,196 个数字的表。把两个动作取平均,手臂会折叠;给每个数字各掷一次骰子,身体会抖动。我们用评审员的评分表比较四个生成器,找出“像样的新动作”需要满足的条件。
乱扔垃圾的人已经抓到了。可是总部的第二个问题还在:用识别时用过的那些数字,这次能不能生成动作?
同样的三个框,只是箭头方向不同。轮流点击两个方向看看吧。
把 5-1 的火柴人场景展开成了表。生成模型要填的空格正是这 1,196 格。把鼠标移到格子上看看吧。
表中的格子并不是各自随意的。同一帧的“右肘”和“右手腕”之间总是相距 0.16(骨长),相邻两帧的值几乎相同(动作是连续的)。判别模型即使不知道这些关联也能给出答案,但生成模型一旦守不住这些关联,马上就会露馅。下一节我们亲手把它打破。
最简单的“生成新动作”方法,就是把已有的两个动作混合起来。试着改变混合的对象吧。下面的条形表示当前帧十根骨头偏离原长度的程度(条越长偏差越大,超过 5% 显示为红色)。
把投掷 + 挥手用坐标平均混合,骨长误差平均为 11.4%,最差时刻达到 99.9%。在两只手腕位于相反方向的那一刻,中点几乎与肩膀重合,前臂就消失了。扔进垃圾桶 + 路过为 1.9%(最差 25.7%),投掷 + 捡起为 1.4%(最差 20.4%)。角度平均在三组中都是 0.0%。同样叫“平均”,结果取决于对什么取平均。
生成模型学习的不是某一个场景,而是众多场景散布的形状。我们用与 5-1 相同的方法,改变速度·位置·幅度,铺开了 100 个投掷。点击左边的点来选择场景吧。
用 100 个投掷生成六个新投掷。评审员看五项:是否逼真(骨长、抖动、投掷力度)、是否多样、是否没有照抄。切换生成器后点“重新生成”看看吧。
上方画面是在浏览器中每次重新抽取六个,所以数字略有不同。下表是实际运行代码 2 的结果(训练用投掷 100 个,生成 20 个)。“新颖性”是与最近的训练场景之间的距离(以身高为单位,按坐标计算的均方根)。
| 生成器 | 骨长误差 | 抖动 | 手腕最大速度 | 多样性 | 新颖性 | 评审员一句话点评 |
|---|---|---|---|---|---|---|
| 训练数据(参考) | 4.7% | 0.0288 | 2.55 | 0.126 | 0.000 | 由于姿态估计的抖动,真实数据的骨长也有 4.7% 的波动 |
| A 单一平均 | 1.7% | 0.0045 | 1.36 | 0.000 | 0.033 | 平滑但总是一样,力度减了一半 |
| B 逐坐标掷骰子 | 44.2% | 0.2659 | 10.00 | 0.149 | 0.109 | 很多样,但不像人。手腕会瞬间移动 |
| C 挑一个复制 | 4.7% | 0.0300 | 2.75 | 0.125 | 0.000 | 很逼真,但是照抄的 |
| D 抽取 3 个旋钮 | 0.0% | 0.0125 | 2.71 | 0.123 | 0.022 | 五项全部通过。不过,它事先就知道旋钮 |
D 之所以胜出,是因为它不是从 1,196 个数字中,而是从3 个数字(速度·位置·幅度)中抽取。这 3 个数字不管怎么改,都会经过骨架(fk)展开成人的形状。
两段代码都只使用 Colab 默认安装的库。“下载笔记本(.ipynb)”后,在 Colab 中通过文件 → 上传笔记本打开,或者复制后粘贴到新笔记本的单元格中。
在 5-1 的场景函数上加入了骨长检查(bone_error)和混合(blend)。把三组动作分别用坐标平均和角度平均混合,比较骨长误差。想换成自己的数据,就在 blend 的两个场景处放入实际的动作坐标(只能做坐标平均,这正是本篇讨论的问题)。
用 100 个投掷构建生成器 A~D,各抽取 20 个进行评分。第 6 节下方的评分表直接由这段输出生成。想测试新的生成器,就把形状为 (46, 13, 2) 的场景列表放进 judge("名称", 结果列表)。
这是粘贴到 ChatGPT、Qwen、Claude 等 AI 助手中的提示词。点击“复制”,所选代码会一起附在提示词后面。把〔 〕里的内容换成你自己的情况即可。
AI 的回答只是起点。它推荐的论文、数值和库函数,一定要对照原文和官方文档核实。使用真人动作数据时,要先确认拍摄同意以及数据集的使用条件(是否允许商用等)。
与正文中黄色虚线下划线相同的词典。点击节名即可跳到首次出现的位置。
比喻是理解的第一步,也可能是误解的种子。与人类知觉相比的比喻标注了强度。直接 有证据表明实际上在做同样的事 · 部分 只有部分性质相似 · 无 尚不知道有对应的东西
| 概念 | 日常比喻 | 人类知觉比喻 | 比喻失效之处 |
|---|---|---|---|
| 判别 vs 生成 | 批改考卷(答案对不对)与出考题(出一道像样的新题) | 部分成立 对人来说,认出一张脸和画出一张脸是不同的能力 | 出题人是带着意图出题的,而生成模型只是顺着数据的形状抽取 |
| 分布 | 全班同学身高集中分布的形状 | 无 | 身高只是一个数字,而动作是 1,196 个数字一起变化的形状,无法用眼睛画出来 |
| 坐标平均 | 把两个人的照片半透明地叠在一起 | 无 | 叠照片时两个人都看得见,而坐标平均会造出两人之间的一个“中间人”,而且这个人的手臂是折起来的 |
| 潜变量(旋钮) | 调音台上的几个音量·音色旋钮 | 部分成立 用“快一点、大一点”这样几句话来记住动作 | 调音台的旋钮都标着名字,而通过学习找到的旋钮没有名字,含义也是混在一起的(5-3) |
| 评审员 | 选秀评委 | 无 | 评委有个人喜好,而本篇的评审员只看规定好的五个数字。数字反映不出的别扭之处,它会漏掉 |
E-1 作者简介 · E-2 学术参考文献 · E-3 图片与数字的出处
这是写给讲师、在职培训(OJT)负责人和辅导老师的教学指南。时间只是预估,请根据实际课堂调整。
| 对象 | 学完 5-1 的大学生和职场人士。想大致了解生成式 AI“学的是什么”的策划人员和从业者 |
|---|---|
| 预备知识 | 5-1 的火柴人 13 点与六种场景,平均值与标准差 |
| 学习目标 | ① 用箭头方向和“答案的个数”说明判别模型与生成模型的区别 ② 举例说明坐标平均为什么会破坏骨长 ③ 从逼真度·多样性·新颖性三个方面评价生成结果 |
| 预计时间 | 阅读 30~40 分钟 · 动画演示 20 分钟 · Colab 实践 25 分钟(代码 1 10 分钟,代码 2 15 分钟) |
导入 5 分钟(第 1·2 节 反转)→ 第 3 节 动作表 8 分钟 → 第 4 节 混合实验 12 分钟 → 第 5 节 数据云 7 分钟 → 第 6 节 四个生成器 13 分钟 → 练习题 5 分钟。
第 2 节 15 分钟 → 把第 6 节的评分表套用到本单位业务中的生成物(文档·图像·动作)上,制定“逼真度·多样性·新颖性”标准 30 分钟 → 结合第 4 节讨论“如何选择表示” 15 分钟 → 运行代码 2·添加新标准 30 分钟。
入门者只学第 2·4·6 节。中级者让他们在代码 2 中亲手做出生成器 E(把两个训练场景用角度平均混合),并加入评分表。
| 节 | 停下来提问 | 操作提示 |
|---|---|---|
| 2 反转 | “生成的正确答案有几个?” | 轮流点击识别 → 生成 |
| 3 动作是表 | “这张表里,格子之间有哪些不能随意打破的约定?” | 在投掷中把鼠标移到 0.8~1.2 秒的列上 |
| 4 混合 | “明明是一半一半混合,为什么手臂消失了?” | 在投掷 + 挥手的坐标平均中,找出红色条变长的帧 |
| 5 数据 | “从这片云中抽取一个新点,会得到怎样的投掷?” | 点击红点和绿点交界附近试试 |
| 6 生成器 | “A·B·C 各自在哪个评分项目上不合格?” | 每个生成器都点两三次“重新生成” |
| 误解 | 正确解释 | 要展示的场景 |
|---|---|---|
| 生成模型生成唯一的正确答案 | 从像样答案的分布中抽取一个。每次都不同才是正常的 | 第 2 节、第 6 节“重新生成” |
| 平均是最安全的生成 | 平均的多样性为 0,而且把时机不同的动作取平均会让力度减弱(手腕速度 2.55 → 1.36) | 第 6 节 生成器 A |
| 数字越多,表达越好 | 1,196 个数字彼此关联。能守住这些关联的少量数字(角度、旋钮)更适合生成 | 第 4 节 角度平均,第 6 节 生成器 D |
| 与训练数据一模一样就是最好的生成 | 照抄的新颖性为 0。还有把数据中的个人原样输出的风险 | 第 6 节 生成器 C |
| 看起来逼真,评价就可以结束了 | 必须同时看逼真度、多样性和新颖性。只看一项的话,A 或 C 就会胜出 | 第 6 节下方的评分表 |
3 秒是 46 帧(含第 0 秒)× 26 = 1,196 个。5 秒是 76 帧 × 26 = 1,976 个。
手 = (0, 1),与肩膀成了同一个点。手臂长度为 0,骨长误差 100%。第 4 节的“最差 99.9%”就是这样的时刻。如果对角度取平均(−90° 与 +90° 的平均为 0°),手臂就成为向下垂、长度为 0.33 的手臂。
新颖性为 0。它只是把训练数据背下来再拿出来,生成不了新动作。如果数据中包含真人的动作或面孔,还会出现把个人信息原样泄露出去的问题。
每个场景投掷的瞬间(时机)不同,对坐标取平均后,快速挥动的区间会被薄薄地摊到很多帧上。峰值被抹平,就变成了软绵绵的投掷。
D 事先就知道生成场景所用的旋钮(速度·位置·幅度)。实际的动作数据不会附带这样的旋钮。只看数据就把旋钮找出来,正是 5-3 编码器·解码器的工作。
在代码 1 中把混合比例改为 0、0.25、0.5、0.75、1,把投掷 + 挥手的坐标平均骨长误差整理成表。用两句话写出误差最大的比例及其原因。
在代码 2 中加入生成器 E“挑两个训练场景做坐标平均”和 F“在训练范围之外(幅度 ×1.6)抽取 3 个旋钮”并评分。报告 F 的结果即使通过了逼真度,还存在什么问题(罐子会飞到哪里)。
| 入门者 | 只要把第 4 节的“坐标平均 vs 角度平均”这一点看透,就掌握了本篇的一半 |
|---|---|
| 进阶 | 让学生调查 GAN 和 VAE 如何把“评审员”放进训练中,并进行发表。论文要查阅原文确认 |
| 下一篇 | 5-3 编码器·解码器 — 只看数据,自己找出旋钮(潜变量) |
你已读完「5-2 从识别到生成」篇。研究室成员们各说一句,帮你总结一下。