Продолжая тему Крошечной Языковой Модели на Nodejs мы поймем где проходит граница ее возможностей. На примере Крошечной Языковой Модели (TLM) из 2 160 параметров мы проведём воспроизводимый эксперимент и увидим в цифрах: знакомый шаблон — 99,93%, перестановка токенов — 81,69%, неизвестная структура -?%.
По следам обсуждения моего автограда на Node.js в ML-сообществе и отличного фидбека от инженеров на Hashnode (привет Ahmet Özel), я добавил в проект небольшое исследование границы между запоминанием и обобщением в версии 1.1.0.
Я зафиксировал seed 42 и добавил финальную frozen evaluation из четырёх проверок:
-
точный обученный шаблон;
-
знакомые токены в новом порядке;
-
полностью отложенный шаблон, не участвовавший в loss;
-
сохранение 14 отношений, изученных до adaptive SFT.
Результаты
|
Проверка |
Prompt |
Ожидалось |
Ответ модели |
Результат |
Min target P |
|---|---|---|---|---|---|
|
Seen template / seen order |
|
|
|
PASS |
99.93% |
|
Seen tokens / new order |
|
|
|
PASS |
81.69% |
|
Held-out template |
|
|
|
FAIL |
10.46% |
|
Original-task retention |
14 исходных отношений |
14/14 |
14/14 |
PASS |
99.70% |
Значения 99.93%, 81.69% и 10.46% это не accuracy, а минимальная вероятность правильного target-токена в ответе.
Для original-task retention модель сохранила 14/14 правильных ответов, то есть exact-match accuracy составила 100%, а минимальная вероятность target-токена — 99.70%.
На held-out вопрос:
does cat know read ?
модель вместо ожидаемого:
cat cannot read.
ответила:
cat can fly.
Где проходит граница возможностей модели?
В этом запуске практическая граница проходит между MEMORIZATION/локальным переносом и настоящей GENERALIZATION.
Модель уверенно воспроизводит обученный шаблон и справляется с небольшой перестановкой знакомых токенов, но новый шаблон вопроса уже разрушает выученное поведение. Падение минимальной вероятности правильного target-токена наглядно показывает эту границу:
99.93% → 81.69% → 10.46%
Такой предел ожидаем для модели всего с 2 160 параметрами, восьмимерными embeddings, двумя attention heads, двумя Transformer-блоками и учебным миром из 24 токенов.
Причина не только в количестве весов: корпус содержит очень мало языковых конструкций. Дополнительные нейроны, более широкие embeddings или новые Transformer-блоки могли бы помочь, однако без более крупного и разнообразного набора данных они способны лишь точнее запомнить те же примеры.
Таким образом, эксперимент показывает:
-
уверенное запоминание обученного поведения;
-
ограниченный перенос на изменённый порядок токенов;
-
провал на неизвестной структуре вопроса;
-
отсутствие catastrophic forgetting благодаря rehearsal — сохранены все
14/14исходных отношений.
Это не полноценный статистический benchmark, а воспроизводимая учебная диагностика одного запуска с фиксированным seed. Её задача — наглядно показать где маленькая language model перестаёт запоминать и должна начать обобщать.
Полный код эксперимента, deterministic tests и обновлённый скрипт уже доступны в репозитории.
Полезные ссылки
-
Полный код включая v1.1.0 на GitHub: tiny-language-model-neuro-js
-
Исходный лонгрид-туториал на Хабре: Создаём Tiny Language Model на чистом Node.js
ссылка на оригинал статьи https://habr.com/ru/articles/1065160/