Cypha · v2.4.0

一套从 第一性原理出发构建的 AI 架构,不是 fork 来的

几乎所有现代人工智能(AI)都是同样那几种设计的变体。Cypha 的起点在别处:一个 C++ 类型,学习规则是从数学里推出来的,不是借来的,而且它每见到一个样本就更新一次,而不是训练一次就冻住。这是一个研究项目,失败的部分和结果一起发布。

语言C++
版本v2.4.0
WikiText-2,每字符比特数(BPC)2.664 BPC
最近一次推送不久前
四条纲领,一条学习规则
  • AIXI / Solomonoff — 最小描述长度(MDL)先验决定模型可以廉价地相信哪些东西。
  • 信息几何 — 更新沿着自然梯度走,所以学习尊重参数空间的曲率。
  • 主动推断 / 自由能 — 给出先验、差分与上下文这套结构分解。
  • 信息瓶颈 — 定下编码器的目标:留下能预测的,其余丢掉。
大白话

一分钟说清这是什么

问题所在

在用的 AI 系统几乎全是少数几种设计的变体。它们在大机器上训练一次,然后冻住发出去,所以要跟上会变的东西 — 一种新的欺诈手法、一种新的故障 — 就得回去重新训练。它们还很大,于是只能待在数据中心里而不是设备上,也让解释任何一次单独的决定变得很难。

解决办法

Cypha 是一个 C++ 类型,能分类、预测数值、生成序列。它的学习规则是从四套数学里推导出来的,不是从现成架构抄来的,而且它每见到一个样本就更新一次 — 没有批次,没有轮次,也没有重训这一步。它小到可以在采集数据的那台硬件上跑。

这是给谁用的

眼下是愿意试一种不同设计的研究者和工程师。它瞄准的问题,是数据一直在动的那些 — 欺诈、设备故障、变化中的行为 — 是模型必须待在设备上而不是数据中心里的那些,也是事后得有人把决定解释清楚的那些。

把它当研究来评判。 下面那些数字来自仓库自己跑的基准测试,对照的是已提交的测试夹具,而不是排行榜上的名次。一个标题叫 Cypha 不是什么 的小节列出了这些局限,其中包括那个标准测试:在某一个特定组件被打开之前,它在上面一直停在接近瞎猜的水平。本页余下的部分是架构和测量结果。
库本身

随机特征,测出来的,不是说出来的

Cypha 为随机傅里叶特征(RFF)给出的理由是:它们能让一个线性头分开线性头本来分不开的东西。这是一个可以测量的主张,所以这里就把它测出来 — 用的是 cypha::rff_features 编译成的 WebAssembly,不是用 JavaScript 复述一遍。

cypha::rff_features — WebAssembly

未加载

径向基函数(RBF):在 n 个采样点上的精确 RBF 核给出一个矩阵 K。随机特征重建出一个近似 K̂。画出来的是 ‖K − K̂‖F 随特征数增长的变化:特征越多,近似越接近。

库
—
编译这段代码时发现了一个 bug。 正交随机特征(ORF)— 稠密的那个变体 — 原本把每一行都归一化成单位长度,而 Yu 等人是从 chi_d 里抽取行范数的,好让一个正交行与它替换掉的那个高斯行对得上。行短了 √d 倍,于是特征近似的是错的核,误差不收敛,而是走平了。一行代码。现在它是三者里最好的。
故意做成单线程:多线程的 WebAssembly 需要 SharedArrayBuffer,而它需要 Cross-Origin-Opener-Policy(COOP)和 Cross-Origin-Embedder-Policy(COEP)这两个响应头,GitHub Pages 发不出来。
架构

七层,每一层只做一件事

下面每一个组件之所以存在,都是因为那四条纲领里有一条要求它 — 而不是因为它那个季度出现在某篇论文里。

Cypha 流水线按顺序排列:编码器、投影、世界先验、类差分、记忆与分层上下文,输出一个类别,附带置信度、异常分数和分布外标记
滑动查看完整示意图 →
一个类型,四件工作。 本页往下那个演示就是这条流水线的二维版本 — 世界先验是那个虚线椭圆,差分是那些条形。
编码器

可插拔的前端

从原始输入到特征向量。自带 VectorEncoder, RFFEncoder (随机傅里叶特征)与 ConcatEncoder。换掉它不用动下游的任何东西。

投影

EncoderProjection

通过 Fisher–Rao 对比更新把特征送进隐空间,并给 Frobenius 范数设上限,这样单个离群点没法把几何结构炸开。

θ₀

WorldPrior

一个共享的对角高斯分布,由 Welford 与指数滑动平均(EMA)更新在线拟合。这就是那个从不遗忘的“无限上下文” — 而它的移动就是漂移信号。

Δₖ

ClassDifferential

每个类一组自然参数偏移,被观测拉过去,又被 MDL 衰减拽回来。一个类是 相对于世界的位移,不是一个单独的模型。

记忆

DIFMemory

在广义双曲后验下计算对数似然比,配上贝塞尔比值查找表,这样重尾不会让每个样本都付出一次超越函数的代价。

上下文

TieredContextBuffer

短、中、长三层按 NIGField 的置信度加权,这样近期的证据可以占主导,又不会抹掉长期那层已经确立的东西。

分类,从头到尾: 编码 → 投影 → 对着世界先验给每个类的对数似然比打分 → 返回 argmax,连同一个置信度、一个异常分数和一个分布外标记。下面那个演示就是这条流水线的缩微版。
交互演示

