Страница 1 из 1

Сверточная нейронная сеть

Добавлено: 17 апр 2025, 13:20
hrigan
Среди методов распознавания лиц наибольшую эффективность демонстрируют сверточные нейронные сети (СНС, от англ. Convolutional Neural Networks), представляющие собой развитие архитектур, таких как когнитрон и неокогнитрон. Их преимущество заключается в способности учитывать двумерную структуру изображений, что отличает их от традиционного многослойного персептрона.
СНС обладают высокой устойчивостью к различным искажениям изображения: масштабированию, смещениям, поворотам и изменению ракурса. Это достигается благодаря сочетанию трех ключевых архитектурных особенностей:
  • локальные рецепторные поля, обеспечивающие пространственную связанность нейронов;
  • общие весовые коэффициенты, позволяющие выявлять одинаковые признаки в разных частях изображения и уменьшающие количество обучаемых параметров;
  • иерархическая структура с подвыборками, способствующая формированию обобщенных признаков на разных уровнях абстракции.
В настоящее время СНС и их производные считаются одними из самых точных и быстрых методов обнаружения объектов на изображениях. С 2012 года они стабильно занимают лидирующие позиции в международном соревновании по распознаванию образов — ImageNet.
image.png
Именно поэтому в своей работе я использовал сверточную нейронную сеть, основанную на принципах неокогнитрона и дополненную обучением по алгоритму обратного распространения ошибки.

Структура сверточной нейронной сети
Сверточная нейронная сеть (СНС) включает в себя несколько типов слоев: сверточные слои (convolutional), слои подвыборки (subsampling, или субдискретизации), а также слои стандартного многослойного персептрона, как это представлено на рисунке 1.
image.png
Рисунок 1 – Топология сверточной нейронной сети
Слои первых двух типов — сверточные и подвыборки — чередуются между собой и в совокупности формируют вектор признаков, который затем подается на вход многослойному персептрону.
Название "сверточная сеть" происходит от ключевой операции, лежащей в её основе — свертки. Подробности этой операции будут приведены далее.
СНС представляют собой компромисс между биологически вдохновленными нейросетями и классическим многослойным персептроном. На сегодняшний день они демонстрируют лучшие результаты в задачах распознавания изображений, обеспечивая в среднем на 10–15% более высокую точность по сравнению с традиционными искусственными нейронными сетями. СНС — это одна из фундаментальных технологий глубинного обучения (Deep Learning).
Успех сверточных сетей во многом обусловлен концепцией общих весов. Несмотря на большую структуру, они требуют существенно меньше настраиваемых параметров, чем, например, их предшественник — неокогнитрон. Существуют также модификации СНС, такие как Tiled Convolutional Neural Networks, в которых частично отказываются от общей связи весов, приближаясь к архитектуре неокогнитрона. Однако процесс обучения по-прежнему основан на алгоритме обратного распространения ошибки.
СНС хорошо масштабируются, могут эффективно работать на последовательных вычислительных устройствах и обучаются быстро благодаря возможности параллельной обработки — как при выполнении операции свертки на каждой карте признаков, так и при распространении ошибки в обратном направлении.
На рисунке ниже продемонстрирована визуализация свертки и подвыборки:
image.png
Модель Нейрона
image.png
image.png
Топология сверточной нейросети
Выбор топологии нейросети зависит от решаемой задачи, научных источников и практического опыта, полученного в ходе экспериментов.
Основными этапами, влияющими на определение топологии, являются:
  • Определение задачи, которую будет решать нейросеть (классификация, прогнозирование, модификация).
  • Учет ограничений задачи (например, требования к скорости работы и точности).
  • Установление характеристик входных данных (тип: изображение, звук; размер: 100x100, 30x30; формат: RGB, градации серого) и выходных данных (количество классов).
В моем случае нейросеть решает задачу классификации изображений, в частности, лиц. Основные ограничения: скорость ответа — не более 1 секунды и точность распознавания — не менее 70%. Общая топология сети представлена на рисунке 2.
image.png
Рисунок 2 — Топология сверточной нейросети

