За очисткой лица математический принцип сверточной нейронной сети оказывается таким

Нейронные сети

от Навстречу Datascience,автор:Петр Скальский,Сердце Машины собрано,принимать участие:Нурхачу Нуль, Чжан Цянь

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

существуетАвтопилот, здравоохранение и розничная торговля, компьютерное зрение позволило нам делать вещи, которые до недавнего времени считались невозможными. Сегодня беспилотные автомобили и беспилотные магазины уже не кажутся такими мечтательными. На самом деле мы каждый день пользуемся компьютерным зрением — разблокируем телефоны лицом, автоматически ретушируем фотографии перед тем, как загрузить их в соцсети…Сверточная нейронная сетьВероятно, это ключевой строительный блок, стоящий за этим огромным успехом. На этот раз мы собираемся использовать идею сверточных нейронных сетей, чтобы расширить наше понимание того, как работают нейронные сети. В качестве меры предосторожности эта статья содержит довольно сложные математические уравнения, но не волнуйтесь, что вам не нравятся линейная алгебра и исчисление. Моя цель не в том, чтобы заставить вас запомнить эти формулы, а в том, чтобы дать вам некоторое интуитивное представление об основных принципах.

Введение

В прошлом мы сталкивались с плотно связанными нейронными сетями. В этих нейронных сетях все нейроны разделены на группы, образующие последовательные слои. Каждая такая единица связана с каждым отдельным нейроном соседнего слоя. На рисунке ниже показана такая архитектура.

Рисунок 1:
Плотно связанная архитектура нейронной сети

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

Структура данных цифровых фотографий

Давайте на минутку объясним, как хранятся цифровые изображения. Как многие из вас, вероятно, понимают, изображение на самом деле представляет собой огромную матрицу чисел. Каждое число представляет яркость отдельного пикселя. В модели RGB цветное изображение состоит из 3-х таких матриц, каждая из которых соответствует одному из 3-х цветовых каналов (красный, зеленый, синий). В черно-белых изображениях мы используем только одну матрицу. Каждая матрица хранит значения от 0 до 255. Этот диапазон значений является компромиссом между эффективностью хранения информации изображения (256 значений соответствуют ровно одному байту) и чувствительностью человеческого глаза (мы можем различать лишь несколько ограниченных оттенков одного и того же цвета).

Рисунок 2. Структура данных цифрового изображения

свертка

Свертка ядра используется не только в сверточных нейронных сетях, но и является ключевым элементом многих других алгоритмов компьютерного зрения. Процесс происходит так: у нас есть небольшая матрица чисел (называемая ядром свертки или фильтром), мы передаем ее на наше изображение и преобразуем на основе значений фильтра. Значения последующих карт признаков рассчитываются по следующей формуле, где входное изображение обозначается f, а наше ядро ​​свертки — h. Индексы строки и столбца результата расчета обозначаются как m и n соответственно.

Рисунок 3. Пример свертки ядра

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

Рис. 4. Нахождение ребер с помощью ядра свертки

Свертка действительного и одинакового

Как показано на рисунке 3, когда мы выполняем свертку изображения 6x6 с ядром 3x3, мы получаем карту признаков 4x4. Это связано с тем, что на нашем изображении есть только 16 уникальных мест для размещения ядра свертки. Поскольку размер нашего изображения уменьшается с каждой сверткой, мы можем сделать только ограниченное количество сверток, прежде чем изображение полностью исчезнет. Также, если мы обратим внимание на то, как ядро ​​свертки перемещается по изображению, мы увидим, что пиксели по краям будут иметь меньшее влияние, чем пиксели в центре. Таким образом, мы теряем часть информации, содержащейся в изображении, и вы можете видеть на изображении ниже, как положение пикселя меняет свое влияние на карту объектов.

Рис. 5. Влияние расположения пикселя

Чтобы решить обе эти проблемы, мы можем заполнить изображение дополнительной рамкой. Например, если мы использовали заполнение в 1 пиксель, мы увеличили размер изображения до 8x8, поэтому на выходе фильтра 3x3 будет 6x6. Обычно на практике мы используем 0 для дополнительного заполнения. В зависимости от того, используем ли мы заполнение, мы делаем два типа сверток — Valid и Same. Именование довольно запутанное, поэтому объясните его здесь: «valid» означает, что мы используем исходное изображение, «same» означает, что мы используем рамку вокруг изображения, поэтому входное и выходное изображения имеют одинаковый размер. Во втором случае ширина расширения должна удовлетворять следующему уравнению, где p — заполнение, а f — размерность фильтра (обычно нечетное число).


ступенчатая свертка

Рисунок 6. Пример пошаговой свертки

В предыдущих примерах мы всегда перемещали ядро ​​свертки на один пиксель. Тем не менее, шаг также можно рассматривать как параметр сверточного слоя. На рисунке 6 мы можем увидеть, как выглядит свертка, если мы используем больший шаг. При разработке структуры CNN, если мы хотим, чтобы рецептивные поля имели меньшее перекрытие или чтобы карты объектов имели меньшее пространственное измерение, мы можем решить увеличить шаг. С учетом расширения и шага размер выходной матрицы можно рассчитать по следующей формуле:



