ЗАМЕТКИ С ИССЛЕДОВАНИЯ · СЕНТЯБРЬ 2026 RESEARCH NOTES · SEPTEMBER 2026 研究笔记 · 2026 年 9 月

Q-Omni: модель без embedding-таблицы Q-Omni: a model with no embedding table Q-Omni:一个没有嵌入表的模型

Языковая модель на 53M параметров, чьи веса принимают только три значения, чей словарь целиком заморожен ещё до начала обучения, и чья арифметика вычисляется, а не заучивается.

A 53M-parameter language model whose weights only ever take three values, whose entire vocabulary is frozen before training starts, and whose arithmetic is computed, not learned.

一个 5300 万参数的语言模型:权重只取三个值,整个词表在训练开始前就已冻结,算术是计算出来的,而不是学出来的。

53.2Mпараметров
1.58-биттернарные веса
33 МБупаковано, без потерь
98.7%точных ответов circuits
53.2Mparameters
1.58-bitternary weights
33 MBpacked, lossless
98.7%exact circuit answers
5320万参数量
1.58 比特三元权重
33 MB打包体积,无损
98.7%circuits 精确答案率

Большинство языковых моделей тратят значительную долю параметров на две вещи, не имеющие отношения к пониманию языка: гигантскую таблицу соответствий токенов векторам и веса, достаточно точные, чтобы хранить по шестнадцать бит информации каждый. Q-Omni — эксперимент по отказу от обоих — обучена с нуля на одной потребительской видеокарте.

Most language models spend a large slice of their parameters on two things that have nothing to do with language understanding: a giant lookup table mapping tokens to vectors, and weights precise enough to store sixteen bits of information each. Q-Omni is an experiment in refusing both — trained from scratch on a single consumer GPU.

大多数语言模型把相当一部分参数花在了两件与语言理解毫无关系的事情上:一张把词元映射到向量的巨大查找表,以及精细到每个都能存储十六位信息的权重。Q-Omni 是一次同时拒绝这两者的实验 —— 在单张消费级显卡上从零训练而成。

Зачем тратить хоть что-то на то, что можно вычислить бесплатно

Тернарные веса, обученные так с первого шага

Q-Omni следует линии работ BitNet b1.58: каждая матрица внимания и feed-forward квантуется до {-1, 0, +1} на каждом forward pass во время обучения, а не сжимается постфактум. Каждая строка хранит один full-precision масштаб α (среднее абсолютное значение); forward pass вычисляет clip(round(W/α), -1, 1) · α, а градиенты проходят прямо через шаг округления. Сеть всегда видит только трёхзначную версию самой себя, поэтому ей никогда не нужно адаптироваться к сдвигу распределения при развёртывании.

Измеренная цена. Контролируемая абляция — две идентичные модели, одна тернарная, другая fp16, тот же срез в 0.3 млрд токенов, то же расписание — даёт честную цену перехода на тернарность при таком размере в +18.1% perplexity (58.7 против 49.7). Большинство опубликованных тернарных результатов приводятся для ≥1B параметров, где цена, как ожидается, сокращается.

Словарь, который ничего не стоит хранить и обучать

Вместо обучаемой таблицы embedding размером vocab_size × d_model, каждый токен получает фиксированный 512-битный код — вектор значений ±1, вычисленный один раз до начала обучения из реальной статистики совстречаемости (PPMI-SVD, затем пороговое отсечение в биты). Ни входной, ни выходной код никогда не получают градиент.

Не случайный хеш. Поскольку коды получены из реальной статистики корпуса, замороженная таблица обладает полезной геометрией ещё до первого шага градиента: ближайшие по расстоянию Хэмминга соседи кода для king — это throne, kings и prince.

Арифметика, которая вычисляется, а не аппроксимируется

