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

Основная цель этого поста — служить моими личными заметками к лекциям Fast.ai таким образом, чтобы я мог ссылаться на них, а не искать в видеолекциях). Я также добавил выдержки и ссылки на связанные сообщения, которые я нашел полезными.

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

Получение набора данных для обучения и тестирования

Kaggle: в Kaggle есть много интересных наборов данных (раздел Конкурсы и Наборы данных), с которыми можно работать. Чтобы загрузить эти наборы данных на свой компьютер (AWS/Paperspace/Crestle), вы можете использовать Kaggle CLI. Kaggle CLI может помочь вам загрузить данные и отправить свои прогнозы тестовых данных.[1]

Создайте свои собственные (изображения).Если у вас уже есть формулировка проблемы, которую вы хотите исследовать, но у вас нет данных. Вы можете создать парсер для своих данных. Это поможет не только вам, но и сэкономит массу времени другим. Например, https://github.com/hardikvasa/google-images-download может загружать изображения из поиска Google.

Платные сторонние службы. Это службы, которые извлекают данные для вас в обмен на комиссию. Я не использовал ни один из них.
https://www.promptcloud.com/datastock-access-ready-to-use-datasets

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

Было бы неплохо разделить данные на обучающую, проверочную и тестовую выборки. ИМХО, в зависимости от размера доступного набора данных, мы должны разделить большой набор данных (≥ 1 миллиона строк) на Train: 90%, Validation: 5%, Test: 5% и небольшой набор данных (10 000 строк) на Train: 60% , Валидация: 20%, Тест: 20%.

Экспертное мнение: Джереми Ховард ответил на этот вопрос во время своей лекции здесь. У Эндрю Нг есть специальный раздел в его специализации глубокого обучения здесь. Если вы участвуете в соревновании Kaggle, Рэйчел Томас (Fastai) собрала свой совет в сообщении в блоге:



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

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

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

Скорость обучения

Скорость обучения — это то, насколько быстро вы оттачиваете свое решение или насколько быстро нейронная сеть регулирует вес во время тренировки.

Вы можете думать о скорости обучения как о длине вектора, используемого на этапе градиентного спуска. Если оно слишком низкое, модели потребуется слишком много времени, чтобы найти минимум, и она может застрять в небольшом локальном минимуме. Если он слишком высок, он будет прыгать и следовать по градиенту до самой низкой точки (самой низкой точки). Если вы когда-нибудь обнаружите, что ваши значения потерь стремятся к бесконечности, ваша скорость обучения слишком высока. — Чарльз Мерриам (форум Fastai)

Чтобы найти хорошую скорость обучения, вы должны начать с оценочного значения. Это может быть интуитивное предположение
или
вы можете использовать функцию learn.lr_find() библиотеки Fastai. Эта функция основана на методике, предложенной Лесли Смитом в Cyclical Learning Rates for Training Neural Networks (Вы можете прочитать краткое и более простое объяснение статьи). Что делает lr_find()?

  • Запуск в случайном месте с небольшой скоростью обучения.
  • Увеличивает скорость обучения для каждой мини-партии, запускает шаг, вычисляет потери, а затем удваивает скорость обучения.
  • Создает график потерь при каждой скорости обучения.

Игнорируйте вывод learn.lr_find(); посмотрите на learn.sched.plot_lr() и learn.sched.plot(). Лучшая скорость обучения на порядок (в 10 раз) меньше, чем скорость с минимальными потерями, потому что скорость с минимальными потерями будет слишком высокой. (ссылка на видео)

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

Оптимизация модели

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

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

Стохастический градиент с перезапусками (SGDR). Этот метод включает уменьшение скорости обучения с помощью косинусного отжига и сброс к исходному значению скорости обучения после каждой эпохи[3]. Это надеется обосноваться в «широких долинах», соответствующих хорошим решениям, которые не слишком специфичны для конкретных данных обучения.

Джереми Джордан также хорошо поместил это в подробный пост в блоге здесь.