点几下训练一个分类器

Cypha 流水线忠实的二维缩微版:在线拟合的世界先验、被你放下的点吸引过去的各类差分,以及按对数似然比做的分类。它从你的每一次点击里学习 — 没有批次,没有轮次,也不重启。

cypha::Cypha — 在线分类器

点击画布,加入一个所选类别的样本。拖动可以刷出一团。

要放置的类别

载入一个数据集

样本数
0
准确率
—
最大 LLR
—
先验漂移
0.00

上次推理

空闲
把鼠标停在画布上,可以对一个点做分类而不拿它训练。

类差分 Δₖ

为这个页面写的二维教学实现 — 结构和真实流水线一样,规模一点都没有。C++ 实现在 native/.
把 RFF 编码器关掉,试试异或(XOR)。 准确率会塌到接近瞎猜,而这不是这个演示里的 bug — 这是线性对数似然比被记录在案的局限,Cypha 的 README 里就直说了。把隐空间 RFF 编码器打开,看着它恢复。把失效模式和修复办法摆在一起发布,这才是重点。
实测

结果,以及真正要紧的那组对比

数字来自仓库自己在诊断修复之后跑的基准测试。正确性由一套 CTest 矩阵对上已提交的夹具基准值来证明 — 不是靠排行榜上的名次。

表里的缩写:随机梯度下降(SGD)、长短期记忆(LSTM)、随时间反向传播(BPTT)。

数据集任务Cypha在线 SGD备注
线性可分2 类0.7830.644同样的在线预算
Iris3 类0.900—经典基准数据集
Wine3 类0.969— 
Digits10 类0.922— 
Breast cancer2 类0.957— 
WikiText-2序列,30 万 token2.664 BPC—混合 GRIA+LSTM L2+Wave2 BPTT
XOR2 类,隐空间 RFF~0.763—只用线性 LLR 时上限接近瞎猜
生成

温度缩放、场条件、隐空间边界插值、对抗式(最大化熵)、OOD 采样、MDL 约束、祖先采样,以及从回放缓冲区做 KDE 采样。

异常检测 & 主动学习

异常分数来自门控值,主动查询分数是熵 × 到边界的接近程度,漂移检测直接从世界先验的移动上读出来。

回放

一个容量 10,000 的优先级缓冲区,按新近程度和意外程度加权,以 0.30 的比例回放 — 这样稀有而有信息量的样本不会被常见的那些淹掉。

参考默认值

跑过性能剖析的,不是猜的

这些是从一次带性能剖析的中等网格优化里得出来的,作为参考配置发布。

特征维度128
RFF 预算256
回放比例0.30
上下文窗口32
世界先验学习率0.008
类差分学习率0.05
编码器学习率0.002
MDL lambda0.001
老实说明

Cypha 不是什么

  • 不是包装层。 从第一性原理定制而来 — 这也意味着它继承不到别人调好的参数。
  • 线性 LLR 有天花板。 没有隐空间 RFF 编码器时,XOR 停在接近瞎猜的水平,加上它之后大约提到 76.3%。
  • 验证是基于一致性的。 用 CTest 对已提交的夹具基准值。不做任何排行榜上的声称。
  • CUDA 只用于推理。 训练留在中央处理器(CPU)上,因为在这套架构上 CPU 更快。
  • 理论在别处。 谐波谱和 NMP 的工作是另一篇讲压缩算法的论文;Cypha 是实现层。
产品演示

Cypha,从一个真实的国际象棋引擎里蒸馏出来

26,568 个局面,标注用的是一个常规 alpha-beta 引擎自己的搜索评估值,拟合时用的是这套架构里其他地方都在用的同一套 WorldPrior 白化与自然梯度更新。它在留出局面上复现教师的评估,达到 R² 0.866 ,并且在同等搜索深度下对那个教师取得 5 胜–19 负–6 和。

这是给谁用的

一个会一直学下去的小型 AI

大多数 AI 在数据中心里训练一次,然后冻住发出去。Cypha 小到可以在普通硬件上跑,而且会从它见到的每一个新样本继续学。

01

小到装不下大 AI 的设备

传感器、摄像头、控制器,以及其他后面塞不下一个数据中心的硬件。Cypha 小到可以直接在设备上跑,所以没有任何东西必须离开这栋楼。

02

任何必须跟上变化的场合

欺诈模式、设备故障、变动中的客户行为。去年训练的模型现在已经过时了。这一个边跑边更新,不用下线重训。

03

事后必须解释清楚的工作

银行、保险公司和医疗机构常常得为一个决定给出理由。Cypha 小到可以逐一检查,而且它把自己不擅长的地方公布出来,而不是藏起来。

在这里看到你自己的情况了吗? 它现在已经开放测试,而它是为哪些人做的,那些人的反馈才是真正会改变它的。 成为测试用户 →
自己构建

三条命令

$ cmake -S native -B /tmp/cypha_build -DCMAKE_BUILD_TYPE=Release -G Ninja
$ cmake --build /tmp/cypha_build --parallel
$ ctest --test-dir /tmp/cypha_build -R native_ --output-on-failure

# REST service
$ cypha_rest --listen 127.0.0.1:8099 --cypha fixtures/reference.cypha
# Qt shell (build with -DCYPHA_BUILD_QT=ON)
$ cypha_qt_shell
许可条款