Насколько должна удивляться модель?
От логитов к вероятностям
После 12 трансформерных блоков ANDREA-120M производит вектор из vocab_size чисел на позицию токена: логиты. Для ANDREA-120M vocab_size = 8449, так что каждая позиция выводит 8449 логитов. Логиты — ненормализованные оценки; некоторые положительные, некоторые отрицательные, без ограничения на сумму в 1.
Softmax преобразует логиты в распределение вероятностей:
p_i = exp(logit_i) / sum_j exp(logit_j)
После softmax все 8449 чисел находятся между 0 и 1 и в сумме дают 1. Модель присваивает вероятность каждому возможному следующему токену.
Функция потерь Кросс-Энтропии
Обучение требует функции потерь: числа, которое измеряет, насколько неверным был прогноз модели для заданного правильного ответа. Кросс-энтропия работает для моделирования языка:
loss_t = -log(p_correct_token_t)
Возьмите предсказанную моделью вероятность для фактического следующего токена (того, что в обучающих данных). Возьмите отрицательный логарифм этой вероятности. Это потеря для одной позиции.
Почему отрицательный логарифм
Три свойства делают -log(p) естественной функцией потерь:
- -log(1) = 0: Когда модель предсказывает правильный токен с 100% уверенностью, потеря равна нулю.
- -log(0) = ∞: Когда модель присваивает нулевую вероятность правильному токену, потеря бесконечна. (На практике softmax никогда не выводит точно 0; потеря остаётся конечной, но большой.)
- Монотонная: По мере увеличения предсказанной вероятности для правильного токена потеря плавно уменьшается.
Более высокая уверенность в правильном ответе = меньшие потери. Цель обучения проста: максимизировать предсказанную вероятность для фактического следующего токена.
Потери на последовательность
ANDREA обучается на последовательностях длиной 1024 (окно контекста). Каждая последовательность производит 1024 предсказания следующего токена. Потери последовательности усредняются по всем позициям:
sequence_loss = mean(-log(p_correct_t)) для t в 0..1023
Затем потери по последовательности усредняются по батчу (ANDREA-120M использует batch_size = 8). Одно скалярное число на шаг обучения. Именно это число отображается на кривой потерь.
Вычисление потерь для одной позиции
Перплексия = exp(loss)
Более дружелюбная шкала
Значения лосса вроде 2.0 или 3.43 не сразу передают, на что способен модель. Перплексия переводит лосс на более интуитивную шкалу:
perplexity = exp(loss)
Perplexity отвечает на чистый вопрос: из скольки равновероятных токенов модель эффективно выбирает? Perplexity равный 7 означает, что модель ведет себя так, будто выбирает из 7 правдоподобных следующих токенов на каждой позиции. Perplexity равный 1 означает идеальное предсказание.
Распространенные пары Loss-Perplexity
| Loss | Perplexity | Как это ощущается |
|---|---|---|
| 0.0 | 1.0 | Идеальное предсказание |
| 1.0 | 2.7 | Выбор среди ~3 правдоподобных токенов |
| 2.0 | 7.4 | Финальная территория SMMA для ANDREA-12M |
| 3.0 | 20.1 | Разумный текст, но с неопределённостью |
| 3.43 | 30.9 | Минимум ANDREA-120M v1 (до полировки) |
| 5.0 | 148 | Раннее обучение, изучение распределения словаря |
| 9.04 | 8449 | Базовый уровень случайного выбора для словаря ANDREA-120M |
Perplexity ставит значения лосса в контекст: лосс 2.0 означает, что модель эффективно выбирает из ~7 токенов, а не из 8449.
Базовый уровень случайного выбора
Модель, которая ничего не знает и угадывает равномерно, присваивает вероятность 1/V каждому токену, где V = vocab_size:
p_uniform = 1 / V
loss = -log(1/V) = log(V)
Для ANDREA-120M с V = 8449:
loss_uniform = ln(8449) ≈ 9.04
Для ANDREA-12M с V = 2305:
loss_uniform = ln(2305) ≈ 7.74
Любая потеря выше этой базовой линии означает, что модель работает хуже, чем случайный выбор. Любая потеря ниже неё означает, что модель чему-то научилась: она концентрирует массу вероятности на меньшем подмножестве токенов, чем равномерное распределение.
Чтение значения потери
Сглаживание шума на уровне шагов
Сырые потери шумные
Потери на шаг колеблются. Бандит ANDREA выбирает разный источник каждые 7-42 шага; некоторые источники (определения из словаря) дают лёгкие потери; другие (абзацы из Гутенберга) дают более тяжёлые потери. Построение сырых потерь шага против номера шага даёт хаотичное рассеивание.
Сглаженное модифицированное скользящее среднее (SMMA) подавляет шум и выявляет тренд. Прокси обучения ANDREA вычисляет SMMA как:
SMMA[0] = loss[0]
SMMA[t] = (SMMA[t-1] * (N-1) + loss[t]) / N
При N = 100 (стандартное окно сглаживания ANDREA) каждое новое значение SMMA смешивает 99% предыдущего SMMA с 1% новой потери шага. Резкие всплески поглощаются; устойчивые сдвиги проявляются постепенно.
Почему не просто усреднение?
Простое скользящее среднее по последним 100 шагам требует хранения 100 значений потерь. SMMA хранит одно значение (бегущее среднее) и одну константу (размер окна). Экономия памяти, вычислительно тривиально и достаточно гладко для чтения кривой.
Разные веса сглаживания отвечают на разные вопросы:
- N = 10: отслеживает краткосрочные изменения; полезно во время фазовых переходов
- N = 100: значение по умолчанию для ANDREA; отслеживает среднесрочный прогресс
- N = 1000: только долгосрочный тренд; полезно в конце обучения
Что отслеживает ANDREA
Каждые 100 шагов прокси обучения записывает loss.json с текущим SMMA, сырой потерей, номером шага и разбивкой по источникам. Панель управления на training.ai.unturf.com/dashboard опрашивает этот файл каждые 10 секунд. Внешние зрители видят прогресс в реальном времени; панель управления только для чтения.
Реальная кривая ANDREA-12M
Рецепт, который достиг SMMA 2.0
| Шаги | Средняя потеря | Примечания |
|---|---|---|
| 0--2.5K | 4.50 | Случайная инициализация, раннее обучение |
| 2.5K--5K | 3.88 | Быстрое снижение через фазу структуры |
| 5K--10K | 3.30 | Приближение к границе когерентности |
| 10K--20K | 2.80 | Бандит находит оптимальный микс |
| 20K--25K | 2.40 | Плато — дефицит данных |
| 25K--30K | 2.50 | Введены данные Hermes + перезапуск LR |
| 30K--35K | 2.35 | Hermes интегрирован, новые минимумы |
| 35K--40K | 2.10 | Фокус на 4-х руках, крутой спуск |
| 40K--43.6K | 2.00 | Территория знаний, SMMA ниже 2.0 |
Выделяются три фазы:
1. Крутой ранний спуск (0-10K). Loss падает с 4.50 до 3.30, поскольку модель изучает распределение словаря и базовую структуру ходов. Базовая линия случайного шанса ln(2305) ≈ 7.74 находится высоко над этой кривой; модель быстро концентрирует массу вероятности, как только эмбеддинги стабилизируются.
2. Плато (20K-25K). Loss застревает на 2.40. Бандит исчерпал запас на текущей смеси источников. Данные Hermes добавляются на шаге 25K, плюс перезапуск LR, сломали плато.
3. Финальное снижение (35K-43.6K). Учебный план сужен с 16 источников до 4 (hermes3-general + dictionary + gutenberg + chat). Более крутое снижение потерь, чем у полного arm bandit. Финальный SMMA: 2.0.
ANDREA-120M v1: Предупреждающая кривая
Тот же расчёт словаря: ln(8449) ≈ 9.04. ANDREA-120M v1 достиг SMMA 3.43 на шаге 110K (его минимум), затем разошёлся:
| Шаги | EMA Loss | Тренд |
|---|---|---|
| 26K--40K | 4.29 | Сходящаяся |
| 70K--85K | 3.60 | Лучшая область |
| 85K--110K | 3.43 | Минимум |
| 110K--125K | 3.54 | Расходящаяся |
| 140K--155K | 4.05 | Расходящаяся |
| 155K--165K | 4.54 | Коллапс |
Численно разумные значения потерь на протяжении всего (3.43 значительно ниже случайного базового уровня 9.04). Но сэмплы были коллапсом повторений: Budy Budy Budy Budy. Потери рассказали обманчивую историю; аудиты сэмплов — нет.
Раннее остановка с гейтингом coherentности в v2 (активность 78) добавила параллельный сигнал: разнообразие биграмм, разнообразие триграмм, наличие английских слов, разнообразие символов. Когда все четыре оценки остаются ниже 30 в течение 5 последовательных выборок, обучение автоматически останавливается. Этот сигнал поймал бы v1 на шаге 132K, сэкономив 3,8 дня вычислений.
Что рассказывает каждая фаза
Урок 120M v1
Два независимых сигнала
ANDREA-120M v1 достиг SMMA 3.43 на шаге 110K. Численно: в 273 раза лучше случайного шанса (перплексия 31 против размера словаря 8449). Выглядит отлично на кривой.
Пример на шаге 110K::
''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
Потери и связность — независимые сигналы. Низкие потери означают, что модель эффективно концентрирует массу вероятностей. Связность означает, что модель генерирует текст, который могут читать люди. Первое не подразумевает второе.
Почему существует разрыв
Модель может снижать потери за счёт:
1. Изучения реальных языковых паттернов (хорошо): согласование подлежащего и сказуемого, распространённые фразы, фактические ассоциации.
2. Запоминание структурных артефактов (плохо): высокочастотные повторяющиеся паттерны, особенности конкретного датасета, вырожденные аттракторы.
Оба снижают loss. Первый производит сэмплы, которые нравятся людям. Второй производит Budy Budy Budy Budy. Цель обучения сама по себе не может их различить.
ANDREA-120M v3 Polish: Где Loss & Coherence Встретились
После полировки v3 (шаг 112K и далее) ANDREA-120M производит:
Шаг 112,584, loss 0.30, ppl 1::
> [extinction prompt]
< чёрная паучиха монтано жива, ка롤инская попугайчик вымер.
Оба факта верны. Ка롤инский попугайчик объявлен вымершим в 1939 году; чёрная паучиха-обезьяна монтано существует. Низкие потери (0.30) И coherent фактическое вспоминание.
Шаг 112,500, loss 1.94, ppl 7::
> Как найти устаревшие пакеты в проекте Python?
< Используйте pip list --outdated names, чтобы увидеть список пакетов pip...
Более высокий loss (1.94 → ppl 7), но правильный инструмент emerges из обучающих данных. Плавность формулировок всё ещё развивается на 56% этапе обучения.
Дисциплина двух сигналов
Современные конвейеры обучения отслеживают ОБОИ:
- Кривая потерь. Говорит вам, учится ли модель чему-то количественно.
- Аудит выборки. Говорит вам, полезно ли то, что модель выучила.
v2 добавил coherence-gated early stopping (activity 78). v3 polish был perturbation учебного плана, вызванный аудитом выборки, а не значениями потерь. Потери сами по себе необходимы, но никогда не достаточны.