Когда Q-Omni нужно посчитать что-то точно, она пишет короткий структурированный span вроде <CALC>347*86<EQ>, а детерминированный logits-процессор перехватывает этот span, вычисляет его точно и принудительно вставляет верные цифры в вывод. Единственная задача модели — распознать, когда обратиться к circuit — четырнадцать детерминированных подпрограмм покрывают арифметику, даты, дни недели, конвертацию единиц, сравнение, сортировку, подсчёт и другое. На 300 отложенных вопросах верный span пишется в 99.7% случаев, а итоговый ответ точен в 98.7% случаев.

Why spend nothing on the things you can compute for free

Ternary weights, trained that way from the first step

Q-Omni follows the BitNet b1.58 line of work: every attention and feed-forward matrix is quantized to {-1, 0, +1} on every forward pass during training, not compressed after the fact. Each row keeps one full-precision scale α (its mean absolute value); the forward pass computes clip(round(W/α), -1, 1) · α, with gradients flowing straight through the rounding step. The network only ever experiences the three-valued version of itself, so it never has to adapt to a distribution shift at deployment.

The measured cost. A controlled ablation — two identical models, one ternary and one fp16, same 0.3B-token slice, same schedule — puts the honest price of going ternary at this size at +18.1% perplexity (58.7 vs 49.7). Most published ternary results are reported at ≥1B parameters, where the cost is expected to shrink.

A vocabulary that costs nothing to store and nothing to train

Instead of a trained vocab_size × d_model embedding table, every token gets a fixed 512-bit code — a vector of ±1 values computed once, before training starts, from real co-occurrence statistics (PPMI-SVD, then thresholded to bits). Neither the input code nor the output code ever receives a gradient.

Not a random hash. Because the codes come from real corpus statistics, the frozen table has useful geometry before a single gradient step: the Hamming-nearest neighbours of the code for king are throne, kings, and prince.

Arithmetic that is computed, not approximated

When Q-Omni needs to compute something exact, it writes a short structured span like <CALC>347*86<EQ>, and a deterministic logits processor intercepts that span, evaluates it exactly, and forces the correct digits into the output. The model's only job is recognizing when to reach for the circuit — fourteen deterministic sub-programs cover arithmetic, dates, weekdays, unit conversion, comparison, sorting, counting, and more. Across 300 held-out questions, it writes the correct span 99.7% of the time and the final answer is exact 98.7% of the time.

为什么在能免费算出来的东西上分文不花

从第一步起就按这种方式训练的三元权重

Q-Omni 沿袭了 BitNet b1.58 这条工作路线:训练期间每一次前向传播中,每个注意力和前馈矩阵都会被量化到 {-1, 0, +1},而不是事后压缩。每一行保留一个全精度缩放系数 α(其绝对值的均值);前向传播计算 clip(round(W/α), -1, 1) · α,梯度则直接穿过取整这一步。网络始终只经历自己的三值版本,因此部署时它永远不需要适应分布偏移。

实测代价。 一次受控消融实验 —— 两个完全相同的模型,一个三元、一个 fp16,相同的 3 亿词元切片,相同的调度 —— 得出在这个规模下三元化的真实代价是 困惑度 +18.1%(58.7 对 49.7)。大多数已发表的三元化结果是在 ≥1B 参数规模下报告的,那里的代价预计会更小。

存储和训练成本都为零的词表

没有使用需要训练的 vocab_size × d_model 嵌入表,每个词元都获得一个固定的 512 位编码 —— 一个 ±1 取值的向量,在训练开始前根据真实的共现统计一次性计算得出(PPMI-SVD,然后阈值化为比特)。输入编码和输出编码都从不接收梯度。

不是随机哈希。 由于这些编码来自真实的语料统计,冻结表在梯度下降开始之前就已经具备有意义的几何结构:king 编码在汉明距离上最近的邻居是 throne、kings 和 prince。

计算出来的算术,而非近似出来的

