Flux — это библиотека глубокого обучения, полностью написанная на Julia. На веб-сайте Flux говорится, что он делает простые вещи простыми, оставаясь при этом полностью взломанным. Это делает Flux идеальной библиотекой для начала работы с Deep Learning, потому что вы можете заглянуть внутрь и увидеть, как реализуются алгоритмы. Также некоторые члены сообщества говорят, что в будущем у Юлии может быть более доминирующая роль в машинном обучении.

В этом посте мы рассмотрим простой пример линейной регрессии с использованием Julia и Flux. Чтобы обучить модель машинного обучения в Flux, нам нужно выполнить следующие пять шагов:

1. Получите данные.

2. Определите модель.

3. Определите функцию потерь.

4. Задайте процедуру оптимизации.

5. Обучите модель.

Если хотите продолжить, то убедитесь, что у вас установлены Julia и Flux. Однако вы можете попробовать и Julia, и Flux, не устанавливая их, взяв за основу этот блокнот Colab. Краткое введение в Julia см. в разделах Изучите Julia для начинающих и Julia для питонистов.

Примечание. Дополнительные сведения об основных понятиях глубокого обучения см. в Часть II.

Перед тем, как пройти шаги, перечисленные выше, импортируем нужные нам пакеты:

Помимо импорта Flux, мы также используем пакет Plots для создания визуализаций в Julia. Подробнее о визуализации Юлии вы можете узнать в этом посте.

Шаг 1: Получите данные

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

Теперь мы построим данные, которые мы только что сгенерировали, чтобы проверить их распределение.

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

Проверяем размер данных поезда.

Прежде чем перейти к следующему шагу, нам нужно изменить форму наших данных, чтобы мы могли передать их в создаваемую нами модель. Данные поезда (x_train) представляют собой список, содержащий 500 элементов. Однако Flux ожидает данные в виде массива 1x500.

Мы используем следующую процедуру для изменения формы данных.

Мы используем функции hcat (горизонтальная конкатенация) и reduce (функция высокого порядка) для получения правильной формы. Таким образом, мы создаем функцию с кодом выше.

Теперь мы применяем функцию ко всем данным и проверяем окончательную форму.

Шаг 2. Определите модель

Мы хотим создать простую модель линейной регрессии m(x) = W*x + b. Чтобы определить этот тип модели, мы установили один нейрон без функции активации. Во Flux мы можем использовать Dense function для определения этой модели:

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

Прежде чем двигаться дальше, нам нужно собрать все параметры, чтобы мы могли получить к ним доступ и обновить их на этапах обучения. Мы делаем это с помощью функции params.

Шаг 3: Определите функцию потерь

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

Шаг 4. Установите процедуру оптимизации

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

В этом примере мы используем алгоритм градиентного спуска, но Flux предлагает множество процедур оптимизации.

Мы также можем установить гиперпараметры для процедур оптимизации. Однако для этого примера мы просто используем градиентный спуск из коробки.

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

Шаг 5: Обучите модель

Наконец, мы готовы обучить нашу модель. Прежде чем вызывать программу обучения Flux, нам нужно заархивировать данные поезда.

Во Flux мы можем выполнить один шаг обучения с помощью функции train!.

Но мы также можем поместить функцию train! внутрь цикла for. Затем мы выполняем этапы поезда (эпохи), пока W и b минимизирует функцию потерь.

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

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

На приведенном выше графике показаны как начальные прогнозы модели (со случайными W и b), так и окончательные (после обучения). Мы видим, что модель очень быстро улучшилась после нескольких итераций. Однако при обучении модели с реальными данными все становится сложнее, и нам нужно использовать более сложные процедуры обучения.

Полный код

Мы можем запустить полный скрипт сразу. Сначала создайте файл с расширением .jl с приведенным ниже кодом, а затем запустите его как julia имя-вашего-файла.jl.

Заключительные замечания

Как видите, создать простую модель с помощью Flux очень просто. Однако Flux предлагает намного больше. Мы можем создавать более сложные модели, такие как CNN и RNN. Для получения дополнительной информации о Flux и о том, как вы можете использовать другие примеры в качестве отправной точки для своих собственных проектов, см. Документацию Flux и Зоопарк моделей.