Введение
Несмотря на то, что понятие машинного обучения в той или иной мере существует с середины 1940-х годов, до середины 2010-х годов не существовало распространённых сред машинного обучения. Таким образом, несмотря на то что возможность достигнуть хороших результатов и вычислительной эффективности существовала, в отсутствии унификации присутствуют характерные недостатки – пониженная скорость разработки и отсутствие портируемости, (возможность выполнения программы на различных операционных системах). С 2015 по 2023 год ситуация поменялась [1].
Рис. 1. Наиболее распространённые СР на 2018 г. [2]
Как можно увидеть из графика, наиболее популярными средами на 2018 год являлись TensorFlow, Keras и PyTorch, однако существовало ещё как минимум восемь других, менее используемых [1. 2, 3]. Но если учитывать, что Keras, начиная с версии 2.3 2019 года, поддерживает только работу с Tensorflow, можно сделать вывод, что Keras является высокоуровневым интерфейсом для Tensorflow.
Однако, исходя из [10], мы можем видеть, что по разные среды разработки искусственных нейронных сетей по-разному производительны в зависимости от типа задачи. Результаты исследования можно наблюдать на графике:
Рис. 2. Результаты исследования
Отсюда можно видеть, что по скорости обучения, если рассматривать весь спектр задач, лидирует низкоуровневый Tensorflow. Однако, если учесть удобство разработки нейронных сетей и сравнивать высокоуровневый Pytorch с высокоуровневым пакетом Keras. То мы видим, что в таком случае, будет лидировать Pytorch.
Мы попробуем оценить удобство разработки, скорость обучения искусственных нейронных сетей в трех наиболее распространённых средах разработки, произведем как качественное, так и количественное сравнение, в среде, наиболее подходящей к разработке, будет выполнено решение задачи регрессии положения спутника на основании обучающего вектора изображений.
Также рассмотрим для сравнения реализацию моделирования искусственной нейронной сети для задачи аппроксимации гладкой функции на старых методах Tensorflow, которые в скором времени будут удалены, на новой версии Tensorflow с применением пакета Keras. Сравним скорость обучения и удобство моделирования с реализацией в Pytorch.
Качественное описание и сравнение
Рис. 3. TensorFlow
TensorFlow – самая популярная на данный момент среда разработки (СР), первая версия выпущена 9 ноября 2015 года. Разрабатывается и поддерживается компанией Google.
Низкоуровневая, имеет множественные интерфейсы в различных языках программирования. До недавнего времени искусственная нейронная сеть (ИНС) задавалась в виде статического графа, с предопределённым порядком вычислений и значениями на входе. Такая модель позволяет достичь большего быстродействия, при условии, что количество входов и модель вычислений известны и неизменны, однако в случае присутствия ошибок в модели их поиск будет значительно осложнён [3, 4, 5, 6, 7].
Рис. 4. Keras
Высокоуровневая среда разработки, изначально была выпущена 27 марта 2015 года как межплатформенное средство взаимодействия с пользователем. Имеет модульную структуру, что при условии соответствия задачи решению может позволить значительно ускорить разработку, а также в простых случаях получить решения задачи без понимания принципов работы ИНС [3, 5, 6, 7].
Рис. 5. PyTorch
Первая версия выпущена компанией Facebook 1 сентября 2016 г. Исторически использовала динамический граф вычислений, позволяющий реализовать изменяющиеся системы, в некоторых случаях, однако, являясь менее вычислительно эффективным. В отличие от Keras и TensorFlow, изначально реализована под язык Python, отличающийся гибкостью и ясностью синтаксиса. По этим двум причинам считается хорошо подходящей для разработки новых архитектур. Дополнительным преимуществом этой среды также является значительно менее трудный поиск ошибок в работе сети, отчасти также обоснованный динамичностью графа и логичным синтаксисом [3, 4, 5, 6, 7].
С момента их выпуска все три среды претерпели изменения, в первую очередь заключающиеся в их конвергенции.
С ростом популярности TensorFlow, Keras, изначально предназначенная как надстройка для множества различных сред, теперь является интегрированной в её структуру, хотя некоторые из менее популярных сред всё ещё продолжают поддерживаться. Соответственно, о её развитии далее стоит говорить в контексте развития TensorFlow [3, 4].
Изменения самих TensorFlow и Pytorch можно охарактеризовать как взаимодополнение: на настоящий момент обе среды могут работать как со статическим, так и с динамическим графом вычислений, однако преимущество TensorFlow в количестве справочного материала, количестве дополнительных пакетов, как и лучшая читаемость PyTorch по-прежнему существуют [6, 7].
Рис. 6. Градиенты изменения популярности TensorFlow(синий) и PyTorch(оранжевый) [8]
Тем не менее, на основании количества запросов в поисковой системе Google, PyTorch становится более востребованной [8].
Для дальнейшего увеличения производительности требуется иметь возможность перевода модели, созданной в любой из этих сред, на язык C++. В обоих случаях такая возможность имеется, однако реализация в PyTorch на настоящий момент опять же является более удобной для использования [9].
Количественное сравнение Tensorflow, Keras, PyTorch
Выбор типа задачи
Рассмотрим задачу линейной регрессии. Приближение линии к набору данных, могущим, однако иметь более одного параметра, является простой задачей, однако если рассматривать более сложные типы регрессии (производимые ИНС) как последовательность из операций линейной регрессии с добавлением нелинейности активационными функциями, можно сделать допущение, что относительная эффективность систем при увеличении сложности задачи меняться не будет. Такой подход позволит получить обобщённое представление о работе СР без дополнительных вычислительных затрат.
Выбор и загрузка набора данных
Рис. 7. Набор данных boston housing
Используем набор данных boston housing. Здесь задача состоит в предсказании цены дома на основании 13-и параметров, при этом зависимость – линейная.
Загрузим все необходимые модули, также, поскольку объём данных невысок, произведём нормализацию сразу по всему обучающему набору данных, затем по проверочному. Поскольку PyTorch использует другой тип массива (совместимый с использованием графического процессора), создаём дополнительные переменные, содержащие наборы данных в читаемым для неё формате.
Рис. 8. Дополнительные переменные
Определение метрик для СР
Поскольку типы данных, с которыми работают различные среды, несколько различаются, для каждой из СР создаём свою функцию метрики, при этом использовать будем среднюю абсолютную ошибку, как более репрезентативную. Стоит упомянуть, что в процессе обучения будет использоваться среднеквадратичное отклонение (СКО), ввиду его большей чувствительности к аномалиям.
Создание классов для TensorFlow, PyTorch
Решение будет реализовываться в форме однослойной нейронной сети, состоящей из одного нейрона, имеющего 13 входов и один выход, проведённый через линейную функцию активации.
Рис. 9. Класс для TensorFlow
Рис. 10. Класс для Pytorch
Класс – это объект языка Python, используются для создания шаблона, на основании которого можно создавать экземпляры, к которым будут применены поправки, например в функции train класса PyTorch количество эпох по умолчанию задаётся равным 500 (для обеспечения установившегося режима), однако в экземпляре можно проставить другое число.
Работа среды Keras основывается на предзаданных классах, принимающих на вход широкое разнообразие аргументов, являющихся, однако, неизменяемыми. Поэтому, для модели в СР Keras здесь собственный класс не задаётся.
Проверка быстродействия сетей в режиме обучения
Ожидается, что при использовании одинаковой функции потерь, скорости обучения и алгоритма обучения, конечное значение функции потерь будет одинаковым. Поэтому первым сравнением будет сравнение быстродействия. Уточним, что значение функции потерь в среде Keras может устанавливаться
Ожидается, что при использовании одинаковой функции потерь, скорости обучения и алгоритма обучения, конечное значение функции потерь будет одинаковым. Поэтому первым сравнением будет сравнение быстродействия. Уточним, что значение функции потерь в среде Keras может устанавливаться лишь автоматически.
В качестве критерия оптимизации используем стохастический градиентный спуск, функция потерь – СКО, количество эпох = 500. Стоит обратить внимание на то, что без измерительных функций для задания модели в среде Keras понадобилось лишь три строки.
Рис. 11
Рис. 12
Рассмотрим задачу классификации на основе датасета CIFAR-10.
CIFAR-10 – набор цветных изображений десяти классов.
Для проверки скорости обучения нейронной сети смоделируем одну и ту же искусственную нейронную сеть с применением пакета Keras и с применением пакета Pytorch:
Результат тестирования оказался следующим:
Pytorch – 2805.2 c
Keras – 1967.7 c
(Полный код тестирования можно посмотреть на странице в GitHub: https://github.com/TrifonovDA/Benchmarks_NN_api).
Заключение
По результатам тестирования времени обучения нейронной сети, мы увидели, что с большими вычислениях Tensorflow справляется намного лучше, чем Pytorch. Однако при небольших вычислениях временные различия оказались более существенными: модель, заданная в PyTorch прошла 500 эпох за наименьшее количество времени, 0,53 сек., TensorFlow потребовала в 2,19 раз больше времени, Keras оказалась наиболее ресурсоёмкой средой, заняв 9,98 сек., что больше PyTorch в 19,48 раз и TensorFlow в 8,87 раз.
Ввиду более высокого быстродействия при большом объеме вычислений и удобства в использовании, дальнейшая работа будет производиться в среде Tensorflow.