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

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


2019-11-07 11:11

Поделиться…

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

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

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

AlexNet

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

1

2

3

4

5

6

7

8

9

10

11

12

13

CONV1—первыйсвёрточныйслой

MAX POOL1—первыйpooling-слой

NORM1—перваянормализация

CONV2—второйсвёрточныйслой

MAX POOL2—второйpooling-слой

NORM2—втораянормализация

CONV3—третийсвёрточныйслой

CONV4—четвёртыйсвёрточныйслой

CONV5—пятыйсвёрточныйслой

Max POOL3—третийpooling-слой

FC6—полносвязныйслой

FC7—полносвязныйслой

FC8—полносвязныйслой

Архитектура 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-слоях мы просто уменьшаем размер изображения, поэтому в них нет изучаемых параметров.

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

[227?227?3]INPUT

[55?55?96]CONV1:96фильтров11?11сшагом4,отступ0

[27?27?96]MAX POOL1:фильтры3?3сшагом2

[27?27?96]NORM1:слойнормализации

[27?27?256]CONV2:256фильтров5?5сшагом1,отступ2

[13?13?256]MAX POOL2:фильтры3?3сшагом2

[13?13?256]NORM2:слойнормализации

[13?13?384]CONV3:384фильтра3?3сшагом1,отступ1

[13?13?384]CONV4:384фильтра3?3сшагом,отступ1

[13?13?256]CONV5:256фильтров3?3сшагом1,отступ1

[6?6?256]MAX POOL3:фильтры3?3сшагом2

[4096]FC6:4096нейронов

[4096]FC7:4096нейронов

[1000]FC8:1000нейронов(меткикласса)

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

  • 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 фотографий за раз.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

INPUT:[224?224?3]memory:224*224*3=150Kparams:0

CONV3-64:[224?224?64]memory:224*224*64=3.2Mparams:(3*3*3)*64=1,728

CONV3-64:[224?224?64]memory:224*224*64=3.2Mparams:(3*3*64)*64=36,864

POOL2:[112?112?64]memory:112*112*64=800Kparams:0

CONV3-128:[112?112?128]memory:112*112*128=1.6Mparams:(3*3*64)*128=73,728

CONV3-128:[112?112?128]memory:112*112*128=1.6Mparams:(3*3*128)*128=147,456

POOL2:[56?56?128]memory:56*56*128=400Kparams:0

CONV3-256:[56?56?256]memory:56*56*256=800Kparams:(3*3*128)*256=294,912

CONV3-256:[56?56?256]memory:56*56*256=800Kparams:(3*3*256)*256=589,824

CONV3-256:[56?56?256]memory:56*56*256=800Kparams:(3*3*256)*256=589,824

POOL2:[28?28?256]memory:28*28*256=200Kparams:0

CONV3-512:[28?28?512]memory:28*28*512=400Kparams:(3*3*256)*512=1,179,648

CONV3-512:[28?28?512]memory:28*28*512=400Kparams:(3*3*512)*512=2,359,296

CONV3-512:[28?28?512]memory:28*28*512=400Kparams:(3*3*512)*512=2,359,296

POOL2:[14?14?512]memory:14*14*512=100Kparams:0

CONV3-512:[14?14?512]memory:14*14*512=100Kparams:(3*3*512)*512=2,359,296

CONV3-512:[14?14?512]memory:14*14*512=100Kparams:(3*3*512)*512=2,359,296

CONV3-512:[14?14?512]memory:14*14*512=100Kparams:(3*3*512)*512=2,359,296

POOL2:[7?7?512]memory:7*7*512=25Kparams:0

FC:[1?1?4096]memory:4096params:7*7*512*4096=102,760,448

FC:[1?1?4096]memory:4096params:4096*4096=16,777,216

FC:[1?1?1000]memory:1000params:4096*1000=4,096,000

TOTAL memory:24M*4bytes~=96MB/image(only forward!~*2forbwd)

TOTAL params:138Mparameters

Несколько фактов об архитектуре 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.

Редакция 7 ноября 2019 47

Please enable JavaScript to view the comments powered by Disqus.

Источник: www.reg.ru

Комментарии: