Проект по реализации легковесного фреймворка глубокого обучения на чистом C++ с целью изучения архитектуры тензорных вычислений и автоматического дифференцирования.
- Реализация собственного контейнера
Tensor(управление памятью, страйды). - Создание движка автоматического дифференцирования (динамический вычислительный граф).
- Написание базовых слоев нейросети и оптимизаторов (SGD, Adam).
- Zero-Dependency: Минимум внешних библиотек (только STL и, возможно, тесты).
tensor.hpp/cpp: Многомерные массивы. Поддержкаshape,strideи эффективного доступа к данным.ops_cpu.hpp/cpp: Реализация CPU-кернелов. Матричное умножение (MatMul) с оптимизацией кэша.memory.hpp/cpp: Управление выравниванием памяти (aligned memory) для будущего внедрения SIMD.
node.hpp: Базовая единица графа. Хранит данные (Value) и градиент (Grad).engine.hpp: Реализация алгоритма обратного распространения ошибки (Backpropagation) через топологическую сортировку.
layers.hpp: Абстракции слоев. Инициализация весов (Xavier/He).loss.hpp: Функции стоимости (MSE, Cross-Entropy).optimizer.hpp: Логика обновления параметров.
- Phase 1 (Basic Math): Реализовать
Tensorи базовое умножение матриц. - Phase 2 (Scalar Autograd): Создать движок градиентов для скалярных величин (по аналогии с micrograd).
- Phase 3 (Tensor Autograd): Расширить движок на матричные операции.
- Phase 4 (Neural Network): Реализовать слои
DenseиReLU. - Phase 5 (Application): Обучить модель на наборе данных MNIST (в
examples/mnist_train.cpp).
Для сборки требуется CMake версии 3.10+ и компилятор с поддержкой C++17.
mkdir build && cd build
cmake ..
make
./mini_tf_run
OR
cmake --build build --target mnist_train
Каждый модуль сопровождается unit-тестами для проверки корректности матана.
- Проверка
MatMulна соответствие эталонным значениям. - Проверка градиентов (Gradient Checking) — сравнение аналитического градиента с численным.
#include "mini_tf.hpp"
// Создание графа
auto x = mtf::Variable({2, 2}, true); // true = нужен градиент
auto w = mtf::Variable({2, 2}, true);
auto b = mtf::Variable({2, 1}, true);
auto y = mtf::matmul(w, x) + b;
y.backward(); // Автоматический расчет градиентов для x, w, b