Интуитивный подход

В Интернете есть множество замечательных статей, объясняющих сверточные нейронные сети (или «CNN») на разных уровнях от новичка до продвинутого. Эта статья, написанная для новичков, призвана использовать другой подход, чем большинство из тех, кто там есть: объяснение снизу вверх механизмов и системы, из которых состоит CNN. Моя гипотеза состоит в том, что многие инженеры узнают о решениях в том порядке, в котором они были созданы: добавляя каждую новую функцию по одной для создания конечного продукта.

Статья будет состоять из трех разделов.

  • Во-первых, объяснение проблемы, для решения которой были созданы CNN.
  • Во-вторых, пошаговое объяснение алгоритмов («слоев») CNN.
  • В-третьих, порядок, в котором эти слои используются и почему.

Раздел 1: Для чего были созданы CNN?

Олимпиада компьютерного зрения - это ежегодное соревнование, получившее название «ImageNet Challenge» (ILSVRC). Начиная с 2010 года, стояла задача создать компьютерную программу, которая сможет правильно идентифицировать объект на изображении. То есть, если я дам вашей программе изображение бабочки, она должна вернуть строку «бабочка».

Человеческий мозг делает этот процесс почти мгновенно. Вы уже знаете, что это за изображение выше, я вам не говорю. Это потому, что в тот момент, когда человек видит льва, мозг распознает его как отдельный объект и сразу же классифицирует его как «льва». Нетрудно думать о преимуществах с точки зрения выживания. Победитель ImageNet 2012 года (названный «AlexNet») использовал этот человеческий навык в качестве основы для своего дизайна. Они создали успешную CNN, исследуя теории нейробиологии, касающиеся распознавания объектов мозгом.

Так как же мозг превращает изображение выше в «трех собак в поле?» Одна вещь, которую мы делаем, - это распознаем резкую грань между зеленым фоном и коричневым мехом собаки. Используя это, мы узнаем общий контур собак: два торчащих уха и длинное тело. Другие формы внутри этого контура помогают нам определить, что это собака, а не лиса (рассмотрите язык, форму рта и носа и т. Д.). Цвет собак нам тоже помогает. Итак, предполагая, что мы хотим подойти к проблеме распознавания форм так же, как это делает человек, мы можем начать с создания алгоритма, который будет распознавать определенные формы или края изображения. Вот где начинается Раздел 2.

Особенности ввода

Для этой задачи важно понимать форму входных данных. Для компьютера изображение представляет собой трехмерную матрицу (ширина × высота × глубина) со значениями от 0 до 255. Цветное изображение 4K имеет размеры 4096 × 2160 × 3. То есть его ширина в пикселях на высота в пикселях на трех цветовых каналов RGB. Значения представляют интенсивность для каждого цвета каждого пикселя. Для упрощения в этой статье в основном будут рассматриваться черно-белые изображения с глубиной 1.

Раздел 2: Уровни CNN

Сверточные нейронные сети можно разбить на несколько компонентов. Эти компоненты можно рассматривать как отдельные алгоритмы, и их обычно называют «слоями». Во-первых, рассмотрите слои по отдельности. В разделе 3 позже будет рассмотрено, как они сочетаются. Мы рассмотрим три слоя (A, B, C).

Слой A: свертка

Как упоминалось в разделе 1, нам может потребоваться распознавать края или цвета внутри изображения. Например, мы можем захотеть обнаружить кривые, подобные приведенной ниже. Кривая может быть представлена ​​с использованием матрицы значений (точно так же, как входные данные). Глубина фильтра всегда равна глубине изображения.

Теперь мы хотим проверить, содержит ли изображение эту форму. Матрица, представляющая эту форму, называется фильтром. Его также называют нейроном или ядром. Давайте протестируем простое изображение ниже для этой формы, используя наш фильтр:

