Глубокое обучение

Объяснение современных сверточных нейронных сетей - DenseNets

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

Изначально опубликовано на louisbouchard.ai, прочтите его за 2 дня до этого в моем блоге!

Сверточные нейронные сети

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

А… свертка?

Как следует из названия, свертка - это процесс, при котором исходное изображение, которое мы вводим в приложение компьютерного зрения, свертывается с использованием фильтров, которые обнаруживают важные мелкие особенности изображения, такие как края. Сеть будет автономно изучать значение фильтров, которые обнаруживают важные функции для соответствия желаемому результату, например, имя объекта в определенном изображении, отправляемом в качестве входных данных. Эти фильтры в основном представляют собой квадраты размером 3 на 3 или 5 на 5, поэтому они могут определять направление края: влево, вправо, вверх или вниз. Как вы можете видеть на этом изображении, процесс свертки создает точечный продукт между фильтром и пикселями, с которыми он сталкивается. Затем он идет вправо и повторяет это снова, свертывая все изображение. Как только это будет сделано, мы получим результат первого сверточного слоя, который называется картой объектов. Затем мы делаем то же самое с другим фильтром, давая нам в конце множество карт фильтров. Все они отправляются в следующий слой в качестве входных данных для повторного создания многих других карт функций, пока он не достигнет конца сети с чрезвычайно подробной общей информацией о том, что содержит изображение.

Обучение CNN

Как правило, чтобы узнать параметры фильтров, которые мы использовали во время сверток, называемых весами, мы используем метод, называемый обратным распространением. Этот метод в основном требует, чтобы сначала выполнить прямое распространение в вашей сети. Это означает, что вы кормите его одним или несколькими примерами и получаете от них предсказание. Где прогноз - это то, чего вы хотите, чтобы ваша модель достигла, например, сообщая вам, содержит ли отправленное вами изображение кошку или собаку. Затем вы используете методику обучения, в данном случае метод обратного распространения ошибки. Вычисление ошибки между нашим предположением и реальным ответом, который мы должны были получить. Распространение этой ошибки по сети с изменением весов фильтров на основе этой ошибки. Как только распространенная ошибка достигает первого уровня, в сеть передается еще один пример, и весь процесс обучения повторяется. Таким образом итеративно улучшается наш алгоритм.

Функция активации

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

Слои объединения

Затем, опять же, чтобы упростить нашу сеть и уменьшить количество параметров, у нас есть уровни объединения. Обычно мы используем окно размером 2 на 2 пикселя и берем максимальное значение этого окна, чтобы создать первый пиксель нашей карты функций. Затем мы повторяем этот процесс для всей карты функций, что уменьшит размеры x-y карты функций, тем самым уменьшая количество параметров в сети, чем глубже мы в нее углубимся. Все это делается с сохранением самой важной информации.

Эти три уровня, уровни свертки, активации и объединения, могут повторяться несколько раз в сети, которые мы называем нашими «сверточными» уровнями, как показано на изображении выше, делая сеть все глубже и глубже. Отсюда и термин «глубокое обучение».

Последние уровни архитектуры CNN для компьютерного зрения

Наконец, есть полностью связанные уровни, которые изучают нелинейную функцию из выходных данных последнего уровня объединения. На изображении ниже представлены как слои «FC». Он сглаживает многомерный объем, полученный в результате объединения слоев, в одномерный вектор с таким же количеством общих параметров. Затем мы используем этот вектор в небольшой полносвязной нейронной сети с одним или несколькими слоями для классификации изображений или других целей, в результате чего получаем один результат для каждого изображения, например, класс объекта. Конечно, это самая основная форма сверточных нейронных сетей.

Современные CNN

Быстрая история

