Веса минус фи, ноль и плюс фи
Вы узнаете
Как тернарный вес хранится в 2 битах, зачем нужен четвёртый код и чего спека не утверждает о фи.
Тернарные сети вроде BitNet хранят каждый вес как минус единицу, ноль или плюс единицу, умноженные на масштаб, так что умножение превращается в сложение, вычитание или ничего. gfternary.t27 фиксирует этот масштаб равным фи, примерно 1,618, и хранит три значения в 2 битах: 00 — ноль, 01 — плюс фи, 10 — минус фи. У двух битов есть четвёртый код, 11, и спека сворачивает его в ноль, а не оставляет неопределённым. Спека говорит и о том, чего не утверждает: что масштаб фи выигрывает у обычных целых тернарных весов — открытая гипотеза, и она называет измеренный разрыв, который её опроверг бы. Плеер компилирует спеку в вашем браузере; большинство проверок здесь выполнить нельзя, и каждый пропуск объясняет почему.
Попробуйте
Запустите тесты и прочитайте, почему пропущенные проверки пропущены; затем найдите код, который сворачивается в ноль, и строку, которая это делает. Золотое сечение может задавать и устройство формата: в спеке найдите golden_section и прочитайте, как gft4 делит 4 позиции между знаком, тритами и мантиссой.

Two-bit ternary weights {-phi, 0, +phi} as a t27 spec, compiled by t27c as WebAssembly in your browser. Seven backends; every test the page cannot run says why.
specs/numeric/gft4.t27
// SPDX-License-Identifier: Apache-2.0
// gft4.t27 -- GF-T4: the golden-ratio ternary ladder, 4-bit class.
//
// TWO AXES, FOUR FAMILIES. GF and GF-T are derived from the golden ratio; BNF and
// TNF are derived from the theorems, as the optimisation result for ternary
// networks. They are not renamings of each other and they answer different
// questions.
//
// GF-T applies GF's rule to POSITIONS, and a trit is a position -- the golden
// section divides the payload the way it divides a segment:
//
// E_t = round((N-1)/phi^2) = 1, M = N - 1 - E_t = 2
//
// Every rung lands exactly: 1 + 1 + 2 = 4, no position unspent. The ratio
// E_t/M = 0.5000 against 1/phi = 0.6180, a phi-distance of 0.1180
// which falls toward zero up the ladder, by construction, exactly as in GF.
//
// What this buys and what it costs, measured against TNF4 on the reference
// oracle: GF-T's exponent spans 1 binades either side where TNF sizes its own
// for the range a workload actually visits. GF-T pays for that in mantissa. At 64
// bits GF-T takes 1.3e8 times the range for 1.2e5 times the error -- neither
// dominates, and the corollary on the pair (M_eff, binades) forbids ranking them
// without naming a workload.
//
// Supersedes the ad-hoc parameters this rung carried before 2026-08-09, where the
// exponent was sized at roughly log2(N) trits with no documented rule and left
// positions unspent.
//
// layout: [ sign(1) | E = 1 balanced-ternary trits | M = 2 binary bits ]
// value = (-1)^sign * (1 + M/2^2) * 2^e, e in [-1,+1]
module triformat_gft4 {
use base::types;
const SIGN_BITS: u32 = 1;
const EXP_TRITS: u32 = 1; // round((N-1)/phi^2)
const MANT_BITS: u32 = 2; // the remaining positions, all of them
const EXP_OFFSET: u32 = 1;
const OFFSET_MAX: u32 = 2;
fn is_finite(offset: u32) -> bool { return offset != OFFSET_MAX; }
fn exp_values() -> u32 { return 3; }
// ---- Tests / invariants ----
// The golden section is the rule; this asserts it rather than remembering it.
test golden_section {
assert(SIGN_BITS + EXP_TRITS + MANT_BITS == 4, "1 + E_t + M = N, every position spent");
assert(EXP_TRITS * 1000 / MANT_BITS == 500, "E_t/M holds the golden section");
}
test balanced_offsets {
assert(EXP_OFFSET * 2 == OFFSET_MAX, "balanced: offset_max = 2 * exp_offset");
}
}
Все уроки
Модуль 1 · Лаборатория: наши исследования
Свой формат чисел, честная таблица результатов и таблицы модели, перемноженные на плате.
Модуль 2 · ИИ-числа: блок MX
Как ИИ-чипы хранят веса в нескольких битах: один общий масштаб на блок, сам байт масштаба и что один выброс делает с соседями.
Модуль 3 · Тернарные веса
Веса, которые бывают только минус масштаб, ноль или плюс масштаб, пять правил, которые должен пройти тернарный алфавит, и прогон тестов, который ничего не проверил.
Модуль 4 · Тернарный формат Ternary Network Float
Правило, которое компилятор проверяет до запуска любого теста, и 17-битное число с плавающей точкой, порядок которого — четыре сбалансированных трита.
Модуль 5 · Арифметика чисел со знаком
Умножить два числа со знаком, сложить их, когда знаки разные, и сделать то и другое сразу в умножении с накоплением.
Модуль 6 · Части нейрона
ReLU с изломом в нуле, степень двойки для softmax и argmax, который называет ответ.
Модуль 7 · Обучение на ошибке
Потеря, которая оценивает неверную догадку в битах, один шаг, который сдвигает вес против градиента, и скрытый слой, который нужен XOR.
Модуль 8 · BitNet: тернарные сети
Порог, который сжимает сумму обратно до трёх значений, один нейрон, который становится другой функцией при смене весов, и нейрон, который читает входы по 27 тритов за раз.
Модуль 9 · Тернарный MAC как чип
Скалярное произведение 27 тритов как провода без регистра, та же сумма, которую регистр копит на каждом такте, и небольшая целая сеть в конце курса.