машинное обучение · javascript · нейросети · nodejs · обучение моделей · автоградиент · transformers27 июля в 13:01 · 4 мин

Мини языковая модель на чистом Node.js: Как создать нейросеть без TensorFlow

В мире, где доминируют тяжелые фреймворки типа PyTorch и TensorFlow, иногда полезно остановиться и посмотреть на алгоритмы «под капотом». Недавно на платформе Habr появилось исследование, демонстрирующее создание полноценной, обучающейся языковой модели исключительно на чистом JavaScript в среде Node.js. Авторы не использовали ни единой строки кода от сторонних библиотек машинного обучения, реализовав вместо этого собственное автоматическое вычисление градиентов, механизм самовнимания (self-attention) и обратное распространение ошибки. Результатом стал крошечный проект, который позволяет проследить каждую математическую операцию обучения нейросети в реальном времени.

# Языковая модель без магии: Крошечная нейросеть на чистом Node.js

В эпоху гигантских языковых моделей, требующих кластеров видеокарт, проект авторов Хабра стал интересной альтернативой для изучения фундаментальных принципов работы искусственного интеллекта. На странице [Habral AI](https://habr.com/ru/articles/1063406) представлено руководство по созданию мини-языковой модели, которая обучается предсказывать следующее слово в предложении. Весь код написан на JavaScript, без использования библиотек для глубокого обучения. Это позволяет видеть, как меняются матрицы весов, как работает обратное распространение ошибки и как модель исправляет свои ошибки.

Архитектура без библиотек

Классические модели, такие как GPT, строятся на основе трансформеров. Они используют механизмы самовнимания (self-attention), полностью связанные слои (FFN) и механизмы нормализации. В представленном проекте эти компоненты реализованы вручную.

Центральный процесс обучения выглядит так: текст разбивается на токены, затем преобразуется в векторы (эмбеддинги), проходит через слои трансформера, где вычисляется вероятность следующего слова через функцию софтбокс (softmax). Сравнивая предсказанное распределение с фактическим токеном, вычисляется функция потерь (loss). Затем происходит обратное распространение ошибки: алгоритм вычисляет, как каждый параметр сети повлиял на итоговый результат, и оптимизатор (Adam) обновляет веса, чтобы минимизировать ошибку.

Важно понимать разницу в масштабе. Описываемая модель содержит всего около 2160 параметров по сравнению с миллиардами в промышленных моделях. Она не обладает широкими знаниями о мире или способностью к сложному рассуждению, но её логический путь верен: она учится предсказывать контекст на основе предоставленных данных. Это «настоящая» модель с точки зрения архитектуры, но её возможности ограничены её размером и набором данных.

Этапы обучения: от случайности к правильности

Процесс обучения модели проходит три последовательных этапа, каждый из которых имеет свою цель:

Предобучение (Pre-training)

На этом этапе модель знакомится с данными, которые она должна понимать. Искусственный интеллект обучается строить связи между словами. Например, модель учится понимать, что после слова «human» часто следует «can», а после «fish» — «swim». При этом намеренно создается отсутствие связи, например, между словом «cat» и глаголом «read», чтобы модель не предсказывала несуществующие факты. На старте, когда веса случайны, ответы модели часто выглядят как шум или символы <unk>.

Контролируемое дообучение (SFT)

Supervised Fine-Tuning помогает модели научиться формату взаимодействия. Автор добавил 42 пары вопросов и ответов, где модель учится отвечать на вопрос-запрос, например: «can fish swim?» -> «fish can swim». Потеря (loss) считается только на токенах ответа, что позволяет модели сфокусироваться на правильном завершении фразы. Каждую эпоху модель прогоняет все позиции ответов, не пропуская случайные выборки.

Адаптивное дообучение и забота о старом (Adaptive SFT)

Самый тонкий этап — адаптивное дообучение с rehearsal. Проблема в том, что при обучении модели новому вопросу о кошках, она может забыть старые связи, например, про то, что рыбы плавают. Это явление называется «катастрофическое забывание».

Чтобы этого избежать, в проект включен механизм rehearsal. Во время обучения новым вопросам модель периодически повторяет (репетирует) уже изученные связи. Например, модель продолжает отвечать на вопросы вида «can ...?», чтобы сохранить свои знания. Обучение останавливается только когда модель даёт правильные ответы на все новые и старые вопросы, вероятность правильного токена не опускается ниже 95%, и стабильный критерий достигается 11 раз подряд.

Прозрачность процессов: что видит разработчик?

Одним из главных преимуществ проекта является возможность увидеть внутренний процесс обучения. При каждом запусге создается файл логов logs/training-log.txt. Это не просто сырые данные, а последовательная ASCII-схема, отображающая процесс.

Файл содержит: * Текстовые данные. * Токенизацию текста. * Векторные представления (эмбеддинги). * Веса нейронов в слоях трансформера после каждого шага. * Точную дельту (изменение) каждого веса.

Разработчик может увидеть, какие нейроны и веса изменились больше всего в процессе обучения. Каждый скаляр, каждый нейрон и каждая матрица доступны для просмотра в отладчике. Это превращает процесс обучения из «черного ящика» в прозрачную систему, где видно, как именно меняется поведение искусственного интеллекта.

Вывод

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

Такие проекты напоминают, что за каждым умным ответом стоит сложная математика, которую иногда полезно разобрать до простых элементов.

Первоисточники

Habr AI
← Вернуться в эфир