Исследовательская модель · раунд 18

Модель решений, выращенная из зерна

Zerno обучается выдавать решения трёх типов — Choice, Noul и Score — и сообщает, насколько уверена в каждом. 34 млн параметров, собственный токенизатор и ни одного чужого веса — всё обучено с нуля на одной RTX 3060.

Rust · Burn 0.22CUDARU ⇄ ENJEPA

Знак Zerno — стеклянное зерно с буквой Z
34 133 505
параметров, все с нуля
p50 · 15 мс
на 77 вариантах ответа
Σ p = 1
один softmax по всем вариантам
34,1 M
параметров — случайные веса в начале каждого обучения
16 384
токена в собственном byte-level BPE
256
вариантов в одном вопросе, 2 059 MiB памяти
12 GB
одна RTX 3060 — весь цикл обучения

01 — Что делает

Выдаёт решения, а не сочиняет текст

Вы передаёте ситуацию в JSON и типизированные вопросы. Zerno обучается выдавать на них решения трёх типов: Choice — выбор из вариантов, Noul — да или нет по явно описанному критерию, Score — оценку по упорядоченной шкале. Каждое решение — вероятности исходов, а слишком длинный вход — типизированная ошибка, а не тихая обрезка.

  • Выборchoice

    До 256 вариантов, один softmax по всем: модель выдаёт вероятность каждого, в сумме 1.

  • Да или нет по критериюnoul

    Обе стороны критерия, true и false, описаны явно; модель выдаёт вероятность стороны true.

  • Оценка по шкалеscore

    Упорядоченные уровни: модель выдаёт вероятность каждого уровня и ожидаемый уровень; порядок учитывается в метрике.

POST/v1/decisions
{
  "schema_version": 1,
  "state": { "сообщение": "Переведи маме 200 евро" },
  "questions": [{
    "id": "intent", "kind": "choice",
    "prompt": "Чего хочет пользователь?",
    "candidates": [
      { "id": "transfer", "text": "Перевод денег" },
      { "id": "exchange", "text": "Курс валют" },
      { "id": "balance",  "text": "Узнать баланс" }
    ]
  }]
}
Ответ · intent "choice": "transfer"
transfer
0.88 exchange
0.09 balance
0.03
Σ p = 1.00 total_ms · local_request

Пример формата по контракту decision-request v1. Вероятности в примере условные.

02 — Чем отличается

Не ещё одна языковая модель

Предобучение языковых моделей обычно строится на предсказании следующего токена, а затем их дообучают следовать инструкциям. Zerno решает другую задачу: обучается выдавать типизированные решения — Choice, Noul и Score — с вероятностью каждого исхода. Поэтому она маленькая, быстрая и проверяемая.

Сравнение Zerno с генеративной языковой моделью
Признак Генеративная LLM Zerno
Что выдаёт Свободный текст Типизированное решение — Choice, Noul или Score — с вероятностями исходов, Σ p = 1
Ответ вне вариантов Возможен: модель может сочинить Исключён устройством: оцениваются только переданные варианты, стороны критерия или уровни шкалы
Уверенность Обычно не выражена числом Число у каждого варианта; температура калибруется на отдельных данных
Размер Миллиарды параметров 34 млн параметров
Где работает Чаще всего облачный API или кластер GPU Одна потребительская видеокарта; локальный запрос — 7.8–33.6 мс
Происхождение Часто дообучение чужой базовой модели Свои веса и токенизатор с нуля, версии данных закреплены

Это сравнение по устройству, а не по качеству: сравнение качества с внешней моделью на настоящем бюджете обучения ещё впереди.

В основе

JEPA: предсказывать смысл, а не слова

Предобучение языковых моделей обычно строится на предсказании следующего токена. JEPA (Joint-Embedding Predictive Architecture) учит другому: по видимой части текста предсказать внутреннее представление скрытой части. Модели не нужно воспроизводить каждое слово — достаточно понять, о чём там речь.

Идею JEPA предложил Ян Лекун в программной работе «A Path Towards Autonomous Machine Intelligence» (2022) как основу системы с моделью мира: она предсказывает существенное, отбрасывает несущественное и на этой основе планирует. Zerno берёт из неё принцип обучения в пространстве представлений и применяет его к тексту: энкодер учится по JEPA, а голова — выдавать Choice, Noul и Score.