Ансамбль моментальных снимков:
Известно, что число локальных минимумов экспоненциально растет с ростом числа параметров. А современные глубокие нейронные сети могут содержать их миллионы. Авторы (статьи Ансамбль снимков: Поезд 1, получи М бесплатно) показывают, что, хотя большинство из них имеют одинаковые коэффициенты ошибок, соответствующие нейронные сети склонны совершать разные ошибки. Это разнообразие можно использовать с помощью ансамбля — обучения нескольких нейронных сетей с разной инициализацией. Неудивительно, что они будут сходиться к разным решениям. Усреднение прогнозов по этим моделям приводит к резкому снижению частоты ошибок — Виталий Бушев

Связь между размером пакета и скоростью обучения.

Общее правило: чем больше размер партии, тем выше скорость обучения. Это просто логично, потому что больший размер пакета означает большую уверенность в направлении вашего спуска поверхности ошибок. "(Источник")

Увеличение данных для изображений (в библиотеке Fastai)

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

Чтобы помочь в этом, у нас есть поддержка увеличения изображения в библиотеке Fastai. transforms_side_on (для объектов, которые вы фотографируете сбоку. Например, кошек) и transforms_top_down (для объектов, которые вы фотографируете сверху вниз. Например, для спутниковых изображений) )

transforms_side_on переворачивает изображение по горизонтали влево и вправо. transforms_top_down переворачивает по вертикали, горизонтали и на все возможные повороты на 90 градусов. При съемке сверху вниз, как и со спутниками, вы можете вращать и переворачивать изображение в любом направлении, и оно все равно может выглядеть правдоподобным тренировочным изображением.
(Форум Фастай)

Дифференциальная скорость обучения (замораживание и размораживание слоев)

Использование предварительно обученных сетей, таких как ResNeXt или ResNet50, поможет вам быстрее обучить вашу модель и значительно повысить точность. Когда мы используем предварительно обученные сети, мы обычно обучаем только последний слой. Другие слои (ранний, средний и поздний) заморожены, фиксированы таким образом, что данные обучения не влияют на их значения. Для эффективности мы используем предварительно вычисленные активации, где мы кэшируем значения активации последнего из более поздних слоев для каждого тренировочного изображения вместо пересчета каждого изображения каждый раз, когда оно находится в мини-пакете, для ускорения примерно в 10 раз. Более простые задачи, такие как определение линии, края, носа, глаз, ушей и т. д., уже выполняются предыдущими слоями.

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

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

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

Кредиты

Большая часть этого поста взята с этих форумов:



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



Крутые находки из сети

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



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



Ссылки

[1] Если вы всегда входили в Kaggle, используя связанную учетную запись в социальной сети, вы получите сообщение об ошибке при использовании kaggle cli, для чего требуется отдельный вход в kaggle. К счастью, у Kaggle есть решение: если вы выберете *Забыли пароль?*, вы получите электронное письмо с несколькими различными вариантами, третий из которых позволяет вам настроить собственное имя пользователя/пароль Kaggle и связать его с исходной социальной сетью. аккаунт (источник: http://wiki.fast.ai/index.php/Kaggle_CLI)

[2] Мини-партия — это часть обучающей выборки. Поэтому, когда кто-то упоминает мини-пакетный градиентный спуск, это означает, что веса и смещения изменяются после обработки каждого подмножества (прямое распространение). Следовательно, партия будет означать весь тренировочный набор. Вот Эндрю Нг с подробным объяснением.

[3] Без достаточного количества данных вы получаете Переоснащение, когда сеть слишком тщательно запоминает артефакты входных данных в ущерб фактическому значению. Переобучение проявляется в гораздо меньших потерях при обучении (больше уверенности) в вашем тренировочном наборе, чем в вашем проверочном наборе, и в снижении точности в более поздние эпохи. Получение большего количества данных — одно из решений. Увеличение данных — это другое. — Чарльз Мерриам (Фастай форум)

Моя следующая запись в блоге — Тонкая настройка (в библиотеке Fastai)

→ цикл_мульт

→TTA (для чего он используется и в чем его преимущества)

→ Мы должны использовать меньший размер изображения для лучшей производительности, а затем увеличивать размер изображения позже, чтобы избежать переобучения. Это работает, потому что наша модель уже обучена распознавать маленькие компоненты изображений.