Поиск по сайту Поиск

Стэнфордский курс: лекция 9. Архитектуры CNN

На прошлом уроке мы узнали о наиболее популярных библиотеках и фреймворках для глубокого обучения, рассмотрели их особенности и области применения. В этой лекции мы поговорим об истории развития свёрточных нейросетей (CNN) и разберём наиболее популярные архитектуры.

Предыдущие лекции:

Лекция 1. Введение
Лекция 2. Классификация изображений
Лекция 3. Функция потерь и оптимизация
Лекция 4. Введение в нейронные сети
Лекция 5. Свёрточные нейронные сети
Лекция 6. Обучение нейросетей, часть 1
Лекция 7. Обучение нейросетей, часть 2
Лекция 8. ПО для глубокого обучения

AlexNet

Мы уже упоминали нейросеть AlexNet в первой лекции, когда рассказывали о соревновании ImageNet, где она достигла прорывных для своего времени результатов. Её архитектура состоит из пяти свёрточных слоёв, между которыми располагаются pooling-слои и слои нормализации, а завершают нейросеть три полносвязных слоя.

Архитектура AlexNet

На схеме архитектуры все выходные изображения делятся на два одинаковых участка — это связано с тем, что нейросеть обучалась на старых GPU GTX580, у которых было всего 3 ГБ видеопамяти. Для обработки использовались две видеокарты, чтобы параллельно выполнять операции над двумя частями изображения.

Изначально на вход подаётся фотография размером 227×227×3, и размер свёрточных фильтров первого слоя — 11×11. Всего применяется 96 фильтров с шагом 4.

Попробуйте догадаться, каким будет размер выходного изображения после первого слоя? Подсказка: (227 − 11) / 4 + 1 = 55

Ответ: Выражение выше находит ширину и высоту изображения, исходя из размера и шага фильтров. Поскольку их общее число равно 96, итоговый размер будет 55×55×96. Кстати, его можно заметить на рисунке выше.

А каким будет число параметров?

Ответ: (11×11×3)×96 = 34848. Каждый из фильтров будет занимать локальную область 11x11x3, так как глубина входного изображения равнялась 3.

Если мы посмотрим на второй слой Max pooling, то в нём применяются фильтры 3×3 с шагом 2. Используя те же вычисления, что и выше, получим размер выходного снимка 27×27×96. Внимание, новый вопрос:

Чему равно число параметров в pooling-слое?

Ответ: 0! Помните, что мы передаём веса в свёрточные слои, чтобы обучить нейросеть. Но в pooling-слоях мы просто уменьшаем размер изображения, поэтому в них нет изучаемых параметров.

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

Также стоит упомянуть о нескольких важных параметрах нейросети.

  • AlexNet — первая архитектура, в которой применяется нелинейность ReLU.
  • Для нормализации используются отдельные слои. Как выяснилось позднее, они не дают значительного улучшающего эффекта и поэтому не распространены в современных архитектурах.
  • На этапе предварительной обработки используется очень большое дополнение данных.
  • Dropout 50% (то есть при регуляризации отсеивается половина нейронов).
  • Размер пакета — 128.
  • SGD Momentum 0.9.
  • Скорость обучения — 1e−2, снижается в 10 раз вручную, если точность в какой-то момент перестаёт меняться.
  • Затухание весов L2 — 5e−4.
  • В архитектуре используется ансамбль из 7 CNN — это позволило снизить процент ошибок с 18,2% до 16,4%.

AlexNet была первой свёрточной нейросетью, выигравшей соревнование по классификации ImageNet в 2012 году. Она до сих пор используется в некоторых проектах в качестве базовой архитектуры или для передачи обучения. Но с момента её создания появилось множество других моделей с гораздо лучшей точностью. Например, уже в 2013 году нейросеть ZFnet смогла достичь результата 11.7% — в ней AlexNet использовалась в качестве основы, но с изменёнными параметрами и слоями. О других архитектурах речь пойдёт ниже.

VGGNet

На диаграмме выше вы можете увидеть, что в 2014 году VGGNet достигла более чем в два раза лучшего результата по сравнению с AlexNet. Основная идея VGG-архитектур — использование большего числа слоёв с фильтрами меньшего размера. Существуют версии VGG-16 и VGG-19 с 16 и 19 слоями соответственно.