Входной слой
Входные данные представляют собой цветные изображения в формате JPEG размером 48x48 пикселей. Если размер изображения слишком велик, это приведет к увеличению вычислительной сложности, что нарушит ограничения на скорость работы сети. Выбор оптимального размера решается методом подбора. Если размер изображения слишком мал, сеть не сможет эффективно выявить важные признаки лиц. Каждое изображение делится на три канала: красный, зеленый и синий, в результате чего получается три изображения размером 48x48 пикселей.
Входной слой учитывает двумерную структуру изображения и состоит из нескольких карт (матриц). Если изображение в оттенках серого, используется одна карта, если же оно цветное, то их три, по одной для каждого канала (красный, зеленый и синий).
Значения пикселей входных данных нормализуются в диапазон от 0 до 1 с использованием следующей формулы:
image.png
Сверточный слой
Сверточный слой состоит из набора карт признаков (или матриц), каждая из которых имеет синаптическое ядро, которое также называют сканирующим ядром или фильтром в зависимости от источника.
Число карт определяется требованиями задачи: увеличение их количества повышает качество распознавания, но также увеличивает вычислительную сложность. Согласно анализу научных публикаций, оптимальное соотношение — один к двум, то есть каждая карта из предыдущего слоя (например, входной слой для первого сверточного слоя) должна быть связана с двумя картами текущего сверточного слоя, как показано на рисунке 3. В этом случае количество карт составляет 6.
image.png
Рисунок 3 — Организация связей между картами сверточного слоя и предыдущего

Размер у всех карт сверточного слоя – одинаковы и вычисляются по формуле 2:
image.png
Ядро сверточного слоя
Ядро представляет собой фильтр или окно, которое скользит по всей области предыдущей карты, выявляя различные признаки объектов. Например, если сеть обучалась на множестве изображений лиц, одно из ядер могло бы усиливать сигнал в области глаза, рта, бровей или носа, а другое — выявлять другие признаки. Обычно размер ядра варьируется от 3x3 до 7x7. Если ядро слишком маленькое, оно не сможет эффективно выделять признаки, а если слишком большое — увеличится количество связей между нейронами. Размер ядра также подбирается таким образом, чтобы карты сверточного слоя оставались четными, что помогает сохранить информацию при уменьшении размерности на этапе подвыборки, который будет описан ниже.
Ядро представляет собой систему общих весов (синапсов), что является одной из ключевых особенностей сверточной нейросети. В традиционной многослойной нейросети существует большое количество связей между нейронами, что замедляет процесс детектирования. В сверточной сети, наоборот, использование общих весов позволяет значительно уменьшить количество связей и эффективно выявлять один и тот же признак по всей области изображения.
image.png
Изначально значения каждой карты сверточного слоя равны 0. Значения весов ядер задаются случайным образом в области от -0.5 до 0.5. Ядро скользит по предыдущей карте и производит операцию свертка, которая часто используется для обработки изображений, формула:
image.png
Неформально эту операцию можно описать следующим образом — окном размера ядра g проходим с заданным шагом (обычно 1) все изображение f, на каждом шаге поэлементно умножаем содержимое окна на ядро g, результат суммируется и записывается в матрицу результата, как на рисунке 4.
image.png
Рисунок 4 — Операция свертки и получение значений сверточной карты (valid)
При этом в зависимости от метода обработки краев исходной матрицы результат может быть меньше исходного изображения (valid), такого же размера (same) или большего размера (full), в соответствии с рисунком 5.
image.png
image.png (8.78 КБ) 65 просмотров
Рисунок 5 — Три вида свертки исходной матрицы

В упрощенном виде этот слой можно описать формулой:
image.png
При этом за счет краевых эффектов размер исходных матриц уменьшается, формула:
image.png
Подвыборочный слой
Подвыборочный слой, как и сверточный, состоит из карт, причем их количество соответствует количеству карт в предыдущем сверточном слое — их 6. Основная задача этого слоя — уменьшение размерности карт, полученных на предыдущем этапе. Если на этапе свертки уже были выделены ключевые признаки, то дальнейшая обработка не требует такой же высокой детализации изображения, и оно упрощается. Это также помогает избежать переобучения, фильтруя ненужные детали.
В процессе работы подвыборочного слоя (или фильтра) сканирующее ядро не перекрывает области, как это происходит в сверточном слое. Обычно размер ядра подвыборки составляет 2x2, что позволяет уменьшить размер карт сверточного слоя в два раза. Каждая карта признаков делится на ячейки 2x2 пикселя, и из каждой ячейки выбирается максимальное значение.
Часто в подвыборочном слое применяется функция активации ReLU. Операция подвыборки (или MaxPooling — выбор максимального) иллюстрируется на рисунке 6.
image.png
Рисунок 6 — Формирование новой карты подвыборочного слоя на основе предыдущей карты сверточного слоя. Операция подвыборки (Max Pooling)
Формально слой может быть описан формулой:
image.png
Полносвязный слой

