7 Уроков из курса глубокого обучения Fast.AI

7 уроков из курса глубокого обучения Fast.AI

Фото от Sincerely Media на Unsplash

Недавно я закончил курс Practical Deep Learning от Fast.AI. Я прошел много курсов по машинному обучению раньше, поэтому могу сравнить. Этот курс определенно один из самых практичных и вдохновляющих. Поэтому я хотел бы поделиться своими основными выводами с вами.

О курсе

Курс Fast.AI ведет Джереми Ховард, один из основных исследователей Fast.AI. Он также был первым в рейтинге Kaggle. Так что вы можете доверять его экспертизе в области машинного обучения и глубокого обучения.

Курс охватывает основы глубокого обучения и нейронных сетей, а также объясняет алгоритмы деревьев решений. Текущая версия курса от 2022 года, поэтому, предположительно, содержание изменилось с момента предыдущих обзоров на TDS.

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

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

Давайте перейдем к моим основным выводам из этого курса.

Урок №1: Математика, которую вам нужно знать, чтобы понять глубокое обучение

Давайте начнем с простого. Обещаю, что следующие выводы будут менее тривиальными.

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

Нейронная сеть – это комбинация линейных функций и активаций. Вот линейная функция.

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

Самая распространенная функция активации – это ReLU (Rectified Linear Unit). Это может звучать пугающе, но на самом деле это просто функция вот такая.

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

График автора

Также используются несколько других математических концепций:

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

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

Урок №2: Как очистить данные

Мы привыкли начинать анализ с очистки данных. Мы все слышали мантру “мусор внутри – мусор снаружи” много раз. Удивительно, но обучение модели сначала, а затем использование ее для очистки данных может быть более эффективным.

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

Фото от Benjamin Vang на Unsplash | Фото от Xennie Moore на Unsplash | Фото от Alvan Nee на Unsplash

Создайте свое первое приложение глубокого обучения за час

Развертывание модели классификации изображений с использованием HuggingFace Spaces и Gradio

towardsdatascience.com

Урок №3: Как выбрать модель компьютерного зрения

Сейчас существует множество предобученных моделей. Например, у PyTorch Image Models (timm) есть 1 242 модели.

import timmpretrained_models = timm.list_models(pretrained=True)print(len(pretrained_models))print(pretrained_models[:5])1242['bat_resnext26ts.ch_in1k', 'beit_base_patch16_224.in22k_ft_in22k', 'beit_base_patch16_224.in22k_ft_in22k_in1k', 'beit_base_patch16_384.in22k_ft_in22k_in1k', 'beit_large_patch16_224.in22k_ft_in22k']

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

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

Изображение из Kaggle Notebook, источник

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

Лучше всего начать с небольшой модели и итерации. Правило состоит в том, чтобы создать первую модель в первый день. Таким образом, вы можете использовать простые модели, такие как Resnet18 или Resnet34, чтобы попробовать различные техники аугментации или внешние наборы данных. Поскольку вы работаете с простой моделью, итерации будут быстрыми. Вы можете перейти к более медленным архитектурам моделей, когда найдете лучшую версию.

Совет от Джереми Ховарда: “Попробуйте сложные архитектуры только в самом конце”.

Урок №4: Как обучать большие модели на Kaggle

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

Существует полезный трюк, который может решить эту проблему. Он называется накопление градиента (Gradient Accumulation). С накоплением градиента мы не обновляем веса после каждой пакетной обработки, а суммируем градиенты для K пакетов. Затем мы обновляем вес модели с накопленным градиентом для общего размера пакета, равного K * размер_пакета, так что для каждой итерации у нас есть пакет размером в K раз меньше.

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

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

Вы можете найти полный пример на Kaggle.

Урок №5: Какие алгоритмы машинного обучения использовать

В настоящее время существует множество различных техник машинного обучения. Например, в документации scikit-learn есть как минимум дюжина подходов к обучению с учителем.

Джереми Ховард предложил сосредоточиться только на нескольких основных техниках:

  • Если у вас есть структурированные данные, вы должны начать с ансамблей деревьев решений (алгоритмы Random Forest или Gradient Boosting).
  • Лучшее решение для неструктурированных данных (таких как естественные тексты, аудио, видео или изображения) – это многослойная нейронная сеть.