当 Q-Omni 需要精确计算某样东西时,它会写出一个简短的结构化片段,例如 <CALC>347*86<EQ>,一个确定性的 logits 处理器会拦截这个片段、精确求值,并把正确的数字强制写入输出。模型唯一的任务是识别何时该调用 circuit —— 十四个确定性子程序覆盖了算术、日期、星期、单位换算、比较、排序、计数等等。在 300 道留出的问题上,正确片段的书写率为 99.7%,最终答案的精确率为 98.7%。

Архитектура The architecture 架构

Семь декодерных блоков между замороженной входной таблицей и замороженным readout — всё внутри остаётся тернарным. Точки на схеме прослеживают forward pass одного токена; смотри, как он бежит по кругу.

Seven decoder blocks between a frozen input table and a frozen readout — everything inside stays ternary. The dots below trace one token's forward pass; watch it loop.

七个解码器块夹在一张冻结的输入表和一个冻结的读出层之间 —— 内部全程保持三元。下图中的光点描摹的是单个词元的前向传播;看它循环流动。

token id frozen fingerprint table c_id  =  ±1 vector, 512 bits + trainable Δ image / audio ids W_in projection transformer block ×7 RMSNorm grouped-query attention 14 query heads · 2 kv heads · head dim 64 RoPE · per-head QK-norm · sigmoid gate Q / K / V / O projections: TernaryLinear + RMSNorm SiLU feed-forward 896 → 2464 → 896, two matrices both matrices: TernaryLinear + final RMSNorm readout (h·W_out) · c_v / √512 + frozen bias dot product against the same frozen table ordinary token sampled and emitted as-is <CALC> span? deterministic circuit → exact answer the model chooses which the circuit is never wrong

Один словарь, три модальности One vocabulary, three modalities 一套词表,三种模态

Тот же механизм 512-битного отпечатка расширяется за пределы текста: 8 192 кода изображений (VQGAN) и 8 192 кода звука (четыре Mimi-кодбука, с покадровым чередованием) живут в том же пространстве id, что и текст — одна модель, один механизм embedding, одна readout-голова.

The same 512-bit fingerprint mechanism extends past text: 8,192 image codes (VQGAN) and 8,192 audio codes (four Mimi codebooks, frame-interleaved) live in the same id space as text — one model, one embedding mechanism, one readout head.

同样的 512 位指纹机制延伸到了文本之外:8,192 个图像编码(VQGAN)和 8,192 个音频编码(四个 Mimi 码本,按帧交错)与文本共享同一个 id 空间 —— 一个模型、一套嵌入机制、一个读出头。

Что сломалось. Loss по image-кодам первого совместного чекпоинта был хуже случайного угадывания — 11.07 нат против случайного порога 9.01 — как на обучающих, так и на отложенных данных. Диагноз: 64- и 256-мерные кодбуки изображений/звука имеют низкий эффективный ранг при сжатии в 512-битные коды, поэтому замороженный readout утекал 35–39% вероятностной массы в чужую модальность. Исправление: небольшая обучаемая поправка только для не-текстовых id — текст остаётся замороженным. Loss по изображениям упал до 7.37, по звуку — до 3.98, оба теперь ниже случайного уровня.
What broke. The first joint checkpoint's image-code loss was worse than random guessing — 11.07 nats against a chance floor of 9.01 — on training and held-out data. Diagnosis: the 64- and 256-dimensional image/audio codebooks have low effective rank once squeezed into 512-bit codes, so the frozen readout leaked 35–39% of its probability mass onto the wrong modality. The fix: a small trainable correction on non-text ids only — text stays frozen. Image loss dropped to 7.37, audio to 3.98, both now below chance.
出过的问题。 第一个联合检查点的图像编码 loss 比随机猜测还差 —— 训练集和留出集上都是 11.07 nats,而随机水平是 9.01。诊断结果:64 维和 256 维的图像/音频码本一旦压缩进 512 位编码,有效秩就会偏低,导致冻结的读出层把 35–39% 的概率质量泄漏到了错误的模态上。修复方法:只对非文本 id 加一个小的可训练修正 —— 文本部分保持冻结。图像 loss 降到了 7.37,音频降到了 3.98,两者都已低于随机水平。
Метрикаv1v2 (исправлено)ориентир
Image-code loss (nats)11.077.37случайный = 9.01
Audio-code loss (nats)6.943.98случайный = 7.62
Speech recognition WER120%123% → 37.6%*100% = неинформативно
Metricv1v2 (fixed)reference
Image-code loss (nats)11.077.37chance = 9.01
Audio-code loss (nats)6.943.98chance = 7.62
Speech recognition WER120%123% → 37.6%*100% = uninformative
指标v1v2(已修复)参考值
Image-code loss (nats)11.077.37随机水平 = 9.01
Audio-code loss (nats)6.943.98随机水平 = 7.62
Speech recognition WER120%123% → 37.6%*100% = 无信息量

