单一网络
一个网络涵盖画作及整个对话线程
一个真实的网络,在此构建并在此训练:画作的补丁、油漆暗示的深度以及这段对话的每一个字母,都处于一个共享空间中。没有任何预训练。
绘画,逐块解析
网络以小块形式观察绘画,每块都有自己的光线、颜色和位置,并学习这些词汇。同样的权重用于读取线程的字母。
- 训练步数
- 0
- 图像误差
- —
- 字母误差
- —
- 深度误差
- —
- 找到对应词语的色块
- —
- 油漆色块
- 0
- 其空间中的词语
- 0
- 已学习的字母
- 0
- 已知字符
- 0
它学习的词汇是绘画所能教授的:区域的亮度、颜色以及位置。文本任务学习的是字母的顺序,而非含义。这里没有任何预训练;梯度在当前标签页中运行。
实时训练
页面打开时它会自动开始并在当前标签页中学习。每隔一百步,它会记录一次测量结果。
等待网络构建中…
整个应用程序,使用 Python 和 JAX 编写
本页面和下方的程序属于同一个网络。该程序是完整的应用程序:包含一个 GTK4 窗口、JAX 梯度、绘画、线程、它预测的深度以及共享空间。请复制或保存它,然后在您自己的机器上运行。
- 油漆色块
- —
- 它学习的词汇
- —
- 它读取的字母
- —
- 需保持在一起的文件
- net_gtk.py
该窗口的功能
- 训练 300 或 2,000 步,或中途停止;学习在线程中运行,因此窗口保持活跃。
- 点击画作的任何补丁,它会告诉你该补丁对应的词。
- 用词语询问——如暖金、深蓝——它会点亮问题落点所在的补丁。
- 输入几个字母,它会列出其预测的下一个字母及其百分比。
- 粘贴您自己的文字并按下“改为学习此内容”:新字母将在同一表格中获得新行,且不会丢弃已掌握的内容。
- 画作下方有两个图表:它预测的深度,以及一个点代表颜料、方块代表词语的空间。
- 将其权重保存到 net_weights.json,以便下次重新加载。
如何运行
一个文件夹,一个文件,如果您有 painting.jpg 那么还需要这张画。在 Linux 的该文件夹中:
-
安装 Python 软件包
python3 -m pip install jax numpy pillow -
安装 GTK4 及其 Python 绑定
sudo apt install python3-gi gir1.2-gtk-4.0 -
打开窗口
python3 net_gtk.py
在 Windows 上,快捷方法是使用 MSYS2:pacman -S mingw-w64-x86_64-python-gobject mingw-w64-x86_64-gtk4,然后 python -m pip install jax numpy pillow,最后在同一个 MSYS2 终端中运行 python net_gtk.py。
在 macOS 上:brew install pygobject3 gtk4,然后 python3 -m pip install jax numpy pillow,最后 python3 net_gtk.py。
没有显示设备?python3 net_gtk.py --selftest 将在终端中训练并打印相同的数字。
通过在终端中使用 JAX 运行此文件,针对此画作和此线程测量得出:400 步 → 67% 的补丁找到了自己的词(图像误差 0.68),2,000 步 → 95% (0.53),5,000 步 → 97% (0.45)。深度误差最终为 0.0003,字母误差从 3.05 降至 2.90。
浏览器无法运行 Python,因此此标签页显示的是文件而非窗口 —— 相同的网络正在上方实时运行。它学习的词汇是绘画所能教授的:这幅画中没有蓝色,因此关于蓝色的问题会落在金色色块上。字母头知道字母的顺序,而不知道含义。
上述 Python 和 JAX 的编译器
方框内包含该网络的前向传递过程。编译器读取它,检查它,并将其输出两次:一次是用于 JAX 的 Python,一次是在此标签页中运行的 JavaScript。一棵树,两个后端。
- Token
- —
- 树中的节点
- —
- 函数
- —
计算结果
检查将这些数值与在相同种子权重下运行的 numpy 和 JAX 程序进行比较 —— 这是在创建此卡片之前测量的,而非推测。
语言允许的内容
- def name(a, b): 带有缩进的正文,name = ...,以及 return ...
- 数字、名称、括号、一元负号,以及用于矩阵乘法的 + - * / @。
- .T 用于转置,以及调用 tanh, sqrt, exp, log, sum, mean, maximum。
- 任何其他内容都会使编译器停止并显示行号和列号,而不是进行猜测。
这是一个针对小型语言的真实编译器,而非 Python 运行时:没有循环,没有类,没有导入。该网络的前向传递过程可以适配其中,这就是为什么相同的文本可以在你的机器上变成 JAX,而在本标签页中变成 JavaScript。
虚拟之眼:它只能看到像素
一只对着显示器的眼睛:它只获取图像,除此之外什么都没有——没有页面,没有数据,没有网络。仅凭这些像素,它就能找到边缘、角点以及眼睛在侧向移动时每个点的滑动方式,并据此重建空间中所有物体的位置。
- 已见帧数
- 0
- 角点
- 0
- 已追踪
- 0
- 中值运动
- —
- 已找到深度
- —
- 空间点
- 0
- 单帧
- —
深度是真实的几何结构,但仅限于眼睛步进的尺寸,且仅在图像有纹理的地方有效——纯色平面无法提供抓手。看到墙的位置并不意味着知道它是一面墙,这里没有任何东西在创造世界:上方的房间就是经过测量的像素。
你的想法,以及它仍然需要什么
- 对着显示器的眼睛是一个真正的接口:一个像人一样读取屏幕的模型不需要为每个程序安装插件——任何可见的内容就已经是输入。
- 通过移动眼睛的两帧图像,你可以获得几何结构,这正是世界模型必须达成一致的内容;这张卡片真实地实现了这一部分。
- 实时生成的虚拟世界还需要一个能够构思未见之物、在转身时保持一致且在毫秒内运行的模型——这不在本标签页中,且页面无法对其进行训练。
- 诚实的界限:这只眼睛恢复的是物体的位置,而不是它们的含义。视觉速度不等于理解,而前者比后者容易得多。
图片:来自维基共享资源的列奥纳多·达·芬奇《最后的晚餐》公有领域扫描件。