Нейронные сети также применимы для структурированных данных, однако деревья решений часто проще использовать:

  • Вы можете обучать ансамбль деревьев решений намного быстрее.
  • У них меньше параметров для настройки.
  • Для их обучения не требуется специального графического процессора.
  • Более того, деревья решений часто проще интерпретировать и понять, почему вы получаете такой результат для каждого объекта, например, какие признаки являются сильными предикторами, а какие можно безопасно игнорировать.

Если мы сравниваем ансамбли деревьев решений, Random Forest проще использовать (потому что почти невозможно переобучиться). Однако Gradient Boosting обычно дает немного лучшие результаты.

Урок №6: Полезные функции Python

Несмотря на то, что я использую Python и Pandas уже почти десять лет, я также нашел несколько полезных хитростей Pandas.

Известный набор данных о “Титанике” использовался для демонстрации мощи Pandas. Давайте посмотрим на него.

Первый пример показывает, как преобразовать столбец в строку, получить первую букву и преобразовать с помощью словаря. Обратите внимание, что если значение не указано в словаре, то будет возвращено NaN.

# мой обычный подходdecks_dict = {'A': 'ABC', 'B': 'ABC', 'C': 'ABC',             'D': 'DE', 'E': 'DE', 'F': 'FG', 'G': 'FG'}df['Deck'] = df.Cabin.map(    lambda x: decks_dict.get(str(x)[0]))# версия из курсаdf['Deck'] = df.Cabin.str[0].map(dict(A="ABC", B="ABC", C="ABC",     D="DE", E="DE", F="FG", G="FG"))

Следующий пример показывает, как рассчитать частоту с использованием функции transform. Эта версия более краткая по сравнению с объединением, которое я обычно использую.

# мой обычный подходdf = df.merge(    df.groupby('Ticket', as_index = False).PassengerId.count()\        .rename(columns = {'PassengerId': 'TicketFreq'}))# версия из курсаdf['TicketFreq'] = df.groupby('Ticket')['Ticket'].transform('count')

Последний пример – самый сложный, как разбирать заголовки.

# мой обычный подходdf['Title'] = df.Name.map(lambda x: x.split(', ')[1].split('.')[0])df['Title'] = df.Title.map(    lambda x: x if x in ('Mr', 'Miss', 'Mrs', 'Master') else None)# версия из курса df['Title'] = df.Name.str.split(', ', expand=True)[1]\    .str.split('.', expand=True)[0]df['Title'] = df.Title.map(dict(Mr="Mr",Miss="Miss",Mrs="Mrs",Master="Master"))

Стоит посмотреть на первую часть df, чтобы понять, как это работает. Вы можете выполнить код: df.Name.str.split(‘, ‘, expand=True) и увидеть фрейм данных, где имена разделены запятыми на два столбца.

Затем мы выбираем столбец 1 и делаем аналогичное разделение на основе точки. Вторая строка просто заменяет все случаи, не равные Mr, Mrs, Miss или Master, на NaN.

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

Урок №7: Хитрости машинного обучения

В этом курсе упоминается множество хитростей и полезных техник или инструментов. Вот те, которые я нашел полезными.

Многотаргетная модель

Удивительно, но добавление еще одной цели в нейронную сеть может помочь улучшить качество модели.

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

Поиск оптимальной скорости обучения

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

Fast.AI предоставляет инструмент, который поможет вам сделать это с помощью одной строки кода learn.lr_find(suggest_funcs=(valley, slide)).

Изображение от автора

Аугментация на этапе тестирования

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

Пример аугментаций | Оригинальное фото Charles Postiaux на Unsplash

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

Обогащение дат

Вы можете получить больше информации из своего набора данных, если у вас есть даты в вашем наборе данных. Например, вместо просто 2023–09–01 вы можете посмотреть на отдельные характеристики: месяц, день недели, год и т.д.

Fast.AI имеет функцию add_datepart для этого, поэтому вам не нужно реализовывать ее самостоятельно.

Вопрос без ответа: Почему сигмоида?

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

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

Большое спасибо за прочтение этой статьи. Надеюсь, она была вам информативной. Если у вас есть какие-либо вопросы или комментарии, пожалуйста, оставьте их в разделе комментариев.