Если мы сосредоточимся на части изображения с такими же размерами (Ш × В × Г), что и фильтр, мы можем вычислить скалярное произведение значений раздела изображения и значений фильтра. Во-первых, давайте исследуем область изображения, содержащую форму, которую мы тестируем. Область, на которой мы фокусируемся, называется рецептивным полем:

Теперь произведите скалярное произведение между фильтром и воспринимающим полем:

Скалярное произведение для этого раздела составляет 218535, очень большое число. Это число было бы меньше, если бы форма на изображении не была так похожа на форму фильтра. Ниже приведен пример, в котором скалярное произведение вычисляется с гораздо меньшим значением, поскольку форма на изображении не соответствует форме фильтра (вычисляется до 0).

Фактически, чем больше скалярное произведение, тем больше похожи фильтр и часть изображения. Поэтому мы можем использовать скалярное произведение фильтра и части изображения, чтобы проверить, где расположены определенные формы. Получение правильных значений фильтра важно, так как вы хотите проверить правильность формы. Значения, которые мы «обучаем» в CNN, и есть это: матричные значения фильтра. Обычно перед обучением на наборе изображений значения инициализируются случайным образом. Обратите внимание, что значения фильтра также могут быть отрицательными.

Но как мы храним эту информацию? Мы хотим сохранить некоторую форму записи кривых на изображении. Как мы сохраняем, что есть одна кривая вверху слева, а справа нет ни одной?

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

Это называется картой, потому что любое место на карте активации будет отражать, насколько хорошо форма (фильтр) соответствует соответствующему местоположению фактического изображения. Другими словами, карта показывает, где на изображении появляется определенная форма.

Глубина карты активации для одного фильтра всегда равна 1.

Слой B: объединение

Назначение уровня объединения - уменьшить пространственный размер карт активации. Это не только сокращает объем необходимых вычислений, но и защищает от переобучения. Идея объединения очень проста. Мы хотим уменьшить большие матрицы, чтобы стать меньшими. Наиболее распространенный метод объединения - максимальный пул.

Идея этого метода состоит в том, чтобы сохранить только максимальное значение в меньших областях карты активации и избавиться от всего остального. В оранжевой области выше 7 - это максимальное значение, поэтому оно сохраняется, а 5, 3 и 2 отбрасываются.

Уровень C: Полностью подключен

Полносвязный слой всегда является последним слоем сверточной нейронной сети. Это потому, что это слой, который связывает преобразования, сделанные на изображении, с фактическими категориями, такими как «лев» и «мышь».

Этот слой представляет собой традиционный многослойный перцептрон. Понимание многослойных перцептронов важно для понимания моделей машинного обучения в целом (здесь можно найти отличное объяснение с изображениями!). Полносвязный уровень CNN - это только один из многих случаев, когда он используется. Поэтому я призываю вас поискать другой учебник, который более подробно освещает эту тему. А пока я сосредоточусь на вводе и выводе этого слоя.

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

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

Почему мы не просто используем полностью связанный слой?

Что ж, хотя полностью связанный слой может «анализировать» комбинации уже идентифицированных форм, он не может анализировать отдельные пиксели. Это связано с тем, что отдельные пиксели не соответствуют содержимому изображения, в отличие от сложных форм. Очень немногие изображения кошек содержат формы колес.

Выходные данные полностью связанного слоя - это вектор вероятностей для каждой категории, в которой мы решили обучить модель. Если, например, мы заставляем модель классифицировать изображение как «кошка», «лев» или «машина», тогда на выходе может быть вектор, такой как [0,91, 0,08, 0,01]. Это означает, что с вероятностью 91% на изображении изображена кошка, 8% - лев и 1% - машина. Затем мы выбираем наиболее вероятную категорию в качестве «предположения» для рассматриваемого изображения. Сумма элементов в этом векторе всегда прибавляется к 1. (если вам интересно, почему это связано с функцией активации многослойного перцептрона).

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

Раздел 3. Объединение слоев