Последний из типов слоев это слой обычного многослойного персептрона. Цель слоя – классификация, моделирует сложную нелинейную функцию, оптимизируя которую, улучшается качество распознавания.
image.png
Нейроны каждой карты подвыборочного слоя связаны с одним нейроном скрытого слоя. Таким образом, количество нейронов в скрытом слое соответствует числу карт подвыборочного слоя. Однако связи между нейронами могут быть различными: например, не все нейроны одной карты подвыборочного слоя могут быть связаны с первым нейроном скрытого слоя — часть нейронов может быть связана со вторым нейроном скрытого слоя, или все нейроны первой карты могут быть связаны с первым и вторым нейронами скрытого слоя. Вычисление значений нейронов скрытого слоя можно выразить следующей формулой:
image.png
Выходной слой
Выходной слой связан со всеми нейронами предыдущего слоя. Количество нейронов в выходном слое соответствует числу классов, которые нужно распознать, в данном случае — два класса: «лицо» и «не лицо». Однако, для сокращения числа связей и вычислительных затрат в случае бинарной классификации можно использовать один нейрон. При этом, если в качестве функции активации выбрать гиперболический тангенс, то выход нейрона со значением -1 будет означать класс «не лицо», а выходное значение 1 — класс «лицо».
Выбор функции активации
Одним из ключевых этапов разработки нейронной сети является выбор функции активации для нейронов. Функция активации влияет на функциональные возможности сети и методы её обучения. Классический алгоритм обратного распространения ошибки хорошо работает для нейросетей с двумя или тремя слоями, однако с увеличением глубины сети возникают проблемы. Одна из них — затухание градиентов. Когда ошибка распространяется от выходного слоя к входному, на каждом слое результат умножается на производную функции активации. Поскольку производная традиционной сигмоидной функции активации всегда меньше единицы, ошибка становится очень малой после нескольких слоев. С другой стороны, если функция активации имеет неограниченную производную, как, например, гиперболический тангенс, ошибка может резко увеличиваться, что приведет к нестабильности обучения.
В данной работе в качестве функции активации для скрытых и выходного слоев используется гиперболический тангенс, а в сверточных слоях применяется ReLU. Рассмотрим наиболее часто используемые функции активации в нейронных сетях.
image.png
Функция активации сигмоиды

Эта функция относится к классу непрерывных функций и принимает на входе произвольное вещественное число, а на выходе дает вещественное число в интервале от 0 до 1. В частности, большие (по модулю) отрицательные числа превращаются в ноль, а большие положительные – в единицу. Исторически сигмоида находила широкое применение, поскольку ее выход хорошо интерпретируется, как уровень активации нейрона: от отсутствия активации (0) до полностью насыщенной активации (1). Сигмоида (sigmoid) выражается формулой:
image.png
image.png (3.11 КБ) 63 просмотра
График сигмоидальной функции в соответствии с рисунком ниже:
image.png
Крайне нежелательные свойства сигмоиды
Одной из основных проблем сигмоидальной функции является её насыщение на концах (0 или 1), где её градиент становится практически нулевым.
В процессе обратного распространения ошибки локальный градиент умножается на общий градиент. Если локальный градиент близок к нулю, то общий градиент также становится очень маленьким, что существенно ослабляет сигнал, проходящий через нейрон и не позволяет корректно обновлять его веса. Кроме того, при инициализации весов нейронов с сигмоидной функцией активации необходимо быть особенно осторожным, чтобы избежать их насыщения. Например, если начальные веса будут слишком большими, большинство нейронов окажутся в состоянии насыщения, что приведет к плохому обучению сети.
Сигмоидальная функция обладает следующими характеристиками:
• непрерывность;
• монотонность;
• дифференцируемость.
Функция активации — гиперболический тангенс
В этой работе для скрытых и выходных слоев используется функция гиперболического тангенса. Это решение объясняется рядом причин:
• Симметричные функции активации, такие как гиперболический тангенс, обеспечивают более быструю сходимость по сравнению с логистической функцией.
• Эта функция имеет непрерывную первую производную.
• Производная гиперболического тангенса проста и может быть вычислена через само значение функции, что снижает вычислительные затраты.
График функции гиперболического тангенса представлен на рисунке.
image.png
Функция активации ReLU
Известно, что нейронные сети способны приблизить сколь угодно сложную функцию, если в них достаточно слоев и функция активации является нелинейной. Функции активации вроде сигмоидной или тангенциальной являются нелинейными, но приводят к проблемам с затуханием или увеличением градиентов. Однако можно использовать и гораздо более простой вариант — выпрямленную линейную функцию активации (rectified linear unit, ReLU), которая выражается формулой:
image.png
image.png (3.75 КБ) 58 просмотров
График функции ReLU в соответствии с рисунком ниже:
image.png
Преимущества использования ReLU
Основным преимуществом функции активации ReLU является то, что её производная равна либо единице, либо нулю. Это означает, что не возникает проблем с затуханием или разрастанием градиентов, как в случае с другими функциями, например, гиперболическим тангенсом. При использовании ReLU, умножив её производную на ошибку, мы получаем ту же ошибку, что предотвращает её уменьшение или увеличение, как это может происходить в случае гиперболического тангенса, где производная может менять знак и величину. Это свойство ReLU способствует стабилизации процесса обучения и предотвращает затухание градиента. Более того, применение ReLU способствует разреженности весов.
Также важно отметить, что вычисления для сигмоиды и гиперболического тангенса требуют выполнения более сложных и ресурсоёмких операций, таких как возведение в степень. В то время как ReLU можно реализовать с помощью простого порогового преобразования, что значительно снижает вычислительные затраты.
ReLU эффективно отсекает ненужные детали, игнорируя отрицательные значения.

