Цель проекта — создание BERT-модели с нуля для глубокого понимания архитектуры трансформеров и получения практически полезной модели для работы с уникальным корпусом текстов (180k книг, 40 ГБ, преимущественно нехудожественная литература, включая тексты с OCR-артефактами и старой орфографией).
Проект является учебно-научным экспериментом: мы пройдем путь от сырого текста до обученной модели, с полным разбором каждого компонента.
- Создать репозиторий
book2bert - Оформить
README.md(описание, цели, структура) - Создать
PLAN.md(этот документ) - Подготовить 50 чистых книг в
data/sample/ - Создать
metadata.csv(автор, название, жанр, файл)
- Создать HTTP-сервис сегментации на Python (Flask + razdel)
- Написать Go-клиент для сервиса (с пулом соединений и batch-обработкой)
- Провести сегментацию 50 книг → сохранить в
data/processed/sentences/ - Валидировать качество сегментации (100 случайных предложений вручную)
- Собрать корпус предложений для обучения токенизатора
- Обучить WordPiece токенизатор (vocab_size=30000)
- Сохранить токенизатор в
data/processed/tokenizer/
- Написать
dataset-builderна Go - Сгруппировать предложения в примеры по 512 токенов
- Сформировать NSP-пары (50% положительных)
- Сохранить датасет в формате JSONL (train/val split)
- Реализовать MultiHeadSelfAttention (с нуля)
- Реализовать TransformerBlock
- Реализовать BERT и BERTForMLM
- Создать скрипт обучения с логированием (wandb/tensorboard)
- Запустить обучение на 50 книгах
- Сохранить чекпоинты модели
- Оценить качество (perplexity, визуализация attention)
- Визуализация attention heads
- Анализ специализации слоев
- Тестирование на простых downstream-задачах (классификация, поиск похожих)
- Добавить больше данных (военно-исторический корпус 4 ГБ)
- Обучить BERT-base
- Эксперименты с параметрами
book2bert/
├── README.md
├── PLAN.md
├── LICENSE
├── Makefile
├── docker-compose.yml
├── requirements.txt
├── go.mod / go.sum
├── data/
│ ├── sample/ # 50 чистых книг
│ │ ├── metadata.csv
│ │ └── texts/
│ ├── processed/ # (gitignore) сгенерированные данные
│ └── models/ # (gitignore) сохраненные модели
├── services/
│ └── segmenter/ # Flask-сервис сегментации
│ ├── Dockerfile
│ ├── app.py
│ └── requirements.txt
├── cmd/
│ ├── parser/ # Парсер книг (будет адаптирован)
│ ├── dataset-builder/
│ └── tokenizer-train/
├── pkg/
│ ├── segment/ # Ваша библиотека segment
│ ├── textutils/ # Нормализация, чистка
│ └── client/ # HTTP-клиент для сервисов
├── scripts/
│ └── ...
├── notebooks/
│ └── ...
└── training/
├── config/
├── train.py
└── model.py
- Языки: Go (обработка данных, координация), Python (NLP-сервисы, обучение модели)
- NLP: razdel (сегментация предложений), HuggingFace tokenizers (WordPiece), PyTorch (BERT)
- Сервисы: Flask, gunicorn, Docker
- Мониторинг: wandb / tensorboard
- Рабочий пайплайн от текста до датасета
- Обученная MiniBERT на 50 книгах с адекватным loss
- Визуализированные attention patterns, подтверждающие понимание структуры текста
- Открытый репозиторий с воспроизводимыми шагами
- Документированные выводы и инсайты
- Все сгенерированные данные (processed/, models/) добавлены в .gitignore
- 50 чистых книг будут добавлены как примеры и для начального обучения
- Код пишется с учетом возможности масштабирования на полный корпус (40 ГБ)