* после дообучения только на семантическом Mimi-кодбуке — см. ниже.

* after fine-tuning on the semantic Mimi codebook alone — see below.

* 仅在语义 Mimi 码本上微调之后 —— 见下文。

Результаты, честно Results, honestly 如实展示的结果

СпособностьРезультатВердикт
Точные circuits (span / итоговый ответ)99.7% / 98.7%работает
Perplexity на отложенном FineWeb-Edu43.1связно, но не фактологично
ARC-Easy / PIQA (zero-shot)38.0% / 58.7%выше случайного
HellaSwag / ARC-C / OpenBookQA27.5% / 22.7% / 25.0%на уровне случайного
Распознавание речи (семантический кодбук)WER 123% → 37.6%улучшается
Абляция ternary vs fp16+18.1% perplexityраскрытая цена
CapabilityResultVerdict
Exact circuits (span / final answer)99.7% / 98.7%works
FineWeb-Edu holdout perplexity43.1fluent, not factual
ARC-Easy / PIQA (zero-shot)38.0% / 58.7%above chance
HellaSwag / ARC-C / OpenBookQA27.5% / 22.7% / 25.0%at chance
Speech recognition (semantic codebook)WER 123% → 37.6%improving
Ternary vs fp16 ablation+18.1% perplexitydisclosed cost
能力结果结论
精确 circuits(片段 / 最终答案)99.7% / 98.7%有效
FineWeb-Edu 留出集困惑度43.1流畅,但不保证事实准确
ARC-Easy / PIQA(零样本)38.0% / 58.7%高于随机水平
HellaSwag / ARC-C / OpenBookQA27.5% / 22.7% / 25.0%接近随机水平
语音识别(语义码本)WER 123% → 37.6%正在改善
三元 vs fp16 消融实验+18.1% 困惑度已公开的代价
Генерация изображений не решена. Loss ниже случайного уровня — реальная структура выучена — но сэмплированные изображения декодируются в плоские цветовые поля, а не в картинки. Потолок ёмкости, слишком мало данных с изображениями или фундаментальное ограничение замороженных кодов-отпечатков для зрения: не выяснено, и мы всё ещё проводим эксперимент, который может дать ответ.
Image generation is not solved. Loss is below chance — real structure was learned — but sampled images decode to flat colour fields, not pictures. A capacity ceiling, too little image data, or a fundamental limit of frozen fingerprint codes for vision: unresolved, and we're still running the experiment that might tell us which.
图像生成尚未解决。 Loss 低于随机水平 —— 说明确实学到了某种结构 —— 但采样出的图像解码后只是纯色色块,而不是图片。是容量上限、图像数据太少,还是冻结指纹编码用于视觉任务存在根本性限制:尚未有定论,我们仍在进行可能给出答案的实验。

33 МБ, и это работает во вкладке браузера 33 MB, and it runs in a browser tab 33 MB,直接在浏览器标签页里运行

Тернарные веса упаковываются без потерь по 1.6 бита/вес; замороженная таблица — по 1 биту/значение. Вся модель — архитектура, веса, токенизатор, self-test — помещается в один файл на 33 МБ, формат, который мы называем QPACK1, против 230–263 МБ fp32 safetensors.