На одном seed предобучение уже даёт −0.020 Brier; проверка на парных seed — следующий раунд

Ян Лекун · A Path Towards Autonomous Machine Intelligence (2022), откроется в новой вкладке
Схема обучения JEPA: обучаемая часть предсказывает представление скрытого фрагмента, которое строит целевой энкодер

Обучаемая часть

Видимый текст Энкодер Предиктор ŝ

Цель

Скрытый фрагмент EMA-копия энкодера s

Ошибка считается между ŝ и s в пространстве представлений, без генерации слов. Градиент идёт только в обучаемую часть, а цель медленно следует за ней (τ 0.99 → 0.9995).

  • Сравнивать смыслы, а не слова

    Ошибка считается между векторами представлений. Существенное для ситуации сохраняется, а точную формулировку воспроизводить не нужно.

  • Защита от схлопывания

    Если энкодер выдаёт один и тот же вектор на любой текст, ошибка предсказания мала, а пользы нет. В Zerno цель — EMA-копия сети, против схлопывания работает регуляризатор, а ранг представлений с раунда 12 измеряется по полному спектру.

  • Loss — не доказательство

    Эмбеддинг — не готовый список понятий. Полезен ли он, показывают только решения на отложенных данных, поэтому JEPA в Zerno оценивается по качеству решений после обучения головы, а не по падению loss.

03 — Как работает

Четыре шага от байта до решения

Энкодер учится понимать текст, предсказывая смысл скрытых фрагментов, а не сами слова. Потом небольшая голова учится выбирать.

  1. 01

    Свой токенизатор

    Byte-level BPE, обученный только на train-части данных. Никаких готовых словарей.

    vocab 16 384

  2. 02

    JEPA-предобучение

    Энкодер предсказывает представления скрытых фрагментов. Цель — EMA-копия той же сети, без учителя со стороны.

    маска 30 % · τ 0.99 → 0.9995

  3. 03

    Решающая голова

    Контекст и каждый вариант проходят через общий энкодер; голова сравнивает пары и выдаёт оценки.

    8 блоков · 512 · 8 голов

  4. 04

    Калибровка

    Температура подбирается на отдельной части данных, чтобы 0,8 значило «верно примерно в 8 случаях из 10».

    calibration split · NLL

Архитектура

dual_encoder_shared_prefix_v1
Контекст ≤ 512 токенов
Вариант × K ≤ 64 токена
Энкодер, 8 блоков
Первые 2 блока того же энкодера
Оценщик пары [c, v, c·v, |c−v|] → 2048 → 256 → 1
softmax по K

04 — Результаты

Цифры, которые можно проверить

Brier score на MASSIVE: 60 намерений, русский и английский. Меньше — лучше. Каждое значение взято из опубликованного отчёта раунда.

Zerno против простых ориентиров

Brier, dev · меньше — лучше
Константный ответ · train prior0.484
Лексический baseline · char n-gram0.186
Zerno · обучение с учителем, 100k0.167
−0.317
к константному ответу
−0.018
к лексическому, 95 % ДИ [−0.027; −0.010]

Кандидат · нужна проверка на парных seed

JEPA начинает помогать

Только с учителем, 30k0.2137
JEPA 8M токенов + голова, 30k0.1937
−0.020
95 % ДИ [−0.025; −0.015] — устойчиво к ресемплингу оценки, но пока один seed.

Задержка локального запроса

RTX 3060 · после прогрева · p50 / p95
8 вариантов
7.8 мс
p95 11.0 мс
77 вариантов · Banking77
15.0 мс
p95 18.0 мс
150 вариантов
23.0 мс
p95 26.4 мс
256 вариантов · максимум
33.6 мс
p95 39.6 мс

Цифры выше — для решений Choice. Noul и Score тоже входят в протокол оценки (BoolQ — Brier, SST-5 — RPS). На исходном английском протоколе, куда входит BoolQ, модель пока не обогнала константный ответ, а сильного результата для Score ещё нет.

Один seed (17), dev-сплит, на котором выбиралась модель. Независимого результата на test пока нет — он будет опубликован один раз, когда протокол позволит.

05 — Принципы

