Сверточная нейронная сеть
Добавлено: 17 апр 2025, 13:20
Среди методов распознавания лиц наибольшую эффективность демонстрируют сверточные нейронные сети (СНС, от англ. Convolutional Neural Networks), представляющие собой развитие архитектур, таких как когнитрон и неокогнитрон. Их преимущество заключается в способности учитывать двумерную структуру изображений, что отличает их от традиционного многослойного персептрона.
СНС обладают высокой устойчивостью к различным искажениям изображения: масштабированию, смещениям, поворотам и изменению ракурса. Это достигается благодаря сочетанию трех ключевых архитектурных особенностей:
Структура сверточной нейронной сети
Сверточная нейронная сеть (СНС) включает в себя несколько типов слоев: сверточные слои (convolutional), слои подвыборки (subsampling, или субдискретизации), а также слои стандартного многослойного персептрона, как это представлено на рисунке 1. Рисунок 1 – Топология сверточной нейронной сети
Слои первых двух типов — сверточные и подвыборки — чередуются между собой и в совокупности формируют вектор признаков, который затем подается на вход многослойному персептрону.
Название "сверточная сеть" происходит от ключевой операции, лежащей в её основе — свертки. Подробности этой операции будут приведены далее.
СНС представляют собой компромисс между биологически вдохновленными нейросетями и классическим многослойным персептроном. На сегодняшний день они демонстрируют лучшие результаты в задачах распознавания изображений, обеспечивая в среднем на 10–15% более высокую точность по сравнению с традиционными искусственными нейронными сетями. СНС — это одна из фундаментальных технологий глубинного обучения (Deep Learning).
Успех сверточных сетей во многом обусловлен концепцией общих весов. Несмотря на большую структуру, они требуют существенно меньше настраиваемых параметров, чем, например, их предшественник — неокогнитрон. Существуют также модификации СНС, такие как Tiled Convolutional Neural Networks, в которых частично отказываются от общей связи весов, приближаясь к архитектуре неокогнитрона. Однако процесс обучения по-прежнему основан на алгоритме обратного распространения ошибки.
СНС хорошо масштабируются, могут эффективно работать на последовательных вычислительных устройствах и обучаются быстро благодаря возможности параллельной обработки — как при выполнении операции свертки на каждой карте признаков, так и при распространении ошибки в обратном направлении.
На рисунке ниже продемонстрирована визуализация свертки и подвыборки: Модель Нейрона Топология сверточной нейросети
Выбор топологии нейросети зависит от решаемой задачи, научных источников и практического опыта, полученного в ходе экспериментов.
Основными этапами, влияющими на определение топологии, являются:
Входной слой
Входные данные представляют собой цветные изображения в формате JPEG размером 48x48 пикселей. Если размер изображения слишком велик, это приведет к увеличению вычислительной сложности, что нарушит ограничения на скорость работы сети. Выбор оптимального размера решается методом подбора. Если размер изображения слишком мал, сеть не сможет эффективно выявить важные признаки лиц. Каждое изображение делится на три канала: красный, зеленый и синий, в результате чего получается три изображения размером 48x48 пикселей.
Входной слой учитывает двумерную структуру изображения и состоит из нескольких карт (матриц). Если изображение в оттенках серого, используется одна карта, если же оно цветное, то их три, по одной для каждого канала (красный, зеленый и синий).
Значения пикселей входных данных нормализуются в диапазон от 0 до 1 с использованием следующей формулы: Сверточный слой
Сверточный слой состоит из набора карт признаков (или матриц), каждая из которых имеет синаптическое ядро, которое также называют сканирующим ядром или фильтром в зависимости от источника.
Число карт определяется требованиями задачи: увеличение их количества повышает качество распознавания, но также увеличивает вычислительную сложность. Согласно анализу научных публикаций, оптимальное соотношение — один к двум, то есть каждая карта из предыдущего слоя (например, входной слой для первого сверточного слоя) должна быть связана с двумя картами текущего сверточного слоя, как показано на рисунке 3. В этом случае количество карт составляет 6. Рисунок 3 — Организация связей между картами сверточного слоя и предыдущего
Размер у всех карт сверточного слоя – одинаковы и вычисляются по формуле 2: Ядро сверточного слоя
Ядро представляет собой фильтр или окно, которое скользит по всей области предыдущей карты, выявляя различные признаки объектов. Например, если сеть обучалась на множестве изображений лиц, одно из ядер могло бы усиливать сигнал в области глаза, рта, бровей или носа, а другое — выявлять другие признаки. Обычно размер ядра варьируется от 3x3 до 7x7. Если ядро слишком маленькое, оно не сможет эффективно выделять признаки, а если слишком большое — увеличится количество связей между нейронами. Размер ядра также подбирается таким образом, чтобы карты сверточного слоя оставались четными, что помогает сохранить информацию при уменьшении размерности на этапе подвыборки, который будет описан ниже.
Ядро представляет собой систему общих весов (синапсов), что является одной из ключевых особенностей сверточной нейросети. В традиционной многослойной нейросети существует большое количество связей между нейронами, что замедляет процесс детектирования. В сверточной сети, наоборот, использование общих весов позволяет значительно уменьшить количество связей и эффективно выявлять один и тот же признак по всей области изображения. Изначально значения каждой карты сверточного слоя равны 0. Значения весов ядер задаются случайным образом в области от -0.5 до 0.5. Ядро скользит по предыдущей карте и производит операцию свертка, которая часто используется для обработки изображений, формула: Неформально эту операцию можно описать следующим образом — окном размера ядра g проходим с заданным шагом (обычно 1) все изображение f, на каждом шаге поэлементно умножаем содержимое окна на ядро g, результат суммируется и записывается в матрицу результата, как на рисунке 4. Рисунок 4 — Операция свертки и получение значений сверточной карты (valid)
При этом в зависимости от метода обработки краев исходной матрицы результат может быть меньше исходного изображения (valid), такого же размера (same) или большего размера (full), в соответствии с рисунком 5. Рисунок 5 — Три вида свертки исходной матрицы
В упрощенном виде этот слой можно описать формулой:
При этом за счет краевых эффектов размер исходных матриц уменьшается, формула: Подвыборочный слой
Подвыборочный слой, как и сверточный, состоит из карт, причем их количество соответствует количеству карт в предыдущем сверточном слое — их 6. Основная задача этого слоя — уменьшение размерности карт, полученных на предыдущем этапе. Если на этапе свертки уже были выделены ключевые признаки, то дальнейшая обработка не требует такой же высокой детализации изображения, и оно упрощается. Это также помогает избежать переобучения, фильтруя ненужные детали.
В процессе работы подвыборочного слоя (или фильтра) сканирующее ядро не перекрывает области, как это происходит в сверточном слое. Обычно размер ядра подвыборки составляет 2x2, что позволяет уменьшить размер карт сверточного слоя в два раза. Каждая карта признаков делится на ячейки 2x2 пикселя, и из каждой ячейки выбирается максимальное значение.
Часто в подвыборочном слое применяется функция активации ReLU. Операция подвыборки (или MaxPooling — выбор максимального) иллюстрируется на рисунке 6. Рисунок 6 — Формирование новой карты подвыборочного слоя на основе предыдущей карты сверточного слоя. Операция подвыборки (Max Pooling)
Формально слой может быть описан формулой: Полносвязный слой
Последний из типов слоев это слой обычного многослойного персептрона. Цель слоя – классификация, моделирует сложную нелинейную функцию, оптимизируя которую, улучшается качество распознавания. Нейроны каждой карты подвыборочного слоя связаны с одним нейроном скрытого слоя. Таким образом, количество нейронов в скрытом слое соответствует числу карт подвыборочного слоя. Однако связи между нейронами могут быть различными: например, не все нейроны одной карты подвыборочного слоя могут быть связаны с первым нейроном скрытого слоя — часть нейронов может быть связана со вторым нейроном скрытого слоя, или все нейроны первой карты могут быть связаны с первым и вторым нейронами скрытого слоя. Вычисление значений нейронов скрытого слоя можно выразить следующей формулой: Выходной слой
Выходной слой связан со всеми нейронами предыдущего слоя. Количество нейронов в выходном слое соответствует числу классов, которые нужно распознать, в данном случае — два класса: «лицо» и «не лицо». Однако, для сокращения числа связей и вычислительных затрат в случае бинарной классификации можно использовать один нейрон. При этом, если в качестве функции активации выбрать гиперболический тангенс, то выход нейрона со значением -1 будет означать класс «не лицо», а выходное значение 1 — класс «лицо».
Выбор функции активации
Одним из ключевых этапов разработки нейронной сети является выбор функции активации для нейронов. Функция активации влияет на функциональные возможности сети и методы её обучения. Классический алгоритм обратного распространения ошибки хорошо работает для нейросетей с двумя или тремя слоями, однако с увеличением глубины сети возникают проблемы. Одна из них — затухание градиентов. Когда ошибка распространяется от выходного слоя к входному, на каждом слое результат умножается на производную функции активации. Поскольку производная традиционной сигмоидной функции активации всегда меньше единицы, ошибка становится очень малой после нескольких слоев. С другой стороны, если функция активации имеет неограниченную производную, как, например, гиперболический тангенс, ошибка может резко увеличиваться, что приведет к нестабильности обучения.
В данной работе в качестве функции активации для скрытых и выходного слоев используется гиперболический тангенс, а в сверточных слоях применяется ReLU. Рассмотрим наиболее часто используемые функции активации в нейронных сетях. Функция активации сигмоиды
Эта функция относится к классу непрерывных функций и принимает на входе произвольное вещественное число, а на выходе дает вещественное число в интервале от 0 до 1. В частности, большие (по модулю) отрицательные числа превращаются в ноль, а большие положительные – в единицу. Исторически сигмоида находила широкое применение, поскольку ее выход хорошо интерпретируется, как уровень активации нейрона: от отсутствия активации (0) до полностью насыщенной активации (1). Сигмоида (sigmoid) выражается формулой:
График сигмоидальной функции в соответствии с рисунком ниже: Крайне нежелательные свойства сигмоиды
Одной из основных проблем сигмоидальной функции является её насыщение на концах (0 или 1), где её градиент становится практически нулевым.
В процессе обратного распространения ошибки локальный градиент умножается на общий градиент. Если локальный градиент близок к нулю, то общий градиент также становится очень маленьким, что существенно ослабляет сигнал, проходящий через нейрон и не позволяет корректно обновлять его веса. Кроме того, при инициализации весов нейронов с сигмоидной функцией активации необходимо быть особенно осторожным, чтобы избежать их насыщения. Например, если начальные веса будут слишком большими, большинство нейронов окажутся в состоянии насыщения, что приведет к плохому обучению сети.
Сигмоидальная функция обладает следующими характеристиками:
• непрерывность;
• монотонность;
• дифференцируемость.
Функция активации — гиперболический тангенс
В этой работе для скрытых и выходных слоев используется функция гиперболического тангенса. Это решение объясняется рядом причин:
• Симметричные функции активации, такие как гиперболический тангенс, обеспечивают более быструю сходимость по сравнению с логистической функцией.
• Эта функция имеет непрерывную первую производную.
• Производная гиперболического тангенса проста и может быть вычислена через само значение функции, что снижает вычислительные затраты.
График функции гиперболического тангенса представлен на рисунке. Функция активации ReLU
Известно, что нейронные сети способны приблизить сколь угодно сложную функцию, если в них достаточно слоев и функция активации является нелинейной. Функции активации вроде сигмоидной или тангенциальной являются нелинейными, но приводят к проблемам с затуханием или увеличением градиентов. Однако можно использовать и гораздо более простой вариант — выпрямленную линейную функцию активации (rectified linear unit, ReLU), которая выражается формулой: График функции ReLU в соответствии с рисунком ниже: Преимущества использования ReLU
Основным преимуществом функции активации ReLU является то, что её производная равна либо единице, либо нулю. Это означает, что не возникает проблем с затуханием или разрастанием градиентов, как в случае с другими функциями, например, гиперболическим тангенсом. При использовании ReLU, умножив её производную на ошибку, мы получаем ту же ошибку, что предотвращает её уменьшение или увеличение, как это может происходить в случае гиперболического тангенса, где производная может менять знак и величину. Это свойство ReLU способствует стабилизации процесса обучения и предотвращает затухание градиента. Более того, применение ReLU способствует разреженности весов.
Также важно отметить, что вычисления для сигмоиды и гиперболического тангенса требуют выполнения более сложных и ресурсоёмких операций, таких как возведение в степень. В то время как ReLU можно реализовать с помощью простого порогового преобразования, что значительно снижает вычислительные затраты.
ReLU эффективно отсекает ненужные детали, игнорируя отрицательные значения.
Недостатки ReLU
Однако, у ReLU есть и недостатки. Она не всегда надежна, и в процессе обучения может выйти из строя («умереть»). Например, если через нейрон проходит слишком большой градиент, это может привести к тому, что веса обновятся таким образом, что нейрон больше не будет активироваться. В результате, с этого момента градиент для этого нейрона всегда будет равен нулю, и нейрон будет «мертвым», то есть никогда больше не активируется. Это явление может случиться, если скорость обучения слишком велика, в этом случае до 40% нейронов с ReLU могут «умереть». Для решения этой проблемы важно правильно настроить скорость обучения.
Обучение сверточной нейронной сети
На начальном этапе нейронная сеть находится в состоянии, когда её веса не настроены, то есть она необучена. В общем смысле, обучение заключается в последовательной подаче примеров из обучающего набора на вход нейросети. Полученный ответ сравнивается с ожидаемым результатом. В нашем случае, если на вход подается изображение лица, то желаемый выход равен 1, если изображение не лицо — минус 1. Разница между полученным и ожидаемым результатом представляет собой ошибку (дельту ошибки). Эту ошибку нужно распространить на все связанные нейроны сети.
Таким образом, процесс обучения сводится к минимизации функции ошибки путём корректировки весов синаптических связей между нейронами. Функция ошибки измеряет разницу между фактическим и ожидаемым результатами. Например, если на вход подано изображение лица, и сеть дала результат 0.73, а желаемый ответ равен 1 (так как это лицо), ошибка составит 0.27. После этого веса нейронов выходного слоя корректируются в зависимости от этой ошибки. Для нейронов выходного слоя, где известны как фактические, так и ожидаемые значения, процесс корректировки весов достаточно прост. Однако для нейронов скрытых слоев эта задача более сложная, и долгое время не было ясного алгоритма для распространения ошибки на эти слои.
Алгоритм обратного распространения ошибки
Для обучения нейронной сети использовался алгоритм обратного распространения ошибки (backpropagation), который представляет собой метод обучения многослойных нейронных сетей, известный как обобщенное дельта-правило. Этот метод был предложен в 1986 году Румельхартом, Макклелландом и Вильямсом, что стало важным моментом для возрождения интереса к нейронным сетям, который начал угасать в начале 70-х годов. Алгоритм обратного распространения ошибки стал первым и основным практическим методом для обучения многослойных нейронных сетей.
Корректировка весов в выходном слое интуитивно понятна, однако долгое время не было известно, как точно настраивать веса в скрытых слоях. Веса скрытых нейронов должны изменяться пропорционально ошибке нейронов, с которыми они связаны. Именно по этой причине метод обратного распространения ошибки позволяет корректно настроить веса связей между всеми слоями сети. В результате этого процесса функция ошибки уменьшается, и сеть начинает эффективно обучаться.
Основные формулы алгоритма обратного распространения ошибки получаются при введении соответствующих обозначений: Величина ошибки определяется по формуле 2.8 среднеквадратичная ошибка: Неактивированное состояние каждого нейрона j для образа p записывается в виде взвешенной суммы по формуле 2.9: Выход каждого нейрона j является значением активационной функции, которая переводит нейрон в активированное состояние. В качестве функции активации может использоваться любая непрерывно дифференцируемая монотонная функция. Активированное состояние нейрона вычисляется по формуле 2.10: В качестве метода минимизации ошибки используется метод градиентного спуска, суть этого метода сводится к поиску минимума (или максимума) функции за счет движения вдоль вектора градиента. Для поиска минимума движение должно быть осуществляться в направлении антиградиента. Метод градиентного спуска в соответствии с рисунком 2.7. Градиент функции потери представляет из себя вектор частных производных, вычисляющийся по формуле 2.11: Производную функции ошибки по конкретному образу можно записать по правилу цепочки, формула 2.12: Ошибка нейрона обычно записывается в виде символа δ (дельта). Для выходного слоя ошибка определена в явном виде, если взять производную от формулы 2.8, то получим t минус y, то есть разницу между желаемым и полученным выходом. Но как рассчитать ошибку для скрытых слоев? Для решения этой задачи, как раз и был придуман алгоритм обратного распространения ошибки. Суть его заключается в последовательном вычислении ошибок скрытых слоев с помощью значений ошибки выходного слоя, т.е. значения ошибки распространяются по сети в обратном направлении от выхода к входу.
Ошибка δ для скрытого слоя рассчитывается по формуле 2.13: Алгоритм распространения ошибки сводится к следующим этапам:
Расчет ошибки на подвыборочном слое представляется в нескольких вариантах. Первый случай, когда подвыборочный слой находится перед полносвязным, тогда он имеет нейроны и связи такого же типа, как в полносвязном слое, соответственно вычисление δ ошибки ничем не отличается от вычисления δ скрытого слоя. Второй случай, когда подвыборочный слой находится перед сверточным, вычисление δ происходит путем обратной свертки. Для понимания обратно свертки, необходимо сперва понять обычную свертку и то, что скользящее окно по карте признаков (во время прямого распространения сигнала) можно интерпретировать, как обычный скрытый слой со связями между нейронами, но главное отличие — это то, что эти связи разделяемы, то есть одна связь с конкретным значением веса может быть у нескольких пар нейронов, а не только одной. Интерпретация операции свертки в привычном многослойном виде в соответствии с рисунком 2.8.
Рисунок 2.8 — Интерпретация операции свертки в многослойный вид, где связи с одинаковым цветом имеют один и тот же вес. Синим цветом обозначена подвыборочная карта, разноцветным – синаптическое ядро, оранжевым – получившаяся свертка.
Теперь, когда операция свертки представлена в привычном многослойном виде, можно интуитивно понять, что вычисление дельт происходит таким же образом, как и в скрытом слое полносвязной сети. Соответственно имея вычисленные ранее дельты сверточного слоя можно вычислить дельты подвыборочного, в соответствии с рисунком 2.9. Рисунок 2.9 — Вычисление δ подвыборочного слоя за счет δ сверточного слоя и ядра
Обратная свертка – это тот же самый способ вычисления дельт, только немного хитрым способом, заключающийся в повороте ядра на 180 градусов и скользящем процессе сканирования сверточной карты дельт с измененными краевыми эффектами. Простыми словами, нам необходимо взять ядро сверточной карты (следующего за подвыборочным слоем) повернуть его на 180 градусов и сделать обычную свертку по вычисленным ранее дельтам сверточной карты, но так чтобы окно сканирования выходило за пределы карты. Результат операции обратной свертки в соответствии с рисунком 2.10, цикл прохода обратной свертки в соответствии с рисунком 2.11. Рисунок 2.10 — Результат операции обратной свертки Рисунок 2.11 — Повернутое ядро на 180 градусов сканирует сверточную карту
Расчет ошибки на сверточном слое
Обычно впередиидущий слой после сверточного это подвыборочный, соответственно наша задача вычислить дельты текущего слоя (сверточного) за счет знаний о дельтах подвыборочного слоя. На самом деле дельта ошибка не вычисляется, а копируется. При прямом распространении сигнала нейроны подвыборочного слоя формировались за счет неперекрывающегося окна сканирования по сверточному слою, в процессе которого выбирались нейроны с максимальным значением, при обратном распространении, мы возвращаем дельту ошибки тому ранее выбранному максимальному нейрону, остальные же получают нулевую дельту ошибки.
СНС обладают высокой устойчивостью к различным искажениям изображения: масштабированию, смещениям, поворотам и изменению ракурса. Это достигается благодаря сочетанию трех ключевых архитектурных особенностей:
- локальные рецепторные поля, обеспечивающие пространственную связанность нейронов;
- общие весовые коэффициенты, позволяющие выявлять одинаковые признаки в разных частях изображения и уменьшающие количество обучаемых параметров;
- иерархическая структура с подвыборками, способствующая формированию обобщенных признаков на разных уровнях абстракции.
Структура сверточной нейронной сети
Сверточная нейронная сеть (СНС) включает в себя несколько типов слоев: сверточные слои (convolutional), слои подвыборки (subsampling, или субдискретизации), а также слои стандартного многослойного персептрона, как это представлено на рисунке 1. Рисунок 1 – Топология сверточной нейронной сети
Слои первых двух типов — сверточные и подвыборки — чередуются между собой и в совокупности формируют вектор признаков, который затем подается на вход многослойному персептрону.
Название "сверточная сеть" происходит от ключевой операции, лежащей в её основе — свертки. Подробности этой операции будут приведены далее.
СНС представляют собой компромисс между биологически вдохновленными нейросетями и классическим многослойным персептроном. На сегодняшний день они демонстрируют лучшие результаты в задачах распознавания изображений, обеспечивая в среднем на 10–15% более высокую точность по сравнению с традиционными искусственными нейронными сетями. СНС — это одна из фундаментальных технологий глубинного обучения (Deep Learning).
Успех сверточных сетей во многом обусловлен концепцией общих весов. Несмотря на большую структуру, они требуют существенно меньше настраиваемых параметров, чем, например, их предшественник — неокогнитрон. Существуют также модификации СНС, такие как Tiled Convolutional Neural Networks, в которых частично отказываются от общей связи весов, приближаясь к архитектуре неокогнитрона. Однако процесс обучения по-прежнему основан на алгоритме обратного распространения ошибки.
СНС хорошо масштабируются, могут эффективно работать на последовательных вычислительных устройствах и обучаются быстро благодаря возможности параллельной обработки — как при выполнении операции свертки на каждой карте признаков, так и при распространении ошибки в обратном направлении.
На рисунке ниже продемонстрирована визуализация свертки и подвыборки: Модель Нейрона Топология сверточной нейросети
Выбор топологии нейросети зависит от решаемой задачи, научных источников и практического опыта, полученного в ходе экспериментов.
Основными этапами, влияющими на определение топологии, являются:
- Определение задачи, которую будет решать нейросеть (классификация, прогнозирование, модификация).
- Учет ограничений задачи (например, требования к скорости работы и точности).
- Установление характеристик входных данных (тип: изображение, звук; размер: 100x100, 30x30; формат: RGB, градации серого) и выходных данных (количество классов).
Входной слой
Входные данные представляют собой цветные изображения в формате JPEG размером 48x48 пикселей. Если размер изображения слишком велик, это приведет к увеличению вычислительной сложности, что нарушит ограничения на скорость работы сети. Выбор оптимального размера решается методом подбора. Если размер изображения слишком мал, сеть не сможет эффективно выявить важные признаки лиц. Каждое изображение делится на три канала: красный, зеленый и синий, в результате чего получается три изображения размером 48x48 пикселей.
Входной слой учитывает двумерную структуру изображения и состоит из нескольких карт (матриц). Если изображение в оттенках серого, используется одна карта, если же оно цветное, то их три, по одной для каждого канала (красный, зеленый и синий).
Значения пикселей входных данных нормализуются в диапазон от 0 до 1 с использованием следующей формулы: Сверточный слой
Сверточный слой состоит из набора карт признаков (или матриц), каждая из которых имеет синаптическое ядро, которое также называют сканирующим ядром или фильтром в зависимости от источника.
Число карт определяется требованиями задачи: увеличение их количества повышает качество распознавания, но также увеличивает вычислительную сложность. Согласно анализу научных публикаций, оптимальное соотношение — один к двум, то есть каждая карта из предыдущего слоя (например, входной слой для первого сверточного слоя) должна быть связана с двумя картами текущего сверточного слоя, как показано на рисунке 3. В этом случае количество карт составляет 6. Рисунок 3 — Организация связей между картами сверточного слоя и предыдущего
Размер у всех карт сверточного слоя – одинаковы и вычисляются по формуле 2: Ядро сверточного слоя
Ядро представляет собой фильтр или окно, которое скользит по всей области предыдущей карты, выявляя различные признаки объектов. Например, если сеть обучалась на множестве изображений лиц, одно из ядер могло бы усиливать сигнал в области глаза, рта, бровей или носа, а другое — выявлять другие признаки. Обычно размер ядра варьируется от 3x3 до 7x7. Если ядро слишком маленькое, оно не сможет эффективно выделять признаки, а если слишком большое — увеличится количество связей между нейронами. Размер ядра также подбирается таким образом, чтобы карты сверточного слоя оставались четными, что помогает сохранить информацию при уменьшении размерности на этапе подвыборки, который будет описан ниже.
Ядро представляет собой систему общих весов (синапсов), что является одной из ключевых особенностей сверточной нейросети. В традиционной многослойной нейросети существует большое количество связей между нейронами, что замедляет процесс детектирования. В сверточной сети, наоборот, использование общих весов позволяет значительно уменьшить количество связей и эффективно выявлять один и тот же признак по всей области изображения. Изначально значения каждой карты сверточного слоя равны 0. Значения весов ядер задаются случайным образом в области от -0.5 до 0.5. Ядро скользит по предыдущей карте и производит операцию свертка, которая часто используется для обработки изображений, формула: Неформально эту операцию можно описать следующим образом — окном размера ядра g проходим с заданным шагом (обычно 1) все изображение f, на каждом шаге поэлементно умножаем содержимое окна на ядро g, результат суммируется и записывается в матрицу результата, как на рисунке 4. Рисунок 4 — Операция свертки и получение значений сверточной карты (valid)
При этом в зависимости от метода обработки краев исходной матрицы результат может быть меньше исходного изображения (valid), такого же размера (same) или большего размера (full), в соответствии с рисунком 5. Рисунок 5 — Три вида свертки исходной матрицы
В упрощенном виде этот слой можно описать формулой:
При этом за счет краевых эффектов размер исходных матриц уменьшается, формула: Подвыборочный слой
Подвыборочный слой, как и сверточный, состоит из карт, причем их количество соответствует количеству карт в предыдущем сверточном слое — их 6. Основная задача этого слоя — уменьшение размерности карт, полученных на предыдущем этапе. Если на этапе свертки уже были выделены ключевые признаки, то дальнейшая обработка не требует такой же высокой детализации изображения, и оно упрощается. Это также помогает избежать переобучения, фильтруя ненужные детали.
В процессе работы подвыборочного слоя (или фильтра) сканирующее ядро не перекрывает области, как это происходит в сверточном слое. Обычно размер ядра подвыборки составляет 2x2, что позволяет уменьшить размер карт сверточного слоя в два раза. Каждая карта признаков делится на ячейки 2x2 пикселя, и из каждой ячейки выбирается максимальное значение.
Часто в подвыборочном слое применяется функция активации ReLU. Операция подвыборки (или MaxPooling — выбор максимального) иллюстрируется на рисунке 6. Рисунок 6 — Формирование новой карты подвыборочного слоя на основе предыдущей карты сверточного слоя. Операция подвыборки (Max Pooling)
Формально слой может быть описан формулой: Полносвязный слой
Последний из типов слоев это слой обычного многослойного персептрона. Цель слоя – классификация, моделирует сложную нелинейную функцию, оптимизируя которую, улучшается качество распознавания. Нейроны каждой карты подвыборочного слоя связаны с одним нейроном скрытого слоя. Таким образом, количество нейронов в скрытом слое соответствует числу карт подвыборочного слоя. Однако связи между нейронами могут быть различными: например, не все нейроны одной карты подвыборочного слоя могут быть связаны с первым нейроном скрытого слоя — часть нейронов может быть связана со вторым нейроном скрытого слоя, или все нейроны первой карты могут быть связаны с первым и вторым нейронами скрытого слоя. Вычисление значений нейронов скрытого слоя можно выразить следующей формулой: Выходной слой
Выходной слой связан со всеми нейронами предыдущего слоя. Количество нейронов в выходном слое соответствует числу классов, которые нужно распознать, в данном случае — два класса: «лицо» и «не лицо». Однако, для сокращения числа связей и вычислительных затрат в случае бинарной классификации можно использовать один нейрон. При этом, если в качестве функции активации выбрать гиперболический тангенс, то выход нейрона со значением -1 будет означать класс «не лицо», а выходное значение 1 — класс «лицо».
Выбор функции активации
Одним из ключевых этапов разработки нейронной сети является выбор функции активации для нейронов. Функция активации влияет на функциональные возможности сети и методы её обучения. Классический алгоритм обратного распространения ошибки хорошо работает для нейросетей с двумя или тремя слоями, однако с увеличением глубины сети возникают проблемы. Одна из них — затухание градиентов. Когда ошибка распространяется от выходного слоя к входному, на каждом слое результат умножается на производную функции активации. Поскольку производная традиционной сигмоидной функции активации всегда меньше единицы, ошибка становится очень малой после нескольких слоев. С другой стороны, если функция активации имеет неограниченную производную, как, например, гиперболический тангенс, ошибка может резко увеличиваться, что приведет к нестабильности обучения.
В данной работе в качестве функции активации для скрытых и выходного слоев используется гиперболический тангенс, а в сверточных слоях применяется ReLU. Рассмотрим наиболее часто используемые функции активации в нейронных сетях. Функция активации сигмоиды
Эта функция относится к классу непрерывных функций и принимает на входе произвольное вещественное число, а на выходе дает вещественное число в интервале от 0 до 1. В частности, большие (по модулю) отрицательные числа превращаются в ноль, а большие положительные – в единицу. Исторически сигмоида находила широкое применение, поскольку ее выход хорошо интерпретируется, как уровень активации нейрона: от отсутствия активации (0) до полностью насыщенной активации (1). Сигмоида (sigmoid) выражается формулой:
График сигмоидальной функции в соответствии с рисунком ниже: Крайне нежелательные свойства сигмоиды
Одной из основных проблем сигмоидальной функции является её насыщение на концах (0 или 1), где её градиент становится практически нулевым.
В процессе обратного распространения ошибки локальный градиент умножается на общий градиент. Если локальный градиент близок к нулю, то общий градиент также становится очень маленьким, что существенно ослабляет сигнал, проходящий через нейрон и не позволяет корректно обновлять его веса. Кроме того, при инициализации весов нейронов с сигмоидной функцией активации необходимо быть особенно осторожным, чтобы избежать их насыщения. Например, если начальные веса будут слишком большими, большинство нейронов окажутся в состоянии насыщения, что приведет к плохому обучению сети.
Сигмоидальная функция обладает следующими характеристиками:
• непрерывность;
• монотонность;
• дифференцируемость.
Функция активации — гиперболический тангенс
В этой работе для скрытых и выходных слоев используется функция гиперболического тангенса. Это решение объясняется рядом причин:
• Симметричные функции активации, такие как гиперболический тангенс, обеспечивают более быструю сходимость по сравнению с логистической функцией.
• Эта функция имеет непрерывную первую производную.
• Производная гиперболического тангенса проста и может быть вычислена через само значение функции, что снижает вычислительные затраты.
График функции гиперболического тангенса представлен на рисунке. Функция активации ReLU
Известно, что нейронные сети способны приблизить сколь угодно сложную функцию, если в них достаточно слоев и функция активации является нелинейной. Функции активации вроде сигмоидной или тангенциальной являются нелинейными, но приводят к проблемам с затуханием или увеличением градиентов. Однако можно использовать и гораздо более простой вариант — выпрямленную линейную функцию активации (rectified linear unit, ReLU), которая выражается формулой: График функции ReLU в соответствии с рисунком ниже: Преимущества использования ReLU
Основным преимуществом функции активации ReLU является то, что её производная равна либо единице, либо нулю. Это означает, что не возникает проблем с затуханием или разрастанием градиентов, как в случае с другими функциями, например, гиперболическим тангенсом. При использовании ReLU, умножив её производную на ошибку, мы получаем ту же ошибку, что предотвращает её уменьшение или увеличение, как это может происходить в случае гиперболического тангенса, где производная может менять знак и величину. Это свойство ReLU способствует стабилизации процесса обучения и предотвращает затухание градиента. Более того, применение ReLU способствует разреженности весов.
Также важно отметить, что вычисления для сигмоиды и гиперболического тангенса требуют выполнения более сложных и ресурсоёмких операций, таких как возведение в степень. В то время как ReLU можно реализовать с помощью простого порогового преобразования, что значительно снижает вычислительные затраты.
ReLU эффективно отсекает ненужные детали, игнорируя отрицательные значения.
Недостатки ReLU
Однако, у ReLU есть и недостатки. Она не всегда надежна, и в процессе обучения может выйти из строя («умереть»). Например, если через нейрон проходит слишком большой градиент, это может привести к тому, что веса обновятся таким образом, что нейрон больше не будет активироваться. В результате, с этого момента градиент для этого нейрона всегда будет равен нулю, и нейрон будет «мертвым», то есть никогда больше не активируется. Это явление может случиться, если скорость обучения слишком велика, в этом случае до 40% нейронов с ReLU могут «умереть». Для решения этой проблемы важно правильно настроить скорость обучения.
Обучение сверточной нейронной сети
На начальном этапе нейронная сеть находится в состоянии, когда её веса не настроены, то есть она необучена. В общем смысле, обучение заключается в последовательной подаче примеров из обучающего набора на вход нейросети. Полученный ответ сравнивается с ожидаемым результатом. В нашем случае, если на вход подается изображение лица, то желаемый выход равен 1, если изображение не лицо — минус 1. Разница между полученным и ожидаемым результатом представляет собой ошибку (дельту ошибки). Эту ошибку нужно распространить на все связанные нейроны сети.
Таким образом, процесс обучения сводится к минимизации функции ошибки путём корректировки весов синаптических связей между нейронами. Функция ошибки измеряет разницу между фактическим и ожидаемым результатами. Например, если на вход подано изображение лица, и сеть дала результат 0.73, а желаемый ответ равен 1 (так как это лицо), ошибка составит 0.27. После этого веса нейронов выходного слоя корректируются в зависимости от этой ошибки. Для нейронов выходного слоя, где известны как фактические, так и ожидаемые значения, процесс корректировки весов достаточно прост. Однако для нейронов скрытых слоев эта задача более сложная, и долгое время не было ясного алгоритма для распространения ошибки на эти слои.
Алгоритм обратного распространения ошибки
Для обучения нейронной сети использовался алгоритм обратного распространения ошибки (backpropagation), который представляет собой метод обучения многослойных нейронных сетей, известный как обобщенное дельта-правило. Этот метод был предложен в 1986 году Румельхартом, Макклелландом и Вильямсом, что стало важным моментом для возрождения интереса к нейронным сетям, который начал угасать в начале 70-х годов. Алгоритм обратного распространения ошибки стал первым и основным практическим методом для обучения многослойных нейронных сетей.
Корректировка весов в выходном слое интуитивно понятна, однако долгое время не было известно, как точно настраивать веса в скрытых слоях. Веса скрытых нейронов должны изменяться пропорционально ошибке нейронов, с которыми они связаны. Именно по этой причине метод обратного распространения ошибки позволяет корректно настроить веса связей между всеми слоями сети. В результате этого процесса функция ошибки уменьшается, и сеть начинает эффективно обучаться.
Основные формулы алгоритма обратного распространения ошибки получаются при введении соответствующих обозначений: Величина ошибки определяется по формуле 2.8 среднеквадратичная ошибка: Неактивированное состояние каждого нейрона j для образа p записывается в виде взвешенной суммы по формуле 2.9: Выход каждого нейрона j является значением активационной функции, которая переводит нейрон в активированное состояние. В качестве функции активации может использоваться любая непрерывно дифференцируемая монотонная функция. Активированное состояние нейрона вычисляется по формуле 2.10: В качестве метода минимизации ошибки используется метод градиентного спуска, суть этого метода сводится к поиску минимума (или максимума) функции за счет движения вдоль вектора градиента. Для поиска минимума движение должно быть осуществляться в направлении антиградиента. Метод градиентного спуска в соответствии с рисунком 2.7. Градиент функции потери представляет из себя вектор частных производных, вычисляющийся по формуле 2.11: Производную функции ошибки по конкретному образу можно записать по правилу цепочки, формула 2.12: Ошибка нейрона обычно записывается в виде символа δ (дельта). Для выходного слоя ошибка определена в явном виде, если взять производную от формулы 2.8, то получим t минус y, то есть разницу между желаемым и полученным выходом. Но как рассчитать ошибку для скрытых слоев? Для решения этой задачи, как раз и был придуман алгоритм обратного распространения ошибки. Суть его заключается в последовательном вычислении ошибок скрытых слоев с помощью значений ошибки выходного слоя, т.е. значения ошибки распространяются по сети в обратном направлении от выхода к входу.
Ошибка δ для скрытого слоя рассчитывается по формуле 2.13: Алгоритм распространения ошибки сводится к следующим этапам:
- прямое распространение сигнала по сети, вычисления состояния нейронов;
- вычисление значения ошибки δ для выходного слоя;
- обратное распространение: последовательно от конца к началу для всех скрытых слоев вычисляем δ по формуле 2.13;
- обновление весов сети на вычисленную ранее δ ошибки.
Расчет ошибки на подвыборочном слое представляется в нескольких вариантах. Первый случай, когда подвыборочный слой находится перед полносвязным, тогда он имеет нейроны и связи такого же типа, как в полносвязном слое, соответственно вычисление δ ошибки ничем не отличается от вычисления δ скрытого слоя. Второй случай, когда подвыборочный слой находится перед сверточным, вычисление δ происходит путем обратной свертки. Для понимания обратно свертки, необходимо сперва понять обычную свертку и то, что скользящее окно по карте признаков (во время прямого распространения сигнала) можно интерпретировать, как обычный скрытый слой со связями между нейронами, но главное отличие — это то, что эти связи разделяемы, то есть одна связь с конкретным значением веса может быть у нескольких пар нейронов, а не только одной. Интерпретация операции свертки в привычном многослойном виде в соответствии с рисунком 2.8.
Рисунок 2.8 — Интерпретация операции свертки в многослойный вид, где связи с одинаковым цветом имеют один и тот же вес. Синим цветом обозначена подвыборочная карта, разноцветным – синаптическое ядро, оранжевым – получившаяся свертка.
Теперь, когда операция свертки представлена в привычном многослойном виде, можно интуитивно понять, что вычисление дельт происходит таким же образом, как и в скрытом слое полносвязной сети. Соответственно имея вычисленные ранее дельты сверточного слоя можно вычислить дельты подвыборочного, в соответствии с рисунком 2.9. Рисунок 2.9 — Вычисление δ подвыборочного слоя за счет δ сверточного слоя и ядра
Обратная свертка – это тот же самый способ вычисления дельт, только немного хитрым способом, заключающийся в повороте ядра на 180 градусов и скользящем процессе сканирования сверточной карты дельт с измененными краевыми эффектами. Простыми словами, нам необходимо взять ядро сверточной карты (следующего за подвыборочным слоем) повернуть его на 180 градусов и сделать обычную свертку по вычисленным ранее дельтам сверточной карты, но так чтобы окно сканирования выходило за пределы карты. Результат операции обратной свертки в соответствии с рисунком 2.10, цикл прохода обратной свертки в соответствии с рисунком 2.11. Рисунок 2.10 — Результат операции обратной свертки Рисунок 2.11 — Повернутое ядро на 180 градусов сканирует сверточную карту
Расчет ошибки на сверточном слое
Обычно впередиидущий слой после сверточного это подвыборочный, соответственно наша задача вычислить дельты текущего слоя (сверточного) за счет знаний о дельтах подвыборочного слоя. На самом деле дельта ошибка не вычисляется, а копируется. При прямом распространении сигнала нейроны подвыборочного слоя формировались за счет неперекрывающегося окна сканирования по сверточному слою, в процессе которого выбирались нейроны с максимальным значением, при обратном распространении, мы возвращаем дельту ошибки тому ранее выбранному максимальному нейрону, остальные же получают нулевую дельту ошибки.