Недостатки ReLU
Однако, у ReLU есть и недостатки. Она не всегда надежна, и в процессе обучения может выйти из строя («умереть»). Например, если через нейрон проходит слишком большой градиент, это может привести к тому, что веса обновятся таким образом, что нейрон больше не будет активироваться. В результате, с этого момента градиент для этого нейрона всегда будет равен нулю, и нейрон будет «мертвым», то есть никогда больше не активируется. Это явление может случиться, если скорость обучения слишком велика, в этом случае до 40% нейронов с ReLU могут «умереть». Для решения этой проблемы важно правильно настроить скорость обучения.


Обучение сверточной нейронной сети
На начальном этапе нейронная сеть находится в состоянии, когда её веса не настроены, то есть она необучена. В общем смысле, обучение заключается в последовательной подаче примеров из обучающего набора на вход нейросети. Полученный ответ сравнивается с ожидаемым результатом. В нашем случае, если на вход подается изображение лица, то желаемый выход равен 1, если изображение не лицо — минус 1. Разница между полученным и ожидаемым результатом представляет собой ошибку (дельту ошибки). Эту ошибку нужно распространить на все связанные нейроны сети.
Таким образом, процесс обучения сводится к минимизации функции ошибки путём корректировки весов синаптических связей между нейронами. Функция ошибки измеряет разницу между фактическим и ожидаемым результатами. Например, если на вход подано изображение лица, и сеть дала результат 0.73, а желаемый ответ равен 1 (так как это лицо), ошибка составит 0.27. После этого веса нейронов выходного слоя корректируются в зависимости от этой ошибки. Для нейронов выходного слоя, где известны как фактические, так и ожидаемые значения, процесс корректировки весов достаточно прост. Однако для нейронов скрытых слоев эта задача более сложная, и долгое время не было ясного алгоритма для распространения ошибки на эти слои.

Алгоритм обратного распространения ошибки
Для обучения нейронной сети использовался алгоритм обратного распространения ошибки (backpropagation), который представляет собой метод обучения многослойных нейронных сетей, известный как обобщенное дельта-правило. Этот метод был предложен в 1986 году Румельхартом, Макклелландом и Вильямсом, что стало важным моментом для возрождения интереса к нейронным сетям, который начал угасать в начале 70-х годов. Алгоритм обратного распространения ошибки стал первым и основным практическим методом для обучения многослойных нейронных сетей.
Корректировка весов в выходном слое интуитивно понятна, однако долгое время не было известно, как точно настраивать веса в скрытых слоях. Веса скрытых нейронов должны изменяться пропорционально ошибке нейронов, с которыми они связаны. Именно по этой причине метод обратного распространения ошибки позволяет корректно настроить веса связей между всеми слоями сети. В результате этого процесса функция ошибки уменьшается, и сеть начинает эффективно обучаться.
Основные формулы алгоритма обратного распространения ошибки получаются при введении соответствующих обозначений:
image.png
Величина ошибки определяется по формуле 2.8 среднеквадратичная ошибка:
image.png
Неактивированное состояние каждого нейрона j для образа p записывается в виде взвешенной суммы по формуле 2.9:
image.png
Выход каждого нейрона j является значением активационной функции, которая переводит нейрон в активированное состояние. В качестве функции активации может использоваться любая непрерывно дифференцируемая монотонная функция. Активированное состояние нейрона вычисляется по формуле 2.10:
image.png
В качестве метода минимизации ошибки используется метод градиентного спуска, суть этого метода сводится к поиску минимума (или максимума) функции за счет движения вдоль вектора градиента. Для поиска минимума движение должно быть осуществляться в направлении антиградиента. Метод градиентного спуска в соответствии с рисунком 2.7.
image.png
Градиент функции потери представляет из себя вектор частных производных, вычисляющийся по формуле 2.11:
image.png
Производную функции ошибки по конкретному образу можно записать по правилу цепочки, формула 2.12:
image.png
Ошибка нейрона обычно записывается в виде символа δ (дельта). Для выходного слоя ошибка определена в явном виде, если взять производную от формулы 2.8, то получим t минус y, то есть разницу между желаемым и полученным выходом. Но как рассчитать ошибку для скрытых слоев? Для решения этой задачи, как раз и был придуман алгоритм обратного распространения ошибки. Суть его заключается в последовательном вычислении ошибок скрытых слоев с помощью значений ошибки выходного слоя, т.е. значения ошибки распространяются по сети в обратном направлении от выхода к входу.
Ошибка δ для скрытого слоя рассчитывается по формуле 2.13:
image.png
Алгоритм распространения ошибки сводится к следующим этапам:
  • прямое распространение сигнала по сети, вычисления состояния нейронов;
  • вычисление значения ошибки δ для выходного слоя;
  • обратное распространение: последовательно от конца к началу для всех скрытых слоев вычисляем δ по формуле 2.13;
  • обновление весов сети на вычисленную ранее δ ошибки.
