Учебник для начинающих без каких-либо внешних данных

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

Этот урок перевернет приведенное выше утверждение с ног на голову. Мы будем использовать нейронную сеть для прогнозирования эпох Unix по заданному DateTime. Это для практики и не более того. Пожалуйста, пожалуйста, не делайте этого ни для чего, кроме как для обучения! 🙏

Все это руководство доступно в виде записной книжки Pluto:



Не знаете, что такое Плутон? Ознакомьтесь с этой статьей.

Для полного доступа ко всем статьям на Medium, в том числе и к моей, рассмотрите возможность подписки здесь.

Эпоха, говоришь?

Просто чтобы уточнить, время эпохи — это количество секунд, прошедших с полуночи 1 января 1970 года. Мы можем получить время эпохи (или unix) из DateTime в Julia, вызвав функцию datetime2unix:

julia> using Dates
julia> dt = DateTime("2021-09-01T12:45:00")
2021-09-01T12:45:00
julia> datetime2unix(dt)
1.6305003e9

Наша цель — взять DateTime и предсказать его значение в эпохах Unix. Пристегнитесь, у нас есть работа!

Это много секунд!

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

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

Поскольку мы строим нейронную сеть, нормализация наших входных данных является обязательной. Но поскольку наши выходные данные очень велики — в масштабе 1 000 000 000 — нам также потребуется нормализовать наши выходные данные. Таким образом, мы можем не ждать, пока NN достигнет огромных весов, которые ей понадобятся.

Вот несколько вспомогательных функций, которые нормализуют x и y:

Мы также можем использовать мини-пакеты для ускорения обучения. Функция partition IterTools упрощает эту задачу:

Если вас смущает вышеизложенное, ознакомьтесь с моей статьей о вещании в Джулии.

Построить сеть, обучить сеть

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

Выше есть 3 компонента:

  • модель: это наша архитектура NN.
  • loss: сообщает Flux, какова наша функция потерь. Выше я использовал встроенную среднеквадратичную ошибку Flux.
  • оптимизатор: функция, сообщающая Flux, как обновлять веса.

Чтобы обучить нашу сеть, мы передаем их в Flux.train! вместе с нашими парами входных и выходных данных и несколько раз повторяем наши данные. Как ни странно, каждую итерацию также называют эпохой 😃.

Чтобы предсказать значения, нам нужно будет перемасштабировать наши прогнозы обратно в эпохи:

Я также создал тестовый набор с примерами между 2020 и 2030 годами, вот пример прогнозов:

Input -> Predicted epochs as datetime | difference
2030-02-13T03:33:28 -> 2030-02-11T17:01:22.811 | -35 hours
2021-02-18T12:15:50 -> 2021-02-16T17:24:46.530 | -43 hours
2022-06-26T02:55:35 -> 2022-06-26T08:19:32.420 | 5 hours
2023-11-16T05:54:15 -> 2023-11-16T01:11:17.980 | -5 hours
2030-06-24T05:38:26 -> 2030-06-24T13:47:39.302 | 8 hours
2026-04-19T21:39:56 -> 2026-04-20T07:08:37.777 | 9 hours
2028-01-16T20:26:00 -> 2028-01-16T12:52:12.389 | -8 hours
2029-12-21T02:00:31 -> 2029-12-20T21:20:49.342 | -5 hours
2027-03-05T14:17:19 -> 2027-03-06T21:43:38.841 | 31 hours
2026-07-01T05:54:13 -> 2026-07-02T01:32:57.773 | 20 hours

Как видите, наши прогнозы не идеальны и есть возможности для улучшения, но наша NN сходится и дает разумные результаты. Разница в 20 часов не так уж и плоха для эпох, когда вы предсказываете будущее на 10 лет.

Теперь твоя очередь

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



Я пишу о Джулии и других классных вещах. Если вам нравятся такие статьи, пожалуйста, подпишитесь на меня.