Благодаря своей способности обрабатывать огромные объемы данных, глубокое обучение за последние несколько десятилетий превратилось в чрезвычайно мощную технологию. Сети со скрытым уровнем в настоящее время более популярны, чем обычные методы, особенно для распознавания образов. Сверточные нейронные сети являются одними из наиболее широко используемых глубоких нейронных сетей.
Итак, давайте посмотрим на работу CNN.
Почему полезны сверточные нейронные сети и что они из себя представляют?
Сверточные нейронные сети, часто известные как CNN или ConvNets, представляют собой тип нейронных сетей, которые показали себя особенно успешными в таких приложениях, как распознавание изображений и классификация. Методы извлечения признаков, которые требовали ручного труда и много времени, ранее использовались для распознавания объектов на фотографиях до CNN. Напротив, сверточные нейронные сети теперь предлагают более масштабируемый метод классификации изображений и распознавания объектов за счет использования методов матричного умножения линейной алгебры.
Помимо обеспечения зрения для роботов и автономных транспортных средств, ConvNets успешно распознают лица, объекты и дорожные знаки.
На рисунке 1 выше мы можем заметить различные варианты использования CNN, такие как классификация изображений, обнаружение объектов и сегментация изображений. а на рисунке 2 и рисунке 3 ниже показан пример использования ConvNet для распознавания повседневных объектов, людей и предметов. В последнее время ConvNets также были эффективны в нескольких задачах обработки естественного языка (например, в классификации предложений).
Таким образом, ConvNets сегодня являются важным инструментом для большинства специалистов по машинному обучению. Однако иногда может быть страшно узнать о ConvNets и использовать их в первый раз. Основная цель этого сообщения в блоге — помочь читателям понять, как сверточные нейронные сети работают при обработке визуальных данных.
В этом тексте «полностью связанные слои» относятся к многослойным персептронам.
Архитектура LeNet (1990-е годы)
Одна из первых сверточных нейронных сетей, LeNet, внесла свой вклад в развитие глубокого обучения. После многочисленных успешных итераций с 1988 года новаторская работа Яна Лекуна получила название LeNet5. В то время действия по распознаванию символов, такие как чтение почтовых индексов, номеров и т. д., в основном выполнялись с использованием архитектуры LeNet.
В разделах ниже мы объясним, как архитектура LeNet справляется с распознаванием изображений. LeNet была улучшена рядом различных архитектур, которые были предложены в последние годы, но все они в значительной степени основаны на основных идеях LeNet, и поэтому их легче понять, если вы знакомы с первой.
Сверточная нейронная сеть на рис. 4 классифицирует входное изображение в одну из четырех групп: собака, кошка, лодка или птица. Первоначальный LeNet в основном использовался для задач распознавания букв. Как показано на графике выше, сеть правильно назначает наивысшую вероятность (0,94) для лодки, когда в качестве входных данных задано изображение лодки. Вероятности выходного слоя должны в сумме равняться единице (объяснено далее в этом посте).
В ConvNet есть три основные операции, показанные на рисунке 4 выше:
- свертка
- Объединение или субвыборка
- Полностью подключенный слой
Понимание того, как работают эти операции, имеет решающее значение для полного понимания сверточных нейронных сетей, поскольку они служат фундаментальными строительными блоками всех сверточных нейронных сетей. Ниже мы попытаемся понять смысл каждой из этих операций.
Матрица значений пикселей составляет изображение
По сути, матрица значений пикселей может использоваться для представления любого изображения.
Обычное слово для обозначения определенной части изображения — канал. Красный, зеленый и синий составляют три канала изображения типичной цифровой камеры; вы можете представить их как три 2D-матрицы, наложенные одна на другую (по одной для каждого цвета), со значениями пикселей в диапазоне от 0 до 255 в каждой. Рисунок 5 ниже можно использовать для визуализации каналов RGB изображения.
С другой стороны, изображение в градациях серого содержит только один канал. Для этого поста мы будем учитывать только фотографии в градациях серого, поэтому каждое изображение будет представлено одной 2D-матрицей. Каждый пиксель в матрице будет иметь значение от 0 до 255, где 0 означает черный, а 255 — белый. Рисунок 6 представляет собой изображение в градациях серого, которое поможет представить изображение в виде матрицы значений в диапазоне от 0 до 255.
Шаг свертки
Оператор «свертки» — это место, где ConvNets получают свое имя. В случае ConvNet основной целью свертки является извлечение признаков из входного изображения. Используя крошечные квадраты входных данных для изучения атрибутов изображения, свертка сохраняет пространственные отношения между пикселями. Мы не будем погружаться в особенности математики свертки здесь; вместо этого мы сосредоточимся на том, как это применимо к изображениям.
Каждое изображение можно рассматривать как матрицу значений пикселей, как мы рассмотрели ранее. Рассмотрим изображение 6 × 6, просто используя 0 и 1 в качестве значений пикселей (имейте в виду, что значения пикселей для изображения в градациях серого варьируются от 0 до 255).
Рассмотрим также следующую дополнительную матрицу 3 x 3:
Подумайте о том, как выполняются вычисления, описанные выше, на мгновение, как показано на рисунке 7. Матрица оранжевого цвета перемещается по синей матрице на один пиксель (также известный как «шаг»), и для каждой позиции поэлементно вычисляется умножение (между двумя матрицами). Затем результаты умножения складываются для получения конечного целого числа, которое составляет один элемент выходной матрицы. Имейте в виду, что матрица 3 x 3 «видит» только часть входного изображения во время каждого шага.
Матрица 3x3 называется «фильтром», «ядром» или «детектором признаков» на жаргоне CNN, в то время как матрица, созданная путем проведения фильтра по изображению и вычисления скалярного произведения, называется «свернутым элементом». », «карта активации» или «карта функций». Фильтры служат детекторами признаков исходного входного изображения, об этом очень важно помнить.
Изображение выше (рис. 8) демонстрирует, как выполняется сверточный процесс. Чтобы создать карту объектов, фильтр (с красным контуром) применяется к входному изображению во время операции свертки. Отчетливая карта объектов создается, когда другой фильтр (с зеленым контуром) применяется к тому же изображению. Важно отметить, что процедура свертки сохраняет локальные зависимости исходного изображения. Также обратите внимание на различные карты признаков, которые эти два разных фильтра создают из идентичного исходного изображения. Имейте в виду, что, как мы уже говорили, изображение и два фильтра выше по сути являются числовыми матрицами.
Хотя нам по-прежнему необходимо определить такие параметры, как количество фильтров, размер фильтра, сетевая архитектура и т. д. до процесса обучения, на практике CNN самостоятельно изучает значения этих фильтров на протяжении всего процесса обучения. Наша сеть лучше извлекает атрибуты изображения и выявляет закономерности в невидимых изображениях по мере того, как мы увеличиваем количество имеющихся у нас фильтров.
Размер карты объектов (свернутый объект) контролируется тремя параметрами, которые нам необходимо определить перед выполнением шага свертки:
- Глубина: глубина определяется тем, сколько фильтров мы используем в процессе свертки. Три отдельных фильтра используются для свертки исходного изображения лодки в сети, изображенной на рисунке 9, в результате чего отображаются три карты объектов. «Глубина» карты объектов будет равна трем, поскольку вы можете думать об этих трех картах объектов как о сложенных 2D-матрицах.
- Шаг: количество пикселей, на которое мы перемещаем нашу матрицу фильтра по входной матрице, называется «шагом». Мы перемещаем фильтры на один пиксель за раз, когда шаг равен 1. Когда шаг равен 2, фильтры перемещаются со скоростью 2 пикселя за каждое движение. Более длинный шаг приводит к меньшим картам признаков.
- Заполнение нулями: чтобы применить фильтр к граничным элементам матрицы входного изображения, может быть полезно заполнить входную матрицу нулями по краям. Нулевое заполнение имеет то преимущество, что позволяет нам регулировать размер карт объектов. Широкая свертка — это добавление заполнения нулями, а узкая свертка — отсутствие заполнения нулями. Существует три вида набивки:
- Допустимое заполнение: это также известно как отсутствие заполнения. В этом случае последняя свертка отбрасывается, если размеры не совпадают.
- То же заполнение: это заполнение гарантирует, что выходной слой имеет тот же размер, что и входной слой.
- Полное заполнение: этот тип заполнения увеличивает размер вывода, добавляя нули к границе ввода.
Шаг объединения
Размерность каждой карты объектов уменьшается, в то время как наиболее важные данные сохраняются с использованием пространственного объединения, также известного как субдискретизация или субдискретизация. Существуют различные типы пространственного объединения: Максимум, Медиана, Сумма и т. д.
В сценарии Max Pooling мы указываем пространственную окрестность (например, окно 2 на 2) и выбираем самый большой элемент из исправленной карты объектов внутри этого окна. Мы можем выбрать среднее значение (Average Pooling) или общее количество всех элементов в этом окне, а не только самое большое. На практике было продемонстрировано, что Max Pooling работает лучше.
На рисунке 11 показан пример операции Max Pooling на карте Rectified Feature (полученной после операции свертки + ReLU (функция активации)) с использованием окна 2×2.
Мы сдвигаем наше окно 2 x 2 на 2 ячейки (также называемое «шагом») и берем максимальное значение в каждой области. Как показано выше, это уменьшает размерность нашей карты объектов.
Цель объединения — постепенно уменьшать пространственный размер входного представления. В частности, объединение:
- делает входные представления (размер объекта) меньше и более управляемым
- уменьшает количество параметров и вычислений в сети, поэтому контроль переобучения
- делает сеть инвариантной к небольшим преобразованиям, искажениям и переводам во входном изображении (небольшое искажение во входе не изменит выход Пулинга — так как мы берем максимальное/среднее значение в локальной окрестности).
- помогает нам прийти к почти масштабно-инвариантному представлению нашего изображения (точный термин — «эквивариантный»). Это очень мощно, поскольку мы можем обнаруживать объекты на изображении независимо от того, где они расположены.
Выходные данные слоя пула действуют как входные данные для полносвязного слоя, который мы обсудим в следующем разделе.
Полностью подключенный слой
Выходной слой обычного многослойного персептрона полносвязного слоя имеет функцию активации SoftMax / Sigmoid (также можно использовать другие классификаторы, такие как SVM, но в этом посте мы будем придерживаться SoftMax). Согласно определению «Полностью подключенный», каждый нейрон в слое ниже связан с каждым нейроном в слое выше.
Функции высокого уровня входного изображения представлены выходными данными сверточных слоев и слоев объединения. Задача слоя Fully Connected состоит в том, чтобы разделить входное изображение на несколько классов, используя эти атрибуты и набор обучающих данных. Например, задача классификации изображений, которую мы поставили перед собой, может привести к ряду различных результатов, как показано на рисунке 12 ниже (обратите внимание, что на рисунке 12 не показаны скрытые слои в полносвязном слое).
В дополнение к классификации данных изучение нелинейных комбинаций этих функций может быть выполнено (обычно) по доступной цене путем добавления полностью связанного слоя. Для задачи классификации может оказаться полезным большинство признаков сверточных слоев и слоев пула, но комбинации этих признаков могут оказаться еще более эффективными.
Выходные вероятности полносвязного слоя в сумме равны единице. Функция активации в выходном слое Fully Connected Layer — это Softmax, который обеспечивает это. Вектор произвольных действительных оценок сжимается функцией Softmax до вектора значений от нуля до единицы, которые в сумме составляют единицу.
Собираем все вместе — обучение с использованием обратного распространения
Как было сказано ранее, слой Fully Connected служит классификатором, а слои Convolution + Pooling работают как экстракторы признаков из входного изображения.
Обратите внимание, что на рис. ), целевая вероятность равна 1 для правильного предсказанного класса и 0 для других классов цифр, т. е.:
- Входное изображение = среди 10 изображений цифр (0–9)
- Целевой вектор = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ] ………….. (1 будет фактической цифрой среди этих 10 цифр)
Общий процесс обучения сверточной сети можно резюмировать следующим образом:
- Шаг 1: мы инициализируем все фильтры и параметры/веса случайными значениями.
- Шаг 2. Сеть принимает обучающее изображение в качестве входных данных, проходит этап прямого распространения (операции свертки, ReLU и объединения вместе с прямым распространением в слое Fully Connected) и находит выходные вероятности для каждого класса.
- Допустим, выходные вероятности для изображения выше [0,2, 0,4, 0,1, 0,3, 0,2, 0,4, 0,1, 0,3, 0,2, 0,4]
- Поскольку веса для первого обучающего примера назначаются случайным образом, выходные вероятности также являются случайными.
- Шаг 3. Рассчитайте общую ошибку на выходном слое (сумма по всем 10 классам).
- Шаг 4. Используйте обратное распространение, чтобы вычислить градиенты ошибки по отношению ко всем весам в сети, и используйте градиентный спуск, чтобы обновить все значения фильтра/веса и значения параметров, чтобы свести к минимуму ошибку вывода.
- Веса корректируются пропорционально их вкладу в общую ошибку.
- Когда то же самое изображение вводится снова, выходные вероятности теперь могут быть [0,03, 0,02, 0,7, 0,02, 0,01, 0,01, 0,10, 0,05, 0,01, 0,05], что ближе к целевому вектору [0, 0, 1, 0 , 0, 0, 0, 0, 0, 0 ]
- Это означает, что сеть научилась правильно классифицировать это конкретное изображение, настраивая его веса/фильтры таким образом, чтобы уменьшить ошибку вывода.
- Такие параметры, как количество фильтров, размеры фильтров, архитектура сети и т. д., были зафиксированы до шага 1 и не меняются в процессе обучения — обновляются только значения матрицы фильтров и веса соединений.
- Шаг 5. Повторите шаги 2–4 со всеми изображениями в тренировочном наборе.
Теперь сеть ConvNet обучена, что по существу означает, что все ее веса и параметры были скорректированы для правильной классификации фотографий из обучающего набора.
ConvNet будет проходить фазу прямого распространения, когда появится новое (невидимое) изображение. ввод и будет производить вероятность для каждого класса (для нового изображения выходные вероятности вычисляются с использованием весов, которые были оптимизированы для правильной категоризации всех предыдущих обучающих экземпляров). Сеть будет (надеюсь) хорошо обобщать новые фотографии и классифицировать их по соответствующим категориям, если наша обучающая выборка будет достаточно большой.
Примечание 1. Чтобы дать представление о процессе обучения, описанные выше этапы были упрощены, а математические особенности исключены.
Примечание 2: два набора альтернативных сверток. и Слои объединения использовались в вышеупомянутом примере. Однако имейте в виду, что эти процедуры можно повторять любое количество раз в одной ConvNet. На самом деле, лучшие сверточные сети в настоящее время имеют десятки слоев как для свертки, так и для объединения! Кроме того, слой пула не требуется, чтобы следовать за каждым сверточным слоем.
Визуализация сверточных нейронных сетей
Вообще говоря, чем более сложные функции наша сеть может научиться обнаруживать, тем больше шагов свертки у нас будет. Например, при распознавании изображений ConvNet может научиться распознавать края в необработанных пикселях первого слоя, использовать эти края во втором слое для распознавания основных форм, а затем использовать эти формы для распознавания функций более высокого уровня, таких как формы лица, в верхние слои. Рисунок 14 ниже иллюстрирует это; он был предоставлен просто для иллюстрации концепции. Эти особенности были изучены с помощью Convolutional Deep Belief Network (это только пример: сверточные фильтры в реальной жизни могут обнаруживать объекты, которые не имеют никакого значения для человека).
Другие архитектуры ConvNet
Сверточные нейронные сети существуют с начала 1990-х годов. Выше мы обсуждали LeNet, которая была одной из самых первых сверточных нейронных сетей. Некоторые другие влиятельные архитектуры перечислены ниже.
- LeNet (1990-е): уже упоминалось в этой статье.
- С 1990-х по 2012 год: в период с конца 1990-х до начала 2010-х сверточная нейронная сеть находилась в стадии инкубации. По мере того как становилось доступно все больше и больше данных и вычислительных мощностей, задачи, которые могли решать сверточные нейронные сети, становились все более и более интересными.
- AlexNet (2012): в 2012 году Алекс Крижевский (и другие) выпустил AlexNet, который был более глубокой и широкой версией LeNet и с большим отрывом выиграл сложная задача ImageNet Large Scale Visual Recognition Challenge (ILSVRC) в 2012 году. Это был значительный прорыв по сравнению с предыдущими подходами, и нынешнее широкое применение CNN можно отнести к этой работе.
- ZF Net (2013): победителем ILSVRC 2013 стала сверточная сеть от Мэтью Зейлера и Роба Фергуса. Он стал известен как ZFNet (сокращение от Zeiler & Fergus Net). Это было улучшение AlexNet за счет настройки гиперпараметров архитектуры.
- GoogLeNet (2014): победителем ILSVRC 2014 стала сверточная сеть от Szegedy et al. от Google. Его основным вкладом стала разработка начального модуля, который резко сократил количество параметров в сети (4 млн по сравнению с AlexNet с 60 млн).
- VGGNet (2014). Второе место в ILSVRC 2014 заняла сеть, которая стала известна как VGGNet. Его основной вклад заключался в том, что он показал, что глубина сети (количество слоев) является критическим компонентом для хорошей производительности.
- ResNets (2015): остаточная сеть, разработанная Kaiming He (и другими), стала победителем ILSVRC 2015. ResNets в настоящее время является самой современной сверточной нейронной сетью. модели и являются выбором по умолчанию для использования ConvNets на практике (по состоянию на май 2016 г.).
- DenseNet (август 2016 г.): недавно опубликованная Гао Хуаном (и другими) сверточная сеть с плотным подключением имеет каждый слой, непосредственно связанный со всеми остальными уровнями в канале. вперед мода. Было показано, что DenseNet обеспечивает значительные улучшения по сравнению с предыдущими современными архитектурами в пяти высококонкурентных тестовых задачах распознавания объектов. Ознакомьтесь с реализацией Torch здесь.
Заключение
Я настоятельно рекомендую прочитать заметки о курсе ConvNets из Стэнфордского университета, а также другие первоклассные источники, перечисленные ниже в разделе «Ссылки», чтобы получить более глубокие знания по некоторым из этих тем.
Пожалуйста, не стесняйтесь оставлять комментарии ниже, если вам нужна помощь в понимании какой-либо из вышеперечисленных тем или если у вас есть какие-либо вопросы или рекомендации.
В этом посте я попытался кратко описать основные идеи, лежащие в основе сверточных нейронных сетей. Есть несколько элементов, которые я пропустил или слишком упростил, но я надеюсь, что это эссе дало вам общее представление о том, как они работают.