Ternary weights pack losslessly at 1.6 bits/weight; the frozen table packs at 1 bit/value. The whole model — architecture, weights, tokenizer, self-test — fits into one 33 MB file, a format we call QPACK1, down from 230–263 MB of fp32 safetensors.

三元权重以每权重 1.6 比特无损打包;冻结表以每个值 1 比特打包。整个模型 —— 架构、权重、分词器、自检 —— 都装进了一个 33 MB 的文件,我们称这种格式为 QPACK1,相比之下 fp32 的 safetensors 需要 230–263 MB。

Проверено тремя способами, а не просто заявлено. Побайтово точная упаковка туда-обратно (ноль расхождений trit на 43,75 млн весов); три независимых рантайма — PyTorch, порт на NumPy с нуля и написанное вручную ядро WebAssembly/SIMD128 — дают токен-в-токен идентичную жадную генерацию; и это ядро WASM запускает настоящий файл .qpack прямо на клиенте, без сервера, без Python, со скоростью около 32 токенов в секунду.
Checked three ways, not just claimed. Byte-exact round-trip packing (zero mismatched trits across 43.75M weights); three independent runtimes — PyTorch, a from-scratch NumPy port, and a hand-written WebAssembly/SIMD128 kernel — producing token-for-token identical greedy generations; and that WASM kernel running the real .qpack file client-side, no server, no Python, at roughly 32 tokens/second.
三种方式验证,不只是口头声称。字节精确的往返打包(在 4375 万个权重中零 trit 不匹配);三个独立的运行时 —— PyTorch、从零实现的 NumPy 移植版,以及手写的 WebAssembly/SIMD128 内核 —— 产生逐词元完全一致的贪心生成结果;而且这个 WASM 内核可以直接在客户端加载真实的 .qpack 文件运行,不需要服务器、不需要 Python,速度约为每秒 32 个词元。
quickstart.py
from transformers import AutoModelForCausalLM, AutoTokenizer

tok = AutoTokenizer.from_pretrained("q-project/Q-Omni-53M-Experimental")
model = AutoModelForCausalLM.from_pretrained(
    "q-project/Q-Omni-53M-Experimental", trust_remote_code=True)

ids = tok("Once upon a time,", return_tensors="pt").input_ids
out = model.generate(ids, max_new_tokens=60, do_sample=True, top_k=40)
print(tok.decode(out[0], skip_special_tokens=True))

Что из этого следует What this adds up to 总结

Q-Omni расходует параметры аккуратно: ничего на embedding-таблицу, ничего на переучивание арифметики, и измеренный, раскрытый налог квантования в 18% ради минимально возможного размера. Та же идея замороженного словаря распространяется на модальности, с одним реально найденным и исправленным багом и как минимум одним открытым вопросом — генерацией изображений. Каждая цифра на этой странице получена с реально запущенного и оценённого чекпоинта, а там, где утверждение можно было проверить дважды, — проверено дважды.

Q-Omni spends its parameters carefully: nothing on an embedding table, nothing on relearned arithmetic, and a measured, disclosed 18% quantization tax for the smallest possible footprint. The same frozen-vocabulary idea reaches across modalities, with one real bug found and fixed, and at least one — image generation — still open. Every number on this page comes from a checkpoint that was actually run, evaluated, and, where a claim could be checked twice, checked twice.

Q-Omni 谨慎地分配每一个参数:不在嵌入表上花一分钱,不在重新学习算术上花一分钱,并且为了尽可能小的体积,付出了经过测量、如实公开的 18% 量化代价。同样的冻结词表思路延伸到了各个模态,其中发现并修复了一个真实的 bug,还至少有一个问题 —— 图像生成 —— 仍未解决。这页上的每一个数字都来自实际运行、评估过的检查点,凡是能够二次核验的说法,都做了二次核验。

Карточка модели и веса Запустить в браузере
Model card & weights Run it in your browser
模型卡片与权重 在浏览器中运行
Назад кВсе посты
Back toAll posts
返回全部文章