在 5-3 中,动作变成了由 16 个数字构成的点。这次把语言也变成点。为了让“손을 흔든다”(挥手)这句话和挥手的动作落在同一张地图的同一个位置,我们同时训练文字漏斗和动作漏斗。先看一开始缠在一起的线如何在学习中找到自己的配对,最后输入句子让火柴人动起来。一句“춤춰”(跳舞吧)也是在这里第一次变成动作。
5-3 的生成器 E 需要我们亲自挑选“扔出动作聚集的位置”。这次由人用语言来挑选。为此,语言也必须成为地图上的点。
左边是句子,右边是动作(顺序是故意打乱的)。线的粗细表示该句子选择那个动作的概率。点击“播放训练”或拖动滑块推进训练吧。
| 训练步数 | 配对损失 | 7 个测试句子 → 最近的 5 个测试动作中属于正确类别的比例 | 140 个测试动作 → 最近句子的类别正确 |
|---|---|---|---|
| 0 | — | 2.9% | 10.0% |
| 10 | 1.763 | 28.6% | 55.0% |
| 25 | 1.317 | 65.7% | 72.1% |
| 50 | 0.395 | 71.4% | 96.4% |
| 100 | 0.090 | 71.4% | 100.0% |
| 400 | 0.010 | 71.4% | 100.0% |
上面画面中的训练是在浏览器里重新运行同样的计算(随机数不同),所以各步的数字略有不同。7 个测试句子中有 5 个找到了正确的动作。没找到的 2 个将在第 6 节中查看。
输入句子后按 Enter。“查找”直接取出地图上最近的场景,“生成”在最近的 5 个场景聚集的位置抽取新动作。用“~다가”(……着……)、“~고 나서”(……之后)把两个句子连起来,就会按前后顺序拼接。
| 方式 | 21 个训练句子(×5 次) | 7 个测试句子(×5 次) |
|---|---|---|
| 查找 | 100.0% | 71.4% |
| 生成 | 100.0% | 71.4% |
生成动作的类别,按它在 5-3 的潜在空间中离哪个类别中心最近来判定。“춤춰”(跳舞吧)→ 生成的动作被判定为跳舞,骨长误差为 5.4%。拼接:“걸어가다가 손을 흔든다”(走着走着挥手)→ 前半段路过 · 后半段挥手,“손을 흔들고 나서 춤춰”(挥手之后跳舞)→ 挥手 · 跳舞,“캔을 줍고 쓰레기통에 넣는다”(捡起罐子放进垃圾桶)→ 捡起 · 放进垃圾桶。
7 个测试句子中有 2 个找到了不相干的动作。两者的原因都很明确。
| 测试句子 | 正确答案 | 找到的动作(最近的 5 个) | 为什么错了 |
|---|---|---|---|
| “길에 캔을 던져 버린다”(把罐子扔在路上) | 远远扔出 | 放进垃圾桶 × 5 | “던져”(扔)是训练句子中没出现过的片段,而“버린”(扔掉)是从放进垃圾桶的句子(“쓰레기통에 쓰레기를 버린다”,把垃圾扔进垃圾桶)中学到的片段。因为不懂上下文,被拉向了“버린다 = 放进垃圾桶” |
| “손을 펴서 떨어뜨리고 걸어간다”(松手丢下后走开) | 丢在脚下 | 路过 × 5 | “걸어”(走)、“간다”(去)强烈地把它拉向路过。词袋不知道哪个词才是核心动作(丢下) |
| “걷다가 손 흔들기”(走着挥手)(第 5 节) | 路过 → 挥手 | 前半段不对 | “걷”(走)虽然在词典里,但在训练句子中一次也没出现过(训练句子用的都是“걸어”)。从没学过的格子在地图上不指向任何地方 |
上表中的“找到的动作”是代码 1 的结果。在浏览器里重新训练的第 5 节中,“길에 캔을 던져 버린다”(把罐子扔在路上)有时会走向捡起。随训练的随机数不同,被拉去的地方也不同,但找不到扔出的原因(不懂上下文的词袋)是一样的。
两段代码都只使用 Colab 默认安装的库。“下载笔记本(.ipynb)”后,在 Colab 中通过文件 → 上传笔记本打开,或者复制后粘贴到新笔记本的单元格中。
加入跳舞场景,把句子变成词袋、把动作变成 16 个数字后,用对比学习让两个漏斗对齐。输出各训练步数的损失和测试句子的命中情况。换成自己的数据 在 CAPTIONS 中放入你的动作说明句,在 VOCAB 中放入要用的词语片段。
用训练好的两个漏斗,由句子 → 查找或新生成动作,并把用“~다가”(……着……)连接的句子前后拼接起来。在潜在空间中判定生成动作的类别。第 5 节的表格直接由这段输出生成。
这是粘贴到 ChatGPT、Qwen、Claude 等 AI 助手中的提示词。点击“复制”,所选代码会一起附在提示词后面。把〔 〕里的内容换成你自己的情况即可。
AI 的回答只是起点。它提出的论文、数值和库函数,务必对照原文和官方文档核实。使用有真人出镜的视频时,先确认拍摄同意和个人信息处理规定。
与正文中黄色虚线下划线相同的词典。点击节名即可跳到首次出现的位置。
比喻是理解的第一步,也可能是误解的种子。与人类知觉相比的比喻标注了强度。直接 有证据表明实际上在做同样的事 · 部分 只有部分性质相似 · 无 尚不知道有对应的东西
| 概念 | 日常比喻 | 人类知觉比喻 | 比喻失效之处 |
|---|---|---|---|
| 词袋 | 把句子剪成单词卡片,放进袋子里摇一摇 | 无 | 从袋子里拿出的卡片没有顺序。“狗咬人”和“人咬狗”就变得一样了 |
| 对比学习 | 配对卡片游戏:对的配对贴在一起,不对的撕开 | 部分 孩子一边听话一边看着相应的动作,从而学会词语的意思 | 孩子几次就能学会,而模型要把同一个配对看上几百遍,没有配对的词则始终学不会 |
| 同一张地图 | 把两种语言收录在同一本词典里 | 无 | 词典里的对应关系由人来确定,而这张地图仅凭配对数据就形成对应。配对少的词会被放到不相干的位置 |
| 查找 vs 生成 | 在图书馆借书 vs 读了几本相似的书后写一篇新文章 | 无 | 新文章有作者的意图,而本篇的生成只是在最近五个场景的平均值附近抽取 |
| 拼接 | “先做……然后做……”这样的舞蹈编排指令 | 部分 按句子顺序活动身体 | 编舞者会让衔接处自然过渡,而这里只是把 10 帧简单混合 |
E-1 作者简介 · E-2 学术参考文献 · E-3 图片与数字的出处
这是写给讲师、在职培训(OJT)负责人和辅导老师的教学指南。时间只是预估,请根据实际课堂调整。
| 对象 | 学完 5-3 的大学生和上班族。想了解“输入提示就出结果”的生成式 AI 内部原理的策划人员和从业者 |
|---|---|
| 预备知识 | 5-3 的潜在空间,内积与 softmax(3-2·3-8) |
| 学习目标 | ① 说明把句子变成数字的最简单方法(词袋)及其局限 ② 讲述对比学习如何以“配对的靠近,不相干的远离”让两个漏斗对齐 ③ 举例说明在共享地图上查找·生成·拼接的区别 |
| 预计时间 | 阅读 30~40 分钟 · 动画演示 25 分钟 · Colab 实践 25 分钟(代码 1 12 分钟,代码 2 13 分钟) |
导入 5 分钟(第 1 节)→ 第 2 节 词袋 8 分钟 → 第 3 节 播放训练 15 分钟 → 第 4 节 地图 7 分钟 → 第 5 节 输入句子试试 10 分钟 → 第 6 节 出错的句子 5 分钟。
第 2·3 节 20 分钟 → 用第 6 节的表格讨论“模型懂的话和不懂的话”15 分钟 → 在第 5 节中分组寻找效果好和效果差的句子 20 分钟 → 在代码 1 中加入新句子重新训练 25 分钟 → 总结 10 分钟。
入门者只看第 2·3·5 节。中级者用 2 × 2 的表格手算,理解代码 1 中 G = (P − I + Q − I) / 14 这一行为什么会“提高对角线、降低其余部分”。
| 节 | 停下来提问 | 操作提示 |
|---|---|---|
| 2 语言即数字 | “为什么‘캔을 던진다’(扔罐子)和‘던진다 캔을’(语序颠倒)是同样的数字?” | 交替点击两个示例 |
| 3 配对 | “线花了多少步找到配对?测试句子呢?” | 播放训练后切换到“测试句子” |
| 4 同一张地图 | “训练前菱形在哪里?” | 把步数滑块从 400 拖到 0 |
| 5 语言 → 动作 | “查找和生成的结果有什么不同?” | 用生成模式多次点击“춤춰”(跳舞吧) |
| 6 局限 | “要让‘던져 버린다’(扔掉)被正确找到,需要改什么?” | 在第 5 节输入这个句子亲自确认 |
| 误解 | 正确解释 | 要展示的场景 |
|---|---|---|
| AI 理解句子的意思后选择动作 | 它只是把句子变成数字,再在地图上找近的位置。本篇的数字只表示词语片段是否出现 | 第 2 节、第 6 节 |
| 对比学习需要正确答案标签 | 只要有“这个句子和这个动作是一对”这样的配对就行。不使用类别名称 | 第 3 节解析 |
| 训练损失接近 0,就能很好地猜中第一次见到的句子 | 损失是以训练句子为准的。测试句子 7 个中只猜中了 5 个 | 第3节表格 |
| 句子写得越长越详细,效果总是越好 | 混入词典外的词或其他动作的词,反而会被拉到不相干的地方 | 第 6 节 “손을 펴서 떨어뜨리고 걸어간다”(松手丢下后走开) |
| “生成”能创造训练数据中完全没有的新动作 | 它是在地图上最近的场景聚集的位置附近抽取。几乎走不出已学过的动作类别 | 第 5 节 “날아올라”(飞起来) |
[1, 1, 1, 1]。四个片段都出现了。这个句子会落到扔出和挥手之间的某个地方。
e³ / (e³ + e¹) ≈ 0.881,e¹ / (e³ + e¹) ≈ 0.119。调整两个漏斗,把对角线(0.881)往 1 提,把非配对的格子(0.119)往 0 压。
动作这边有 420 个场景,每一类的形态都抓得很好;而句子这边每类只有 3 个训练句子,词袋又不懂上下文。遇到没见过的词语组合,文字漏斗就会摇摆不定。
“걷”(走)虽然在词典里,但在训练句子中一次也没出现。那一格的权重还是最初的小随机值,不指向地图上任何有意义的地方。改成“걸어가다가”(走着走着)就会出现路过。
查找。它直接取出训练场景,如果是真人的动作数据,那个人的动作会原样出现(与 5-2 的生成器 C 相同)。生成则是在多个场景聚集的位置重新抽取。
把代码 1 的 CAPTIONS 中扔出类的一个训练句子换成与“길에 캔을 던져 버린다”(把罐子扔在路上)相似的句子,然后重新训练。报告测试句子的命中情况有何变化。
编写一个 bag 函数,用“每两个字重叠切出的片段”(例如:“던져” → “던”“져”“던져”)代替词袋,并用测试句子的命中情况比较它是否能更好地处理没见过的词(“걷다가”,走着)。
| 入门者 | 仅凭第 3 节的播放训练,就能让学生体会“通过配对来学习” |
|---|---|
| 进阶 | 让学生把 CLIP·MotionCLIP 论文的图 1 与本篇第 3 节并排放置,发表两者的相同点和不同点 |
| 下一篇 | 5-5 从“跳舞吧”到舞蹈视频 — 给火柴人的舞蹈穿上助手的样子 |
你已经读完了「5-4 从词语到动作」。研究室成员们各用一句话为你总结。