Превратиться в третье измерение

Стерео свертка — очень важная концепция, которая позволяет нам не только работать с цветными изображениями, но, что более важно, использовать несколько фильтров на одном слое. Самое важное правило заключается в том, что фильтр и изображение, к которому вы хотите применить фильтр, должны иметь одинаковое количество каналов. По сути, мы продолжаем использовать пример, аналогичный рисунку 3, хотя на этот раз мы умножаем пары значений в матрице из третьего измерения. Если бы мы хотели применить несколько фильтров к одному и тому же изображению, мы бы вычисляли свертки для каждого фильтра независимо, затем складывали вычисленные результаты один за другим и, наконец, объединяли их в единое целое. принадлежитТензор(трехмерные матрицы можно назвать тензорами) удовлетворяют следующим уравнениям, где: n — размер изображения, f — размер фильтра, n_c — количество каналов в изображении, p — используемое заполнение, а s — используемый шаг, n_f — количество фильтров.

Рисунок 7. Стерео свертка

сверточный слой

Пришло время построить сверточный слой, используя то, что мы узнали сегодня. Наш подход почти идентичен тому, который используется в плотносвязанных нейронных сетях, с той лишь разницей, что вместо простого матричного умножения на этот раз мы будем использовать свертки. Прямое распространение состоит из двух шагов. Первым шагом является вычисление промежуточного результата Z, который получается путем свертки входных данных предыдущего слоя с тензором W (содержащим фильтр) плюс член смещения b. Второй шаг — применить нелинейную функцию активации к нашему промежуточному результату (обозначим нашу функцию активации как g). Любители матричных уравнений найдут подходящие математические формулы ниже. На иллюстрации ниже вы можете увидеть небольшую визуализацию, описывающую размерности тензоров, используемых в наших уравнениях.

Рис. 8. Размеры тензора

Разрыв соединения и совместное использование параметров

В начале этой статьи я упомянул, что плотносвязанные нейронные сети слабы в обработке изображений из-за огромного количества параметров для обучения. Теперь, когда мы все знаем о свертке, давайте рассмотрим, как она оптимизирует вычисления. На изображении ниже 2D-свертка визуализируется немного по-другому — нейроны, помеченные номерами 1-9, составляют входной слой, который получает интенсивности последующих пикселей, а 4 единицы AD представляют вычисленный элемент карты признаков. И последнее, но не менее важное: I-IV — это значения в ядре свертки — их надо выучить.

Рис. 9. Отсечение соединения и совместное использование параметров

Теперь давайте сосредоточимся на двух важных свойствах сверточных слоев. Во-первых, вы можете видеть, что в двух последовательных слоях не все нейроны связаны друг с другом. Например, ячейка 1 влияет только на значение A. Во-вторых, мы обнаружили, что некоторые нейроны имеют одинаковые веса. Оба эти свойства означают, что нам нужно изучить гораздо меньшее количество параметров. Кстати, стоит отметить, что каждое значение в фильтре влияет на каждый элемент карты признаков — это особенно важно при обратном распространении.

Обратное распространение свёрточного слоя

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

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

Рисунок 10. Входные и выходные данные для сверточного слоя в прямом и обратном распространении

Наша задача — вычислить dW^[l] и db^[l] — которые являются производными по параметрам текущего слоя, а также вычислить dA^[l -1], которые передаются предыдущему слою. Как показано на рисунке 10, мы принимаем dA^[ l ] в качестве входных данных. Конечно, размерности этих соответствующих тензоров все одинаковы: dW и W, db и b, dA и A. Первый шаг — получить промежуточное значение dZ^[l], применив производную нашей функции активации к нашему входному тензору. По цепному правилу результат этой операции будет использован позже.

Теперь нам нужно разобраться с обратным распространением самой сверточной нейронной сети, и для этого мы будем использовать матричную операцию, называемую полной сверткой — см. изображение ниже. Обратите внимание, что используемое нами ядро ​​свертки заранее повернуто на 180°. Эту операцию можно описать следующей формулой, где фильтр обозначается W, а dZ[m,n] — скаляр, принадлежащий частной производной, полученной из предыдущего слоя.

Рисунок 11. Полная свертка

объединяющий слой

Помимо сверточных слоев, CNN часто используют так называемые объединяющие слои. Сначала они использовались для уменьшения размера тензоров и ускорения операций. Эти слои относительно просты — нам нужно разделить наше изображение на разные области, а затем выполнить некоторые операции с каждой частью. Например, для слоя Max Pool мы выберем максимальное значение каждой области и поместим его в соответствующую выходную область. Как и в случае сверточных слоев, нам доступны два гиперпараметра — размер фильтра и шаг. И последнее, но не менее важное: если вы выполняете объединение изображений с несколькими каналами, объединение для каждого канала должно выполняться отдельно.

Рисунок 12. Пример максимального объединения

Обратное распространение слоя пула

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


Рисунок 13. Обратное распространение с максимальным объединением

Оригинальная ссылка:к data science.com/gentle-dive…