С маленькими фильтрами мы получим не так много параметров, но при этом сможем гораздо эффективнее обрабатывать их.

Попробуем посчитать размер выходных изображений и число параметров точно так же, как мы это делали для AlexNet. Если вычислить объём памяти, необходимый для обработки одного изображения, то он будет равен примерно 100 МБ (только для прямого прохода). Это означает, что видеокарта с 5 ГБ памяти сможет обрабатывать всего 50 фотографий за раз.

Несколько фактов об архитектуре VGGNet:

  • Нейросеть заняла 2 место в задаче классификации и 1 место в локализации на соревновании ImageNet (при локализации необходимо не только классифицировать объект, но и обвести его в ограничивающие рамки).
  • Процедура обучения такая же, как у AlexNet.
  • Слои нормализации отсутствуют.

В прикладных задачах обычно используются архитектуры VGG16 или VGG19 (VGG19 работает лучше, но расходует больше памяти).

GoogleNet

GoogleNet — ещё более глубокая архитектура с 22 слоями. Целью Google было разработать нейросеть с наибольшей вычислительной эффективностью. Для этого они придумали так называемый модуль Inception — вся архитектура состоит из множества таких модулей, следующих друг за другом.

Архитектура GoogleNet (Нажмите на картинку для увеличения)

Также в GoogleNet нет полносвязных слоёв, и она содержит всего 5 миллионов параметров — в 12 раз меньше, чем у AlexNet.

В составе GoogleNet есть небольшая подсеть — Stem Network. Она состоит из трёх свёрточных слоёв с двумя pooling-слоями и располагается в самом начале архитектуры.

На схеме нейросети можно увидеть небольшие промежуточные «отростки» — это вспомогательные классификационные выходы для введения дополнительного градиента на начальных слоях.

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

Но здесь же кроется проблема. Рассмотрим пример: возьмём упрощённую версию модуля Inception и попробуем посчитать размеры выходных изображений после применения каждого фильтра. При исходной фотографии 28×28×256 получим следующее:

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

Чтобы этого избежать, введены так называемые «узкие места» — слои с фильтром 1×1, уменьшающие глубину изображения.

Уменьшение глубины изображения с помощью 32 фильтров 1×1

Добавление дополнительных слоёв в модуль Inception

Если мы вернёмся к нашему примеру и добавим к нему несколько дополнительных слоёв, то увидим, что вычислительная сложность уменьшилась почти в 2,5 раза.

Использование таких модулей и отсутствие полносвязных слоёв делают GoogleNet очень эффективной и достаточно точной сетью. Но на этом развитие свёрточных архитектур не остановилось.

ResNet

В 2015 году ResNet произвела настоящую революцию глубины нейросетей. Она состояла из 152 слоёв и снизила процент ошибок до 3,57% в соревновании классификации ImageNet. Это сделало её почти в два раза эффективнее GoogleNet.

Что же происходит с нейросетью, когда мы увеличиваем число слоёв? Можно ли, взяв обычную архитектуру вроде VGG, просто складывать всё больше и больше слоёв друг на друга и достигать лучшей точности? 

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

Создатели ResNet предположили, что загвоздка кроется в оптимизации — более глубокие модели гораздо хуже поддаются настройке. Тогда они решили не складывать слои друг на друга для изучения отображения нужной функции напрямую, а использовать остаточные блоки, которые пытаются «подогнать» это отображение. Так ResNet стала первой остаточной нейронной сетью. Говоря простыми словами, она «перепрыгивает» через некоторые слои. Они больше не содержат признаков и используются для нахождения остаточной функции H(x) = F(x) + x вместо того, чтобы искать H(x) напрямую.

Нейросеть состоит из большого стека одинаковых остаточных блоков, каждый из которых имеет два свёрточных слоя 3×3. Периодически число фильтров удваивается, а их размерность уменьшается с шагом 2 (/ 2 в каждом измерении). В самом начале архитектуры присутствует дополнительный свёрточный слой. Также у ResNet нет полносвязных слоёв в конце — используется только один слой с выходными классами. С увеличением числа слоёв для уменьшения размерности изображения применяются точно такие же дополнительные слои, как и в GoogleNet. 

И, наконец, несколько важных параметров:

  • После каждого свёрточного слоя используется пакетная нормализация.
  • SGD + Momentum 0.9.
  • Скорость обучения — 0.1, делится на 10 при затухании скорости изменения ошибки.
  • Размер мини-пакета — 256.
  • Затухание весов — 1e−5.
  • Dropout не используется.
