ЗАМЕТКИ С ИССЛЕДОВАНИЯ · СЕНТЯБРЬ 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 万参数的语言模型:权重只取三个值,整个词表在训练开始前就已冻结,算术是计算出来的,而不是学出来的。
Большинство языковых моделей тратят значительную долю параметров на две вещи, не имеющие отношения к пониманию языка: гигантскую таблицу соответствий токенов векторам и веса, достаточно точные, чтобы хранить по шестнадцать бит информации каждый. 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) · α, а градиенты проходят прямо через шаг округления. Сеть всегда видит только трёхзначную версию самой себя, поэтому ей никогда не нужно адаптироваться к сдвигу распределения при развёртывании.
Словарь, который ничего не стоит хранить и обучать
Вместо обучаемой таблицы embedding размером vocab_size × d_model, каждый токен получает фиксированный 512-битный код — вектор значений ±1, вычисленный один раз до начала обучения из реальной статистики совстречаемости (PPMI-SVD, затем пороговое отсечение в биты). Ни входной, ни выходной код никогда не получают градиент.
Арифметика, которая вычисляется, а не аппроксимируется
Когда 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.
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.
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) · α,梯度则直接穿过取整这一步。网络始终只经历自己的三值版本,因此部署时它永远不需要适应分布偏移。
存储和训练成本都为零的词表
没有使用需要训练的 vocab_size × d_model 嵌入表,每个词元都获得一个固定的 512 位编码 —— 一个 ±1 取值的向量,在训练开始前根据真实的共现统计一次性计算得出(PPMI-SVD,然后阈值化为比特)。输入编码和输出编码都从不接收梯度。
计算出来的算术,而非近似出来的
当 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.
七个解码器块夹在一张冻结的输入表和一个冻结的读出层之间 —— 内部全程保持三元。下图中的光点描摹的是单个词元的前向传播;看它循环流动。
Один словарь, три модальности 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 空间 —— 一个模型、一套嵌入机制、一个读出头。
| Метрика | v1 | v2 (исправлено) | ориентир |
|---|---|---|---|
| Image-code loss (nats) | 11.07 | 7.37 | случайный = 9.01 |
| Audio-code loss (nats) | 6.94 | 3.98 | случайный = 7.62 |
| Speech recognition WER | 120% | 123% → 37.6%* | 100% = неинформативно |
| Metric | v1 | v2 (fixed) | reference |
|---|---|---|---|
| Image-code loss (nats) | 11.07 | 7.37 | chance = 9.01 |
| Audio-code loss (nats) | 6.94 | 3.98 | chance = 7.62 |
| Speech recognition WER | 120% | 123% → 37.6%* | 100% = uninformative |
| 指标 | v1 | v2(已修复) | 参考值 |
|---|---|---|---|
| Image-code loss (nats) | 11.07 | 7.37 | 随机水平 = 9.01 |
| Audio-code loss (nats) | 6.94 | 3.98 | 随机水平 = 7.62 |
| Speech recognition WER | 120% | 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-Edu | 43.1 | связно, но не фактологично |
| ARC-Easy / PIQA (zero-shot) | 38.0% / 58.7% | выше случайного |
| HellaSwag / ARC-C / OpenBookQA | 27.5% / 22.7% / 25.0% | на уровне случайного |
| Распознавание речи (семантический кодбук) | WER 123% → 37.6% | улучшается |
| Абляция ternary vs fp16 | +18.1% perplexity | раскрытая цена |
| Capability | Result | Verdict |
|---|---|---|
| Exact circuits (span / final answer) | 99.7% / 98.7% | works |
| FineWeb-Edu holdout perplexity | 43.1 | fluent, not factual |
| ARC-Easy / PIQA (zero-shot) | 38.0% / 58.7% | above chance |
| HellaSwag / ARC-C / OpenBookQA | 27.5% / 22.7% / 25.0% | at chance |
| Speech recognition (semantic codebook) | WER 123% → 37.6% | improving |
| Ternary vs fp16 ablation | +18.1% perplexity | disclosed cost |
| 能力 | 结果 | 结论 |
|---|---|---|
| 精确 circuits(片段 / 最终答案) | 99.7% / 98.7% | 有效 |
| FineWeb-Edu 留出集困惑度 | 43.1 | 流畅,但不保证事实准确 |
| ARC-Easy / PIQA(零样本) | 38.0% / 58.7% | 高于随机水平 |
| HellaSwag / ARC-C / OpenBookQA | 27.5% / 22.7% / 25.0% | 接近随机水平 |
| 语音识别(语义码本) | WER 123% → 37.6% | 正在改善 |
| 三元 vs fp16 消融实验 | +18.1% 困惑度 | 已公开的代价 |
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。
.qpack прямо на клиенте, без сервера, без Python, со скоростью около 32 токенов в секунду..qpack file client-side, no server, no Python, at roughly 32 tokens/second..qpack 文件运行,不需要服务器、不需要 Python,速度约为每秒 32 个词元。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,还至少有一个问题 —— 图像生成 —— 仍未解决。这页上的每一个数字都来自实际运行、评估过的检查点,凡是能够二次核验的说法,都做了二次核验。