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

Стэнфордский курс: лекция 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 и обучение свёрточных нейросетей. Можете выбрать только те упражнения, которые кажутся вам наиболее полезными и интересными. Все инструкции и необходимые файлы можно скачать отсюда.

⌘⌘⌘

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

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

Следующие лекции (список будет дополняться по мере появления материалов):

Лекция 10. Рекуррентные нейронные сети

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

Domains weekly: конец стабильности .COM, детали продажи .ORG и сделки недели

Domains weekly: конец стабильности .COM, детали продажи .ORG и сделки недели

Из нового доменного дайджеста вы узнаете, может ли проигрыш спора за домен стать победой, чего ждать от повышения цен на...
Read More
PHP 7 или Как ускорить сайт за минуту без регистрации и СМС

PHP 7 или Как ускорить сайт за минуту без регистрации и СМС

Вы наверняка в курсе, что PHP удерживает лидерство среди языков, применяющихся для создания сайтов. В конце 2019 года версия PHP...
Read More
Приключенческая игра с самым опасным ИИ в мире

Приключенческая игра с самым опасным ИИ в мире

Долгие праздничные каникулы уже позади, но многим наверняка хочется ещё немного отдохнуть от серьёзных тем. Поэтому сегодня мы расскажем вам...
Read More
Новогодний чек-лист: не пропразднуй свой домен

Новогодний чек-лист: не пропразднуй свой домен

Не все задачи и дела подходят под фразу «А давайте уже после праздников». И те, что «горят прям горят», мы...
Read More
Domains weekly: рост Интернета, зона .AMAZON и домен на миллион

Domains weekly: рост Интернета, зона .AMAZON и домен на миллион

Приближаются праздники, и в доменной индустрии всё становится спокойнее… Или нет? Из последней подборки в этом году вы узнаете, насколько...
Read More
Итоги 2019 года в блоге REG.RU: создание сайтов, бэкапы, нейросети и UX‑дизайн

Итоги 2019 года в блоге REG.RU: создание сайтов, бэкапы, нейросети и UX‑дизайн

Год приближается к финишной прямой, и редакция блога, следуя тренду, подводит его итоги. Сегодня мы поделимся материалами, которые вы больше...
Read More
Стэнфордский курс: лекция 10. Рекуррентные нейронные сети

Стэнфордский курс: лекция 10. Рекуррентные нейронные сети

В прошлый раз мы рассказали о нескольких популярных свёрточных архитектурах и узнали об их влиянии на развитие машинного обучения. В...
Read More
Domains weekly: карта Интернет-мира, перспективы Китая и доменная зависть

Domains weekly: карта Интернет-мира, перспективы Китая и доменная зависть

Новая подборка новостей будет очень полезной для домейнеров. Насколько активно страны мира регистрируют сайты в своих национальных доменных зонах? Есть...
Read More
Shared или VPS — какой хостинг выбрать для сайта?

Shared или VPS — какой хостинг выбрать для сайта?

Один из наших читателей попросил рассказать, какой же вариант хостинга стоит использовать для своего онлайн-проекта. Этим вопросом задаётся почти каждый...
Read More
С чего начать SEO-продвижение сайта

С чего начать SEO-продвижение сайта

Вы создали красивый и яркий сайт, грамотно расписали контент, добавили акценты для целевой аудитории, но трафик не растёт? Скорее всего,...
Read More