e
У многих слово «свёртка» ассоциируется со сложными и непонятными формулами. А ведь это одно из самых важных понятий в Deep Learning: именно свёрточные сети вывели глубокое обучение на новый уровень. Специально для тех, кто не до конца понимает свёртку — статья о том, как работает свёртка и что делает её такой мощной.
Первая часть материала предназначена для всех, кто хочет понять общую концепцию свёртки и свёрточных сетей. Вторая часть включает более сложное объяснение и направлена на углубление понимания свёртки для исследователей и специалистов.
Вы можете представить себе свёртку как «смешивание» информации. Представьте два ведра, наполненных какой-либо информацией, которые выливаются в один большой контейнер и затем перемешиваются определённым способом. Каждое ведро с информацией имеет своё собственное правило, которое описывает, как информация из одного ведра смешивается с другим. Свёртка — это упорядоченная процедура смешивания двух источников информации.
Свёртку можно описать математически. Это такая же операция, как сложение, умножение или взятие производной. Хотя сама по себе операция свёртки сложна, она может быть очень полезна для упрощения ещё более сложных выражений.
Когда мы применяем свёртку к изображениям, она действует на них в двух измерениях: по ширине и высоте. Здесь снова можно провести аналогию с двумя «вёдрами» информации. Первое ведро — входное изображение с тремя матрицами пикселей: по одной для красного, синего и зелёного цветов. Пиксель состоит из целочисленного значения от 0 до 255 для каждого цветового канала. Второе — это ядро свёртки: матрица вещественных чисел, свойства которой можно рассматривать как правила «перемешивания» входного изображения и ядра. В результате мы получим изменённое изображение, которое в глубоком обучении часто называют «карта признаков». Для каждого цветового канала будет по одной карте.
Теперь рассмотрим саму операцию свёртки. Один из способов её применения — взять патч (небольшой участок) входного изображения размером с ядро. Например, здесь у нас картинка 100×100 пикселей и ядро 3×3, поэтому мы возьмём патч 3×3 и поэлементно перемножим каждый патч изображения с ядром свёртки. Потом сложим все результаты умножения и получим один пиксель карты признаков. После этого мы сдвигаем патч и повторяем вычисления. Проделываем эту операцию до тех пор, пока не посчитаем все пиксели карты признаков.
Как вы могли заметить, существует ещё процедура нормализации: выходное значение нормализуется по размеру ядра, чтобы общая интенсивность изображения и карты признаков оставалась неизменной.
На изображениях часто присутствует лишняя информация, которая не имеет отношения к тому, что мы ищем на них. Например, вы хотите сделать поиск по фотографиям с одеждой, чтобы находить вещи похожего стиля с помощью автокодировщика (это специальная архитектура глубоких нейронных сетей, которая по входному изображению ищет наиболее похожие на него варианты). Для определения стиля одежды вам не важен её цвет, эмблемы бренда и прочие мелкие детали. Наиболее информативной будет форма — блузка явно отличается от пиджака, брюк или рубашки. Поэтому если мы отфильтруем ненужную информацию, наш алгоритм не будет отвлекаться на несущественные детали. Это легко можно сделать с помощью свёртки.
Для начала предварительно обработаем данные, применив детектор краёв Собеля-Фельдмана (один из видов ядер), чтобы отфильтровать всё, кроме контуров формы объекта. Вот почему применение свёртки часто называют фильтрацией, а ядра — фильтрами (более точное определение процессов фильтрации приведено ниже). Полученная карта признаков будет полезной, если вы хотите отличить разные типы одежды, поскольку на ней чётко видна форма.
Мы можем усовершенствовать наш алгоритм: существует множество ядер для создания разных карт признаков. Есть те, которые делают изображение более чётким (больше деталей) или, наоборот, размытым (меньше деталей). При этом каждая карта признаков может оказаться полезной для алгоритма: например, такие детали, как три кнопки вместо двух на куртке, будут важны.
Такая процедура — получение и преобразование входных данных перед отправкой в алгоритм — называется проектирование признаков. Это очень сложная операция, и не так много людей могут умело применять её для широкого круга решений. Трудность заключается в том, что для каждого типа данных и задач подходят совершенно разные признаки: например, признаки для изображений будут совершенно бесполезным при работе с временными рядами. Даже если у вас две одинаковые задачи с фотографиями, будет непросто найти хорошее решение, поскольку разным объектам могут требоваться разные признаки. Для понимания этого требуется немалый опыт.
Каждую задачу проектирования признаков нужно начинать с нуля. Но можем ли мы по одному взгляду на изображения определить, какое ядро подойдёт для конкретной проблемы?
Находить подходящие для определённой задачи ядра можно с помощью свёрточных сетей. Вместо того, чтобы задавать конкретные числа нашим ядрам, мы назначим для них параметры, которые будут обучаться на данных. По мере обучения ядро будет всё лучше и лучше фильтровать изображение (или карту признаков) для получения нужной информации. Этот автоматический процесс называется обучение признакам. Он обобщается для любой новой задачи: нам надо просто заново обучить нашу сеть и найти подходящие фильтры. Именно поэтому свёрточные сети такие мощные — никаких проблем с проектированием признаков.
Обычно мы обучаем не одно ядро, а иерархию нескольких ядер одновременно. Например, применение ядра 32×16×16 к изображению 256×256 даст 32 карты признаков размером 241×241 (это стандартное соотношение: размер изображения - размер ядра + 1). Таким образом, мы автоматически изучим 32 новых признака с информацией для нашей задачи. Они используются в качестве входных данных для следующего ядра, которое снова применяет к ним фильтр. Как только мы изучим всю иерархию, мы просто передадим её в простую нейросеть, которая объединит признаки для классификации входного изображения. Это почти всё, что нужно знать о свёрточных сетях на концептуальном уровне.
Теперь у нас есть неплохое понимание того, что такое свёртка и как работают свёрточные сети. Но можно копнуть глубже и подробнее рассмотреть, что на самом деле происходит во время применения свёртки. При этом мы увидим, что первоначальная интерпретация довольно грубая, и попробуем найти решение, которое поможет расширить наши знания. Для этого первым делом попробуем понять теорему о свёртке.
Теорема связывает две сущности: свёртку в пространственно-временной области в виде громоздкого интеграла или суммы и простое поэлементное умножение в Фурье-области (частотной). Теорема применяется во многих сферах науки и является причиной, по которой многие считают алгоритм быстрого преобразования Фурье одним из важнейших в 20-м веке.
Первое уравнение — одномерная непрерывная теорема о свёртке для двух базовых непрерывных функций. Второе — двумерная дискретная теорема для дискретных изображений. Здесь
Обратите внимание, что здесь понятие «дискретный» означает, что наши данные состоят из счётного числа переменных (пикселей). А «одномерный» значит, что эти переменные могут быть представлены в одном измерении. Например, время — одномерное (одна секунда следует за другой), изображения — двумерные (пиксели находятся в строках и столбцах), видео — трёхмерные (пиксели находятся в строках и столбцах, а изображения следуют друг за другом).
Для лучшего понимания теоремы мы подробнее рассмотрим интерпретацию преобразований Фурье в отношении обработки изображений.
Быстрое преобразование Фурье — алгоритм, который преобразует данные из пространственно-временной области в частотную область. Он представляет исходную функцию в виде суммы косинусов и синусов. Важно отметить, что преобразование Фурье обычно является комплексным (действительное значение преобразуется в комплексное). Мнимая часть полученного числа играет роль только для определённых операций или обратного преобразования в пространственно-временную область. В этой статье мы будем рассматривать действительную часть. Ниже вы можете увидеть визуализацию применения преобразования Фурье к входному сигналу (частотной функции с временным параметром).
На самом деле вы часто видите примеры преобразований Фурье в реальной жизни: например, если красный сигнал — песня, то чёрный — столбцы эквалайзера в вашем mp3-плеере.
Как мы можем вообразить частоты изображений? Представьте себе лист бумаги с двухцветным рисунком. Теперь представьте волну, которая проходит от одного края листа к другому и проникает сквозь бумагу на каждой полосе одного цвета и парит над полосами другого цвета. Такие волны «прокалывают» чёрные и белые части через определённые интервалы, например, каждые два пикселя — это будет частотой. В преобразовании Фурье более низкие частоты находятся ближе к центру, а более высокие — по краям (максимальная частота будет у самого края изображения).
Значения с более высокой интенсивностью (белый цвет) упорядочены в соответствии с направлением наибольшего изменения интенсивности в исходном изображении. Если эта фраза показалась вам непонятной — посмотрите на наглядный пример ниже, где изображена фотография и её логарифмическое преобразование Фурье. Применение логарифма к действительным значениям сглаживает различия в интенсивностях пикселей, чтобы нам легче было воспринимать информацию.
Мы сразу замечаем, что преобразование Фурье содержит много информации об ориентации объекта на изображении. Если объект повёрнут, скажем, на 37°, то нам трудно будет понять это из информации об исходных пикселях, но будет очевидно из преобразованных значений.
Благодаря теореме о свёртке мы можем представить, как свёрточные сети работают с изображениями в Фурье-области. Кроме того, мы знаем, что алгоритм чувствителен к повороту — поэтому свёрточные сети справляются с повёрнутыми изображениями лучше традиционных методов.
Причина, по которой операцию свёртки часто называют фильтрацией, станет очевидной из следующего примера.
Применим к исходному изображение преобразование Фурье, а затем умножим его на окружность, дополненную нулями (нули=чёрный цвет) в Фурье-области — так мы отфильтруем все высокочастотные значения. Заметьте, что отфильтрованное изображение имеет тот же полосатый рисунок, но худшего качества — примерно так же работает сжатие JPEG. Мы сохраняем только определённые частоты и возвращаемся в пространственную область изображения. Коэффициент сжатия — отношение размера чёрной области к размеру круга.
Если представить, что круг — это ядро свёртки, то мы получим её полноценное описание. Такой же механизм применяется в свёрточных сетях. Существует много способов ускорить и стабилизировать вычисление свёртки с помощью преобразований Фурье, здесь изложен только основной принцип.
Теперь попытаемся применить наши знания о свёртке и преобразованиях Фурье к различным областям науки и глубокому обучению.
Механика жидкостей и газов занимается созданием моделей потоков жидкостей с помощью дифференциальных уравнений, которые, как и свёртку, можно упростить с помощью преобразований Фурье. Поэтому эти преобразования широко применяют в любой области, где используется дифференцирование. Иногда единственный способ найти аналитическое решение для потока жидкости — упростить уравнение в частных производных. Решение такого уравнения иногда можно переписать в виде свёртки двух функций, поэтому оно применимо к одномерным и некоторым двумерным процессам диффузии.
Вы можете смешать две жидкости (молоко и кофе), перемещая их внешним усилием (ложкой) — это называется конвекцией и происходит довольно быстро. Но можно и подождать, когда жидкости смешаются сами (если это химически возможно) — это более медленный процесс диффузии.
Представьте себе аквариум, который разделён на две части тонким съемным барьером. Одна сторона заполнена солёной водой, а другая — пресной. Если осторожно убрать барьер, две жидкости будут смешиваться до тех пор, пока во всём аквариуме не будет одинаковая концентрация соли. Чем больше разница в солёности, тем стремительнее протекает процесс.
Допустим, у нас есть квадратный аквариум 256×256 с барьерами, которые разделяют 256×256 кубиков с различной концентрацией соли. Если вы уберёте один барьер, то два кубика с небольшой разницей в концентрации соли смешаются медленно, а с большой — быстро. Теперь представьте, что сетка 256×256 — это изображение, кубики — это пиксели, а концентрация соли — интенсивность каждого пикселя. Вместо диффузии солёности мы имеем диффузию информации о пикселях.
Мы только что описали первую часть свёртки для решения уравнения диффузии, то есть начальную концентрацию жидкости — или, в терминах изображения — исходный снимок и интенсивности пикселей. Чтобы завершить интерпретацию свёртки в виде процесса диффузии, рассмотрим вторую часть уравнения: пропагатор.
Пропагатор — функция плотности вероятности, которая указывает, в каком направлении распространяются частицы жидкости. Проблема в том, что в глубоком обучении нет функции вероятности, но есть ядро свёртки — как объединить эти понятия?
Можно применить нормализацию, которая превратит ядро свёртки в функцию плотности вероятности. Это похоже на вычисление softmax для выходных значений в задачах классификации. Пример softmax-нормализации для ядра Собеля:
Теперь у нас есть полная интерпретация свёртки для изображений с точки зрения диффузии. Мы можем разделить этот процесс на две части: первая — сильная диффузия, которая меняет интенсивности пикселей (с чёрного на белый, с жёлтого на синий и так далее), и вторая — регулирование процесса распределением вероятностей ядра свёртки. Это означает, что каждый пиксель в области ядра переходит в другое положение в соответствии со значением функции вероятности.
Для детектора контуров почти вся информация будет сконцентрирована в одном месте (это неестественно для жидкостей, но математически интерпретация верна). Например, все пиксели, значения которых меньше 0.0001, с большой вероятностью будут скапливаться в центре. Конечная концентрация будет наибольшей там, где значения соседних пикселей отличаются сильнее всего, поскольку процесс диффузии более заметен. Нетрудно догадаться, что самая большая разница между пикселями находится на гранях и пересечениях объектов — поэтому ядро и называется детектором контуров.
Итак, свёртка — это диффузия информации. Мы можем применить эту интерпретацию и к другим ядрам. Иногда необходимо выполнить softmax-нормализацию, но обычно можно сразу понять по числам внутри ядра, какой эффект получится на изображении.
Возьмём, к примеру следующее ядро. Попробуйте догадаться, что оно делает. Кликните сюда, чтобы узнать ответ (вы сможете вернуться по обратной ссылке).
Как так получается, что мы получаем детерминированное поведение, хотя в ядре свёртки находятся вероятности? Мы же должны учитывать, что диффузия частиц происходит в соответствии с пропагатором, не так ли?
Да, это действительно так. Но если взять маленькую частицу жидкости, скажем, крошечную каплю воды — в ней тоже будут находиться миллионы молекул. И хотя одна молекула может вести себя случайным образом, группа молекул в целом имеет квазидетерминированное поведение — это важная интерпретация статистической механики, и, следовательно, диффузии. Мы можем рассматривать вероятности пропагатора как среднее распределение интенсивностей пикселей. Таким образом, наша интерпретация верна с точки зрения механики жидкостей и газов. Тем не менее, существует и более точное сравнение.
Пропагатор — важное понятие в квантовой механике. Частица может находиться в суперпозиции и иметь два и более свойств, которые обычно взаимоисключают друг друга в нашем эмпирическом мире. Например, в квантовой механике частица может находиться в двух местах или состояниях одновременно (вспомните кота Шрёдингера).
Однако, когда вы попытаетесь определить состояние частицы — например, где она находится именно сейчас — то узнаете только одно из её возможных местоположений. Другими словами, вы разрушаете состояние суперпозиции, наблюдая за частицей. Пропагатор описывает распределение вероятностей в тех местах, где частица может появиться: скажем, с 30% вероятностью в месте А и с 70% вероятностью в месте Б.
Если мы запутаем частицы (квантовая запутанность — явление, при котором квантовые состояния объектов оказываются взаимозависимыми), то несколько частиц смогут одновременно находиться в сотнях или даже миллионах различных состояний. Примерно такой эффект смогут дать квантовые компьютеры.
Если интерпретировать это для глубокого обучения, то мы можем представить, что пиксели изображения находятся в суперпозиции состояний. Так, пиксель в каждом патче находится в 9 позициях одновременно (если у нас ядро 3×3). Как только мы применим свёртку, то сделаем очередное измерение, и суперпозиция каждого пикселя свернётся в одно наиболее вероятное положение. Другими словами: для каждого нового положения мы выбираем один пиксель из 9 случайным образом (согласно вероятности ядра), и результат — среднее значение всех этих пикселей. Чтобы эта интерпретация полностью была верной, необходим реальный случайный процесс. Это значит, что одно и тоже изображение и ядро дадут разные результаты. На самом деле это не так, но такое представление свёртки может натолкнуть вас на идеи, как разработать квантовые алгоритмы для свёрточных сетей.
Свёртка тесно связана с кросс-корреляцией. Кросс-корреляция — это операция, для которой требуется небольшой фрагмент информации (например, несколько секунд песни), чтобы отфильтровать большой фрагмент (всю песню) на предмет сходства. Аналогичные методы используются на YouTube для автоматической пометки видео, нарушающих авторские права.
Связь между кросс-корреляцией и свёрткой. Здесь
Хотя взаимная кросс-корреляция кажется довольно сложной, мы можем легко связать её со свёрткой в глубоком обучении с помощью небольшого трюка. Просто перевернём искомое изображение вверх ногами, чтобы выполнить взаимную корреляцию с помощью свёртки. Когда мы выполняем свёртку фотографии человека с перевёрнутым снимком его лица, то результатом будет изображение с одним или несколькими яркими пикселями в том месте, где лицо совпадёт с человеком.
Пример выше также иллюстрирует дополнение нулями (padding) для стабилизации преобразования Фурье. Padding может быть разным: некоторые реализации деформируют только ядро, другие вообще не требуют никаких дополнений. В этой статье мы не будем останавливаться на различных вариантах padding-а.
На более ранних слоях свёрточные сети не выполняют кросс-корреляцию, поскольку мы знаем, что сначала они обнаруживают границы объекта. Но в глубоких слоях, где генерируются более абстрактные признаки, сеть может научиться выполнять подобную операцию.
В чём разница между статистическими моделями и машинным обучением? Статистика часто концентрируется на небольшом количестве переменных, которые можно легко интерпретировать. Такие модели отвечают на вопрос: лучше ли лекарство А, чем лекарство Б?
Машинное обучение же больше ориентировано на прогнозирование: препарат А даёт на 17.83% лучшие результаты по сравнению с препаратом Б для людей в возрасте X и на 22.34% для людей в возрасте Y.
Но модели машинного обучения не всегда надёжны. Статистические решения важны для получения точных выводов: даже если препарат А на 17.83% лучше, чем препарат Б, мы не знаем, случайное это значение или нет. Чтобы решить проблему, нам нужна статистическая модель.
Для временных рядов существует два важных статистических решения: взвешенное скользящее среднее и авторегрессия, которые можно объединить в модели ARIMA (AutoRegressive Integrated Moving Average). ARIMA не такие эффективные, как рекуррентные сети с долгой краткосрочной памятью, но они чрезвычайно надёжны для небольших выборок (1-5 измерений). Их довольно сложно интерпретировать, хотя ARIMA не являются чёрным ящиком, как алгоритмы глубокого обучения.
На самом деле можно представить эти модели в виде свёрток и показать, что свёртки в глубоком обучении — это функции, из которых мы получаем признаки ARIMA и передаём их на следующий слой. Однако эту идею не всегда получится применить.
Здесь C(kernel) — постоянная функция с ядром в качестве параметра, white noise (белый шум) — данные с нулевым средним и стандартным отклонением, равным единице. Каждая переменная некоррелирована по отношению к другим.
Предварительно обрабатывая данные, мы часто делаем их очень похожими на белый шум: центрируем вокруг нуля и устанавливаем дисперсию или стандартное отклонение равными единице. Создание некоррелированных переменных используется реже, потому что требует больших вычислительных ресурсов. Но сама по себе операция несложная: мы просто переориентируем оси вдоль собственных векторов данных.
То есть, если мы примем C(kernel) за сдвиг, то получим выражение, очень похожее на свёртку. Входные данные свёрточного слоя можно представить как выходные данные авторегрессионной модели, если предварительно обработать их и получить белый шум.
Интерпретация взвешенного скользящего среднего проста: это стандартная свёртка на некоторых данных (исходных) с определённым весом (ядром). Более понятным будет взглянуть на ядро сглаживания Гаусса на рисунке ниже. Его можно интерпретировать как средневзвешенное значение в окрестности каждого пикселя. Другими словами, пиксели смешиваются, а края сглаживаются.
Одно ядро не может создавать признаки как авторегрессии, так и взвешенного скользящего среднего. Поэтому обычно мы используем несколько ядер, комбинация которых будет содержать одни признаки, похожие на модель взвешенного среднего, и другие — на модель авторегрессии.
Надеемся, что статья помогла лучше понять свёртку. Если раньше вам казалось, что все ваши знания математики и статистики бесполезны и непрактичны — то теперь вы можете убедиться, что почти всегда им находится практическое применение. Если что-то осталось непонятным, задавайте вопросы, мы всегда с радостью ответим на них.
Ссылка на оригинальную статью в блоге timdettmers.com.
Рассказываем, как мы помогли команде РБК автоматизировать процесс тегирования материалов редакции с помощью нейросети на…
Узнать все самое необходимое о компании и легко и без ошибок выставить ей счет на…
Выбор правильной платформы для создания интернет-магазина играет важную роль в успехе бизнеса. Одной из самых…
Зачастую пользователи хранят важные документы и файлы на компьютере или съемном носителе. Но что делать…
Нередко сотрудники при найме на работу подписывают трудовые договоры, не читая, а работодатели используют первый…
Виртуальные машины позволяют запускать одну операционную систему (ОС) внутри другой с помощью виртуализации (создания изолированных…