One Network:JAX 与虚拟之眼
Loading...
The app: one network in Python and JAX

单一网络

一个网络涵盖画作及整个对话线程

一个真实的网络,在此构建并在此训练:画作的补丁、油漆暗示的深度以及这段对话的每一个字母,都处于一个共享空间中。没有任何预训练。

绘画,逐块解析

网络以小块形式观察绘画,每块都有自己的光线、颜色和位置,并学习这些词汇。同样的权重用于读取线程的字母。

整个应用程序,使用 Python 和 JAX 编写

本页面和下方的程序属于同一个网络。该程序是完整的应用程序:包含一个 GTK4 窗口、JAX 梯度、绘画、线程、它预测的深度以及共享空间。请复制或保存它,然后在您自己的机器上运行。

油漆色块
—
它学习的词汇
—
它读取的字母
—
需保持在一起的文件
net_gtk.py
net_gtk.py

该窗口的功能

  • 训练 300 或 2,000 步,或中途停止;学习在线程中运行,因此窗口保持活跃。
  • 点击画作的任何补丁,它会告诉你该补丁对应的词。
  • 用词语询问——如暖金、深蓝——它会点亮问题落点所在的补丁。
  • 输入几个字母,它会列出其预测的下一个字母及其百分比。
  • 粘贴您自己的文字并按下“改为学习此内容”:新字母将在同一表格中获得新行,且不会丢弃已掌握的内容。
  • 画作下方有两个图表:它预测的深度,以及一个点代表颜料、方块代表词语的空间。
  • 将其权重保存到 net_weights.json,以便下次重新加载。

如何运行

一个文件夹,一个文件,如果您有 painting.jpg 那么还需要这张画。在 Linux 的该文件夹中:

  1. 安装 Python 软件包 python3 -m pip install jax numpy pillow
  2. 安装 GTK4 及其 Python 绑定 sudo apt install python3-gi gir1.2-gtk-4.0
  3. 打开窗口 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
—
树中的节点
—
函数
—
JAX 的 Python 代码
JavaScript,在此运行

计算结果

    检查将这些数值与在相同种子权重下运行的 numpy 和 JAX 程序进行比较 —— 这是在创建此卡片之前测量的,而非推测。

    语言允许的内容

    • def name(a, b): 带有缩进的正文,name = ...,以及 return ...
    • 数字、名称、括号、一元负号,以及用于矩阵乘法的 + - * / @。
    • .T 用于转置,以及调用 tanh, sqrt, exp, log, sum, mean, maximum。
    • 任何其他内容都会使编译器停止并显示行号和列号,而不是进行猜测。

    这是一个针对小型语言的真实编译器,而非 Python 运行时:没有循环,没有类,没有导入。该网络的前向传递过程可以适配其中,这就是为什么相同的文本可以在你的机器上变成 JAX,而在本标签页中变成 JavaScript。

    虚拟之眼:它只能看到像素

    一只对着显示器的眼睛:它只获取图像,除此之外什么都没有——没有页面,没有数据,没有网络。仅凭这些像素,它就能找到边缘、角点以及眼睛在侧向移动时每个点的滑动方式,并据此重建空间中所有物体的位置。

    眼睛所见 蓝色为角点,橙色为运动
    边缘 Sobel 梯度
    运动 Lucas–Kanade 光流
    重建的房间 拖动以旋转
    已见帧数
    0
    角点
    0
    已追踪
    0
    中值运动
    —
    已找到深度
    —
    空间点
    0
    单帧
    —

    深度是真实的几何结构,但仅限于眼睛步进的尺寸,且仅在图像有纹理的地方有效——纯色平面无法提供抓手。看到墙的位置并不意味着知道它是一面墙,这里没有任何东西在创造世界:上方的房间就是经过测量的像素。

    你的想法,以及它仍然需要什么

    • 对着显示器的眼睛是一个真正的接口:一个像人一样读取屏幕的模型不需要为每个程序安装插件——任何可见的内容就已经是输入。
    • 通过移动眼睛的两帧图像,你可以获得几何结构,这正是世界模型必须达成一致的内容;这张卡片真实地实现了这一部分。
    • 实时生成的虚拟世界还需要一个能够构思未见之物、在转身时保持一致且在毫秒内运行的模型——这不在本标签页中,且页面无法对其进行训练。
    • 诚实的界限:这只眼睛恢复的是物体的位置,而不是它们的含义。视觉速度不等于理解,而前者比后者容易得多。

    图片:来自维基共享资源的列奥纳多·达·芬奇《最后的晚餐》公有领域扫描件。