Есть несколько способов объединить слои, описанные в разделе 2, во что-то полезное для классификации изображений. Здесь мы рассмотрим объединение нескольких сверточных слоев для распознавания сложных форм и того, что иногда называют четвертым «слоем», используемым в CNN: функции нелинейности. Наконец, мы рассмотрим некоторые успешные CNN и их общую архитектуру.

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

Распознавание этих паттернов - хорошее начало, но они могут не идентифицировать что-то как «лев» или «кошку». Для этого нам нужно построить более сложные формы, используя эти простые.

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

Эти проблемы лучше устраняются с помощью более простых фильтров. Таким образом, они остаются простыми. Вместо этого мы применяем несколько фильтров к изображению в одном сверточном слое и объединяем их в следующем слое только после того, как они были обнаружены и записаны индивидуально в карты активации.

Две отдельные формы (фильтр 1 и 2) на исходном изображении обозначены на картах активации как более высокие значения (из вычислений скалярного произведения). Затем мы можем создать фильтр той же глубины, что и результат первого слоя, чтобы объединить фильтры. В приведенном выше примере эта глубина равна 2, поскольку мы использовали 2 фильтра. В других архитектурах это может быть больше; это полностью зависит от того, сколько фильтров мы используем в первом слое. В нашем случае фильтр для этого второго слоя может быть очень простым. Мы хотим найти вхождения формы 1, посмотрев на карту активации 1, и вхождения фигуры 2, посмотрев на карту активации 2. Проекция их на 2D-изображение должна давать их расположенные рядом друг с другом комбинации. Таким образом, мы идентифицируем области изображения с этой более сложной формой.

Затем этот процесс повторяется столько раз, сколько вы хотите. Повторение этого больше раз означает, что сеть может изучать все более сложные формы. Цель состоит в том, чтобы научиться обнаруживать сложные функции, которые могут стать обучаемыми классификаторами для списка объектов. Рассмотрим комплексные особенности автомобиля ниже:

Конкретные особенности, указанные выше, не обязательно являются тем, что сеть, участвующая в ILSVRC, учится «искать». Это просто визуализация, чтобы помочь нам, людям, понять, что происходит под капотом CNN.

Так зачем возиться с этой «функцией нелинейности»?

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

Ответ прост: свертка - это линейное преобразование. Этому есть простые математические объяснения (например, это), и я настоятельно рекомендую вам прочитать одно, если вы еще не уверены в этом.

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

Одна успешная функция нелинейности, используемая во многих CNN, - это ReLU. Это просто функция «max (0, x)», где x - входное значение, применяемое поэлементно к матрице. Превращает любые отрицательные значения в 0.

Собираем все вместе, проектируем архитектуру CNN

Теперь вы понимаете все строительные блоки. Мы (1) берем изображение и применяем сверточный слой. Затем мы (2) применяем функцию нелинейности к выходным данным, чтобы (3) повторить (3) с другим сверточным слоем. После нескольких парных слоев свертки и нелинейности мы (4) применяем объединяющий слой, чтобы уменьшить сложность и избежать переобучения. С некоторыми (5) повторениями этого (шаги 1–4) мы определили несколько обучаемых классификаторов и можем (6) отправить выходную матрицу на полностью связанный уровень. Он выводит весовые коэффициенты вероятности для каждой категории, на которой мы хотим его обучить. Краткое описание процесса приводится ниже:

Все выборы, сделанные в отношении количества слоев, их гиперпараметров и их порядка, однозначно идентифицируют сеть. Существует множество известных сетей с открытым исходным кодом с разными целями и уровнями успеха. Мы уже обсуждали AlexNet, победителя ILSVRC 2012. Другая сеть, которая фокусируется на распознавании более сложных обучаемых классификаторов, называется VGG.

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

Если вам понравилась эта статья, подумайте о том, чтобы дать ей аплодисменты. Это действительно помогает мне и мотивирует делать больше!