Со времен LeNet-5, разработанного Яном Лекуном в 1998 году, было много различных сверточных архитектур, а в последнее время - с первой глубокой нейронной сетью, применяемой в самом популярном соревновании по распознаванию объектов с развитием наших графических процессоров: сети AlexNet в 2012 году. конкурс ImageNet Large Scale Visual Recognition Competition (ILSVRC), где лучшие алгоритмы обнаружения объектов соревновались каждый год на самом большом когда-либо созданном наборе данных компьютерного зрения: Imagenet. Он взорвался сразу после этого года. Где новые архитектуры превосходили предыдущие и всегда работали лучше, вплоть до сегодняшнего дня.

Самая многообещающая архитектура CNN: DenseNet [1]

В настоящее время большинство современных архитектур работают одинаково и имеют некоторые конкретные варианты использования, в которых они лучше. Здесь вы можете увидеть краткий обзор самых мощных архитектур. Вот почему в этой статье я расскажу только о моей любимой сети, которая дает наилучшие результаты в моих исследованиях - DenseNet. На мой взгляд, это также самая интересная и многообещающая архитектура CNN. Пожалуйста, дайте мне знать в комментариях, если вы хотите, чтобы я осветил какой-либо другой тип сетевой архитектуры!

Семейство DenseNet впервые появилось в 2016 году в статье Facebook AI Research под названием «Плотно связанные сверточные сети». Это семейство, потому что оно имеет множество версий с разной глубиной, от 121 уровня с 0,8 млн параметров до версии с 264 слоями с 15,3 млн параметров. Что меньше, чем архитектура ResNet с глубиной 101 уровня!

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

Вот пример пятислойного плотного блока.

В этих плотных блоках каждый слой принимает все предыдущие карты функций в качестве входных данных, тем самым помогая процессу обучения, облегчая проблему исчезающего градиента. Эта проблема исчезающего градиента возникает в действительно глубоких сетях, где они настолько глубоки, что, когда мы распространяем ошибку обратно в сеть, эта ошибка уменьшается на каждом шаге и в конечном итоге становится 0. Эти соединения в основном позволяют распространять ошибку дальше без слишком сильно сокращается. Эти соединения также поощряют повторное использование функций и сокращают количество параметров по той же причине, поскольку они повторно используют предыдущую информацию о картах функций вместо создания дополнительных параметров. И, следовательно, доступ к «коллективным знаниям» сети и снижение вероятности переобучения за счет сокращения общих параметров. И, как я уже сказал, это работает очень хорошо, сокращая количество параметров примерно в 5 раз по сравнению с современной архитектурой ResNet с тем же количеством слоев.

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

Заключение

Конечно, это было всего лишь введение в сверточные нейронные сети, а точнее в архитектуру DenseNet. Я настоятельно рекомендую вам подробнее прочитать об этих архитектурах, если вы хотите сделать хорошо продуманный выбор для своего приложения. Ссылки на документ [1] и GitHub [2] для DenseNet приведены ниже для получения дополнительной информации. Пожалуйста, дайте мне знать, если вы хотите, чтобы я осветил любую другую архитектуру!

Если вам нравится моя работа и вы хотите быть в курсе событий с ИИ, вам обязательно стоит подписаться на меня в других моих учетных записях в социальных сетях (LinkedIn, Twitter) и подписаться на мою еженедельную информационную рассылку AI !

Чтобы поддержать меня:

  • Лучший способ поддержать меня - подписаться на меня здесь на Medium или подписаться на мой канал на YouTube, если вам нравится видео. формат.
  • Поддержите мою работу над Patreon
  • Присоединяйтесь к нашему сообществу Discord: Учим ИИ вместе и делитесь своими проектами, статьями, лучшими курсами, найдите товарищей по команде Kaggle и многое другое!

Ссылки

[1] Г. Хуанг, З. Лю, Л. Маатен, к. Вайнбергер, Плотно связанные сверточные сети (2016), https://arxiv.org/pdf/1608.06993.pdf

[2] Г. Хуанг, З. Лю, Л. Маатен, к. Вайнбергер, Плотно связанные сверточные сети - GitHub (2019), https://github.com/liuzhuang13/DenseNet