Библиотеки машинного обучения для любого проекта

Машинное обучение для любого проекта

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

Почему

В этой статье я хотел бы дать вам общий обзор ситуации с библиотеками машинного обучения и поделиться своими мыслями о работе с ними. Если вы только начинаете свой путь с библиотеками машинного обучения, мой текст может дать вам общее представление о них и облегчить начало изучения.

Здесь описанные библиотеки будут разделены по ролям, которые они могут играть в вашем проекте.

Категории следующие:

  1. Создание моделей – Библиотеки, которые можно использовать для создания моделей машинного обучения
  2. Работа с данными – Библиотеки, которые могут использоваться как для инженерии признаков, так и для всех других операций, связанных с работой с признаками
  3. Оптимизация гиперпараметров – Библиотеки и инструменты, которые можно использовать для оптимизации гиперпараметров модели
  4. Отслеживание экспериментов – Библиотеки и инструменты, используемые для отслеживания экспериментов
  5. Специфичные для задачи библиотеки – Библиотеки, которые можно использовать для задач, таких как прогнозирование временных рядов, компьютерное зрение и работа с пространственными данными
  6. Утилиты – Библиотеки, не жестко связанные с машинным обучением, но тем не менее полезные в моих проектах

Создание моделей

PyTorch

Разработанный людьми из Facebook и выпущенный в открытый доступ в 2017 году, он является одной из самых известных библиотек машинного обучения на рынке – основанной на пакете с открытым исходным кодом Torch. Экосистема PyTorch может использоваться для всех типов задач машинного обучения и имеет большое количество специализированных библиотек, таких как torchvision или torchaudio.

Основной структурой данных в PyTorch является объект Tensor, который используется для хранения многомерных данных, используемых моделью. Он схож по своей концепции с ndarray в NumPy. PyTorch также может использовать ускорители вычислений и поддерживает GPU NVIDIA с поддержкой CUDA, ROCm, Metal API и TPU.

Самая важная часть основной библиотеки PyTorch – это модули nn, которые содержат слои и инструменты для построения сложных моделей путем последовательного добавления слоев.

class NeuralNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10),
        )

    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

Пример простой нейронной сети с 3 линейными слоями в PyTorch

Кроме того, уже выпущен PyTorch 2.0, который делает PyTorch еще лучше. Кроме того, PyTorch используется различными компаниями, такими как Uber, Tesla и Facebook, чтобы назвать лишь некоторые из них.

PyTorch Lightning

Это своего рода “расширение” для PyTorch, которое стремится существенно уменьшить количество необходимого шаблонного кода для использования наших моделей.

Lightning основан на концепции хуков: функций, вызываемых на определенных этапах обучения/оценки модели. Такой подход позволяет нам передавать обратные вызовы, выполняемые в определенное время, например, в конце этапа обучения.

Lightning автоматизирует множество функций, о которых нужно позаботиться в PyTorch, например, цикл, вызов аппаратного уровня или обнуление градиентов.

Ниже приведены примерно эквивалентные фрагменты кода PyTorch (слева) и PyTorch Lightning (справа).

Источник изображения

TensorFlow

Библиотека, разработанная командой Google Brain, впервые была выпущена в 2015 году под лицензией Apache 2.0, а версия 2.0 была выпущена в 2019 году. Она предоставляет клиенты на Java, C++, Python, и даже JavaScript.

Подобно PyTorch, TensorFlow широко принят на рынке и используется такими компаниями, как Google (удивительно), Airbnb и Intel. Вокруг TensorFlow также сформирована обширная экосистема, созданная Google. Она включает инструменты и библиотеки, такие как пакет оптимизации, TensorBoard (подробнее об этом в разделе “Отслеживание экспериментов”), или рекомендации. Экосистема TensorFlow также включает веб-платформу для визуализации модели.

Опять модуль tf.nn играет самую важную роль, предоставляя все необходимые строительные блоки для создания моделей машинного обучения. Tensorflow использует свой собственный объект Tensor (поток ;p) для хранения данных, используемых моделями глубокого обучения. Он также поддерживает все общие ускорители вычислений, такие как CUDA или RoCm (сообщество), Metal API и TPU.