Расчет ошибки на подвыборочном слое
Расчет ошибки на подвыборочном слое представляется в нескольких вариантах. Первый случай, когда подвыборочный слой находится перед полносвязным, тогда он имеет нейроны и связи такого же типа, как в полносвязном слое, соответственно вычисление δ ошибки ничем не отличается от вычисления δ скрытого слоя. Второй случай, когда подвыборочный слой находится перед сверточным, вычисление δ происходит путем обратной свертки. Для понимания обратно свертки, необходимо сперва понять обычную свертку и то, что скользящее окно по карте признаков (во время прямого распространения сигнала) можно интерпретировать, как обычный скрытый слой со связями между нейронами, но главное отличие — это то, что эти связи разделяемы, то есть одна связь с конкретным значением веса может быть у нескольких пар нейронов, а не только одной. Интерпретация операции свертки в привычном многослойном виде в соответствии с рисунком 2.8.
image.png
Рисунок 2.8 — Интерпретация операции свертки в многослойный вид, где связи с одинаковым цветом имеют один и тот же вес. Синим цветом обозначена подвыборочная карта, разноцветным – синаптическое ядро, оранжевым – получившаяся свертка.

Теперь, когда операция свертки представлена в привычном многослойном виде, можно интуитивно понять, что вычисление дельт происходит таким же образом, как и в скрытом слое полносвязной сети. Соответственно имея вычисленные ранее дельты сверточного слоя можно вычислить дельты подвыборочного, в соответствии с рисунком 2.9.
image.png
Рисунок 2.9 — Вычисление δ подвыборочного слоя за счет δ сверточного слоя и ядра

Обратная свертка – это тот же самый способ вычисления дельт, только немного хитрым способом, заключающийся в повороте ядра на 180 градусов и скользящем процессе сканирования сверточной карты дельт с измененными краевыми эффектами. Простыми словами, нам необходимо взять ядро сверточной карты (следующего за подвыборочным слоем) повернуть его на 180 градусов и сделать обычную свертку по вычисленным ранее дельтам сверточной карты, но так чтобы окно сканирования выходило за пределы карты. Результат операции обратной свертки в соответствии с рисунком 2.10, цикл прохода обратной свертки в соответствии с рисунком 2.11.
image.png
Рисунок 2.10 — Результат операции обратной свертки
image.png
Рисунок 2.11 — Повернутое ядро на 180 градусов сканирует сверточную карту
Расчет ошибки на сверточном слое
Обычно впередиидущий слой после сверточного это подвыборочный, соответственно наша задача вычислить дельты текущего слоя (сверточного) за счет знаний о дельтах подвыборочного слоя. На самом деле дельта ошибка не вычисляется, а копируется. При прямом распространении сигнала нейроны подвыборочного слоя формировались за счет неперекрывающегося окна сканирования по сверточному слою, в процессе которого выбирались нейроны с максимальным значением, при обратном распространении, мы возвращаем дельту ошибки тому ранее выбранному максимальному нейрону, остальные же получают нулевую дельту ошибки.