Архитектура ResNet

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

И ещё немного

Совершенствование свёрточных архитектур не закончилось — появились новые версии ResNet, достигающие лучших результатов (Wide ResNet и ResNeXT). В 2017 году представлена глубокая нейросеть FractalNet, в которой уже нет остаточных соединений. Вместо них применяются более сложные конструкции, похожие на разветвлённые деревья.

Архитектура FractialNet

CNN продолжают развиваться и активно используются в задачах классификации изображений.

А теперь попробуйте попрактиковаться и самостоятельно написать код для обучения нейронных сетей и CNN. Вам понадобится Python > 3.6 и среда Jupyter Notebook или Jupyter Lab. Задание включает в себя материал, который мы изучили на последних нескольких лекциях: реализация обратного распространения ошибки (back propagation), оптимизация, пакетная нормализация, Dropout и обучение свёрточных нейросетей. Можете выбрать только те упражнения, которые кажутся вам наиболее полезными и интересными. Все инструкции и необходимые файлы можно скачать отсюда.

⌘⌘⌘

Мы рассмотрели популярные свёрточные архитектуры и познакомились с их устройством. Обязательно выполните практическое задание: оно позволит глубже погрузиться в процесс обучения нейросетей и посмотреть на него изнутри. Если вы столкнётесь с какими-либо трудностями, не стесняйтесь задавать вопросы в комментариях — мы обязательно ответим.

А в следующий раз поговорим о рекуррентных нейронных сетях. 

С оригинальной лекцией можно ознакомиться на YouTube.

Обучаем виртуального дракона фигурам высшего пилотажа

Обучаем виртуального дракона фигурам высшего пилотажа

В наши дни компьютерная графика присутствует во всех популярных видах визуального контента: от видеороликов YouTube-блогеров до полнометражных фильмов. Но проработка...
Read More
Стэнфордский курс: лекция 9. Архитектуры CNN

Стэнфордский курс: лекция 9. Архитектуры CNN

На прошлом уроке мы узнали о наиболее популярных библиотеках и фреймворках для глубокого обучения, рассмотрели их особенности и области применения....
Read More
GPT-2: нейросеть, которая закончит за вас предложение

GPT-2: нейросеть, которая закончит за вас предложение

Встречали ли вы когда-нибудь собеседника, который после нескольких сказанных вами слов заканчивал за вас предложение? GPT-2 умеет и не такое:...
Read More
Жуткие сайты, которые вызовут у вас мурашки

Жуткие сайты, которые вызовут у вас мурашки

Интернет может не только развлекать вас новыми мемами и видеороликами, но и быть по-настоящему пугающим. В честь Хэллоуина представляем несколько...
Read More
10 ингредиентов надёжной инфраструктуры хостинга REG.RU

10 ингредиентов надёжной инфраструктуры хостинга REG.RU

Привет! На связи редакция блога. И сегодня мы расскажем в деталях об одной из сторон инфраструктуры REG.RU, объясним как работает...
Read More
Голосовой помощник Apple, которому можно доверять

Голосовой помощник Apple, которому можно доверять

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

Как организовать техническую поддержку пользователей

Быстрая техподдержка очень важна для клиентов, особенно в критических ситуациях. От скорости и качества решения проблемы зависит лояльность пользователя и...
Read More
Роботы в облаках: совмещение ROS и Jupyter

Роботы в облаках: совмещение ROS и Jupyter

Робототехника — одна из самых популярных и прогрессивно развивающихся отраслей. Ролики Boston Dynamics на YouTube собирают миллионы просмотров. Если вы...
Read More
Стэнфордский курс: лекция 8. ПО для глубокого обучения

Стэнфордский курс: лекция 8. ПО для глубокого обучения

В предыдущих главах мы познакомились с основами обучения нейросетей и выяснили, чему при этом стоит уделять больше внимания. Сегодня вы...
Read More
Анализ производительности нейросетей на GPU с помощью NVIDIA Visual Profiler (часть 1)

Анализ производительности нейросетей на GPU с помощью NVIDIA Visual Profiler (часть 1)

Специалисты Data Science делятся на два лагеря: те, кому кажется, что нейросети обучаются слишком медленно, и те, кому скоро тоже...
Read More