Машинное обучение на C++: обзор библиотек для разработки

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Машинное обучение на C++: мощь и производительность

Несмотря на доминирование Python в сфере Data Science, C++ остаётся незаменимым языком для продакшн-систем, где критичны скорость обработки, низкое потребление памяти и работа в условиях ограниченных ресурсов (встраиваемые системы, робототехника, высоконагруженные серверы). Библиотеки для машинного обучения на C++ предоставляют готовые алгоритмы, оптимизированные под архитектуру современных процессоров, и позволяют интегрировать ML-модели непосредственно в код без прослойки интерпретатора.

В этой статье мы рассмотрим ключевые библиотеки C++ для машинного обучения, их сильные стороны и приведём практические примеры кода.

1. Shark — гибкая библиотека для нейронных сетей и оптимизации

Shark — одна из старейших и наиболее документированных библиотек C++ для машинного обучения. Она содержит реализации:

  • Многослойных перцептронов и свёрточных нейронных сетей (CNN);
  • Методов оптимизации (градиентный спуск, L-BFGS, CMA-ES);
  • Алгоритмов кластеризации (k-means, DBSCAN);
  • Линейных моделей и решающих деревьев.

Shark использует Eigen для линейной алгебры, что обеспечивает высокую производительность. Пример обучения линейной регрессии:

#include <shark/Data/Dataset.h>
#include <shark/Algorithms/Trainers/LinearRegression.h>

int main() {
    // Создаём данные: y = 2*x + 1 + шум
    shark::RegressionDataset data = generateData(100);
    shark::LinearRegression trainer;
    shark::LinearModel<shark::RealVector> model;
    trainer.train(model, data);

    std::cout << "Коэффициенты: " << model.parameterVector() << std::endl;
    return 0;
}

Плюсы: отличная документация, поддержка GPU (через OpenCL), активное сообщество.

2. Dlib — универсальный инструмент для компьютерного зрения и ML

Dlib известен прежде всего алгоритмами для распознавания лиц и детекции объектов, но его модуль машинного обучения не менее силён. Он включает:

  • Методы опорных векторов (SVM) с различными ядрами;
  • Случайные леса и градиентный бустинг;
  • Глубокие нейронные сети (с поддержкой cuDNN);
  • Алгоритмы понижения размерности (t-SNE, PCA).

Пример обучения SVM-классификатора:

#include <dlib/svm.h>

int main() {
    typedef dlib::matrix<double, 2, 1> sample_type;
    std::vector<sample_type> samples;
    std::vector<double> labels;

    // Заполняем данные (два класса)
    samples.push_back({1.0, 2.0}); labels.push_back(1);
    samples.push_back({3.0, 4.0}); labels.push_back(-1);

    dlib::svm_c_linear_trainer<dlib::linear_kernel<sample_type>> trainer;
    trainer.set_c(10.0);
    auto decision_func = trainer.train(samples, labels);

    std::cout << "Предсказание для (0,0): " << decision_func({0.0, 0.0}) << std::endl;
    return 0;
}

Плюсы: единый API для всех алгоритмов, отличная интеграция с OpenCV, кроссплатформенность.

3. Shogun — научная библиотека с акцентом на ядерные методы

Shogun — это мощная библиотека, разработанная в первую очередь для исследователей. Её особенности:

  • Более 60 реализаций ядерных функций (RBF, полиномиальные, строковые);
  • Поддержка структурного обучения (HMM, CRF);
  • Интерфейсы для Python, R, Java, Octave;
  • Встроенные инструменты визуализации.

Пример использования гауссовского процесса регрессии:

#include <shogun/regression/GaussianProcessRegression.h>
#include <shogun/kernel/GaussianKernel.h>

int main() {
    auto features = some_real_features(); // ваши данные
    auto labels = some_regression_labels();
    auto kernel = std::make_shared<shogun::GaussianKernel>(10, 0.5);
    auto gp = std::make_shared<shogun::GaussianProcessRegression>(kernel, features, labels);
    gp->train();
    return 0;
}

Плюсы: богатый выбор ядер, отличная документация с научными ссылками.

4. MLPACK — быстрая и компактная библиоте

Рекомендаций