3Blue1Brown 那种数学动画,AI 也能写
公式里的字母飞出来变成数字,一条曲线立起来变成一个碗。这段梯度下降是 AI 用 Manim 写的,提示词和源码在下面。
梯度下降示范片(70 秒)
<role> 你是 3Blue1Brown 那种数学动画的导演,也是 Python 程序员。用 Manim Community(from manim import *,不要用 manimgl / manimlib)写一段 70 秒、1920×1080、30fps 的讲解动画:梯度下降——AI 训练时是怎么一步步「学」的。分两个 Scene:Descent2D(MovingCameraScene)和 Descent3D(ThreeDScene),渲完拼成一条。 </role> <direction> 深色底 #0E1117,自己的配色,一种颜色只代表一样东西,全片不换:蓝 #58C4DD = 误差(曲线、曲面),黄 #FFD54A = 当前的参数(点、步子),橙 #FF7A59 = 斜率(切线、公式里的「斜率」),黄绿 #C6F432 = 步长 η。 东西不消失,只变形:公式里的字母飞成数字,一条曲线拆成三格再收回一条,2D 曲线变成 3D 曲面的一个切面。数字是活的:斜率、步数、误差都跟着动。 画面上只放短标签,不放整句话。禁止:Manim 默认的黑底白字、默认配色、淡入淡出堆满屏、字压在坐标轴上。 </direction> <structure> 误差函数 L(w) = 0.22(w−0.4)² + 0.3 + 0.12·cos(1.7w),w 从 −3.5 到 3.5。 1. 画坐标轴(纵轴「误差」、横轴「参数 w」)和曲线;一根箭头沿纵轴往下:「越低越准」。 2. 一个黄点从上面掉到 w = −2.8;切线和「斜率 −1.61」出现。拧旋钮:点移到坡缓处、坡往上翘处(斜率变正)、再回到陡坡(数字变大)。 3. 右上角写更新规则 w ← w − η × 斜率(「斜率」两个字用 Text 写,跟 MathTex 拼在一起),η 标黄绿「步子迈多大」。 4. 代入数字:w、η、斜率各自用 TransformFromCopy 飞到下一行变成 −2.80 − 1.5 × (−1.61) = −0.38,跟着口播念到哪个数飞哪个。 5. 横轴上画出这一步的箭头,点沿曲线滑过去;之后一步步重复,留下淡淡的脚印,右上角记「第 n 步」和误差;坡越缓步子越小。镜头推近谷底看步子小到几乎不动,再拉回。 6. 曲线缩成一格、复制成三格:「同一个坡,三种步子」——η = 0.15 太小磨磨蹭蹭、η = 1.5 刚好、η = 4 太大来回乱跳。三格收回一条。 7. 换 Descent3D:先正面看过去只有一条曲线,镜头抬起来,曲面从这条线长出来(L2(u,v) = 0.35·L(u) + 0.3(v+0.2)²,按高度上色);一个黄球从高处出发,每步往最陡的下坡方向走(步长 2.9),在窄沟里之字形下到谷底,镜头慢慢转。左上角:「这里:2 个参数 / 大模型:几十亿个 / 每一步,都往下坡挪一点」。 </structure> <build> 1. 先配音,再写动画:配音的稿子里埋时间点,生成一个 beats.json(每个时间点是第几秒);Scene 里写一个 until(t):等到第 t 秒再播下一个动作(已经超过就不等)。 2. 点的位置用 ValueTracker 当旋钮;点、光晕、切线用 always_redraw,斜率数字用 add_updater,之后只拧旋钮,其他自己跟着动。 3. 中文全部用 Text(Noto Sans CJK SC),LaTeX 只写公式。 4. 3D 曲面从切线长出来:做两张点数一样的 Surface(一张压扁在曲线上、一张完整),move_camera 的 added_anims 里放 Transform。 5. 渲染:manim -qh --fps 30 descent.py Descent2D Descent3D;先用 -ql 出低清小样看节奏。 </build> <gotchas> - 每做完一段就出几张静帧自己看:公式和坐标轴、标签有没有叠在一起,3D 碗有没有顶出画面。 - 安装:pip install manim 报 pangocairo 找不到,先装系统库(Ubuntu:libpango1.0-dev libcairo2-dev pkg-config),再装 LaTeX(texlive-latex-extra)和中文字体(fonts-noto-cjk)。 </gotchas>
- 我用的是 Claude Opus 5.5,在 Claude Code 里做的,一共两百多行 Python。
- 想自己渲:先装 Manim(pip install manim,另外要装 LaTeX),再跑 manim -qh descent.py Descent2D Descent3D。
- 想换题目,改 direction 和 structure 两段。
网页版小坡道:自己拧一拧
- 同一条曲线的网页版,点一下放小球,拖滑块改步长:步长太小半天走不到,太大会在两边来回跳。