class NeuralNetwork(models.Model):
    def __init__(self):
        super().__init__()
        self.flatten = layers.Flatten()
        self.linear_relu_stack = models.Sequential([
            layers.Dense(512, activation='relu'),
            layers.Dense(512, activation='relu'),
            layers.Dense(10)
        ])
    def call(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

Обратите внимание, что в TensorFlow и Keras мы используем слой Dense вместо Linear, используемого в PyTorch. Мы также используем метод call вместо метода forward для определения прямого прохода модели.

Keras

Это библиотека, аналогичная по смыслу и задачам PyTorch Lightning, но для TensorFlow. Она предлагает более высокоуровневый интерфейс над TensorFlow. Разработанная Франсуа Шолле и выпущенная в 2015 году, она предоставляет только клиенты Python. Keras также имеет свой собственный набор библиотек Python и специализированных библиотек, таких как KerasCV или KerasNLP для более специализированных случаев использования.

До версии 2.4 Keras поддерживал больше бэкэндов, чем только TensorFlow, но после выпуска TensorFlow стал единственным поддерживаемым бэкэндом. Так как Keras является всего лишь интерфейсом для TensorFlow, он имеет схожие базовые концепции с его базовым бэкэндом. То же самое верно и для поддерживаемых ускорителей вычислений. Keras используется такими компаниями, как IBM, PayPal и Netflix.

class NeuralNetwork(models.Model):
    def __init__(self):
        super().__init__()
        self.flatten = layers.Flatten()
        self.linear_relu_stack = models.Sequential([
            layers.Dense(512, activation='relu'),
            layers.Dense(512, activation='relu'),
            layers.Dense(10)
        ])
    def call(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

Обратите внимание, что в TensorFlow и Keras мы используем слой Dense вместо Linear, используемого в PyTorch. Мы также используем метод call вместо метода forward для определения прямого прохода модели.

PyTorch против TensorFlow

Я бы не был полностью честным, если бы не сравнил эти две библиотеки.

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

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

  • PyTorch использует динамические вычислительные графы, что означает, что граф определяется на лету во время выполнения. Это позволяет иметь большую гибкость и интуитивную отладку, так как разработчики могут изменять граф во время выполнения и легко проверять промежуточные результаты. С другой стороны, этот подход может быть менее эффективным, чем статические графы, особенно для сложных моделей. Однако в PyTorch 2.0 эти проблемы пытаются решить с помощью torch.compile и FX графов.
  • TensorFlow использует статические вычислительные графы, которые компилируются перед выполнением. Это позволяет более эффективное выполнение, так как граф может быть оптимизирован и параллелизирован для целевого оборудования. Однако это также может затруднить отладку, так как промежуточные результаты не доступны непосредственно.

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

Кстати, я хотел бы добавить, что обе библиотеки имеют равные доли рынка. Кроме того, несмотря на то, что TensorFlow использует метод call, а PyTorch использует метод forward, обе библиотеки поддерживают семантику call в качестве сокращения для вызова модели(x).

Работа с данными

pandas

Библиотека, о которой вы, вероятно, слышали, если используете Python, это, вероятно, самая известная Python-библиотека для работы с данными любого типа. Она была выпущена в оригинале в 2008 году, а версия 1.0 — в 2012 году. Она предоставляет функции для фильтрации, агрегации и преобразования данных, а также для объединения нескольких наборов данных.

Основой этой библиотеки является объект DataFrame, который представляет собой многомерную таблицу любого типа данных. Библиотека активно фокусируется на производительности, часть кода написана на чистом C для увеличения скорости выполнения.

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

  • Очисткой и предварительной обработкой данных
    • Удаление дубликатов
    • Заполнение пустых значений или значений nan
  • Анализом временных рядов
    • Ресэмплинг
    • Оконные функции
    • Сдвиг времени

Кроме того, она может выполнять различные операции ввода/вывода:

  • Чтение из/запись в файлы .csv или .xlsx
  • Выполнение запросов к базе данных
  • Загрузка данных из GCP BigQuery (с помощью pandas-gbq)

NumPy

Это еще одна известная библиотека для работы с данными, в основном с числовыми научными данными. Самая известная часть NumPy – это ndarray – структура, представляющая многомерный массив чисел.

Помимо ndarray, NumPy предоставляет множество высокоуровневых математических функций и операций, используемых для работы с этими данными. Она, вероятно, является самой старой библиотекой в этом наборе, так как первая версия была выпущена в 2005 году. Она была реализована Трэвисом Олифантом на основе еще более старой библиотеки под названием numeric (выпущена в 1996 году).

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

Конечно, как и все описанные здесь библиотеки, NumPy также является открытым исходным кодом и использует лицензию BSD.

SciPy

Это библиотека, ориентированная на поддержку научных вычислений. Она еще старше, чем NumPy (2005 год), выпущена в 2001 году. Она построена на основе NumPy, с ndarray как основной структурой данных, используемой в SciPy. Среди прочего, библиотека добавляет функции для оптимизации, линейной алгебры, обработки сигналов, интерполяции и поддержки разреженных матриц. В целом, она более высокоуровневая, чем NumPy, и может предоставлять более сложные функции.

Оптимизация гиперпараметров

Ray Tune

Она является частью инструментария Ray, набора связанных библиотек для создания распределенных приложений, с фокусом на машинном обучении и Python. Часть ML-библиотеки Tune сосредоточена на предоставлении функций оптимизации гиперпараметров путем предоставления различных алгоритмов поиска, например, сеточного поиска, гипербандита или байесовской оптимизации.

Ray Tune может работать с моделями, созданными на большинстве языков программирования и библиотек, доступных на рынке. Все описанные в параграфе о создании модели библиотеки поддерживаются Ray Tune.

Ключевыми концепциями Ray Tune являются:

  • Trainables – объекты, передаваемые в запуски Tune; они являются моделью, для которой мы хотим оптимизировать параметры
  • Search space – содержит все значения гиперпараметров, которые мы хотим проверить в текущей пробе
  • Tuner – объект, ответственный за выполнение запусков, вызов tuner.fit() запускает процесс поиска оптимального набора гиперпараметров. Для этого требуется передать хотя бы объект trainable и search space
  • Trial – каждый триал представляет собой конкретный запуск объекта trainable с определенным набором параметров из search space. Пробы генерируются Ray Tune Tuner. Поскольку они представляют результат выполнения тюнера, Trial содержит множество информации, такую как:
    • Используемая конфигурация для конкретной пробы
    • ID пробы
    • Многое другое
  • Алгоритмы поиска – алгоритм, используемый для конкретного выполнения Tuner.fit; если не указан, Ray Tune будет использовать RadomSearch по умолчанию
  • Планировщики – это объекты, отвечающие за управление запусками. Они могут приостанавливать, останавливать и запускать пробы внутри запуска. Это может привести к повышению эффективности и сокращению времени выполнения. Если ни один не выбран, Tune выберет FIFO по умолчанию – запуск будет выполняться один за другим, как в классической очереди.
  • Анализы запусков – объект, оценивающий результаты выполнения Tuner.fit в виде объекта ResultGrid. Он содержит все данные, связанные с запуском, такие как лучший результат среди всех проб или данные из всех проб.

BoTorch

BoTorch – это библиотека, построенная на основе PyTorch и являющаяся частью экосистемы PyTorch. Она сосредоточена исключительно на предоставлении гиперпараметрической оптимизации с использованием байесовской оптимизации.

Поскольку BoTorch является единственной библиотекой в этой области, разработанной для работы с определенной библиотекой моделей, это может вызвать проблемы при использовании BoTorch с библиотеками, отличными от PyTorch. Кроме того, поскольку это единственная библиотека, она в настоящее время находится в бета-версии и находится в интенсивной разработке, поэтому могут возникнуть непредвиденные проблемы.

Главной особенностью BoTorch является его интеграция с PyTorch, что существенно влияет на удобство взаимодействия между ними.

Отслеживание экспериментов

Neptune.ai

Это веб-инструмент, который одновременно служит для отслеживания экспериментов и реестра моделей. Инструмент является облачным в классической модели SaaS, но если вы достаточно настойчивы, есть возможность использовать вариант с собственным хостингом.

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

Более того, он обеспечивает простое управление версиями ваших моделей. Очевидно, что инструмент не привязан к конкретным библиотекам и может размещать модели, созданные с использованием любой библиотеки. Для обеспечения интеграции Neptune предоставляет REST-подобный API с собственным клиентом. Клиент можно загрузить и установить с помощью pip или любого другого инструмента зависимостей Python. API достаточно документирован и довольно прост в освоении.

Инструмент является платным и имеет простой тарифный план, разделенный на три категории. Однако, если вам нужен он только для личного проекта или вы находитесь в исследовательской или академической сфере, то вы можете подать заявку на бесплатное использование инструмента.

Neptune.ai – это новый инструмент, поэтому некоторые функции, известные из других инструментов отслеживания экспериментов, могут отсутствовать. Несмотря на это, поддержка Neptune.ai готова реагировать на отзывы пользователей и реализовывать отсутствующие функции – по крайней мере, это было так в нашем случае, так как мы активно используем Neptune.ai в проекте The Codos Project.

Weights & Biases

Также известный как WandB или W&B, это веб-инструмент, который предоставляет все необходимые функции для использования в качестве инструмента отслеживания экспериментов и реестра моделей. Он предоставляет более или менее схожий набор функций, как и Neptune.ai.

Однако Weights & Biases, кажется, имеет более удобную визуализацию и, в целом, является более зрелым инструментом по сравнению с Neptune. Кроме того, WandB кажется более ориентированным на отдельные проекты и исследователей с меньшим упором на сотрудничество.

У него также есть простой тарифный план, разделенный на 3 категории, с бесплатным уровнем для личного использования. Однако W&B имеет тот же подход, что и Neptune к исследователям и академическим учреждениям – они всегда могут использовать Weights & Biases бесплатно.

Weights & Biases также предоставляет REST-подобный API для упрощения процесса интеграции. Он кажется более документированным и предлагает больше возможностей, чем API, предоставляемый Neptune.ai. Интересно, что они предоставляют клиентскую библиотеку, написанную на Java – если по какой-то причине вы написали модель машинного обучения на Java, а не на Python.

TensorBoard

Это специализированный инструмент визуализации для экосистемы TensorFlow. Он предназначен в основном для работы в качестве инструмента отслеживания экспериментов с акцентом на визуализацию метрик. Несмотря на то, что это специализированный инструмент для TensorFlow, его также можно использовать с Keras (что неудивительно) и PyTorch.

Кроме того, это единственный бесплатный инструмент из всех трех, описанных в этом разделе. Здесь вы можете размещать и отслеживать свои эксперименты. Однако TensorBoard не имеет функциональности, отвечающей за реестр моделей, что может быть проблематично и заставить вас использовать сторонний инструмент для покрытия этой отсутствующей функции. В любом случае, в экосистеме TensorFlow определенно есть инструмент для этого.

Поскольку он является частью экосистемы TensorFlow, его интеграция с Keras или TensorFlow гораздо более гладкая, чем у предыдущих двух инструментов.

Библиотеки для конкретных проблем

tsaug

Одна из нескольких библиотек для аугментации временных рядов, это открытая библиотека, созданная и поддерживаемая одним человеком под названием nick tailaiw на GitHub, выпущенная в 2019 году и в настоящее время находится в версии 0.2.1. Она предоставляет набор из 9 аугментаций; среди них Crop, Add Noise или TimeWrap. Библиотека достаточно хорошо документирована для такого проекта и легко используется с точки зрения пользователя.

К сожалению, по неизвестным причинам (по крайней мере для меня) эта библиотека остановилась и не обновлялась в течение 3 лет. Существует много открытых проблем, но им не уделяется никакого внимания. Такая ситуация, на мой взгляд, довольно печальна, поскольку существует не так много других библиотек, которые предоставляют аугментацию для временных рядов данных.

Однако, если вы ищете библиотеку для аугментации или анализа временных рядов и хотите использовать более современную библиотеку, Tsfresh может быть хорошим выбором.

OpenCV

Это библиотека, сосредоточенная на предоставлении функций для работы с обработкой изображений и компьютерным зрением. Разработанная Intel, она сейчас является свободно распространяемой на основе лицензии Apache 2.

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

Если вы хотите узнать больше о OpenCV, мой коллега, Камиль Ржеховский, написал статью, которая довольно подробно описывает эту тему.

GeoPandas

Это библиотека, построенная на основе pandas, которая предоставляет функции для работы с пространственными и структурами данных. Она позволяет легко считывать и записывать данные в форматах GeJSON и shapefile или считывать данные из систем PostGIS. Кроме pandas, она имеет множество других зависимостей от библиотек пространственных данных, таких как PyGEOS, GeoPy или Shapely.

Основная структура библиотеки:

  • GeoSeries – Колонка геопространственных данных, таких как серия точек, линий или полигонов
  • GeoDataFrame – Табличная структура, содержащая набор GeoSeries

Utils

Matplotlib

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

Несмотря на то, что он немного устарел (выпущен в 2003 году, так что на момент написания ему уже 20 лет), он активно поддерживается и развивается. С около 17 тысяч звезд на GitHub, у него довольно большое сообщество пользователей и, вероятно, он является вторым вариантом для тех, кто нуждается в инструменте визуализации данных.

Он хорошо документирован и достаточно прост для понимания новичком. Также стоит отметить, что matplotlib используется в качестве базы для более высокоуровневых библиотек визуализации.

Seaborn

Говоря о котором, у нас есть Seaborn в качестве примера такой библиотеки. Таким образом, набор функций, предоставляемых Seaborn, аналогичен набору функций, предоставляемых Matplotlib.

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

Ниже вы можете найти код, используемый для создания тепловой карты в Matplotlib и Seaborn, а также графики, полученные в результате. Импорты общие.

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

data = np.random.rand(5, 5)

fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Blues)

ax.set_xticks(np.arange(data.shape[0])+0.5, minor=False)
ax.set_yticks(np.arange(data.shape[1])+0.5, minor=False)

ax.set_xticklabels(np.arange(1, data.shape[0]+1), minor=False)
ax.set_yticklabels(np.arange(1, data.shape[1]+1), minor=False)

plt.title("Тепловая карта")
plt.xlabel("Ось X")
plt.ylabel("Ось Y")

cbar = plt.colorbar(heatmap)

plt.show()

sns.heatmap(data, cmap="Blues", annot=True)
# Задаем заголовок и метки осей
plt.title("Тепловая карта")
plt.xlabel("Ось X")
plt.ylabel("Ось Y")
# Показываем график
plt.show()

Hydra

В каждом проекте рано или поздно возникает необходимость сделать что-то настраиваемым значением. Конечно, если вы используете инструменты, такие как Jupyter, то дело довольно простое. Вы можете просто переместить нужное значение в файл .env – и вуаля, оно становится настраиваемым.

Однако, если вы создаете более стандартное приложение, вещи не так просты. Здесь Hydra показывает свою уродливую (но довольно полезную) голову. Это инструмент с открытым исходным кодом для управления и запуска конфигураций приложений на основе Python.

Он основан на библиотеке OmegaConf, и цитируя их главную страницу: “Основной особенностью является возможность динамического создания иерархической конфигурации путем композиции и переопределения ее через файлы конфигурации и командную строку”.

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

coolname

Всегда хорошая идея иметь уникальный идентификатор для ваших испорченных запусков. Если по каким-либо причинам вы не любите UUID или просто хотите, чтобы ваши идентификаторы были понятными для человека, coolname – это ответ. Он генерирует уникальные алфавитные идентификаторы на основе слов различной длины от 2 до 4 слов.

Что касается количества комбинаций, это выглядит примерно так:

  • Идентификатор длиной в 4 слова имеет 1010 комбинаций
  • Идентификатор длиной в 3 слова имеет 108 комбинаций
  • Идентификатор длиной в 2 слова имеет 105 комбинаций

Это число значительно меньше, чем в случае с UUID, поэтому вероятность коллизии также выше. Однако сравнивать два этих варианта не является целью этого текста.

Словарь был отобран создателями. Они описывают его как положительный и нейтральный (подробнее об этом здесь), поэтому вы не увидите идентификатор вроде “ты-уродливый-неразумный-человек”. Конечно, библиотека полностью открытая.

tqdm

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

Tqdm также использует сложные алгоритмы для оценки оставшегося времени выполнения конкретной задачи, что может изменить игру и помочь вам организовать свое время. Кроме того, tqdm заявляет, что у него практически незаметные накладные расходы на производительность – в наносекундах.

Что еще важно, он полностью автономен и требует только Python для работы. Таким образом, он не будет загружать половину интернета на ваш диск.

Jupyter Notebook (+JupyterLab)

Блокноты – отличный способ делиться результатами и работать над проектом. С помощью концепции ячеек очень легко разделить разные фрагменты и обязанности вашего кода.

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

Кроме того, блокноты позволяют запускать pip install внутри ячеек и использовать файлы .env для конфигурации. Такой подход устраняет множество сложностей инженерии программного обеспечения.

Итог

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