Правила, по которым растёт Zerno

  • Всё с нуля

    Случайные веса в начале каждого обучения. Никаких pretrained-моделей, готовых эмбеддингов и внешнего учителя.

  • Только Rust

    Данные, обучение, оценка и сервер — на Rust с Burn и CUDA. Ни Python, ни PyTorch в рантайме.

  • Честные метрики

    Нет данных — значит null, а не красивое число. Найденная ошибка — публичное errata и новый протокол.

  • Локально

    Сервер решений слушает только loopback. Данные не уходят наружу, модель помещается в одну видеокарту.

06 — Журнал исследования

18 раундов. У каждого — отчёт, у ошибок — errata.

Все раунды
  1. Раунд 09

    Задача обучаема

    0.167 против 0.484 у константного ответа на 60 намерениях RU/EN.

  2. Раунд 12

    Метрика коллапса исправлена

    Истинный ранг цели — 1.88, а не 44.7. Прежние выводы отозваны.

  3. Раунд 14

    Объём учит предиктор

    Skill предиктора: −0.486 → +0.155 при росте до 8 M токенов.

  4. Раунд 18 · сейчас

    Голова снова учится

    Найден и закрыт дефект загрузки. С ним исправленным JEPA даёт −0.020.

  5. Далее

    Парные seed, затем 100k

    Подтверждение переноса. Ожидает одобрения.

Все раунды с 08 по 18
  1. 08

    Аудит данных без обучения

    Валидатор RUSSE отбрасывал 74 % верных фрагментов, 4 430 строк MASSIVE попали из train в dev, а три датасета раунда 07 модели ни разу не предъявлялись. Прежнее объяснение через «интерференцию» отозвано.

  2. 09

    Задача обучаема

    Нативный протокол MASSIVE RU/EN. Обучение с учителем даёт 0.167 против лексического baseline 0.186 и константного ответа 0.484.

  3. 10

    Контролируемая проверка JEPA, 2 M токеновпересмотрено в 18

    Сравнение с учителем признано недействительным: голова JEPA-запуска не обучалась.

  4. 11

    Ошибка диагностики найдена

    Вывод «JEPA сдвинул scorer» не подтвердился: все тензоры scorer побитово совпадали с инициализацией.

  5. 12

    Настоящая метрика коллапса

    Старая метрика читала диагональ ковариации. Истинный ранг цели — 1.88, а не 44.74; все прежние утверждения «коллапса нет» отозваны.

  6. 13

    Регуляризатор на токен-остатке

    Коллапс на уровне токенов предотвращён: ранг 467 против 2.51, защитное правило ни разу не сработало.

  7. 14

    В 10 раз больше данных

    Skill предиктора вырос с −0.486 до +0.155 к 8 M токенов, но заранее зафиксированное правило коллапса остановило предобучение.

  8. 15

    Куда уходит токен-специфичная часть целипересмотрено в 18

    Диагностика покрытия остаётся в силе; сравнения с учителем недействительны.

  9. 16

    Регуляризатор на всём окне

    Разрыв покрытия закрыт: 0.160 → 0.0.

  10. 17

    Разброс по seed инициализации

    0.2137 / 0.2062 / 0.2086, стандартное отклонение 0.0038. Исправлено влияние гейта на генератор случайных чисел.

  11. 18

    Голова снова учится

    С 10-го раунда голова всех JEPA-запусков была заморожена дефектом загрузки. После исправления JEPA 8 M даёт 0.1937 против 0.2137 — кандидат на положительный перенос. Добавлена проверка при старте.

07 — Инвесторам и фондам

Зерно проросло.
Ищем тех, кто поможет ему вырасти.

Zerno — исследовательский проект на ранней стадии. Мы открыты к разговору с инвесторами, фондами и индустриальными партнёрами, которым нужны компактные проверяемые модели решений.

Что уже есть

  • Собственный стек на Rust: данные, токенизатор, обучение, оценка и сервер
  • Модель, которая обгоняет простые ориентиры на 60 намерениях RU/EN
  • 18 раундов исследований с отчётами и публичными errata
  • Около 28 GPU-часов на одной RTX 3060 за весь путь

Куда направить ресурсы

  • Больше данных и вычислений для JEPA: в раунде 14 качество предиктора росло с объёмом
  • Независимая проверка на test и на нескольких seed
  • Решения по произвольному контексту и критерию на RU/EN
  • Длинный контекст: качество за пределами 512 токенов пока не измерено

Как начать разговор

Напишите в Telegram или на почту. Пришлём технический отчёт, журнал раундов и план следующих экспериментов, ответим на вопросы.