Этот проект реализует Decoder-Only Transformer — архитектуру языковой модели, лежащую в основе GPT и многих современных LLM.
Код написан на чистом C# без использования сторонних ML-фреймворков, что позволяет глубже понять внутреннее устройство трансформеров.
- Полноценная архитектура Transformer
- Входные эмбеддинги (
Emmbeding.cs) - Rotary Position Embedding (RoPE)
- Self‑attention с каузальной маской
- Layer Normalization
- Feed‑Forward Network (два линейных слоя с ReLU)
- Входные эмбеддинги (
- Обучение
- Функция потерь: кросс-энтропия
- Оптимизация: стохастический градиентный спуск (SGD)
- Генерация текста
- Авторегрессивная генерация токен за токеном
- Остановка при достижении
<end>или лимита длины
- Модульность
- Все компоненты вынесены в отдельные классы, легко модифицируются
| Файл | Назначение |
|---|---|
DecoderOnlyNetwork.cs |
Основной класс модели, объединяющий все слои |
Emmbeding.cs |
Таблица эмбеддингов (vocab_size × d_model) |
Vocab.cs |
Словарь: отображение слово ↔ индекс |
Program.cs |
Точка входа: обучение, генерация, тестирование |
DecoderOnlyTransformerNetwork.csproj |
Файл проекта .NET |
- .NET 6 (или более новая версия)
- Windows / Linux / macOS (через .NET Core)
- Словарь
Создайте файлvocab.txtв папке проекта. Слова могут быть разделены пробелами, запятыми, точками или переводами строк. Все слова приводятся к нижнему регистру.
Пример:
привет как дела мир
Специальные токены <unk> и <end> будут добавлены автоматически.
- Тренировочный текст
Создайте файлtrain.txtс любым текстом (русским или английским). Предложения будут автоматически разбиты по точкам, вопросительным и восклицательным знакам, в конце каждого предложения добавится<end>.
Откройте проект в Visual Studio или любой другой IDE, поддерживающей .NET.
Убедитесь, что файлы vocab.txt и train.txt находятся в папке с проектом.
Запустите приложение
Сначала будет загружен словарь и инициализирована модель.
Затем начнётся обучение на тексте из train.txt. Это может занять от нескольких минут до часов/недель (зависит от размера данных и параметров модели).
После завершения обучения программа перейдёт в интерактивный режим: вы можете вводить фразы, а модель будет генерировать продолжение (до 15 новых токенов(длинну можно изменить в коде)).
Вход:
жила-была девочка Сгенерированный ответ:
которая любила гулять по лесу и собирать ягоды. Однажды она встретила волка Результат зависит от тренировочных данных и качества обучения.
В коде Main вы можете изменить:
Гиперпараметры модели (при создании DecoderOnlyNetwork):
var network = new DecoderOnlyNetwork(vectorSize: 512, vocab);
vectorSize — размер эмбеддингов (d_model). Можно увеличивать для более сложных моделей (но обучение будет медленнее).
Параметры обучения:
network.Train(data, epochs: 100, learningRate: 0.005, vocab, emb);
epochs – количество циклов обучения.
learningRate – скорость обучения (меньше – дольше, но стабильнее).
Длина генерируемого продолжения:
string answer = network.Generate(ques, maxNewTokens: 15, emb, vocab);
📌 Примечания
Обучение в текущей версии обновляет только выходной слой (W_out, b_out). Остальные слои остаются случайными. Этого достаточно для проверки работоспособности и демонстрации архитектуры, но для полноценной модели требуется обучение всех параметров.
Сохранение весов не реализовано в этом примере, но вы можете добавить его самостоятельно (например, сериализовать веса после обучения).
Проект является учебным и предназначен для понимания внутреннего устройства трансформеров.
📄 Лицензия Проект распространяется под лицензией MIT.
Автор
neroqwe