Стэнфордский курс: лекция 9. Архитектуры CNN
На прошлом уроке мы узнали о наиболее популярных библиотеках и фреймворках для глубокого обучения, рассмотрели их особенности и области применения. В этой лекции мы поговорим об истории развития свёрточных нейросетей (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 14 15 |
CONV1 — первый свёрточный слой MAX POOL1 — первый pooling-слой NORM1 — первая нормализация CONV2 — второй свёрточный слой MAX POOL2 — второй pooling-слой NORM2 — вторая нормализация CONV3 — третий свёрточный слой CONV4 — четвёртый свёрточный слой CONV5 — пятый свёрточный слой Max POOL3 — третий pooling-слой FC6 — полносвязный слой FC7 — полносвязный слой FC8 — полносвязный слой <img width="602" height="300" src="https://lh5.googleusercontent.com/o3LMzydwmThouxIn0CD_j8rjZja-0Pr7wBoba_87EpBdy_d1coFP8NN_2txEQUdocuS92T5UwAt-RglRiT3QEiCAiXj8rLi1PZQUDJcsShDVAyjhnEuKCjPQMVjuQS0xSh-1v4iA"> |
На схеме архитектуры все выходные изображения делятся на два одинаковых участка — это связано с тем, что нейросеть обучалась на старых 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=150K params: 0 CONV3-64: [224×224×64] memory: 224*224*64=3.2M params: (3*3*3)*64 = 1,728 CONV3-64: [224×224×64] memory: 224*224*64=3.2M params: (3*3*64)*64 = 36,864 POOL2: [112×112×64] memory: 112*112*64=800K params: 0 CONV3-128: [112×112×128] memory: 112*112*128=1.6M params: (3*3*64)*128 = 73,728 CONV3-128: [112×112×128] memory: 112*112*128=1.6M params: (3*3*128)*128 = 147,456 POOL2: [56×56×128] memory: 56*56*128=400K params: 0 CONV3-256: [56×56×256] memory: 56*56*256=800K params: (3*3*128)*256 = 294,912 CONV3-256: [56×56×256] memory: 56*56*256=800K params: (3*3*256)*256 = 589,824 CONV3-256: [56×56×256] memory: 56*56*256=800K params: (3*3*256)*256 = 589,824 POOL2: [28×28×256] memory: 28*28*256=200K params: 0 CONV3-512: [28×28×512] memory: 28*28*512=400K params: (3*3*256)*512 = 1,179,648 CONV3-512: [28×28×512] memory: 28*28*512=400K params: (3*3*512)*512 = 2,359,296 CONV3-512: [28×28×512] memory: 28*28*512=400K params: (3*3*512)*512 = 2,359,296 POOL2: [14×14×512] memory: 14*14*512=100K params: 0 CONV3-512: [14×14×512] memory: 14*14*512=100K params: (3*3*512)*512 = 2,359,296 CONV3-512: [14×14×512] memory: 14*14*512=100K params: (3*3*512)*512 = 2,359,296 CONV3-512: [14×14×512] memory: 14*14*512=100K params: (3*3*512)*512 = 2,359,296 POOL2: [7×7×512] memory: 7*7*512=25K params: 0 FC: [1×1×4096] memory: 4096 params: 7*7*512*4096 = 102,760,448 FC: [1×1×4096] memory: 4096 params: 4096*4096 = 16,777,216 FC: [1×1×1000] memory: 1000 params: 4096*1000 = 4,096,000 TOTAL memory: 24M * 4 bytes ~= 96MB / image (only forward! ~*2 for bwd) TOTAL params: 138M parameters |
Несколько фактов об архитектуре VGGNet:
- Нейросеть заняла 2 место в задаче классификации и 1 место в локализации на соревновании ImageNet (при локализации необходимо не только классифицировать объект, но и обвести его в ограничивающие рамки).
- Процедура обучения такая же, как у AlexNet.
- Слои нормализации отсутствуют.
В прикладных задачах обычно используются архитектуры VGG16 или VGG19 (VGG19 работает лучше, но расходует больше памяти).
GoogleNet
GoogleNet — ещё более глубокая архитектура с 22 слоями. Целью Google было разработать нейросеть с наибольшей вычислительной эффективностью. Для этого они придумали так называемый модуль Inception — вся архитектура состоит из множества таких модулей, следующих друг за другом.
Также в GoogleNet нет полносвязных слоёв, и она содержит всего 5 миллионов параметров — в 12 раз меньше, чем у AlexNet.
В составе GoogleNet есть небольшая подсеть — Stem Network. Она состоит из трёх свёрточных слоёв с двумя pooling-слоями и располагается в самом начале архитектуры.
На схеме нейросети можно увидеть небольшие промежуточные «отростки» — это вспомогательные классификационные выходы для введения дополнительного градиента на начальных слоях.
Идея основного модуля Inception заключается в том, что он сам по себе является небольшой локальной сетью. Вся его работа состоит в параллельном применении нескольких фильтров на исходное изображение. Данные фильтров объединяются, и создаётся выходной сигнал, который переходит на следующий слой.
Но здесь же кроется проблема. Рассмотрим пример: возьмём упрощённую версию модуля Inception и попробуем посчитать размеры выходных изображений после применения каждого фильтра. При исходной фотографии 28×28×256 получим следующее:
В результате вычислений мы обнаружили, что наш небольшой блок выполняет 854 миллиона операций! При этом pooling-слои не уменьшают размер объекта — это означает, что после каждого объединения фильтров он будет только расти, и вычисления станут очень дорогостоящими.
Чтобы этого избежать, введены так называемые «узкие места» — слои с фильтром 1×1, уменьшающие глубину изображения.
Если мы вернёмся к нашему примеру и добавим к нему несколько дополнительных слоёв, то увидим, что вычислительная сложность уменьшилась почти в 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, достигающие лучших результатов (Wide ResNet и ResNeXT). В 2017 году представлена глубокая нейросеть FractalNet, в которой уже нет остаточных соединений. Вместо них применяются более сложные конструкции, похожие на разветвлённые деревья.
CNN продолжают развиваться и активно используются в задачах классификации изображений.
А теперь попробуйте попрактиковаться и самостоятельно написать код для обучения нейронных сетей и CNN. Вам понадобится Python > 3.6 и среда Jupyter Notebook или Jupyter Lab. Задание включает в себя материал, который мы изучили на последних нескольких лекциях: реализация обратного распространения ошибки (back propagation), оптимизация, пакетная нормализация, Dropout и обучение свёрточных нейросетей. Можете выбрать только те упражнения, которые кажутся вам наиболее полезными и интересными. Все инструкции и необходимые файлы можно скачать отсюда.
⌘⌘⌘
Мы рассмотрели популярные свёрточные архитектуры и познакомились с их устройством. Обязательно выполните практическое задание: оно позволит глубже погрузиться в процесс обучения нейросетей и посмотреть на него изнутри. Если вы столкнётесь с какими-либо трудностями, не стесняйтесь задавать вопросы в комментариях — мы обязательно ответим.
А в следующий раз поговорим о рекуррентных нейронных сетях.
Следующие лекции (список будет дополняться по мере появления материалов):
Лекция 10. Рекуррентные нейронные сети
С оригинальной лекцией можно ознакомиться на YouTube.