Текст
                    МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ
(НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ)

А. С. Алексейчук

ВВЕДЕНИЕ В НЕЙРОННЫЕ СЕТИ:
МОДЕЛИ, МЕТОДЫ
И ПРОГРАММНЫЕ СРЕДСТВА

Рекомендовано Редакционно-издательским советом
Московского авиационного института
(национального исследовательского университета)
в качестве учебного пособия

Москва
Издательство «Доброе слово и Ко»
2023


УДК 519.6 ББК 32.973 А47 Рецензенты: Кафедра «Прикладная информатика и мультимедийные технологии» факультета «Информационные технологии» Московского государственного психолого-педагогического университета. Артамонов Г. Ф. — к. ф.-м. н., генеральный директор АО «ОВИОНТ ИНФОРМ». Автор: А. С. Алексейчук Введение в нейронные сети: модели, методы и программные А47 средства : Учебное пособие / А. С. Алексейчук. — М. : Издательство «Доброе слово и Ко», 2023. — 106 с. ISBN 978-5-6049766-0-9 Пособие содержит основные сведения о математической модели нейронных сетей, в том числе о ее применении к анализу изображений. Приводятся сведения о полносвязных и свёрточных нейронных сетях, о принципах их работы и методах их обучения. Рассмотрены приемы проектирования эффективных архитектур свёрточных сетей, а также приведена модель анализа изображений на основе векторных представлений. Материал снабжен примерами программного кода, позволяющими читателю самостоятельно освоить нейросетевое моделирование с использованием языка программирования Python. Пособие предназначено для студентов магистратуры, обучающихся по направлению 01.04.04 «Прикладная математика», изучающих дисциплину «Проектирование и функционирование нейронных сетей». УДК 519.6 ББК 32.973 ISBN 978-5-6049766-0-9 © Алексейчук А. С., 2023 © Издательство «Доброе слово и Ко», 2023
Оглавление 1 Общие концепции нейронных сетей ..................................................... 5 1.1 Биологические основы концепции нейронных сетей ................. 5 1.2 Основные понятия и определения ................................................ 6 1.3 Типы задач, решаемых нейронными сетями.............................. 10 1.4 Метрики классификации ............................................................. 12 1.5 Виды функций активации ............................................................ 14 1.6 Недообучение и переобучение .................................................... 18 1.7 Обучение нейросетей ................................................................... 20 1.7.1 Общие принципы обучения нейросетей ................................. 20 1.7.2 Уравнение работы многослойного перцептрона.................... 21 1.7.3 Функция потерь......................................................................... 24 1.7.4 Алгоритм обратного распространения ошибки ..................... 25 1.7.5 Разновидности метода градиентного спуска .......................... 27 1.7.6 Алгоритмы численной оптимизации ...................................... 31 1.7.7 Анализ результатов обучения .................................................. 35 1.8 Знакомство с библиотеками TensorFlow и Keras ....................... 36 1.8.1 TensorFlow ................................................................................. 36 1.8.2 Установка среды разработки с поддержкой GPU .................. 38 1.8.3 Построение модели многоклассовой классификации с помощью библиотеки TensorFlow ........................................................... 39 1.8.4 Построение модели многоклассовой классификации с помощью библиотеки Keras ..................................................................... 44 2 Свёрточные нейронные сети ................................................................ 47 2.1 Свёртка .......................................................................................... 48 2.1.1 Карты признаков ....................................................................... 50 2.1.2 Примеры сверток ...................................................................... 53 2.2 Субдискретизация ........................................................................ 56 3
3 2.3 Полносвязные слои ...................................................................... 57 2.4 Пример построения сверточной сети ......................................... 58 Приемы построения эффективных архитектур сверточных сетей ... 61 3.1 Прореживание............................................................................... 67 3.2 Аугментация данных.................................................................... 69 3.3 Нормализация по мини-пакетам ................................................. 72 3.4 Трансферное обучение ................................................................. 75 3.4.1 Выделение признаков ............................................................... 75 3.4.2 Дообучение ................................................................................ 79 4 Классификация на основе векторных представлений. «Сиамские» нейронные сети .................................................................................................. 83 4.1 Постановка задачи распознавания лиц ....................................... 83 4.2 Решение задачи распознавания лиц при помощи векторных представлений ................................................................................................ 84 4.3 Построение модели вычисления векторных представлений .... 85 4.3.1 Функция потерь contrastive loss ............................................... 87 4.3.2 Функция потерь triplet loss ....................................................... 88 4.3.3 Методы генерирования триплетов обучающей выборки ...... 90 4.4 Решение задач классификации с помощью векторных представлений ................................................................................................ 91 4.5 Пример построения «сиамских» сетей ....................................... 94 4.5.1 Подготовка исходных данных ................................................. 94 4.5.2 Генерирование триплетов обучающей выборки .................... 96 4.5.3 Построение базовой модели .................................................... 98 4.5.4 Построение генератора мини-батчей ...................................... 99 4.5.5 Обучение модели .................................................................... 101 4.5.6 Финальная классификация ..................................................... 103 4.5.7 Валидация модели .................................................................. 103 Список литературы..................................................................................... 105 4
1 Общие концепции нейронных сетей 1.1 Биологические основы концепции нейронных сетей Решение интеллектуальных задач при помощи вычислительных машин требует в той или иной мере воспроизведения процессов, происходящих во время мыслительной деятельности человека. Нервная система и мозг человека состоят из клеток специальной структуры – нейронов, соединенных между собой нервными волокнами. Нервные волокна способны передавать электрические импульсы между нейронами. Все процессы передачи восприятий от рецепторов органов чувств к мозгу, все процессы мышления, памяти и управления действиями реализованы в живом организме как передача электрических импульсов между нейронами. Каждый нейрон имеет отростки нервных волокон двух типов – дендриты, по которым принимаются импульсы, и единственный аксон, по которому нейрон может передавать импульс другим нейронам. Аксон контактирует с дендритами других нейронов через специальные образования – синапсы, которые влияют на силу прошедшего через них импульса. При прохождении синапса импульс усиливается или ослабляется в определенное число раз. Импульсы, поступившие к нейрону одновременно по нескольким дендритам, суммируются. Если суммарный импульс превышает некоторый порог, нейрон возбуждается, формирует собственный импульс и передает его далее по аксону. Важно отметить, что электрическое сопротивление между синапсами непостоянно и может изменяться со временем в результате прохождения через них электрических импульсов. На этом основан процесс обучения: при повторном прохождении импульсов формируются устойчивые синаптические связи, формирующие долговременные связи между нейронами и таким образом обеспечивающие запоминание информации и формирование нужных знаний и навыков. Подобную модель обработки можно реализовать на ЭВМ с помощью упрощенной математической модели процессов, происходящих в нейронах и в соединяющих их дендритах. Такая модель называется искусственной 5
нейронной сетью. Оказывается, подобная модель обладает способностью решать широкий круг задач, связанных с обработкой как числовой информации, так и мультимедийных данных: изображений, текстов, аудио- и видеоданных. К достоинствам нейросетевой модели относят возможность воссоздания очень сложных зависимостей между входными и выходными переменными, вычислительную эффективность (возможность аппаратной реализации с параллельными вычислениями) и свойство самоорганизации (способность сети самостоятельно формировать структуру параметров для решения поставленной задачи). Нейронные сети применяются на практике для поиска сложных, нетривиальных закономерностей в многомерных информационных системах, где затруднительно найти какое-либо аналитическое или статистическое описание связи между входными и выходными данными. Области применения нейросетей включают распознавание образов, построение прогнозов, поддержку принятия решений, классификацию объектов и т.д. Наиболее частая сфера применения нейросетей – решение задач классификации. При этом используется способность нейросетей производить обобщение, то есть выделять из обучающей выборки закономерность отображения входных значений в выходные. В сложных практических задачах обученная нейронная сеть выступает как эксперт, обладающий накопленным в процессе обучения опытом и способный найти ответ на сложный вопрос. 1.2 Основные понятия и определения Пусть 𝑥𝑥 ∈ ℝ𝑛𝑛 – некоторой входной вектор (полезная информация, которую необходимо обработать), а 𝑦𝑦 ∈ ℝ1 – скалярная выходная величина. Определение 1. Искусственный нейрон – это математическая модель биологического нейрона, осуществляющая преобразование входного вектора 𝑥𝑥 ∈ ℝ𝑛𝑛 в соответствии с уравнением: 𝑦𝑦 = 𝑓𝑓(𝒘𝒘𝑇𝑇 𝑥𝑥 + 𝑤𝑤0 ), где 𝒘𝒘 ∈ ℝ𝑛𝑛 – вектор весовых коэффициентов нейрона, 𝑤𝑤0 ∈ ℝ – постоянное смещение нейрона, а 𝑓𝑓 – функция активации нейрона. Определение 2. Функция активации (англ. activation function) – это действительнозначная функция 𝑓𝑓: ℝ → ℝ, определяющая значение на выходе нейрона. 6
Работу искусственного нейрона удобно изображать в виде схемы. На рисунке 1.1 изображен пример нейрона, обрабатывающего входной вектор 𝑥𝑥 = (𝑥𝑥1 , 𝑥𝑥2 , 𝑥𝑥3 )𝑇𝑇 ∈ ℝ3 . Соответственно, этот нейрон имеет 3 весовых коэффициента 𝑤𝑤1 , 𝑤𝑤2 , 𝑤𝑤3 и постоянное смещение 𝑤𝑤0 . Нейрон вычисляет суммарную величину 𝑠𝑠 = 𝑤𝑤1 𝑥𝑥1 + 𝑤𝑤2 𝑥𝑥2 + 𝑤𝑤3 𝑥𝑥3 + 𝑤𝑤0 и затем к полученному результату применяет функцию активации 𝑓𝑓(𝑠𝑠). Таким образом, выходное значение нейрона равно 𝑦𝑦 = 𝑓𝑓(𝑠𝑠) = 𝑓𝑓(𝑤𝑤1 𝑥𝑥1 + 𝑤𝑤2 𝑥𝑥2 + 𝑤𝑤3 𝑥𝑥3 + 𝑤𝑤0 ). Рис. 1.1. Графическое представление работы искусственного нейрона Таким образом, искусственный нейрон полностью описывается своими весовыми коэффициентами {𝑤𝑤𝑘𝑘 }𝑛𝑛𝑘𝑘=1 , постоянным смещением 𝑤𝑤0 и функцией активации 𝑓𝑓(𝑠𝑠). Получив вектор входных значений 𝑥𝑥 в качестве входов, нейрон выдает некоторое число 𝑦𝑦 на выходе. В дальнейшем в данном пособии биологические нейроны рассматриваться не будут, поэтому вместо термина «искусственный нейрон» будет употребляться более короткий термин «нейрон», а «весовые коэффициенты» иногда будут называться просто «весами» или «параметрами». Таким образом, одиночный нейрон реализует отображение ℝ𝑛𝑛 → ℝ1 в соответствии с выбранной функцией активации. Для решения большинства практических задач одного такого отображения недостаточно, поэтому для построения разнообразных многомерных отображений используются более сложные конструкции – искусственные нейронные сети. Определение 3. Искусственная нейронная сеть (нейронная сеть, нейросеть, англ. neural network) – это набор искусственных нейронов, соединенных между собой связями. Способ соединения нейронов в сеть называется архитектурой нейронной сети. 7
Нейроны можно соединять в сеть бесчисленным количеством способов, но, к счастью, необязательно каждый раз придумывать новую архитектуру нейронной сети. Существует множество эффективных, хорошо изученных готовых нейросетевых архитектур. Как правило, функции активации всех нейронов в нейронной сети фиксированы, а весовые коэффициенты и постоянные смещения нейронов являются параметрами нейронной сети и могут изменяться. Некоторые входы нейронов помечаются как внешние входы нейронной сети, а некоторые выходы – как внешние выходы нейронной сети. При подаче некоторых значений на входы нейронной сети будут получены некоторые значения на ее выходах. Таким образом, работа нейронной сети состоит в преобразовании входного вектора в выходной вектор, причем это преобразование задается архитектурой и весовыми коэффициентами нейронов сети. Определение 4. Многослойный перцептрон – архитектура нейронной сети, в которой нейроны организованы в слои, где каждый нейрон соединен со всеми нейронами одного предыдущего и одного следующего за ним слоев. Схема многослойного перцептрона показана на рис. 1.2. Рис. 1.2. Многослойный перцептрон 8
Количество входов этой сети 𝑛𝑛 равно размерности входного вектора. Первый слой называется входным. Нейроны входного слоя не преобразуют входной вектор, а передают его напрямую в следующий слой, т.е. имеют тождественную функцию активации и единственный фиксированный весовой коэффициент 𝑤𝑤1 = 1. Последний слой называется выходным, количество нейронов в нем равно размерности 𝑚𝑚 выходного вектора. Все остальные слои называются скрытыми. В общем случае функции активации нейронов могут быть разными для разных слоев, но обычно принимаются одинаковыми для всех нейронов одного и того же слоя. Возможность применения многослойного перцептрона для решения практических задач опирается на теорему, утверждающую, что многослойный перцептрон с сигмоидной функцией активации способен аппроксимировать любую непрерывную функциональную зависимость. Теорема (Дж. Цыбенко об универсальной аппроксимации [1]). Пусть 𝜑𝜑(∙) – ограниченная, непостоянная монотонно возрастающая непрерывная функция. Пусть 𝐼𝐼𝑚𝑚 – 𝑚𝑚-мерный единичный гиперкуб [0, 1]𝑚𝑚 , а 𝐶𝐶(𝐼𝐼𝑚𝑚 ) – пространство непрерывных на 𝐼𝐼𝑚𝑚 функций. Тогда для любой функции 𝑓𝑓 ∈ 𝐶𝐶(𝐼𝐼𝑚𝑚 ) и для любого 𝜀𝜀 > 0 существует такое целое число 𝑁𝑁 и множество векторов 𝑇𝑇 𝛼𝛼𝑖𝑖 , 𝑤𝑤𝑖𝑖 , 𝑤𝑤0𝑖𝑖 , где 𝑖𝑖 = 1, … , 𝑁𝑁, что функция 𝐹𝐹(𝑥𝑥1 , … , 𝑥𝑥𝑚𝑚 ) = ∑𝑁𝑁 𝑖𝑖=1 𝛼𝛼𝑖𝑖 𝜑𝜑(𝑤𝑤𝑖𝑖 𝑥𝑥 + 𝑤𝑤0𝑖𝑖 ) является реализацией аппроксимации функции 𝑓𝑓, то есть |𝐹𝐹(𝑥𝑥1 , … , 𝑥𝑥𝑚𝑚 ) − 𝑓𝑓(𝑥𝑥1 , … , 𝑥𝑥𝑚𝑚 )| < 𝜀𝜀 для всех 𝑥𝑥1 , … , 𝑥𝑥𝑚𝑚 ∈ 𝐼𝐼𝑚𝑚 . Данная теорема гарантирует, что некоторый перцептрон с одним скрытым слоем с 𝑁𝑁 нейронами может построить равномерную аппроксимацию произвольной непрерывной функции 𝑓𝑓 на компактном множестве с точностью 𝜀𝜀. Однако теорема не дает ответа о требуемом количестве 𝑁𝑁 нейронов скрытого слоя, которое на практике может оказаться очень большим. Поэтому для моделирования сложных функциональных зависимостей значительно чаще используются многослойные архитектуры, включающие два и более скрытых слоя. Требуемое количество нейронов для каждой архитектуры подбирается экспериментально. На практике обычно аппроксимируемая функция 𝑓𝑓 не задана явно, а определена на некотором конечном наборе известных примеров. Этот набор составляет обучающую выборку. Определение 5. Обучающая выборка (ОВ) – это конечное множество объектов 𝑋𝑋 𝑁𝑁 = {(𝑥𝑥1 , 𝑦𝑦1 ), … , (𝑥𝑥𝑚𝑚 , 𝑦𝑦𝑚𝑚 )}, 𝑚𝑚 = 1, … , 𝑁𝑁, где каждый элемент (𝑥𝑥𝑖𝑖 , 𝑦𝑦𝑖𝑖 ) – 9
это объект, характеризуемый набором его характеристик, или признаков, и целевым атрибутом 𝑦𝑦𝑖𝑖 , который модель обучается воспроизводить. Определение 6. Признаком (англ. feature) называется отображение 𝑓𝑓: 𝑋𝑋 → 𝐷𝐷𝑓𝑓 , где 𝐷𝐷𝑓𝑓 – множество допустимых значений признака 𝑓𝑓. Вектор (𝑥𝑥1 , … , 𝑥𝑥𝑛𝑛 ) = �𝑓𝑓1 (𝑥𝑥), … , 𝑓𝑓𝑛𝑛 (𝑥𝑥)� называется признаковым описанием объекта 𝑥𝑥, а всё пространство допустимых значений признаков 𝑋𝑋 = 𝐷𝐷𝑓𝑓1 × … × 𝐷𝐷𝑓𝑓𝑛𝑛 называется признаковым пространством. В зависимости от вида множества 𝐷𝐷𝑓𝑓 признаки делятся на числовые, бинарные, категориальные и порядковые. Числовые признаки принимают всевозможные числовые значения, т.е. 𝐷𝐷𝑓𝑓 = ℝ. Например, с помощью числового признака можно хранить возраст человека. Бинарные признаки принимают одно из двух возможных значений, которые чаще всего обозначаются числами 0 и 1, т.е. 𝐷𝐷𝑓𝑓 = {0, 1}. Например, с помощью бинарного признака можно хранить пол человека: 0 – мужской, 1 – женский. Категориальные признаки принимают значения из неупорядоченного множества. Пример – гражданство человека, которое может принимать значение из неупорядоченного списка существующих в мире государств. Порядковые признаки принимают одно значение из конечного упорядоченного множества. С помощью порядкового признака, например, можно хранить сведения об образовании, которые выбираются из упорядоченного списка: {«начальное», «базовое», «среднее», «высшее», «ученая степень»}. В некоторых практических приложениях признаки могут включать и более сложные структуры данных, такие как изображения, аудиозаписи и другие структурированные данные. Нейронные сети, обрабатывающие такие данные, обычно имеют большое количество слоев специальной структуры, предназначенной для обработки такой информации, и называются нейронными сетями глубокого обучения. 1.3 Типы задач, решаемых нейронными сетями Как уже упоминалось, нейронная сеть может построить аппроксимацию некоторой произвольной непрерывной функции с заданной точностью. Многие прикладные задачи, решаемые нейронными сетями, сводятся именно к 10
такому представлению. Задача аппроксимации ставится следующим образом. Имеется множество объектов 𝑋𝑋 и множество возможных значений некоторого выделенного атрибута 𝑌𝑌, называемого целевым атрибутом, заданные на конечной обучающей выборке 𝑋𝑋 𝑁𝑁 = {(𝑥𝑥1 , 𝑦𝑦1 ), … , (𝑥𝑥𝑚𝑚 , 𝑦𝑦𝑚𝑚 )}, 𝑚𝑚 = 1, … , 𝑁𝑁. На основе этих данных требуется с приемлемой точностью восстановить целевое отображение 𝑋𝑋 → 𝑌𝑌, позволяющее определить значение целевого атрибута 𝑦𝑦𝑖𝑖 для любого объекта 𝑥𝑥𝑖𝑖 , взятого из того же распределения, что и объекты обучающей выборки. Если множество значений целевого атрибута 𝑌𝑌 непрерывно, то нейросеть решает задачу аппроксимации числовой или вектор-функции. В частности, с помощью нейросети можно построить модель линейной или нелинейной регрессии. Примером такой задачи может быть прогноз значения цены акций на бирже на один или несколько следующих периодов времени, исходя из их значений в предыдущие периоды. Если множество 𝑌𝑌 дискретно, то задача, решаемая нейросетью, называется задачей классификации. В случае бинарной классификации (классификации объектов на 2 класса) множество значений целевого атрибута состоит из двух вариантов: 𝑌𝑌 = {0,1}. Для проведения классификации нейросеть строит разделяющие гиперповерхности в пространстве признаков. Задачи классификации, для которых разделяющая гиперповерхность является линейной функцией (рис. 1.3, слева), называются линейно разделимыми. На рис. 1.3 справа показан пример линейно неразделимой задачи. Рис. 1.3. Примеры линейно разделимой (слева) и линейно неразделимой (справа) задач классификации 11
Для решения линейно разделимой задачи достаточно построить нейронную сеть всего лишь с одним нейроном. Для решения линейно неразделимых задач требуется более сложная архитектура сети с одним или несколькими слоями. Как правило, чем сложнее форма разделяющей гиперплоскости, тем больше требуется слоев и (или) нейронов в каждом слое. Решение задач классификации является основной темой данного пособия, поэтому далее в основном приводятся сведения об обучении нейронных сетей применительно к этому классу задач. 1.4 Метрики классификации В каждой задаче классификации ставится вопрос оценки результатов, поскольку редко удается построить модель классификации, работающую со 100%-ной точностью. Для этого служат метрики – числовые характеристики качества работы алгоритма классификации. Рассмотрим некоторую задачу бинарной классификации, где один из классов обозначен как «положительный», а другой как «отрицательный». Результат работы алгоритма бинарной классификации можно представить в виде матрицы ошибок: Истинно положительные объекты Истинно отрицательные объекты Классифицированы как: TP Правильные ответы FP Ошибка I рода Положительные FN Ошибка II рода TN Правильные ответы Отрицательные Эта таблица состоит из следующих четырех значений. TP – True Positive – количество правильно определенных «положительных» объектов. TN – True Negative – количество правильно определенных «отрицательных» объектов. FP – False Positive – количество неправильно определенных «положительных» объектов, называемых также ошибками I рода. 12
FN – False Negative – количество неправильно определенных «отрицательных» объектов, называемых также ошибками II рода. Самая простая метрика, которую можно вычислить из этой таблицы – accuracy (точность). Она показывает долю правильно проставленных меток класса (истинно положительных и истинно отрицательных) от общего количества данных: 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎 = 𝑇𝑇𝑇𝑇 + 𝑇𝑇𝑇𝑇 . 𝑇𝑇𝑇𝑇 + 𝑇𝑇𝑇𝑇 + 𝐹𝐹𝐹𝐹 + 𝐹𝐹𝐹𝐹 (1.1) Метрика accuracy обладает существенным недостатком: она не показывает истинное качество классификатора в случае несбалансированной выборки (сильного преобладания одного класса над другим среди объектов выборки). Поэтому эту метрику стоит применять только в том случае, если все классы представлены в обучающей выборке примерно в одинаковом количественном соотношении. Следующие две метрики – precision (тоже называется точностью) и recall (полнота) – характеризуют способность алгоритма отделять «положительные» объекты от «отрицательных» и полноту охвата множества «положительных» объектов: 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 = 𝑇𝑇𝑇𝑇 , 𝑇𝑇𝑇𝑇 + 𝐹𝐹𝐹𝐹 𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟 = 𝑇𝑇𝑇𝑇 . 𝑇𝑇𝑇𝑇 + 𝐹𝐹𝐹𝐹 (1.2) Обычно увеличение метрики precision приводит к уменьшению метрики recall и наоборот. Поэтому на практике, чтобы с помощью одного числа учесть обе метрики, используют гармоническое среднее между точностью и полнотой – меру F1 (англ. F1-score): 𝐹𝐹1 = 2 ∙ 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 ∙ 𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟 . 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 + 𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟𝑟 (1.3) Метрика F1 достигает максимума при полноте и точности, равными единице, и близка к нулю, если хотя бы один из аргументов близок к нулю. Достоинство метрики F1 – возможность ее применения при несбалансированных выборках. 13
1.5 Виды функций активации В качестве функции активации нейронов, как правило, используют одну из предопределенных функций, для которых хорошо исследовано их применение в нейронных сетях. Некоторые из этих функций имеют параметр 𝑧𝑧, определяющий конкретный вид функции активации из некоторого семейства функций. Этот параметр фиксируется до начала обучения нейронной сети и остается неизменным на протяжении всего ее функционирования. 1. Тождественная функция активации: 𝑓𝑓(𝑥𝑥) = 𝑥𝑥. Рис. 1.4. Тождественная функция активации Тождественная функция может быть использована во входном слое, а также в выходном слое нейросети, реализующей модель функциональной аппроксимации. В скрытых слоях применение такой функции не имеет смысла, поскольку для реализации нелинейных зависимостей между входом и выходом сети скрытые слои должны иметь нелинейные функции активации. 2. Сигмоидная функция активации (рис. 1.5): 𝑓𝑓𝑧𝑧 (𝑥𝑥) = 1 . 1 + 𝑒𝑒 −𝑧𝑧𝑧𝑧 14 (1.4)
Рис. 1.5. Сигмоидная функция активации Сигмоидная функция находит широкое применение в нейронных сетях. Она может быть использована как в скрытых, так и в выходном слое. Разделяющая поверхность соответствует точке перегиба сигмоиды, где значение функции равно 0,5. Важное достоинство сигмоидной функции состоит в том, что производная этой функции выражается через значение самой функции: 𝑓𝑓𝑧𝑧′ (𝑥𝑥) = 𝑧𝑧𝑧𝑧𝑧𝑧 (𝑥𝑥)�1 − 𝑓𝑓𝑧𝑧 (𝑥𝑥)�. (1.5) 3. Симметричная сигмоидная функция (гиперболический тангенс): 𝑓𝑓𝑧𝑧 (𝑥𝑥) = 2 − 1. 1 + 𝑒𝑒 −𝑧𝑧𝑧𝑧 Рис. 1.6. Симметричная сигмоидная функция активации 15 (1.6)
Симметричная сигмоидная функция отличается от сигмоидной тем, что она принимает значения в интервале (−1, 1). Она также позволяет вычислять производную через значение самой функции:. 𝑓𝑓𝑧𝑧′(𝑥𝑥) = 𝑧𝑧�1 − 𝑓𝑓𝑧𝑧2 (𝑥𝑥)�. (1.7) 4. Функция ReLU (англ. REctified Linear Unit) – кусочно-линейная функция с изломом в нуле и нулевыми значениями в отрицательной области (рис. 1.7): 𝑓𝑓(𝑥𝑥) = max(0, 𝑥𝑥). (1.8) Рис. 1.7. Функция ReLU Функция ReLU находит широкое применение в современных архитектурах сетей глубокого обучения благодаря вычислительной эффективности и очень простому правилу вычислению ее производной: 𝑓𝑓 ′ (𝑥𝑥) = � 1, 𝑥𝑥 > 0, 0, 𝑥𝑥 < 0. В точке 𝑥𝑥 = 0 функция не дифференцируема, поэтому во избежание неопределенности в этой точке значение производной можно принять равным 1 или 0. 5. Функция Leaky ReLU (ReLU «с утечкой») – кусочно-линейная функция, значения которой в отрицательной области являются линейными, но с меньшей крутизной, чем в положительной области (рис. 1.8): 𝑓𝑓𝑧𝑧 (𝑥𝑥) = max(𝑥𝑥, 𝑧𝑧𝑧𝑧) , 0 < z < 1. Параметр 𝑧𝑧 определяет крутизну отрицательной ветви. 16 (1.9)
Рис. 1.8. Функция Leaky ReLU Функцию Leaky ReLU используют для предотвращения разреженности, т.е. во избежание появления нулевых активаций нейронов в скрытых слоях. Это имеет существенное значение в некоторых типах сетей глубокого обучения, таких как генеративно-состязательные сети. 6. Функция softmax представляет собой обобщение сигмоидной функции активации на случай классификации с числом классов более двух. Отличие этой функции от остальных состоит в том, что она, во-первых, является вектор-функцией и, во-вторых, применяется сразу к нескольким нейронам, находящимся, как правило, в выходном слое. Пусть сеть осуществляет классификацию входных данных на q классов. В этом случае выход сети будет включать q нейронов, по одному на каждый класс. Пусть 𝑥𝑥𝑖𝑖 , 𝑖𝑖 = 1, … , 𝑞𝑞 – взвешенная сумма компонент входного вектора 𝑖𝑖-го нейрона (до применения активации). Тогда 𝑖𝑖-я компонента вектор-функции softmax будет вычисляться по формуле: 𝑓𝑓𝑖𝑖 (𝑥𝑥) = 𝑒𝑒 𝑥𝑥𝑖𝑖 , 𝑖𝑖 = 1, … , 𝑞𝑞. ∑𝑞𝑞𝑗𝑗=1 𝑒𝑒 𝑥𝑥𝑗𝑗 (1.10) Таким образом, функция softmax преобразует вектор 𝑥𝑥 в вектор той же размерности, каждая координата которого принимает значения в интервале (0, 1] и сумма координат которого равна 1. Благодаря этому свойству компоненты вектора 𝑓𝑓(𝑥𝑥) похожи на ряд распределения некоторой дискретной случайной величины, поэтому значения на выходе слоя с 17
функцией активации softmax зачастую называют вероятностями. Необходимо отметить, что это название является условным и не связано с вероятностями каких-либо случайных величин, поскольку модель нейросетевой классификации является полностью детерминированной. Компоненту 𝑓𝑓𝑖𝑖 (𝑥𝑥) вектор-функции softmax можно понимать как степень уверенности модели в том, что классифицируемый объект относится к i-му классу. Существует и ряд других функций активации (радиально-базисные функции, ELU, GELU, SoftPlus и др.). В некоторых приложениях они могут показать лучшие результаты, чем перечисленные выше функции, однако в целом первостепенное значение имеют выбор архитектуры, подбор гиперпараметров и алгоритма оптимизации. Поэтому в данном пособии в дальнейшем они рассматриваться не будут. 1.6 Недообучение и переобучение При обработке обучающей выборки встает вопрос правильности обобщения функциональной зависимости, определенной на конечном множестве примеров. При правильном выборе архитектуры обученная нейросетевая модель верно воспроизводит общую тенденцию зависимостей между признаками и целевым атрибутом, несмотря на то, что в точках обучающей выборки предсказанное значение целевого атрибута может в точности не совпадать с истинным значением (рис. 1.9, а)). Если обобщающей способности модели недостаточно, чтобы воспроизводить сложные взаимозависимости между признаками, то возникает явление недообучения (англ. underfitting), заключающееся в сильном отклонении значения целевого атрибута от истинной функциональной зависимости, в том числе в точках обучающей выборки (рис. 1.9, б)). Возможна и обратная ситуация, когда нейросеть очень точно воспроизводит аппроксимируемую функцию 𝑓𝑓 в точках обучающей выборки, но при подаче на вход других значений (между точками ОВ) она производит сильно отклоняющиеся от общей тенденции значения. Это явление называется переобучением (англ. overfitting) (рис. 1.9, в)). Как недообучение, так и переобучение являются нежелательными явлениями, поскольку они ограничивают способность нейросети правильно обра- 18
батывать новые данные, которых не было в обучающей выборке. Процесс построения и обучения нейронной сети состоит в выборе разумного компромисса, позволяющего, с одной стороны, получить модель с достаточной обобщающей способностью, и, с другой стороны, не допустить явления переобучения. Это достигается экспериментальным выбором подходящей архитектуры и гиперпараметров нейросети и контролем работы полученной модели с помощью метрик. Рис. 1.9. Результаты обучения нейросети: а) нормальное обучение, б) недообучение, в) переобучение Основной способ борьбы с недо- и переобучением – деление обучающей выборки на части и использование одних данных для обучения, а других – для проверки модели. Самый простой способ организации обучающих данных – разделить имеющуюся выборку на две части, одна из которых (примерно ¾ общего количества) используется для обучения, а другая (примерно ¼) – для проверки качества работы сети и подбора гиперпараметров. Эта часть называется тестовой выборкой. Более совершенный способ включает повторное разделение имеющихся данных на несколько (обычно от 4 до 10) непересекающиеся блоков одинаковой длины. Процедура обучения производится несколько раз с поочередным использованием каждого блока в качестве тестовой выборки и с обучением на остальных блоках. Такая процедура называется кросс-валидацией. Однако во многих современных приложениях, включающих обработку изображений и других мультимедийных данных, обучающая выборка может быть настолько велика, что применение кросс-валидации становится слишком вычислительно затратно. В таких случаях данные разделяют на три ча- 19
сти: обучающую, тестовую и валидационную выборки. В качестве обучающей выборки берется большая часть данных (порядка 95-98% от общего количества). Тестовая выборка (2-3%) служит для контроля метрик и подбора гиперпараметров модели с целью достижения максимального значения метрик. Наконец, валидационная выборка (1-2%) не принимает участия в процедуре обучения и подборе гиперпараметров и служит только для независимой оценки итогового качества работы модели. 1.7 Обучение нейросетей 1.7.1 Общие принципы обучения нейросетей Как упоминалось в разделе «Основные определения», аппроксимируемая нейросетью функциональная зависимость обычно не задана явно, а определена на некоторой конечной обучающей выборке. Поэтому настройка параметров модели (весовых коэффициентов и постоянных смещений нейронов) должна производиться путем перебора имеющихся примеров обучающей выборки и постепенной корректировки параметров модели, чтобы выходные значения нейросети как можно точнее соответствовали требуемому отображению. Эта процедура называется обучением нейронной сети. Процесс обучения нейросети подобен биологическому принципу обучения мозга новому навыку. Например, рассмотрим, как происходит изучение алфавита ребенком. Поначалу он может неверно интерпретировать буквы, что требует корректировки его ответов учителем. При этом у ребенка происходит запоминание, основанное на изменениях проводимости синаптических связей между нейронами в участках мозга, отвечающих за долговременную память и распознавание образов. Со временем, после множества повторений, синаптические связи становятся устойчивыми, происходит безошибочное сопоставление визуального образа и правильного ответа, и таким образом ребенок запоминает все 33 буквы алфавита. Теперь рассмотрим типичный пример обучения нейросети распознаванию букв на изображениях. Здесь происходит похожий процесс. Для обучения требуется обучающая выборка, состоящая из набора изображений букв и сопоставленного каждому изображению правильного ответа, составляющего целевой атрибут. Нейросеть включает входной слой, число нейронов которого совпадает с числом пикселей каждого изображения, скрытые слои и выходной слой с количеством нейронов, равным количеству распознаваемых 20
символов. В начале обучения все изменяемые параметры нейросети инициализируются случайными значениями. Подавая, например, изображение буквы «А» на вход нейронной сети, мы получаем на ее выходе некоторый вектор, поначалу никак не связанный с истинным правильным ответом. Правильный ответ представляется вектором вида [1, 0, 0, … , 0], где 1 стоит на выходе с меткой «А», а 0 – на всех остальных выходах. Такой способ кодирования называется one-hot кодированием. Вычисляя разность между желаемым ответом и реальным ответом сети, мы получаем вектор ошибки. Задача обучения нейросети – минимизировать среднее значение вектора ошибки. Для этого используют численные методы оптимизации, в частности, метод градиентного спуска. Процесс обучения включает итеративное предъявление на вход сети порций данных обучающей выборки, вычисление вектора ошибки, корректировку параметров сети (весов и постоянных смещений) и вычисление метрик качества классификации на тестовой выборке. Каждый цикл полного перебора обучающей выборки называется эпохой. После многократного прохождения выборки параметры сети постепенно стабилизируются. Если при этом качество классификации на тестовой выборке достигает приемлемого уровня, процесс обучения завершают, а сеть считают обученной и готовой к применению с использованием новых данных. Если же не удается достичь приемлемого качества, то требуются дополнительные исследования: модификация архитектуры нейросети и/или ее гиперпараметров, сбор дополнительных обучающих данных, их очистка, применение методов регуляризации и т.п. Некоторые методы построения эффективных архитектур для решения задач классификации изображений будут рассмотрены в главе 3. 1.7.2 Уравнение работы многослойного перцептрона Как упоминалось в п. 1.2, многослойный перцептрон состоит из входного слоя, принимающего на вход исходные данные, нескольких скрытых слоев и выходного слоя. Каждый нейрон получает в качестве входного вектора выходные значения всех нейронов предыдущего слоя и передает свои выходные значения каждому нейрону следующего слоя. Такая нейросеть называется полносвязной. Вычисления, производимые каждым слоем нейросети, удобно представлять в векторно-матричной форме. 21
Допустим, некоторый слой содержит 𝑘𝑘 нейронов с векторами весовых коэффициентов 𝒘𝒘1 , 𝒘𝒘2 , … , 𝒘𝒘𝑘𝑘 , где 𝒘𝒘𝑖𝑖 = (𝑤𝑤𝑖𝑖1 𝑤𝑤𝑖𝑖2 … 𝑤𝑤𝑖𝑖𝑖𝑖 )𝑇𝑇 , 𝑖𝑖 = 1, … , 𝑘𝑘, а на вход этого слоя подается вектор 𝑥𝑥 = (𝑥𝑥1 𝑥𝑥2 … 𝑥𝑥𝑛𝑛 )𝑇𝑇 . Тогда у 𝑖𝑖-го нейрона с весовыми коэффициентами 𝒘𝒘𝑖𝑖 значение на выходе будет равно: 𝑦𝑦𝑖𝑖 = 𝑓𝑓(𝒘𝒘𝑇𝑇𝑖𝑖 𝑥𝑥 + 𝑤𝑤0𝑖𝑖 ), (1.11) где 𝑓𝑓 – функция активации 𝑖𝑖-го нейрона, а 𝑤𝑤0𝑖𝑖 – его постоянное смещение. Поскольку все нейроны каждого слоя получают на вход один и тот же вектор и имеют одну и ту же функцию активации, а вычисления в них происходят параллельно и независимо, то преобразование, которое делают все нейроны одного слоя, можно представить в векторной форме: где 𝑦𝑦1 � ⋮ � = 𝑓𝑓(𝑊𝑊𝑊𝑊 + 𝒘𝒘0 ), 𝑦𝑦𝑘𝑘 𝑤𝑤11 𝒘𝒘1𝑇𝑇 𝑊𝑊 = � ⋮ � = � ⋮ 𝑤𝑤𝑘𝑘1 𝒘𝒘𝑇𝑇𝑘𝑘 ⋯ 𝑤𝑤1𝑛𝑛 𝑤𝑤01 ⋯ ⋮ � , 𝒘𝒘0 = � ⋮ �. ⋯ 𝑤𝑤𝑘𝑘𝑘𝑘 𝑤𝑤0𝑘𝑘 (1.12) (1.13) Таким образом, вычисление выходов всех нейронов слоя сводится к умножению матрицы весов на входной вектор, прибавлению вектора смещения и покомпонентному применению функции активации к полученному вектору. С помощью полученного выражения можно вывести рекуррентную формулу преобразования входного вектора многослойной нейронной сетью. Введем следующие обозначения весов связей, соединяющих нейроны входного и первого скрытого слоев (рис. 1.10). 22
Рис. 1.10. Обозначение весовых коэффициентов (на примере первого нейрона входного слоя) Весовые коэффициенты всех связей между этими слоями можно записать в виде матрицы: 𝑊𝑊 (1) (1) 𝑤𝑤11 =� ⋮ (1) 𝑤𝑤𝑛𝑛11 (1) ⋯ 𝑤𝑤1𝑛𝑛0 ⋯ ⋮ �, (1) ⋯ 𝑤𝑤𝑛𝑛1𝑛𝑛0 (1.14) где 𝑛𝑛0 – количество нейронов входного слоя, 𝑛𝑛1 – количество нейронов первого слоя. Таким образом, матрица 𝑊𝑊 (1) имеет размерность 𝑛𝑛1 × 𝑛𝑛0 . Аналогично, матрица весов 𝑊𝑊 (𝑙𝑙) между любыми слоями 𝑙𝑙 и 𝑙𝑙 − 1 будет иметь размерность 𝑛𝑛𝑙𝑙 × 𝑛𝑛𝑙𝑙−1 . Постоянное смещение нейронов слоя 𝑙𝑙 можно записать в виде вектора (𝑙𝑙) 𝒘𝒘0 (𝑙𝑙) 𝑤𝑤01 = � ⋮ �. (𝑙𝑙) 𝑤𝑤0𝑛𝑛𝑙𝑙 (1.15) Вектор выходных значений нейронов первого слоя можно записать в виде следующего матричного выражения: 23
𝑍𝑍 (1) (1) 𝑧𝑧1 (1) = � ⋮ � = 𝑓𝑓 (1) �𝑊𝑊 (1) 𝑥𝑥 + 𝒘𝒘0 �, (1) 𝑧𝑧𝑛𝑛1 (1.16) где 𝑥𝑥 – входной вектор, 𝑓𝑓 (1) – функция активации первого слоя. Обобщая данное выражение, можно получить уравнение выхода для произвольного слоя 𝑙𝑙: 𝑍𝑍 (𝑙𝑙) (𝑙𝑙) 𝑧𝑧1 (𝑙𝑙) = � ⋮ � = 𝑓𝑓 (𝑙𝑙) �𝑊𝑊 (𝑙𝑙) 𝑍𝑍 (𝑙𝑙−1) + 𝒘𝒘0 �, (𝑙𝑙) 𝑧𝑧𝑛𝑛1 (1.17) где 𝑍𝑍 (𝑙𝑙−1) – выход слоя, предшествующего слою 𝑙𝑙. В каждом случае 𝑙𝑙 изменяется от 1 до 𝐿𝐿, где 𝐿𝐿 – количество слоев сети. Этот процесс называется прямым распространением входных данных (англ. forward propagation). 1.7.3 Функция потерь С практической точки зрения задача обучения нейросети состоит в получении максимально возможного качества ее работы, которое измеряется метриками. Однако напрямую оптимизировать значения метрик (например, accuracy) при обучении нейросети не представляется возможным, поскольку эти функции – кусочно-постоянные и не дифференцируемые. Поэтому вводится другая функция 𝐸𝐸, вычисляемая на основе выходных данных сети и поддающаяся оптимизации градиентными методами – функция потерь (англ. loss function), называемая также целевой функцией. Пусть на вход нейросети подается вектор 𝑥𝑥 (𝑖𝑖) ∈ ℝ𝑛𝑛 , где верхний индекс (𝑖𝑖) обозначает номер элемента обучающей выборки. Тогда на выходе сети (𝑖𝑖) (𝑖𝑖) 𝑇𝑇 будет получен соответствующий ему вектор 𝑦𝑦� (𝑖𝑖) = �𝑦𝑦�1 … 𝑦𝑦�𝑚𝑚 � ∈ ℝ𝑚𝑚 . Пусть целевой атрибут элемента 𝑥𝑥 (𝑖𝑖) представлен вектором 𝑦𝑦 (𝑖𝑖) ∈ ℝ𝑚𝑚 , а 𝑁𝑁 – общая длина выборки или ее части, на которой происходит обучение. Выходной вектор сети 𝑦𝑦� (𝑖𝑖) при заданном входном векторе 𝑥𝑥 (𝑖𝑖) определяется архитектурой сети, в которой переменными являются параметры сети – весовые (𝑙𝑙) коэффициенты 𝑊𝑊 (𝑙𝑙) и постоянные смещения 𝒘𝒘0 , 𝑙𝑙 = 1, … , 𝐿𝐿, всю совокупность которых мы обозначим через 𝒘𝒘. Таким образом, при фиксированной 24
обучающей выборке значение функции потерь зависит от параметров всех нейронов всех слоев сети 𝒘𝒘, т.е. 𝐸𝐸 = 𝐸𝐸(𝒘𝒘). В задаче аппроксимации 𝑚𝑚-мерной выходной величины на выходе сети используют 𝑚𝑚 нейронов с тождественной функцией активации и в качестве функции потерь используют среднеквадратическую ошибку: 𝑚𝑚 𝑁𝑁 1 1 (𝑖𝑖) (𝑖𝑖) 2 𝐸𝐸(𝒘𝒘) = � ��𝑦𝑦𝑘𝑘 − 𝑦𝑦�𝑘𝑘 � . 2𝑁𝑁 (1.18) 𝑖𝑖=1 𝑘𝑘=1 Коэффициент вводится для удобства дифференцирования этой функции. 2 В задаче бинарной классификации в качестве целевого атрибута используют числовые метки 0 или 1, обозначающие один из двух классов, т.е. 𝑦𝑦� (𝑖𝑖) ∈ {0, 1}. На выходе нейросети, предназначенной для бинарной классификации, используют один нейрон с сигмоидной функцией активации, а в качестве функции потерь используют кросс-энтропию: 𝑁𝑁 1 𝐸𝐸(𝒘𝒘) = ��𝑦𝑦 (𝑖𝑖) log 2 𝑦𝑦� (𝑖𝑖) + �1 − 𝑦𝑦 (𝑖𝑖) � log 2 �1 − 𝑦𝑦� (𝑖𝑖) ��. 𝑁𝑁 (1.19) 𝑖𝑖=1 В задаче многоклассовой классификации на q классов на выходе сети ставят q нейронов с функцией активации softmax и используют обобщение кросс-энтропии на случай нескольких классов: 𝑁𝑁 (𝑖𝑖) 𝑞𝑞 1 (𝑖𝑖) (𝑖𝑖) 𝐸𝐸(𝒘𝒘) = � � 𝑦𝑦𝑗𝑗 log 2 𝑦𝑦�𝑗𝑗 , 𝑁𝑁 𝑖𝑖=1 𝑗𝑗=1 (1.20) (𝑖𝑖) где 𝑦𝑦𝑗𝑗 = 1, если 𝑖𝑖-й объект принадлежит 𝑗𝑗-му классу, 𝑦𝑦𝑗𝑗 = 0 в противном (𝑖𝑖) случае, а компонента выходного вектора 𝑦𝑦�𝑗𝑗 ∈ (0, 1) считается «вероятно- стью» (степенью уверенности модели) принадлежности 𝑖𝑖-го объекта 𝑗𝑗-му классу. 1.7.4 Алгоритм обратного распространения ошибки Алгоритм обратного распространения ошибки (англ. backpropagation algorithm) – это разновидность метода градиентного спуска, при помощи которого ищется минимум функции потерь в пространстве параметров нейросети (весовых коэффициентов и постоянных смещений нейронов). Этот метод 25
обучения является основным для всего многообразия разновидностей архитектур современных нейронных сетей. Алгоритм обратного распространения ошибки следующий. 1. Инициализировать синаптические веса и постоянные смещения нейронной сети случайными значениями из заданного распределения, в качестве которого чаще всего выступает нормальное распределение. 2. Подать один элемент или пакет элементов из обучающего множества на вход сети в соответствии с выбранной стратегией (см. далее). 3. Вычислить выходной вектор сети и функцию потерь. 4. Вычислить градиент функции потерь по всем параметрам нейросети по формулам обратного распространения ошибки (для сигмоидных функций активации – по формулам (1.22)-(1.24)). 5. Подкорректировать веса сети для минимизации функции потерь по методу градиентного спуска (1.21) или одной из его модификаций (см. разд. 1.7.6). 6. Вычислить функцию потерь и метрики качества классификации на пакете обучающей и тестовой выборки. 7. Повторять шаги с 2 по 6 до тех пор, пока метрика качества на тестовой выборке не достигнет приемлемого уровня или до достижения максимального количества итераций. Пусть 𝒘𝒘𝑖𝑖 – вектор значений параметров сети на 𝑖𝑖-м шаге обучения, и требуется вычислить их значения 𝒘𝒘𝑖𝑖+1 на следующем шаге. Градиентный спуск описывается формулой градиентного шага: 𝒘𝒘𝑖𝑖+1 = 𝒘𝒘𝑖𝑖 − 𝜂𝜂 𝑖𝑖 ∇𝒘𝒘 𝐸𝐸(𝒘𝒘), (1.21) где 𝜂𝜂 𝑖𝑖 > 0 – коэффициент, называемый скоростью обучения на 𝑖𝑖-м шаге обучения, ∇𝒘𝒘 𝐸𝐸 – вектор градиента функции 𝐸𝐸(𝒘𝒘). За счет отрицательной величины −𝜂𝜂 𝑖𝑖 поправки градиентного шага происходят в направлении наискорейшего спуска, определяемого антиградиентом (вектором, противоположным градиенту). Для вычисления поправок градиентного спуска необходим метод вычисления вектора градиента ∇𝒘𝒘 𝐸𝐸(𝒘𝒘), где функция потерь 𝐸𝐸 довольно сложным образом зависит от параметров нейросети 𝒘𝒘, особенно тех, которые относятся к нейронам, стоящим далеко от выходного слоя. Однако можно показать, что частные производные функции 𝐸𝐸(𝒘𝒘) по параметрам скрытых слоев 26
многослойного перцептрона могут быть явно выражены рекуррентными формулами для каждого слоя, начиная с выходного, что значительно упрощает вычисление градиента. Например, пусть некоторый многослойный перцептрон содержит только сигмоидные функции активации. Обозначим через 𝑜𝑜𝑗𝑗 значение на выходе j-го нейрона скрытого или выходного слоя, а через 𝑤𝑤𝑗𝑗𝑗𝑗 – весовые коэффициенты связей, соединяющих j-й нейрон текущего слоя и k-й нейрон следующего за ним слоя. Сопоставим каждому j-му нейрону величину 𝛿𝛿𝑗𝑗 , которая для нейронов выходного слоя вычисляется по формуле: 𝛿𝛿𝑗𝑗 = −𝑜𝑜𝑗𝑗 �1 − 𝑜𝑜𝑗𝑗 ��𝑦𝑦𝑗𝑗 − 𝑜𝑜𝑗𝑗 �, (1.22) а для нейронов скрытых слоев – по формуле: 𝛿𝛿𝑗𝑗 = 𝑜𝑜𝑗𝑗 �1 − 𝑜𝑜𝑗𝑗 � � 𝑘𝑘 ϵ 𝑐𝑐ℎ𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖(𝑗𝑗) 𝛿𝛿𝑘𝑘 𝑤𝑤𝑗𝑗𝑗𝑗 , (1.23) где через 𝑐𝑐ℎ𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖(𝑗𝑗) обозначено множество нейронов следующего после jго нейрона слоя. Тогда можно показать, что частная производная функции потерь 𝜕𝜕𝐸𝐸 𝜕𝜕𝑤𝑤𝑗𝑗𝑗𝑗 по коэффициенту 𝑤𝑤𝑗𝑗𝑗𝑗 может быть вычислена по формуле: 𝜕𝜕𝐸𝐸 = 𝛿𝛿𝑘𝑘 𝑜𝑜𝑗𝑗 . 𝜕𝜕𝑤𝑤𝑗𝑗𝑗𝑗 (1.24) Следовательно, компоненты вектора градиента функции потерь могут быть вычислены для параметров всех слоев сети в обратном порядке, начиная с выходного. Это и определяет название метода обратного распространения ошибки. Аналогичные формулы могут быть выведены и для других видов функций активации. 1.7.5 Разновидности метода градиентного спуска В формулу шага градиентного спуска (1.21) входит градиент функции потерь ∇𝒘𝒘 𝐸𝐸(𝒘𝒘), где, как видно из структуры формул (1.18)-(1.20), функция потерь 𝐸𝐸(𝒘𝒘) представима в виде среднего функций потерь 𝐸𝐸𝑖𝑖 (𝒘𝒘), вычисленных для каждого элемента выборки: 𝐸𝐸 = 𝑁𝑁 1 � 𝐸𝐸𝑖𝑖 (𝒘𝒘). 𝑁𝑁 𝑖𝑖=1 27 (1.25)
Соответственно, выбирая различные подмножества элементов ОВ на каждом шаге градиентного спуска, можно реализовывать разные стратегии перебора элементов ОВ. Разновидность градиентного спуска, использующая вычисление усредненного антиградиента на всех элементах выборки, называется пакетным градиентным спуском: 𝒘𝒘 𝑖𝑖+1 𝑁𝑁 1 = 𝒘𝒘 − 𝜂𝜂 ∙ � ∇𝒘𝒘 𝐸𝐸𝑖𝑖 (𝒘𝒘). 𝑁𝑁 𝑖𝑖 𝑖𝑖 𝑖𝑖=1 (1.26) На рис. 1.11 показано условное изображение функции потерь в координатах, соответствующих весовым коэффициентам модели, и процесс сходимости к минимуму путем вычисления усредненного антиградиента на всех элементах обучающей выборки. Антиградиент показан только для первого шага. Рис. 1.11. Пакетный градиентный спуск 28
Преимущество такой разновидности градиентного спуска состоит в его стабильной сходимости. Пакетный градиентный спуск обычно используют при небольшом размере обучающей выборки. Если же выборка большая, то вычисление градиента на каждом шаге становится слишком вычислительно затратным. В этом случае используют методы, в которых производится вычисление градиента на меньших подмножествах – стохастический либо мини-пакетный градиентный спуск. Стохастический градиентный спуск. При таком способе выбираемое подмножество состоит из одного случайно выбранного элемента обучающей выборки �𝑥𝑥 (𝑖𝑖) , 𝑦𝑦 (𝑖𝑖) �. Для него вычисляется градиент функции потерь и сразу же производится обновление весов: 𝒘𝒘𝑖𝑖+1 = 𝒘𝒘𝑖𝑖 − 𝜂𝜂 𝑖𝑖 ∇𝒘𝒘 𝐸𝐸𝑖𝑖 (𝒘𝒘). Процесс сходимости алгоритма показан на рис. 1.12. Рис. 1.12. Стохастический градиентный спуск 29 (1.27)
Преимущество этой разновидности градиентного спуска заключается в ее естественном свойстве выбираться из локальных минимумов за счет случайных осцилляций вектора антиградиента. Но на больших наборах данных этот алгоритм является довольно медленным, так как требует постоянных обновлений весов модели, при этом сходимость алгоритма за счет тех же осцилляций может быть нестабильной. Мини-пакетный градиентный спуск. Это компромиссный вариант, в котором усредненный антиградиент на всей выборке аппроксимируется усредненным антиградиентом на небольшой случайной подвыборке размера 𝑚𝑚, называемой мини-пакетом или мини-батчем (англ. minibatch) (рис. 1.13): 𝒘𝒘 𝑖𝑖+1 𝑚𝑚 1 = 𝒘𝒘 − 𝜂𝜂 ∙ � ∇𝒘𝒘 𝐸𝐸𝑖𝑖 (𝒘𝒘). 𝑚𝑚 𝑖𝑖 𝑖𝑖 𝑖𝑖=1 Рис. 1.13. Мини-пакетный градиентный спуск 30 (1.28)
Этот алгоритм является основным в современном машинном обучении благодаря его достаточно стабильной сходимости и высокой скорости работы. Мини-пакетный вариант ввиду его эффективности часто используется в сетях глубокого обучения, где выборки имеют очень большие размеры и не помещаются целиком в оперативной памяти. 1.7.6 Алгоритмы численной оптимизации Применение метода обратного распространения ошибки требует использования численных методов оптимизации на основе градиентного спуска. Однако метод градиентного спуска «в чистом виде», представленный формулой (1.21), в практике обучения нейронных сетей практически не используется в силу специфики этой задачи. Пространство оптимизируемых параметров нейронных сетей чрезвычайно многомерно – количество параметров в современных архитектурах нейросетей может исчисляться миллионами и даже миллиардами. При этом функция потерь имеет очень сложный ландшафт со множеством седловых точек, а также имеет выраженную овражную структуру, т.е. модуль и направление градиента может быстро меняться вдоль одних осей и очень медленно – вдоль других. Это затрудняет поиск глобального минимума с «чистым» методом градиентного спуска. Поэтому используют модификации метода градиентного спуска на основе специальных эвристик, позволяющих значительно ускорить приближение к глобальному минимуму в этих условиях. Алгоритм AdaGrad [2] предназначен для преодоления сложностей, связанных с неравномерной крутизной целевой функции вдоль различных осей. Размер градиентного шага в алгоритме AdaGrad вычисляется отдельно для каждого параметра, исходя из накопленной предыстории значения градиента на предыдущих шагах. Это позволяет замедлить обновление быстро меняющихся параметров и ускорить обновление медленно меняющихся и, соответственно, быстрее достигать минимума в условиях овражной структуры целевой функции. Обозначим через 𝑔𝑔𝑘𝑘𝑖𝑖 значение k-й компоненты вектора градиента на i-м шаге: 𝑔𝑔𝑘𝑘𝑖𝑖 = ∇𝒘𝒘 𝐸𝐸�𝒘𝒘𝑖𝑖𝑘𝑘 �. 31 (1.29)
Через 𝐺𝐺𝑘𝑘𝑖𝑖 обозначим сумму квадратов частных производных по k-й переменной, вычисленную от начала работы алгоритма до i-го шага включительно. Эта величина выступает в качестве характеристики, позволяющей адаптировать скорость обучения для соответствующего параметра: 2 (1.30) 𝑖𝑖 𝐺𝐺𝑘𝑘𝑖𝑖 = 𝐺𝐺𝑘𝑘−1 + �𝑔𝑔𝑘𝑘𝑖𝑖 � . Чем больше величина 𝐺𝐺𝑘𝑘𝑖𝑖 , тем больше должно замедляться движение вдоль соответствующего направления, чтобы выровнять скорости обучения вдоль «быстрых» и «медленных» направлений. Обновление k-го весового коэффициента на 𝑖𝑖-м шаге производится по формуле: 𝑤𝑤𝑘𝑘𝑖𝑖+1 = 𝑤𝑤𝑘𝑘𝑖𝑖 − 𝜂𝜂 𝑖𝑖 𝑔𝑔𝑘𝑘𝑖𝑖 �𝐺𝐺𝑘𝑘𝑖𝑖 + 𝜀𝜀 . (1.31) Здесь 𝜂𝜂 𝑖𝑖 – глобальная скорость обучения на 𝑖𝑖-м шаге, 𝜀𝜀 – стабилизирующий малый параметр порядка 10−6 , исключающий деление на ноль. Одним из главных преимуществ алгоритма AdaGrad является то, что он исключает необходимость точной настройки скорости обучения – достаточно лишь приблизительно указать глобальную скорость обучения 𝜂𝜂 𝑖𝑖 , которую можно принять постоянной для всех 𝑖𝑖. Однако особенностью алгоритма является то, что в процессе обучения знаменатель в формуле (1.31) неограниченно возрастает, накапливая сумму квадратов компонент градиента. С одной стороны, это может быть полезно, так как уменьшение скорости обучения помогает приближаться к глобальному минимуму, не проскочив его. Однако при большой длительности обучения скорость обновления параметров может становиться слишком малой, что приводит к параличу алгоритма. Алгоритм RMSProp – это усовершенствование алгоритма Adagrad, в котором решается проблема прогрессирующего уменьшения скорости обучения. Сумма квадратов компонентов градиента в этом алгоритме заменяется на их экспоненциальное скользящее среднее, благодаря чему становится возможно избежать неограниченного роста 𝐺𝐺𝑘𝑘𝑖𝑖 и паралича алгоритма. Экспоненциальное скользящее среднее квадратов частных производных на i-м шаге вычисляется по рекуррентной формуле: 2 𝐸𝐸[𝑔𝑔𝑘𝑘2 ]𝑖𝑖 = 𝜌𝜌𝜌𝜌[𝑔𝑔𝑘𝑘2 ]𝑖𝑖−1 + (1 − 𝜌𝜌)�𝑔𝑔𝑘𝑘𝑖𝑖 � , 32 (1.32)
где 𝜌𝜌 – параметр алгоритма, характеризующий скорость «забывания» предыстории. Квадратный корень из скользящего среднего со стабилизирующим малым параметром обозначается через 𝑅𝑅𝑅𝑅𝑅𝑅[𝑔𝑔𝑘𝑘 ]𝑖𝑖 (от англ. root mean square): (1.33) 𝑅𝑅𝑅𝑅𝑅𝑅[𝑔𝑔𝑘𝑘 ]𝑖𝑖 = �𝐸𝐸[𝑔𝑔𝑘𝑘2 ]𝑖𝑖 + 𝜀𝜀. Тогда обновление k-го весового коэффициента для алгоритма RMSProp будет производиться по формуле: 𝑤𝑤𝑘𝑘𝑖𝑖+1 = 𝑤𝑤𝑘𝑘𝑖𝑖 − 𝜂𝜂 𝑖𝑖 𝑔𝑔𝑖𝑖 , 𝑅𝑅𝑅𝑅𝑅𝑅[𝑔𝑔𝑘𝑘 ]𝑖𝑖 𝑘𝑘 (1.34) где 𝜂𝜂 𝑖𝑖 – глобальная скорость обучения на 𝑖𝑖-м шаге. Алгоритм Adadelta [3] отличается от RMSProp тем, что вместо глобальной скорости обучения 𝜂𝜂 𝑖𝑖 используется квадратный корень из скользящего среднего квадрата коррекции вектора параметров на предыдущих шагах, обозначенный через 𝑅𝑅𝑅𝑅𝑅𝑅[∆𝒘𝒘𝒌𝒌 ]𝑖𝑖−1 . ∆𝑤𝑤𝑘𝑘𝑖𝑖 = − 𝑤𝑤𝑘𝑘𝑖𝑖+1 𝑅𝑅𝑅𝑅𝑅𝑅[∆𝑤𝑤𝑘𝑘 ]𝑖𝑖−1 𝑖𝑖 𝑔𝑔𝑘𝑘 , 𝑅𝑅𝑅𝑅𝑅𝑅[𝑔𝑔𝑘𝑘 ]𝑖𝑖 = 𝑤𝑤𝑘𝑘𝑖𝑖 − (1.35) ∆𝑤𝑤𝑘𝑘𝑖𝑖 . Обновление скользящего среднего квадрата коррекции вектора параметров производится по формулам, аналогичным подсчету среднего квадратов частных производных, с использованием того же параметра забывания 𝜌𝜌: 2 𝐸𝐸[∆𝑤𝑤𝑘𝑘2 ]𝑖𝑖 = 𝜌𝜌𝜌𝜌[∆𝑤𝑤𝑘𝑘2 ]𝑖𝑖−1 + (1 − 𝜌𝜌)�∆𝑤𝑤𝑘𝑘𝑖𝑖 � , 𝑅𝑅𝑅𝑅𝑅𝑅[∆𝑤𝑤𝑘𝑘 ]𝑖𝑖 = �𝐸𝐸[∆𝑤𝑤𝑘𝑘2 ]𝑖𝑖 + 𝜀𝜀. (1.36) Алгоритм Adam (англ. adaptive moment estimation) [4] сочетает в себе подход адаптивной скорости обучения и идею накопления импульса. Метод накопления импульса основан на идее инерционности движения в процессе градиентного спуска: если за последние несколько шагов происходило движение в некотором направлении, то это направление и скорость движения 33
нужно пытаться сохранить на следующих нескольких шагах, чтобы быстрее достичь глобального минимума. Физическая аналогия этого принципа – движение массивного шарика по поверхности сложной формы под действием силы тяжести: за счет накопленного импульса шарик может в некоторые моменты двигаться вверх, выбираясь из локальных минимумов и успешно достигая самой нижней точки поверхности, в то время как без импульса шарик остановился бы в первом же локальном минимуме. Таким образом, накопление импульса позволяет сглаживать осцилляции целевой функции, преодолевать локальные минимумы и быстрее спускаться к минимуму функции со сложным ландшафтом. Шаг алгоритма Adam, как и в других алгоритмах, начинается с вычисления вектора градиента целевой функции относительно параметров нейросети: (1.37) 𝑔𝑔𝑖𝑖 = ∇𝒘𝒘 𝐸𝐸(𝒘𝒘𝑖𝑖 ). Затем вычисляются экспоненциальные средние значения каждой компоненты градиента 𝑚𝑚𝑘𝑘𝑖𝑖 (первый момент, отвечающий за накопление импульса) и ее квадрата 𝑣𝑣𝑘𝑘𝑖𝑖 (второй момент, реализующий адаптивную скорость обучения по каждой компоненте): 𝑚𝑚𝑘𝑘𝑖𝑖 = β1 𝑚𝑚𝑘𝑘𝑖𝑖−1 + (1 − β1 )𝑔𝑔𝑘𝑘𝑖𝑖 , 2 𝑣𝑣𝑘𝑘𝑖𝑖 = β2 𝑣𝑣𝑘𝑘𝑖𝑖−1 + (1 − β2 )�𝑔𝑔𝑘𝑘𝑖𝑖 � . (1.38) Затем вычисляются скорректированные оценки этих моментов, сохраняющие их средние значения близкими к истинным моментам (верхний индекс 𝑖𝑖 в знаменателе обозначает возведение в степень 𝑖𝑖): 𝑚𝑚 � 𝑘𝑘𝑖𝑖 = 𝑚𝑚𝑘𝑘𝑖𝑖 , (1 − β1𝑖𝑖 ) 𝑣𝑣�𝑘𝑘𝑖𝑖 = 𝑣𝑣𝑘𝑘𝑖𝑖 . (1 − β𝑖𝑖2 ) (1.39) Наконец, производится обновление параметров с учетом импульса, адаптивной скорости и глобальной скорости обучения α: 𝑤𝑤𝑘𝑘𝑖𝑖+1 = 𝑤𝑤𝑘𝑘𝑖𝑖 − α 𝑚𝑚 � 𝑘𝑘𝑖𝑖 �𝑣𝑣�𝑘𝑘𝑖𝑖 + 𝜀𝜀 34 . (1.40)
Любой из перечисленных алгоритмов оптимизации можно использовать в сочетании с любой из трех стратегий отбора элементов ОВ. На практике наиболее эффективным сочетанием считается мини-пакетный градиентный спуск с использованием алгоритма Adam. Такой способ показал высокую эффективность на практике при минимальной необходимости подбора гиперпараметров. Поэтому он рекомендуется в качестве предпочтительного алгоритма оптимизации при обучении нейронных сетей и будет использован в качестве основного алгоритма в данном пособии. 1.7.7 Анализ результатов обучения Эффективная процедура обучения основана на постоянном контроле динамики изменения метрик качества и функции потерь на обучающей и тестовой выборках. Как правило, эти величины вычисляют в процессе обучения модели в конце каждой эпохи и затем сохраняют для последующей визуализации. Графики изменения этих величин дают необходимую информацию о наличии или отсутствии переобучения, о достигнутом качестве работы модели и о возможности дальнейшего его улучшения. Рис. 1.14. Пример динамики обучения нейросети: а) динамика метрики accuracy; б) динамика функции потерь На рис. 1.14 приведен типичный сценарий динамики точности (accuracy) и функции потерь (кросс-энтропии) в процессе обучения нейросети задаче бинарной классификации. Обычно в начале обучения точность на обучающей выборке растет, в пределе достигая значений, близких к единице (рис. 1.14, а), точечный график). Функция потерь, наоборот, стабильно уменьшается и стремится к нулю (рис. 1.14, б), точечный график). Однако это еще не 35
свидетельствует о хорошей работе модели, поскольку она может быть подвержена переобучению. Основным показателем является изменение метрики и функции потерь на тестовой выборке, поскольку оно показывает способность обученной сети классифицировать новые данные, которые она не видела в процессе обучения. Обычно значение точности на тестовой выборке вначале растет, а затем достигает насыщения, после которого рост прекращается (рис. 1.14, а), непрерывный график). Функция потерь также достигает некоторого предельного значения, после которого может стабилизироваться или даже начать расти (рис. 1.14, б), непрерывный график). Увеличение разрыва между точностью и (или) значением функции потерь на обучающей и тестовой выборках говорит о достижении максимального качества обучения модели и о начале переобучения. Это явление наблюдается на обоих графиках справа от вертикальной черты. В рассмотренном примере обучение можно останавливать после 12 эпох обучения, поскольку продолжение процедуры обучения больше не приводит к улучшению метрики accuracy. Среднее значение уровня насыщения (около 0,81 в приведенном примере) можно считать итоговым показателем метрики точности обученной сети. 1.8 Знакомство с библиотеками TensorFlow и Keras 1.8.1 TensorFlow Для практического построения многослойной нейросети необходимо при помощи программных средств реализовать модель, осуществляющую вычисление выходного вектора по уравнениям прямого распространения (1.17) и обеспечивающую вычисление необходимых метрик и функции потерь. Кроме того, для обучения нейросети (нахождения коэффициентов весовых матриц 𝑊𝑊 и смещений 𝒘𝒘0 ) необходимо уметь вычислять производные функции ошибки относительно этих параметров и применять алгоритм обратного распространения ошибки. Для этого используют специальные программные средства, представляющие собой высокоуровневые библиотеки, позволяющие автоматически рассчитывать градиенты функции потерь по параметрам сети. Одна из таких библиотек – TensorFlow, созданная для языка программирования Python. 36
Библиотеку TensorFlow выпустила компания Google в 2015 году. Это библиотека с открытым исходным кодом, предназначенная для построения моделей тензорных вычислений и автоматического дифференцирования. TensorFlow отлично подходит для построения и обучения нейронных сетей, в том числе глубоких сетей со сложной структурой, так как нейросетевая модель естественным образом отображается на модель тензорных вычислений, реализованных в TensorFlow. На настоящий момент есть две версии библиотеки TensorFlow: 1.х и 2.х. Версия 1.x основана на концепции построения статического графа вычислений (схемы вычислений выходных значений в виде ориентированного ациклического графа, соединяющего входы и выходы модели) и его компиляции до выполнения вычислений. На практике такая модель оказалась довольно трудна для использования, поэтому в версии 2.х от нее отказались в пользу динамического вычисления тензоров и градиентов без необходимости компиляции. К тому же версия 2.х тесно интегрирована с библиотекой Keras, позволяющей абстрагироваться от тензорных вычислений и строить архитектуру нейронной сети непосредственно из готовых шаблонов слоёв. Это является довольно простой и дружественной к разработчикам концепцией написания кода, позволяющей даже новичкам строить и обучать достаточно сложные нейросетевые модели. Для всех операций, функций активации и целевых функций, реализованных в TensorFlow, известны их производные относительно всех входных переменных. Таким образом, TensorFlow может вычислить градиент целевой функции по всем входным переменным, в качестве которых, в случае обучения нейронной сети, выступают весовые коэффициенты нейронов, и, следовательно, проводить их оптимизацию методом градиентного спуска. Это свойство можно использовать для построения моделей вычислений произвольной сложности, не задумываясь о необходимости вычисления градиентов для реализации градиентного спуска. TensorFlow самостоятельно вычислит градиенты целевой функции по всем входным параметрам и позволит запустить процедуру градиентной оптимизации, а исследователь может сосредоточиться на поиске оптимальной архитектуры нейросети. Основной объект, которым оперирует TensorFlow и который дал библиотеке её название, — это тензор, представляющий собой многомерный массив примитивных типов. 37
Тензор имеет статический тип и динамические размерности. Число размерностей (осей) тензора называется рангом. Ранг тензора может быть произвольным. Например, тензор ранга 0 соответствует скаляру, тензор ранга 1 – вектору, тензор ранга 2 –матрице. Существуют и другие библиотеки для нейросетевого моделирования, наиболее известные из которых – PyTorch, Theano, Caffe, CNTK, а также библиотеки для других языков программирования: R, Matlab, Java и т.д. Они отличаются сферой применения, быстродействием и поддерживаемыми платформами, но при этом TensorFlow остается наиболее популярной средой для изучения нейронных сетей и построения учебных и исследовательских проектов. 1.8.2 Установка среды разработки с поддержкой GPU Для удобной работы с библиотеками, рассматриваемой в этом пособии, необходимо установить интерпретатор Python 3.x и набор библиотек машинного обучения: NumPy, Pandas, Tensorflow, Keras. Для удобства разработки желательно установить среду JupyterLab, позволяющую проектировать алгоритмы машинного обучения в среде Jupyter Notebook в браузере. Также очень желательно наличие графического ускорителя (GPU) производства NVIDIA с поддержкой технологии CUDA. Применение GPU позволяет значительно ускорить процесс обучения нейросетей (в 10-20 раз). Библиотеки машинного обучения и компоненты CUDA можно установить самостоятельно, например, на Linux это делается при помощи менеджера пакетов apt. Для поддержки GPU необходимо установить пакеты CUDA Toolkit и cuDNN, распространяемые с официального сайта NVIDIA. Однако отдельная установка и настройка всех необходимых компонентов и библиотек может быть затруднительна. Для облегчения этого процесса создан пакет Anaconda [5], позволяющий одним пакетом установить все требуемые библиотеки машинного обучения с поддержкой GPU. Другим способом установки может быть запуск готового контейнера со всеми необходимыми библиотеками в среде Docker. Для проверки наличия поддержки GPU на компьютере следует выполнить в Jupyter Notebook следующий код: 38
При наличии правильно настроенного графического ускорителя данная команда выведет непустой список доступных устройств GPU. При отсутствии возможности запуска среды Jupyter Notebook на локальном компьютере можно воспользоваться облачной средой вычислений Google Colaboratory, доступ к которой производится по адресу https://colab.research.google.com. Эта среда позволяет запускать вычисления на серверах Google с поддержкой GPU и сохранять результаты расчетов в облачном хранилище Google Drive. Данная среда поддерживает формат файлов .ipynb, используемый в среде Jupyter Notebook, и предоставляет похожий интерфейс. Для доступа к Google Colaboratory необходимо иметь аккаунт Google, а исходные данные загружать в сессионное хранилище через веб-интерфейс. 1.8.3 Построение модели многоклассовой классификации с помощью библиотеки TensorFlow В качестве первого примера построим нейросетевой классификатор, способный распознавать изображения предметов одежды, и обучим его на классическом наборе Fashion MNIST (рис. 1.15). Рис. 1.15. Примеры изображений набора данных Fashion MNIST 39
Этот набор данных содержит 60 000 черно-белых изображений размером 28×28 пикселей. Каждое изображение относится к одному из классов, соответствующих предметам одежды: 0 – футболка, 1 – брюки, 2 – пуловер, 3 – платье, 4 – куртка, 5 – сандалии, 6 – рубашка, 7 – кроссовки, 8 – сумка, 9 – полусапоги. Тестовая выборка содержит 10 000 изображений, относящихся к тем же классам. Принцип работы такого классификатора состоит в построчном развертывании растрового изображения и подаче значения интенсивности всех пикселов изображения на вход нейросети. Количество нейронов входного слоя должно совпадать с общим количеством пикселов изображения, если изображение монохромно, либо быть в 3 раза больше количества пикселов, если изображение цветное (по одному нейрону на каждый цветовой канал RGB) (рис. 1.16). Рис. 1.16. Классификация изображений при помощи полносвязной нейросети Для начала работы подключим требуемые библиотеки numpy и tensorflow и загрузим выборку Fashion MNIST, которая представлена в пакете tensorflow.keras.datasets. Размерности тензоров, составляющих массив исходных данных, можно проверить при помощи атрибута shape. 40
В данном случае тензор x_train содержит 60 000 элементов размерностью 28×28, т.е. 60 000 изображений в оттенках серого размером 28×28 пикселей. Тензор y_train содержит 60 000 элементов, представляющих собой целевой атрибут для соответствующих изображений в виде чисел от 0 до 9. Классификатор будем строить на основе полносвязной нейронной сети с одним скрытым слоем, содержащим 10 нейронов (по числу классов) и имеющим функцию активации softmax. Чтобы классификатор мог принимать на вход изображение целиком, требуется развернуть каждое изображение обучающей выборки в линейный массив. Эта операция производится методом reshape. Кроме того, перед подачей на вход нейросети изображения всегда нужно нормализовывать, т. е. приводить интенсивности пикселов к диапазону [0, 1] путем деления значений интенсивности на 255 (максимальное значение интенсивности каждого пиксела). Затем необходимо создать объект Dataset из исходных данных и разделить его на мини-батчи заданного размера. Для хранения обучаемых параметров – весовых коэффициентов и смещений – вводятся переменные W и b типа tf.Variable. В методе feed_forward определяется уравнение прямого распространения (1.17) в сети с использованием ранее введенных переменных. 41
Для начала обучения необходимо определить функцию потерь, в качестве которой выступает кросс-энтропия (1.20), и метрику качества классификации accuracy (1.1). Метод оптимизации Adam (1.37)-(1.40) реализован в пакете tf.optimizers. Затем определяем процедуру вычисления градиентов функции потерь относительно параметров W и b. 42
Далее определяется главный цикл обучения, в котором происходит пошаговый запуск алгоритма градиентного спуска, подсчет значений метрик после каждого шага и сохранение их в переменные для дальнейшей визуализации. Сохраненные значения функции потерь и метрики точности можно вывести в виде графиков, где по горизонтальной оси отложен номер мини-пакета. Из графиков видно постепенное уменьшение функции ошибки и рост точности классификации в процессе обучения сети. Таким образом, для создания модели были вручную реализованы уравнения прямого распространения, функция потерь, процедура подсчета метрики и цикл работы алгоритма градиентного спуска. Рассмотрим теперь создание 43
аналогичной модели с использованием библиотеки Keras, не требующей реализации этих компонентов и позволяющей сосредоточиться на конкретной архитектуре модели. 1.8.4 Построение модели многоклассовой классификации с помощью библиотеки Keras Основная концепция создания модели в Keras – создание стека (последовательности) слоев. Стек позволяет добавлять произвольное количество слоев, для каждого из которых требуется лишь указать количество нейронов и функцию активации. Затем производится компиляция модели, в процессе которой указываются используемая функция потерь, алгоритм оптимизации и метрики. Все эти компоненты предоставляются библиотекой Keras в готовом виде. При этом в программе всегда можно обратиться к методам TensorFlow в случае необходимости реализации каких-либо низкоуровневых или нестандартных вычислений. Приведем пример решения аналогичной задачи с распознаванием изображений Fashion MNIST с использованием библиотеки Keras. Доступ к методам библиотеки Keras из TensorFlow осуществляется через модуль tensorflow.keras. Сначала загружаем необходимые компоненты, из которых будет составлена модель. Для создания нейросетевой модели используются классы Flatten (слой, осуществляющий линеаризацию двумерного изображения) и Dense (шаблон полносвязного слоя). В качестве алгоритма оптимизации используется тот же самый алгоритм Adam, но уже импортированный из библиотеки Keras. Также необходимо импортировать функцию потерь, в качестве которой используем класс SparseCategoricalCrossentropy, который сам строит one-hot представления целевого атрибута, заданного целыми числами. После импортирования классов и загрузки обучающей выборки создается контейнер модели с использованием класса Sequential. В этот контейнер нужно поместить друг за другом слои модели – в нашем случае Flatten и Dense – при помощи метода add(). 44
Затем производится компиляция модели при помощи метода compile(). Параметры этого метода задают используемую функцию потерь, алгоритм оптимизации и метрики, которые будут отслеживаться в процессе обучения. Затем процесс обучения запускается методом fit(). В процессе обучения на экран выводятся сведения о текущей эпохе, затраченном времени и о текущем значении функции потерь и метрик на обучающей и тестовой выборках. После окончания процесса обучения сохраненные сведения можно визуализировать в виде графиков. 45
Видно, что при использовании библиотеки Keras программный код получается значительно короче и интуитивно понятнее, чем аналогичный на TensorFlow. В дальнейшем в данном пособии, если не оговорено иное, будет использоваться библиотека Keras. 46
2 Свёрточные нейронные сети В предыдущей главе была построена модель классификация изображений при помощи полносвязной нейронной сети. Принцип работы такой модели заключался в линеаризации растрового изображения и подаче полученного массива пикселов на входной слой нейросети. Недостаток такого подхода состоит в том, что каждый пиксел изображения (или каждый пиксел каждого цветового канала, если изображение цветное) подается на независимый вход нейросети, поэтому модель не распознает пространственную структуру изображений, в частности, она не способна выделять двумерные паттерны близко расположенных пикселов, т.е. повторяющиеся закономерности распределения цвета и яркости, характерные для каких-либо визуальных объектов. Ввиду этого в предыдущем примере была достигнута невысокая точность распознавания – порядка 84% на тестовой выборке даже для очень небольших монохромных изображений. Для полноцветных и полноразмерных изображений качество будет значительно ниже. Другим недостатком полносвязных сетей применительно к анализу изображений является очень высокая размерность пространства оптимизации. Например, для анализа изображений размером 28х28 пикселов нейросетью с 800 нейронами скрытого слоя требуется обучить более 600 000 весов, а для обработки полноразмерных реалистичных изображений потребуются многие миллионы весовых коэффициентов. Для обработки изображений и других данных, обладающих пространственной структурой, используют нейросети специальной архитектуры, называемые сверточными нейронными сетями (англ. convolutional neural networks, CNN). Такие сети отдаленно напоминают принцип обработки зрительной информации мозгом человека. Зрительная кора устроена по иерархическому принципу и делится на зоны, которые обрабатывают различные уровни абстракции зрительных образов. Нижние зоны, соединяющиеся со зрительным нервом, обрабатывают простейшие локальные визуальные паттерны: участки линий, точки, края и т.п. Вышележащие зоны обрабатывают образы, основанные на результатах обработки нижележащих зон, и таким образом складывают более сложные образы, составляющие целые видимые предметы окружающего мира. 47
Сверточную сеть, имитирующую подобный принцип обработки информации, можно представить чередующимися слоями свертки и субдискретизации, после которых идут несколько полносвязных слоев (рис. 2.1). Сверточная сеть подразумевает, что на вход одного нейрона подается не один пиксел изображения, а некоторая его область – локальное рецептивное поле, обработанное алгоритмом обнаружения визуальных паттернов, называемом свёрткой. Это позволяет построить значительно более эффективную модель обработки пространственной информации. Рис. 2.1. Общая структура сверточной сети 2.1 Свёртка Принцип иерархической обработки пространственной информации реализуется с помощью специальной математической операции – свёртки. Свёртка (англ. convolution) – это бинарная операция над тензорами, при помощи которой вычисляется преобразование входного тензора с помощью ядра свёртки. Рассмотрим определение свертки на примере в случае, когда оба тензора имеют ранг 2, т.е. представляют собой двумерные матрицы. Ядро свертки в этом случае представляет собой квадратную матрицу, имеющую размерность 𝑛𝑛 × 𝑛𝑛, где, как правило, 𝑛𝑛 – небольшое число, обычно равное 3 или 5. Пусть A – квадратная матрица 3 × 3, a K – ядро той же размерности 3 × 3. Тогда свертка будет вычисляться по формуле: 𝑎𝑎11 𝐴𝐴 ∗ 𝐾𝐾 = �𝑎𝑎21 𝑎𝑎31 𝑎𝑎12 𝑎𝑎22 𝑎𝑎32 𝑎𝑎13 𝑘𝑘11 𝑎𝑎23 � ∗ �𝑘𝑘21 𝑎𝑎33 𝑘𝑘31 𝑘𝑘12 𝑘𝑘22 𝑘𝑘32 3 3 𝑘𝑘13 𝑘𝑘23 � = � � 𝑎𝑎𝑖𝑖𝑗𝑗 𝑘𝑘𝑖𝑖𝑗𝑗 . 𝑘𝑘33 𝑖𝑖=1 𝑗𝑗=1 (2.1) Таким образом, свертка двух тензоров одинаковой размерности равна сумме попарных произведений элементов этих тензоров с совпадающими индексами, то есть их скалярному произведению. 48
Рассмотрим теперь случай, когда оба тензора являются двумерными матрицами, но их размерности не совпадают. Пусть матрица 𝐴𝐴 имеет размерность 4 × 4, а ядро 𝐾𝐾 – 3 × 3: 𝑎𝑎11 𝑎𝑎21 𝐴𝐴 = �𝑎𝑎 31 𝑎𝑎41 𝑎𝑎12 𝑎𝑎22 𝑎𝑎32 𝑎𝑎42 𝑎𝑎13 𝑎𝑎23 𝑎𝑎33 𝑎𝑎43 𝑎𝑎14 𝑎𝑎24 𝑎𝑎34 � , 𝑎𝑎44 𝑘𝑘11 𝐾𝐾 = �𝑘𝑘21 𝑘𝑘31 𝑘𝑘12 𝑘𝑘22 𝑘𝑘32 𝑘𝑘13 𝑘𝑘23 �. 𝑘𝑘33 Для вычисления свертки из матрицы 𝐴𝐴 последовательно, со сдвигом на одну позицию, выбираются участки размером 3 × 3 (совпадающим с размерностью ядра) и вычисляются свертки этих участков с ядром K: 𝑎𝑎11 𝐵𝐵1 = 𝐴𝐴1 ∗ 𝐾𝐾 = �𝑎𝑎21 𝑎𝑎31 𝑎𝑎12 𝑎𝑎 𝐵𝐵2 = 𝐴𝐴2 ∗ 𝐾𝐾 = � 22 𝑎𝑎32 𝑎𝑎12 𝑎𝑎22 𝑎𝑎32 𝑎𝑎13 𝑎𝑎23 𝑎𝑎33 𝑎𝑎13 𝑘𝑘11 𝑎𝑎23 � ∗ �𝑘𝑘21 𝑎𝑎33 𝑘𝑘31 𝑎𝑎14 𝑘𝑘11 𝑎𝑎24 � ∗ �𝑘𝑘21 𝑎𝑎34 𝑘𝑘31 𝑘𝑘12 𝑘𝑘22 𝑘𝑘32 𝑘𝑘12 𝑘𝑘22 𝑘𝑘32 𝑘𝑘13 𝑘𝑘23 �, 𝑘𝑘33 𝑘𝑘13 𝑘𝑘23 �. 𝑘𝑘33 После достижения правого края выбор подматриц из матрицы 𝐴𝐴 начинается снова с левого края со сдвигом вниз на одну строку. 𝑎𝑎21 𝑎𝑎 𝐵𝐵3 = 𝐴𝐴3 ∗ 𝐾𝐾 = � 31 𝑎𝑎41 𝑎𝑎22 𝑎𝑎32 𝑎𝑎42 𝑎𝑎23 𝑘𝑘11 𝑎𝑎33 � ∗ �𝑘𝑘21 𝑎𝑎43 𝑘𝑘31 49 𝑘𝑘12 𝑘𝑘22 𝑘𝑘32 𝑘𝑘13 𝑘𝑘23 �, 𝑘𝑘33
𝑎𝑎22 𝐵𝐵4 = 𝐴𝐴4 ∗ 𝐾𝐾 = �𝑎𝑎32 𝑎𝑎42 𝑎𝑎23 𝑎𝑎33 𝑎𝑎43 𝑎𝑎24 𝑘𝑘11 𝑎𝑎34 � ∗ �𝑘𝑘21 𝑎𝑎44 𝑘𝑘31 𝑘𝑘12 𝑘𝑘22 𝑘𝑘32 𝑘𝑘13 𝑘𝑘23 �. 𝑘𝑘33 Результирующие значения образуют тензор операции свертки: 𝐵𝐵 𝐵𝐵 = � 1 𝐵𝐵3 𝐵𝐵2 �. 𝐵𝐵4 Можно рассматривать горизонтальный сдвиг «окна» не на один, а на большее число элементов. Этот параметр называется страйдом (англ. stride) и обозначается через 𝑠𝑠. Можно показать, что размерность результирующей матрицы В равна 𝑛𝑛𝐵𝐵 = � 𝑛𝑛𝐴𝐴 − 𝑛𝑛𝐾𝐾 + 1�, 𝑠𝑠 (2.2) где 𝑛𝑛𝐴𝐴 – размерность матрицы 𝐴𝐴, 𝑛𝑛𝐾𝐾 – размерность ядра 𝐾𝐾, а квадратные скобки обозначают взятие целой части числа. Таким образом, выходная размерность оказывается меньше, чем входная, и чем больше размерность ядра, тем сильнее эта разница. Однако во многих случаях уменьшение размерности матриц нежелательно. В этом случае применяют пэддинг (англ. padding) – искусственное увеличение размерности входной матрицы путем добавления к ней дополнительных элементов по краям. Значения добавляемых элементов обычно получают копированием или вычислением средних значений близлежащих элементов исходной матрицы. 2.1.1 Карты признаков Результирующая матрица, полученная после применения операции свертки, называется картой признаков (англ. feature map). Она представляет собой отклики на определенные паттерны, присутствующие на изображении и выделенные ядром свертки. Карты признаков первого слоя свертки формируются из исходного изображения и состоят из откликов на простейшие паттерны – участки прямых, части дуг и т.п. Карты признаков последующих слоев составляются из карт признаков предшествующих слоев и содержат отклики на комбинации выделяемых ими паттернов. Таким образом, вышележащие слои обучаются обнаруживать всё более сложные признаки, с помощью которых составляется представление о наличии на изображении цельных объектов (человеческих лиц, автомобилей, деревьев и т.д.). 50
Операцию свертки можно обобщить на тензоры произвольной размерности (не только двумерные матрицы). В этом случае по аналогичному правилу вычисляется сумма попарных произведений элементов обоих тензоров, имеющих одинаковые индексы. Это позволяет вычислять свертку не только одной карты признаков, но и целого набора карт при помощи одного ядра, имеющего три измерения. Таким же образом обрабатывают и цветные изображения, представляя их в виде совокупности трех матриц, соответствующих трём цветовым каналам – R (красный), G (зеленый), B (синий). Ядро свертки можно представить как «кубик», пробегающий по «стопке» карт признаков или цветовых каналов и формирующий свою карту признаков на выходе (рис. 2.2). Рис. 2.2. Формирование карты признаков трехмерным ядром свертки Одно ядро свертки может выделять присутствие только одного паттерна на изображении и, соответственно, формировать только одну карту признаков. Для выделения всего многообразия объектов и составляющих их частей необходимо иметь набор из нескольких ядер, отвечающих за разные пат- 51
терны. Например, для распознавания букв нужно иметь несколько ядер, каждое из которых обнаруживает свой вид графических элементов: вертикальные, горизонтальные, наклонные штрихи, закругления и т. п. Совокупность всех сверток входного изображения с использованием набора ядер является набором карт признаков. Количество карт (и ядер) каждого слоя является настраиваемым гиперпараметром модели, иногда называемым глубиной выходной карты признаков. Таким образом, каждый сверточный слой на входе принимает трехмерный тензор (три цветовых канала исходного изображения или совокупность карт признаков предыдущего слоя) и применяет к нему определенное число ядер (порядка единиц или десятков). Обычно глубину карты признаков увеличивают для вышележащих слоев. Это объясняется тем, что высокоуровневые паттерны в изображениях имеют гораздо большее разнообразие, чем низкоуровневые, поэтому для хорошей обобщающей способности модель должна распознавать достаточное их количество. Обычно для ядер упоминается только две размерности, отвечающие за размер окна фильтра. Но на самом деле совокупность параметров каждого фильтра задается четырехмерным тензором, последние две размерности которого обозначают число каналов (карт признаков) предшествующего и текущего слоя. Так, например, при работе с цветными изображениями на вход подаются три слоя, передающие соответственно красный, зеленый и синий цвета. Если в первом сверточном слое стоит фильтр размерностью 5 × 5, это значит, что каждое ядро первого слоя имеет размерность 5 × 5 × 3 и переводит все входные каналы в матрицу одной выходной карты признаков. При формировании, например, 10 карт признаков необходимо иметь 10 таких ядер размерностью 5 × 5 × 3 каждое, т.е. совокупность ядер слоя образует тензор размерностью 5 × 5 × 3 × 10. Весовые коэффициенты ядер, необходимых для решения поставленной задачи, заранее определить невозможно. Они инициализируются случайными значениями, и нейросеть в процессе обучения сама формирует структуру выделяемых паттернов. В этом проявляется полезное свойство самоорганизации нейронных сетей. Следующей после свертки операцией является преобразование, общее для всех нейронных сетей – добавление к каждой ячейке каждой выходной карты признаков постоянного смещения и применение нелинейной функции активации. В качестве функции активации в современных архитектурах чаще 52
всего используют функцию ReLU (1.8). Таким образом, каждую карту признаков можно рассматривать как двумерный слой нейронов, весовые коэффициенты каждого из которых определяются элементами соответствующего ядра свертки. Элементы ядер и постоянные смещения представляют собой параметры, оптимизируемые в процессе обучения. Все нейроны одной карты признаков используют одно и то же ядро, т.е. один и тот же набор весовых коэффициентов. Это значительно сокращает размерность пространства оптимизации по сравнению с полносвязной сетью. 2.1.2 Примеры сверток Рассмотрим, как выглядит результат применения свертки к двумерным монохромным изображениям. Для этого определим функцию apply_kernel, применяющую операцию свертки к переданному ему в качестве параметра изображению. Функция использует метод conv2d, определенный в модуле tensorflow.nn и позволяющий вручную применять операцию свертки к тензору ранга 4 с заданным ядром. Для приведения изображения и ядра к нужному рангу используется метод reshape. Пусть исходное изображение представляет собой чередующиеся белые и черные клетки наподобие шахматной доски. Сгенерируем это изображение средствами Python. Исследуем результат применения свертки с ядром 𝐽𝐽𝐻𝐻 , обнаруживающим горизонтальные края. Это ядро выглядит следующим образом: 53
1 1 1 𝐽𝐽𝐻𝐻 = � 0 0 0 �. −1 −1 −1 Применим это ядро к исходному изображению. Как видно из рисунка, результат применения ядра представляет собой серый квадрат с параллельными черно-белыми полосами. Это и есть карта признака, формируемого фильтром 𝐽𝐽𝐻𝐻 . Серый цвет в этом представлении означает отсутствие активации, черный – максимальную отрицательную активацию, белый – максимальную положительную активацию. Следовательно, ненулевые активации действительно наблюдаются только в тех местах, где есть резкие перепады яркости вдоль горизонтальных краев клеток, т.е. данный фильтр производит распознавание горизонтальных краев. Выведем также результат применения свертки с ядрами 𝐽𝐽𝑉𝑉 и 𝐽𝐽𝐸𝐸 , обнаруживающими соответственно вертикальные края и произвольные края, на которых происходит резкий перепад контрастности: 1 0 −1 1 1 1 𝐽𝐽𝑉𝑉 = �1 0 −1� , 𝐽𝐽𝐸𝐸 = �1 −8 1�. 1 0 −1 1 1 1 54
Аналогично предыдущему примеру, ненулевые активации присутствуют вдоль вертикальных краев (слева) и вдоль всех краев клеток (справа). Приведем также примеры применения этих сверток к реальному изображению. Возьмем одно случайное изображение из набора рукописных цифр MNIST. Оно выглядит следующим образом: Результаты применения трех сверток с ядрами 𝐽𝐽𝑉𝑉 , 𝐽𝐽𝐻𝐻 и 𝐽𝐽𝐸𝐸 представлены ниже. 55
Как мы видим, ядра действительно формируют отклик на соответствующие им паттерны в конфигурации пикселей в исходном изображении: вертикальные края, горизонтальные края и произвольные края. 2.2 Субдискретизация Субдискретизация (англ. pooling, пулинг) – это вторая фундаментальная операция для сверточных сетей, предназначенная для сокращения размерности карт признаков путем выделения подматриц карт признаков и отбора максимального элемента из каждой подматрицы. Такой прием позволяет вышележащим слоям иметь больший размер локального рецептивного поля, не ограниченного размером ядер нижележащих слоев, и таким образом выделять более сложные, масштабные образы на изображении, абстрагируясь от конкретного расположения мелких деталей. Пусть исходная матрица имеет вид: 𝑎𝑎11 𝑎𝑎21 𝐴𝐴 = �𝑎𝑎 31 𝑎𝑎41 𝑎𝑎12 𝑎𝑎22 𝑎𝑎32 𝑎𝑎42 𝑎𝑎13 𝑎𝑎23 𝑎𝑎33 𝑎𝑎43 𝑎𝑎14 𝑎𝑎24 𝑎𝑎34 �. 𝑎𝑎44 Чтобы выполнить субдискретизацию, нужно определить окно размерности 𝑛𝑛𝑘𝑘 × 𝑛𝑛𝑘𝑘 , как и для свертки, и задать страйд s. Из всех элементов матрицы, попадающих в текущее положение окна, выбирается максимальный. Чаще всего используется окно размерности 2 × 2 и страйд, равный размеру окна субдискретизации. В этом случае операция субдискретизации выглядит следующим образом: 56
Приведем пример субдискретизации матрицы размерности 4 × 4 с окном размерности 2 × 2: Существует и другой способ субдискретизации, основанный на усреднении элементов текущего положения окна вместо подсчета максимума. Этот метод является исторически первым, но в современной практике он встречается реже и в целом дает не столь хорошие результаты. Слой субдискретизации работает по фиксированному алгоритму и не имеет обучаемых параметров. Зачастую сверточные слои чередуются со слоями субдискретизации, однако это не обязательно – несколько сверточных слоев могут идти друг за другом. В современных реализациях количество слоев может достигать многих десятков и даже сотен. 2.3 Полносвязные слои Полносвязные слои (англ. dense layers) по принципу действия аналогичны слоям перцептрона. Они обычно являются последними в сверточной сети и выполняют заключительную классификацию. Перед подачей на полносвязный слой карты признаков последнего сверточного слоя подвергаются линеаризации, т.е. превращаются в одномерную последовательность путем построчного развертывания каждой карты признаков и конкатенации полученных результатов (рис. 2.3). 57
Рис. 2.3. Линеаризация карт признаков Состав нейронов последнего слоя определяется типом решаемой задачи. Например, при решении задачи бинарной классификации выходной слой состоит из одного нейрона с сигмоидной функцией активации. Для многоклассовой классификации выходной слой должен содержать несколько нейронов, по одному для каждого класса, с функцией активации softmax. При решении задачи аппроксимации числовой функции (например, определении координат ключевых точек на изображении) выходные нейроны могут иметь тождественную или сигмоидную функцию активации, а их количество совпадает с количеством определяемых координат. 2.4 Пример построения сверточной сети Рассмотрим практический пример построения сверточной сети для многоклассовой классификации изображений при помощи библиотеки Keras. В качестве исходных данных возьмем ту же выборку Fashion MNIST, которую использовали ранее для обучения полносвязной сети. 58
Создание нейросети в библиотеке Keras начинается с инициализации модели Sequential и сохранении ее в переменную. Затем в эту модель последовательно добавляются слои нужного типа в требуемом порядке при помощи метода add(). Сверточные слои реализуются классом Conv2D из пакета tensorflow.keras.layers, субдискретизация – классом MaxPooling2D. Добавим в модель три сверточных слоя с ядрами размерностью 3 × 3, разделенных двумя слоями субдискретизации. Слой Flatten осуществляет линеаризацию набора карт признаков последнего сверточного слоя. На выходе модели добавим полносвязный классификатор, состоящий из двух слоев типа Dense (20 и 10 нейронов соответственно). Функция активации последнего слоя – softmax. Вид функции активации каждого слоя можно указывать с помощью параметра activation. Далее необходимо скомпилировать модель, используя выбранный метод оптимизации – Adam. Установим скорость обучения равной 6 ∙ 10−4 , выберем метрику качества (accuracy), функцию потерь (sparse_categorical_crossentropy) и запустим процесс обучения сети при помощи метода fit(). 59
В переменной history сохраняется история изменений функции потерь на обучающей и тестовой выборке (loss, val_loss) и значений выбранной метрики на этих выборках (accuracy, val_accuracy). Эти величины можно отобразить на графике. По итогам анализа графиков можно сделать вывод, что мы достигли существенно лучшей точности на тестовой выборке по сравнению с полносвязной сетью (91% против 88%) при сравнимом количестве параметров обеих сетей. Это говорит о большей эффективности сверточной модели для обработки изображений, причем с помощью специальных приемов можно еще больше улучшить качество ее работы. Эти приемы будут рассмотрены в следующей главе. 60
3 Приемы построения эффективных архитектур сверточных сетей В этой главе рассматриваются приемы проектирования архитектур сверточных нейросетей, обеспечивающих достижение максимального качества их работы в условиях ограниченности имеющихся данных и вычислительных ресурсов. В качестве примера рассмотрим построение сверточной нейросети для бинарной классификации изображений. Исходный набор содержит цветные изображения, часть из которых содержит Георгия Победоносца (положительный класс, который мы обозначим через 1), а остальная часть – не содержит (отрицательный класс, который обозначим 0). Требуется построить алгоритм классификации, с помощью которого можно автоматически отличать изображения, содержащие Георгия Победоносца. Примеры изображений обоих классов приведены на рисунке 3.1. Рис. 3.1. Примеры изображений обучающей выборки, содержащих Георгия (слева) и не содержащих Георгия (справа) Исходные данные представлены в виде двух csv-файлов georges.csv и non_georges.csv, расположенных по адресу https://bit.ly/3QDDgVx и содержащих ссылки на изображения. Их необходимо предварительно загрузить и сохранить на диске при помощи следующих команд. 61
Эффективность каждого приема будет сравниваться с базовой моделью (англ. baseline, «бейзлайн»), представляющей собой достаточно простой базовый вариант сверточной сети. Она состоит из следующих слоев: 5 сверточных слоев с 4 слоями субдискретизации между ними, слой линеаризации и 2 полносвязных слоя на выходе, где последний слой – нейрон с сигмоидной функцией активации. На вход модель принимает трехканальные изображения размером 200 × 200 пикселей. На рис. 3.2 приведена схема архитектуры этой модели, где через Conv2D обозначены сверточные слои, через MaxPool – слои субдискретизации, через Flatten – слой линеаризации и через Dense – полносвязные слои. Для каждого слоя обозначены соответствующие размерности выходных тензоров. Например, 48 × 48 × 32 обозначает, что на выходе слоя будет 32 карты признаков размерностью 48 × 48 каждая. Рис. 3.2. Архитектура базовой модели 62
Базовую модель можно построить при помощи следующего кода. Сверточные слои представлены в библиотеке Keras классом Conv2D. Первый аргумент в конструкторе Conv2D – количество карт признаков на выходе слоя, второй – кортеж, задающий размерность ядра. Остальные параметры являются опциональными. Параметр padding определяет наличие пэддинга. Если он не задан, то пэддинг не будет применяться, и размерность выходных карт признаков будет уменьшаться в соответствии с формулой (2.2). Значение параметра padding=’SAME’ означает, что пэддинг на входе слоя применяется с учетом размерности ядра таким образом, чтобы размерность выходных карт признаков всегда совпадала с размерностью входных карт. Параметр activation задает вид функции активации. Для первого слоя модели необходимо обязательно указать размерность входного тензора с помощью параметра input_shape, в нашем случае указывается размерность входных трехканальных изображений. Класс MaxPooling2D определяет слои субдискретизации. Параметр конструктора этого класса – кортеж, задающий размер окна субдискретизации, обычно равный 2 × 2. Класс Flatten определяет слой линеаризации, а Dense – полносвязный слой. Все эти слои добавляются в стек модели, представленный классом Sequential. Сводку об архитектуре и параметрах модели можно вывести на экран вызовом метода summary(). В первом столбце полученной таблицы выводятся автоматически сгенерированные названия слоев и их типы. Во втором столбце показаны размерности выходных тензоров. Например, значение 63
(None, 200, 200, 8) обозначает, что на выходе слоя – 8 карт признаков размерностью 200 × 200 каждая. Первая размерность соответствует размеру минибатча, который на этапе разработки еще неизвестен, поэтому он представляется значением None. В последнем столбце показано количество обучаемых параметров соответствующего слоя. Видно, что слои типа MaxPooling и Flatten не имеют обучаемых параметров, поскольку они работают по фиксированному алгоритму. Внизу таблицы показано общее число обучаемых и необучаемых («замороженных») параметров модели. Для запуска процедуры обучения все исходные изображения должны быть преобразованы в тензоры заданной фиксированной размерности. В фреймворке Keras имеется модуль keras.preprocessing.image с инструментами для обработки изображений. Класс ImageDataGenerator из этого модуля 64
предоставляет генератор для автоматического преобразования файлов с изображениями в пакеты готовых тензоров. После создания модели и определения генераторов данных следует этап компиляции модели. В качестве алгоритма оптимизации будем использовать Adam со скоростью обучения 0,0002 и остальными параметрами по умолчанию, а в качестве метрики отслеживать метрику accuracy, так как классы достаточно сбалансированы. В качестве функции потерь, как обычно для бинарной классификации, используем бинарную кросс-энтропию. Затем производится запуск обучения модели с использованием метода fit(). В первом аргументе этот метод принимает ссылку на генератор Python, бесконечно возвращающий пакеты входных данных и целевых атрибутов. Второй аргумент steps_per_epoch определяет количество пакетов на одну эпоху обучения. Третий аргумент epochs задает длительность процесса обучения. Параметр validation_data определяет генератор тестовой выборки, используемой для валидации модели в конце каждой эпохи. 65
Проанализируем графики изменения точности и функции потерь. По оси x отложен номер эпохи, по оси у – значение выбранной метрики и функции потерь на обучающих и тестовых данных. По результатам анализа графиков видно, что базовая модель подвержена переобучению ввиду небольшого размера обучающей выборки. Примерно после 15 эпох точность обучения быстро приближается к единице, в то время как точность валидации остается постоянной примерно на уровне 0,8. Такое же рассогласование происходит и с функцией потерь. Увеличение количества эпох не приводит к улучшению точности валидации. Рассмотрим, как можно устранить переобучение и улучшить качество работы классификатора без привлечения дополнительных данных. Для этого можно использовать следующие приемы регуляризации сверточных нейросетей: • Прореживание. 66
• Аугментация данных. • Нормализация по мини-пакетам. • Трансферное обучение: выделение признаков, дообучение. Рассмотрим подробно работу каждого из этих приемов. 3.1 Прореживание Прореживание (англ. dropout) – прием регуляризации нейронных сетей, заключающийся в удалении (обнулении выходных значений) случайного подмножества нейронов на каждой эпохе или мини-пакете (рис. 3.3). Удалению подвергаются только нейроны скрытых слоев, состав нейронов входного и выходного слоев остается неизменным. Рис. 3.3. Прореживание полносвязной нейронной сети Доля обнуляемых нейронов называется коэффициентом прореживания. Обычно он выбирается в диапазоне от 0,2 до 0,5, т.е. каждый нейрон скрытого слоя может быть обнулен с вероятностью от 0,2 до 0,5. Прореживание применяется только на этапе обучения нейросети. На этапе работы обученной сети прореживание не производится. Вместо этого выходные значения каждого скрытого нейрона умножаются на коэффициент прореживания, чтобы сохранить среднее значение выхода этих нейронов. Доказано, что операция прореживания эквивалентна построению ансамбля моделей нейросетей, совместная обобщающая способность которого может оказаться выше, чем у исходной нейросети. В Keras добавить прореживание в сеть можно посредством слоя Dropout, который обрабатывает результаты работы слоя, стоящего непосредственно перед ним. Прореживание можно применять и к сверточным, и к полносвязным слоям. 67
Попробуем добавить слой Dropout после первого слоя полносвязного классификатора. Единственный параметр конструктора слоя – это коэффициент прореживания. Построим графики изменения точности и функции потерь для полученной модели. По результатам анализа видно небольшое улучшение итоговой точности, которая составила порядка 0,82. Прореживание следует применять осторожно и всегда сопровождать экспериментами. Применение прореживания может как улучшить, так и ухудшить итоговый результат, особенно при его применении к сверточным слоям. 68
3.2 Аугментация данных Прием аугментации данных (англ. data augmentation) реализует подход создания дополнительных обучающих данных из имеющихся путем трансформации образцов случайными преобразованиями. Преобразования могут включать в себя линейные и нелинейные искажения типа «параллелограмм», «трапеция», повороты, сдвиги, зеркальное отражение, изменения яркости, контрастности, добавление шума и т.п. При использовании аугментации можно получить практически неограниченное количество вариаций каждого изображения обучающей выборки, что поможет достичь лучшей степени обобщения. Класс ImageDataGenerator из модуля tensorflow.keras.preprocessing.image предоставляет базовые возможности аугментации: смещение, искажение, масштабирование, поворот и т.п. Пример создания генератора преобразованных изображений приведен ниже, где параметр rotation_range обозначает диапазон случайного поворота в градусах, width_shift_range и height_shift_range – диапазон случайных смещений по горизонтали и вертикали, shear_range – диапазон искажений типа параллелограмма, zoom_range – диапазон масштабирования, horizontal_flip – задает возможность зеркального отражения по горизонтали. Существуют и более совершенные библиотеки методов аугментации, такие как ImgAug или Albumentations. Они позволяют применять большее количество преобразований с очень гибкой настройкой параметров. Выбор видов и параметров преобразований должен соответствовать смыслу решаемой задачи. Например, для изображений Георгия Победоносца нет смысла использовать вертикальное отражение, поскольку вряд ли кто-то станет изображать его «вверх ногами». А при обработке, например, аэрофотоснимков вертикальное отражение может быть уместно. 69
Продемонстрируем применение аугментации к одному изображению из выборки (рис. 3.4). Рис. 3.4. Применение аугментации к изображению из обучающей выборки В этом примере сгенерировано 4 отличающихся изображения, каждое из которых может стать независимым элементом обучающей выборки. Как видно, освободившиеся области изображения заполняются пикселами, цвет которых совпадает с цветом ближайшего пиксела на краю изображения. Это поведение управляется параметром fill_mode приведенного выше генератора изображений. При использовании аугментации нужно помнить, что к тестовой и валидационной выборкам аугментация не применяется, поэтому параметры преобразований задавать для соответствующего генератора не нужно. 70
При использовании аугментации сходимость процесса обучения значительно замедляется, поэтому необходимо использовать большее (в 3-5 раз) количество эпох. Выполним процедуру обучения на 140 эпохах и построим графики изменения точности и функции потерь. Видно, что в конце процесса обучения точность валидации стабильно превысила 0,8, а рассогласование точности обучения и точности валидации значительно уменьшилось. Таким образом, с использованием аугментации мы смогли улучшить качество работы алгоритма классификации и значительно уменьшить эффект переобучения. 71
3.3 Нормализация по мини-пакетам При обучении нейронных сетей один шаг градиентного спуска обычно делается после вычисления усредненного градиента на случайно выбранном мини-пакете, как упоминалось в разделе 1.7.5. При этом происходит изменение весовых коэффициентов нейронов, вследствие чего происходит каскадное изменение распределения активаций в последующих слоях. Поэтому нейронам вышележащих слоев нужно постоянно подстраиваться под изменяющиеся выходные активации нижележащих слоев, что замедляет процесс обучения сети. Эта проблема называется внутренним сдвигом переменных. Для борьбы с этим явлением можно применять специальное линейное преобразование – нормализацию по мини-батчам (англ. minibatch normalization). Оно применяется к выходному вектору того или иного слоя сети и преобразует его распределение к некоторому нормализованному виду. Нормализация выполняется в два этапа. Первый этап – центрирование – приводит среднее значение выходов слоя к значению, близкому к нулю, а ковариационную матрицу – к матрице, близкой к единичной. Пусть 𝑦𝑦 = (𝑦𝑦1 , … , 𝑦𝑦𝑁𝑁 ) – выходной вектор некоторого слоя, включающего 𝑁𝑁 нейронов. Тогда этот вектор после центрирования будет иметь вид 𝑦𝑦˚ = (𝑦𝑦1 ˚, … , 𝑦𝑦𝑁𝑁 ˚), где 𝑦𝑦𝑘𝑘 ˚ = � [𝑦𝑦𝑘𝑘 ] 𝑦𝑦𝑘𝑘 − 𝑀𝑀 � [𝑦𝑦𝑘𝑘 ] + 𝜀𝜀 �𝐷𝐷 , 𝑘𝑘 = 1, … , 𝑁𝑁. (3.1) Параметр 𝜀𝜀 представляет собой небольшую константу порядка 10−6 , необходимую для исключения деления на ноль. � [𝑦𝑦𝑘𝑘 ] и В этой формуле выборочные оценки математического ожидания 𝑀𝑀 � дисперсии 𝐷𝐷 [𝑦𝑦𝑘𝑘 ] теоретически нужно вычислять по всей обучающей выборке, но на практике это нерационально с вычислительной точки зрения. Поэтому эти величины вычисляются по текущему мини-батчу, поэтому данный подход и называется нормализацией по мини-батчам. Данный этап нормализации всегда приводит выходное распределение слоя к стандартному с параметрами 𝑀𝑀[𝑦𝑦𝑘𝑘 ˚] ≈ 0, 𝐷𝐷[𝑦𝑦𝑘𝑘 ˚] ≈ 1. В таком виде нормализацию ещё нельзя использовать, поскольку при использовании сигмоидных активационных функций распределение значений нейронов будет приходиться на центральный, почти линейный участок сигмоиды, что сильно 72
ограничивает обобщающую способность сети. К тому же необходимо сохранить возможность тождественного преобразования после операции нормализации. Поэтому используется второй этап нормализации, заключающийся в линейном преобразовании с использованием параметров сдвига 𝛾𝛾 и масштабирования 𝛽𝛽: 𝑦𝑦�𝑘𝑘 = 𝛾𝛾𝑦𝑦𝑘𝑘 ˚ + 𝛽𝛽. (3.2) Параметры 𝛾𝛾 и 𝛽𝛽 являются дополнительными обучаемыми параметрами. В начале обучения они инициализируются значениями 𝛾𝛾 = 1, 𝛽𝛽 = 0 и затем корректируются на каждом мини-батче методом градиентного спуска. � [𝑦𝑦𝑘𝑘 ] и 𝐷𝐷 � [𝑦𝑦𝑘𝑘 ] не подсчитыНа этапе работы уже обученной сети оценки 𝑀𝑀 ваются, поскольку на этом этапе нет доступных обучающих данных. Вместо � [𝑦𝑦𝑘𝑘 ] и 𝐷𝐷 � [𝑦𝑦𝑘𝑘 ], представляющие собой экспоненних используются значения М � [𝑦𝑦𝑘𝑘 ] и 𝐷𝐷 � [𝑦𝑦𝑘𝑘 ] по всем мини-батчам, циальные скользящие средние значений 𝑀𝑀 предоставленным сети в процессе обучения, т.е. 𝑦𝑦�𝑘𝑘 = 𝛾𝛾 � [𝑦𝑦𝑘𝑘 ] 𝑦𝑦𝑘𝑘 − М + 𝛽𝛽. � [𝑦𝑦𝑘𝑘 ] + 𝜀𝜀 �𝐷𝐷 (3.3) � [𝑦𝑦𝑘𝑘 ] и 𝐷𝐷 � [𝑦𝑦𝑘𝑘 ] в процессе обучения обновляются по следующим При этом М рекуррентным формулам: � [𝑦𝑦𝑘𝑘 ](1) = 𝑀𝑀 � [𝑦𝑦𝑘𝑘 ](1) , М � [𝑦𝑦𝑘𝑘 ](𝑡𝑡−1) + (1 − 𝛼𝛼)𝑀𝑀 � [𝑦𝑦𝑘𝑘 ](𝑡𝑡) (𝑡𝑡 > 1), � [𝑦𝑦𝑘𝑘 ](𝑡𝑡) = 𝛼𝛼М М � [𝑦𝑦𝑘𝑘 ](1) , � [𝑦𝑦𝑘𝑘 ](1) = 𝐷𝐷 𝐷𝐷 � [𝑦𝑦𝑘𝑘 ](𝑡𝑡−1) + (1 − 𝛼𝛼)𝐷𝐷 � [𝑦𝑦𝑘𝑘 ](𝑡𝑡) (𝑡𝑡 > 1), � [𝑦𝑦𝑘𝑘 ](𝑡𝑡) = 𝛼𝛼𝐷𝐷 𝐷𝐷 (3.4) где верхний индекс (𝑡𝑡) обозначает номер обрабатываемого мини-батча, а 𝛼𝛼 – гиперпараметр, называемый коэффициентом сглаживания (0 < 𝛼𝛼 < 1). На практике операция нормализации реализуется при помощи дополнительного слоя типа BatchNormalization, который добавляется после нормализуемого слоя и производит требуемые преобразования, приводя выходные данные к нормализованным. Этот слой можно добавлять как до, так и после 73
слоя нелинейной активации. Нормализацию можно применять как к сверточным, так и к полносвязным слоям. Рассмотрим пример построения сверточной сети со слоями нормализации, расположенными после каждого сверточного слоя перед нелинейной активацией. Как видно из графика, использование нормализации позволило улучшить точность на тестовой выборке примерно до 0,83. 74
3.4 Трансферное обучение Одним из эффективных подходов к глубокому обучению на небольших наборах изображений является использование предварительно обученной сети. Предварительно обученная сеть – это нейросеть, обученная решению задачи классификации на некотором большом наборе данных. Высокоуровневые признаки, выделяемые верхними слоями сверточной основы, являются в значительной мере похожими для множества объектов видимого мира, поэтому их можно использовать для распознавания объектов, хотя бы частично представленных в наборе данных. Такой подход называется трансферным обучением. Сообщество исследователей публикует большое количество предобученных архитектур для свободного использования, например, DenseNet169, VGG16, VGG19, Xception, ResNet152. Они доступны для загрузки через модуль tensorflow.keras.applications. Многие из этих предобученных основ обучены на наборе изображений ImageNet, включающем 1,4 миллиона изображений, классифицированных на 1000 разных классов, включающих людей, животных и бытовые предметы. Такой набор данных позволяет создать достаточно обобщенную модель видимого мира. Есть два основных способа использования предварительно обученной сети: выделение признаков и дообучение. 3.4.1 Выделение признаков Выделение признаков (англ. feature extraction) заключается в использовании высокоуровневых представлений предобученной сети для обучения нового классификатора, добавляемого поверх нее. Новый классификатор может включать в себя полносвязный классификатор, а может также иметь дополнительно один или несколько сверточных слоев. При этом предобученная основа не участвует в процессе обучения, т.е. находится в «замороженном» состоянии (рис. 3.5). 75
Рис. 3.5. Процесс обучения нейросети методом выделения признаков Рассмотрим пример применения выделения признаков для распознавания изображений, содержащих Георгия Победоносца. За основу возьмем предобученную сеть VGG16, входящую в состав Keras и обученную на наборе данных ImageNet. Импортируем и инициализируем сверточную основу этой сети. С помощью директивы include_top=False предотвращается загрузка «головы» сети, т. е. полносвязного классификатора. Он будет создан заново и обучен на имеющейся выборке. Приведенная ниже функция build_model создает новую модель Sequential, добавляет в нее сверточную основу conv_base, передаваемую первым параметром, и добавляет поверх нее двухслойный полносвязный классификатор, отображающий входные данные в два класса – «положительный» и «отрицательный». Кроме того, функция предусматривает возможность «заморозки» определенных слоев сверточной основы, что будет использоваться в дальнейшем. Наконец, функция запускает процесс обучения полученной модели в течение 40 эпох. 76
Запустим обучение модели и сохраним динамику изменения метрик в переменную history_vgg16. Выведем графики изменения точности и функции потерь. Мы достигли значительно лучшей точности, близкой к 0,88, даже без использования аугментации и прореживания. Это говорит о высокой эффективности применения трансферного обучения. 77
Для максимальной эффективности можно выбирать и другие сверточные основы, помимо VGG19. Для этого нужно только варьировать первый аргумент функции build_model, передавая в нее различные предобученные основы, и выбрать ту основу, которая дает наибольшее значение точности. Например, загрузка основы DenseNet169 будет выглядеть следующим образом: Проведем серию экспериментов с основами DenseNet169 и Xception, используя один и тот же финальный классификатор. Графики изменения точности для этих основ приведены на рис. 3.6 и 3.7. Рис. 3.6. Результаты обучения классификатора с основой DenseNet169 Рис. 3.7. Результаты обучения классификатора с основой Xception 78
Как видно из графиков, наилучший результат в данной задаче показала сверточная основа DenseNet169, с помощью которой удалось достичь точности порядка 0,9. 3.4.2 Дообучение Дообучение (fine-tuning) – прием дальнейшего повышения качества классификации сверточной сетью, заключающийся в поэтапном обучении модели, состоящей из предобученной основы и финального классификатора. Первый этап полностью повторяет процесс выделения признаков, описанный в предыдущем разделе. Второй этап включает размораживание нескольких верхних слоев предобученной основы и продолжение обучения всей модели с уменьшенной скоростью. Этот этап позволяет тонко скорректировать наиболее абстрактные представления, выделяемые верхними слоями сверточной основы, для более точной классификации в рамках текущей задачи. Как мы видели, наилучшие результаты при выделении признаков показала сверточная основа DenseNet169. Попробуем ещё больше улучшить точность классификации с использованием приема дообучения. Загрузим модель DenseNet169 и начнем с выделения признаков. Будем придерживаться следующей схемы обучения в три этапа: первый этап – 20 эпох обучения с замороженной основой и скоростью 1 ∙ 10−4 ; второй этап – 20 эпох с размороженной группой верхних слоев и скоростью 2 ∙ 10−5 ; третий этап – 30 эпох с такой же моделью и скоростью 1 ∙ 10−5 . Второй и третий этапы можно объединить с использованием расписания изменения скорости обучения, реализованного в классе tf.keras.callbacks.LearningRateScheduler, однако для наглядности будет использоваться ручное изменение скорости обучения. Создадим модель, аналогичную рассмотренной ранее: добавим двухслойный полносвязный классификатор и заморозим сверточную основу. 79
Далее компилируем модель и запускаем 1-й этап обучения. На этом этапе обучается только полносвязный классификатор. После окончания первого этапа нужно определить, какие слои сверточной основы будут разморожены. Это можно сделать с помощью метода summary(), который выводит на экран список всех слоев модели. В полученном списке нужно в левом столбце найти имена нужных слоев. Ими могут быть один или несколько последних слоев, имеющих ненулевое количество обучаемых параметров. … 80
В модели DenseNet169 группа последних слоев имеет имена, начинающиеся на conv5 и bn. Эти слои нужно сделать обучаемыми, перебирая их в цикле и присвоив им значение атрибута trainable=True, а для остальных слоев – False. После этого снова компилируем модель и запускаем 2-й этап процесса обучения с новым оптимизатором с уменьшенным значением скорости обучения learning_rate. Наконец, на 3-м этапе нужно снова уменьшить learning_rate и запустить обучение. Модель изменять не нужно, т.к. обучаемые слои остаются те же. 81
Результаты всех трех этапов можно вывести в виде графика. Видно, что прием дообучения позволил существенно улучшить точность классификации до величины порядка 0,93, хотя и присутствует переобучение ввиду отсутствия аугментации. Каждый из перечисленных в главе приемов в отдельности может помочь добиться улучшения результатов работы модели классификации. Наилучших результатов можно получить, комбинируя перечисленные методы, однако каждое изменение нужно сопровождать экспериментами. 82
4 Классификация на основе векторных представлений. «Сиамские» нейронные сети В ряде задач машинного зрения встречается задача классификации с довольно большим количеством классов, причем количество примеров для каждого класса из обучающей выборки может быть невелико. Типичный пример такой задачи – распознавание людей по их фотографии или изображению с видеокамеры. Например, такая система может использоваться для определения сотрудников офиса, проходящих через КПП, с помощью сканирования их лиц. В некоторых аэропортах возможно пройти входной контроль, позволив системе сканировать лицо пассажира и его паспорт с автоматическим установлением соответствия. Мобильный телефон, который разблокируется по лицу, также осуществляет сверку изображения лица с фронтальной камеры с эталонной фотографией, записанной в память телефона. 4.1 Постановка задачи распознавания лиц Задача проверки двух изображений на принадлежность одному человеку называется задачей верификации. Пусть дано известное изображение человека (эталон). Дается еще одно изображение (скан), и нужно определить, принадлежит ли оно тому же человеку, что и эталон. Это задача бинарной классификации, где положительный класс соответствует принадлежности фотографии скана тому же человеку, что и эталона, а отрицательный – их принадлежности разным людям. Разновидностью этой задачи является задача идентификации, подобная многоклассовой классификации. Пусть даны эталонные изображения N людей и скан некоторого человека. Требуется определить, является ли скан изображением одного из людей, для которых имеются эталоны, или это ктото другой. Задачи верификации и идентификации теоретически могут быть решены при помощи уже рассмотренных нами моделей на основе сверточных сетей с 83
полносвязным классификатором на выходе. Например, в задаче идентификации N людей можно поместить на выходе сети полносвязный слой с 𝑁𝑁 + 1 нейронами – по одному нейрону для каждого распознаваемого человека плюс дополнительный нейрон для всех остальных, кого нет в базе данных системы идентификации (рис. 4.1). Рис. 4.1. Распознавание лиц при помощи сверточной сети Однако на практике такой подход не используется в силу специфики решаемой задачи. Во-первых, обычно нет возможности получить достаточное количество (сотни и тысячи) различных изображений для каждого человека в базе данных системы идентификации, требуемых для обучения нейросетевого классификатора. Во-вторых, при внесении нового человека в базу данных потребуется каждый менять число нейронов выходного слоя и переобучать классификатор. 4.2 Решение задачи распознавания лиц при помощи векторных представлений Метод решения задачи распознавания лиц, избавленный от перечисленных выше недостатков, основан на идее построения векторных представлений (англ. embeddings) [6]. Идея этого метода состоит в вычислении векторов фиксированной размерности p, сохраняющих отношение сходства лиц независимо от изменений ракурса съемки и освещения. Векторные представления любых двух изображений одного и того же человека будут иметь близкие координаты, поэтому расстояние между ними будет достаточно мало. Решение задачи идентификации сводится к выбору некоторого порога, или зазора, разделяющего векторные представления фотографий разных людей. Если 84
расстояние между векторами не превышает заданный порог, то можно считать, что обе фотографии принадлежат одному человеку, иначе – разным людям. Пусть 𝐴𝐴 – фотография-эталон, принадлежащая определенному человеку, а 𝐵𝐵 – изображение идентифицируемого человека. Обозначим через 𝑓𝑓(𝑋𝑋) = = �𝑓𝑓1𝑋𝑋 , 𝑓𝑓2𝑋𝑋 , … , 𝑓𝑓𝑝𝑝𝑋𝑋 � векторное представление, вычисляемое моделью для заданного изображения X. Расстояние между векторными представлениями вычисляется как евклидово расстояние в p-мерном пространстве: 2 𝑑𝑑(𝐴𝐴, 𝐵𝐵) = ‖𝑓𝑓(𝐴𝐴) − 𝑓𝑓(𝐵𝐵)‖ = �(𝑓𝑓1𝐴𝐴 − 𝑓𝑓1𝐵𝐵 )2 +. . . +�𝑓𝑓𝑝𝑝𝐴𝐴 − 𝑓𝑓𝑝𝑝𝐵𝐵 � . Для идентификации задается некоторый порог 𝑑𝑑0 и производится сравнение величины 𝑑𝑑(𝐴𝐴, 𝐵𝐵) с этим порогом. Если 𝑑𝑑(𝐴𝐴, 𝐵𝐵) < 𝑑𝑑0 , то обе фотографии считаются принадлежащими одному человеку, и верификация считается пройденной, в противном случае – фотографии считаются принадлежащими разным людям. Для вычисления векторных представлений можно использовать полносвязный классификатор на выходе сверточной основы. Выход этого классификатора должен иметь количество нейронов, равное размерности векторных представлений, а в качестве функции активации можно использовать сигмоидную, симметричную сигмоидную или тождественную функцию. Также можно обойтись без полносвязных слоев – для этого нужно построить верхний сверточный слой с размерностью карт признаков 1×1 и использовать его выход непосредственно как векторное представление. Размерность векторных представлений является настраиваемым гиперпараметром модели, обычно она выбирается в диапазоне от нескольких десятков до нескольких сотен. 4.3 Построение модели вычисления векторных представлений Для обучения модели вычисления векторных представлений, обладающих свойством инвариантности относительно ракурса съемки и освещения лица, разработаны специальные архитектуры и функции потерь. В процессе обучения нужно как можно дальше развести векторы, получаемые для фотографий разных людей, и сблизить векторы, получаемые для одного человека. 85
Пусть 𝐴𝐴1 – фотография одного человека, а 𝐵𝐵1 и 𝐵𝐵2 – две фотографии другого человека. Изобразим условно векторные представления этих изображений в двумерном пространстве (рис. 4.2). Слева показано возможное распределение представлений у необученной модели. Видно, что вектор 𝑓𝑓(𝐵𝐵1 ) находится ближе к 𝑓𝑓(𝐴𝐴1 ), чем к 𝑓𝑓(𝐵𝐵2 ). Справа показано распределение векторных представлений после обучения, где видно, что векторы 𝑓𝑓(𝐵𝐵1 ) и 𝑓𝑓(𝐵𝐵2 ) находятся на небольшом расстоянии друг от друга, а от 𝑓𝑓(𝐴𝐴1 ) их отделяет зазор α. Таким образом, векторные представления фотографий в обученной модели образуют кластеры, то есть группы векторов, близких для изображений одного человека, и отделенных зазорами от групп, соответствующих фотографиям других людей. Такая архитектура имеет важное свойство – она позволяет делать вывод о принадлежности изображений одному человеку или разным людям даже для тех изображений, которых не было в обучающей выборке. Поэтому при добавлении нового человека в базу данных системы идентификации переобучения не требуется. Рис. 4.2. Распределение векторных представлений обучающей выборки: слева – до обучения, справа – после обучения Один из подходов к построению модели, обладающей указанными свойствами, – использовать «сиамские» сети (англ. Siamese neural networks). Идея таких сетей состоит в использовании нескольких одинаковых, параллельно работающих моделей с общей функцией потерь. 86
В качестве функции потерь для обучения «сиамских» архитектур используют функции contrastive loss и triplet loss. Рассмотрим эти функции подробнее. 4.3.1 Функция потерь contrastive loss Идея использования функции contrastive loss [7] состоит в попарном сравнении и корректировке векторных представлений различных пар примеров обучающей выборки. Для этого используется две параллельно работающие «сиамские» сети. Каждый пример обучающей выборки включает два изображения, которые могут относиться либо к одному классу (фотографии одного человека), либо к разным классам (рис. 4.3). Рис. 4.3. Схема обучения «сиамских» сетей с функцией потерь contrastive loss Пусть 𝑥𝑥𝑖𝑖 и 𝑥𝑥𝑗𝑗 – два элемента обучающей выборки, а 𝑧𝑧𝑖𝑖𝑗𝑗 – метка, обозначающая принадлежность элементов одному классу: 𝑧𝑧𝑖𝑖𝑗𝑗 = 0, если 𝑥𝑥𝑖𝑖 и 𝑥𝑥𝑗𝑗 принадлежат одному классу, иначе 𝑧𝑧𝑖𝑖𝑗𝑗 = 1. Тогда функция contrastive loss для выборки из 𝑚𝑚 пар вычисляется по формуле: 𝑚𝑚 (𝑘𝑘) (𝑘𝑘) (𝑘𝑘) (𝑘𝑘) 𝐽𝐽 = ��1 − 𝑧𝑧𝑖𝑖𝑗𝑗 ��𝑓𝑓�𝑥𝑥𝑖𝑖 � − 𝑓𝑓�𝑥𝑥𝑗𝑗 �� + 𝑧𝑧𝑖𝑖𝑗𝑗 �𝛼𝛼 − �𝑓𝑓�𝑥𝑥𝑖𝑖 � − 𝑓𝑓�𝑥𝑥𝑗𝑗 ��� , 𝑘𝑘=1 87 + (4.1)
где 𝛼𝛼 – зазор, на который должны быть разведены векторные представления различных классов, а [𝑥𝑥]+ обозначает max[𝑥𝑥, 0]. Первое слагаемое в этой формуле отвечает за вычисление расстояния между векторными представлениями изображений одного класса, поскольку в этом случае 𝑧𝑧𝑖𝑖𝑖𝑖 = 0, а второе слагаемое равно нулю. В случае же разных классов обнуляется первое слагаемое и остается второе, которое представляет собой разность между имеющимся и требуемым зазором 𝛼𝛼 для разных классов. Если зазор больше или равен требуемому, функция потерь будет равна нулю. Минимизируя эту функцию потерь для всевозможных пар изображений обучающей выборки, можно получить требуемую параметризацию пространства векторных представлений для построения модели идентификации. Недостатком функции потерь contrastive loss является медленная сходимость, поскольку на каждом шаге градиентного спуска происходит либо сближение векторных представлений изображений одного класса, либо разведение векторных представлений изображений двух разных классов, но не то и другое одновременно. 4.3.2 Функция потерь triplet loss Для исправления недостатков функции contrastive loss разработана функция потерь triplet loss [8]. В каждом обучающем примере при использовании этой функции потерь должно присутствовать три примера: пара изображений одного класса и одно изображение отличающегося класса. Таким образом, в данной архитектуре работают сразу три «сиамские» сети одинаковой структуры с общей функцией потерь (рис. 4.4). 88
Рис. 4.4. Схема обучения «сиамских» сетей с функцией потерь triplet loss Каждый пример обучающей выборки состоит из трех элементов: 𝐴𝐴 – anchor (якорное изображение) – точно известное изображение определенного класса; 𝑇𝑇 – positive (положительный пример) – изображение того же класса, что и A; 𝑁𝑁 – negative (отрицательный пример) – изображение отличающегося класса. Пусть имеется обучающая выборка, составленная из 𝑚𝑚 триплетов (способы ее составления будут рассмотрены ниже). Обозначим 𝑘𝑘-й обучающий пример через �𝐴𝐴(𝑘𝑘) , 𝑇𝑇(𝑘𝑘) , 𝑁𝑁 (𝑘𝑘) �. Цель обучения – быть уверенным, что расстояние между 𝐴𝐴 и 𝑁𝑁 будет больше, чем между 𝐴𝐴 и 𝑇𝑇, причем как минимум на величину зазора 𝛼𝛼: �𝑓𝑓�𝐴𝐴(𝑘𝑘) � − 𝑓𝑓�𝑁𝑁 (𝑘𝑘) �� > �𝑓𝑓�𝐴𝐴(𝑘𝑘) � − 𝑓𝑓�𝑇𝑇(𝑘𝑘) �� + 𝛼𝛼. 89 (4.2)
Перенося все члены неравенства в одну сторону и просуммировав по всем 𝑚𝑚 триплетам обучающей выборки, получаем итоговое выражение для функции потерь triplet loss: 𝑚𝑚 𝐽𝐽 = ���𝑓𝑓�𝐴𝐴(𝑘𝑘) � − 𝑓𝑓�𝑃𝑃(𝑘𝑘) �� − �𝑓𝑓�𝐴𝐴(𝑘𝑘) � − 𝑓𝑓�𝑁𝑁 (𝑘𝑘) �� + 𝛼𝛼�+ . (4.3) 𝑘𝑘=1 Здесь [𝑥𝑥]+ также обозначает max[𝑥𝑥, 0]. Минимизация этой функции потерь обеспечивает формирование параметризации в пространстве векторных представлений, при котором векторные представления изображений различных классов образуют непересекающиеся кластеры, разведенные как минимум на расстояние 𝛼𝛼. Более того, векторные представления изображений других классов, которых не было в обучающей выборке, в хорошо обученной модели также группируются в кластеры, а количество распознаваемых классов (и кластеров) теоретически не ограничено, однако, разумеется, на практике оно всё же ограничено обобщающей способностью модели. 4.3.3 Методы генерирования триплетов обучающей выборки Генерирование триплетов примеров обучающей выборки – важный шаг, от которого зависит успешность процесса обучения. Самый простой способ генерирования триплетов – однократное создание триплетов со случайным выбором положительных и отрицательных примеров и использование этого набора как фиксированной обучающей выборки. Такой способ наиболее легок для реализации, но дает довольно низкое качество итоговой модели ввиду отсутствия разнообразия обучающих примеров. Более совершенный метод – случайное генерирование комбинаций триплетов из всей обучающей выборки на каждой эпохе обучения. Этот метод дает довольно хорошее качество модели, но может привести к медленной сходимости, так как в такой обучающей выборке будет много «легких» примеров (easy negatives), у которых функция потерь равна нулю (расстояние между 𝑓𝑓(𝐴𝐴) А и 𝑓𝑓(𝑃𝑃) меньше, чем между 𝑓𝑓(𝐴𝐴) и 𝑓𝑓(𝑁𝑁), даже с учетом отступа 𝛼𝛼). Самый совершенный метод состоит в том, чтобы выбирать из обучающей выборки «сложные» примеры (hard negatives, отрицательный пример ближе к якорному, чем положительный) и «полусложные» (semi-hard negatives, отрицательный пример дальше от якорного, чем положительный, но в пределах 90
зазора), и обучаться на них. Этот метод обеспечивает быструю сходимость, но он вычислительно наиболее сложный, так как требует вычисления матрицы близости между всеми парами элементов обучающей выборки в текущем мини-пакете. 4.4 Решение задач классификации с помощью векторных представлений Подход к распознаванию лиц с помощью векторных представлений может быть применен и к другим задачам, требующим различения изображений или других многомерных входных данных, относящимся к разным классам, то есть его можно приспособить для решения задач классификации. Такой подход можно использовать в задачах, когда фактическое число классов велико или не известно во время обучения, а количество объектов в классах мало́. Для решения задачи классификации после формирования пространства векторных представлений необходимо построить некоторый алгоритм финальной классификации. Пусть есть обученная модель, различающая изображения трех классов С1 , С2 и С3 при помощи векторных представлений. В этом случае векторные представления объектов обучающей выборки для этих трех классов будут образовывать непересекающиеся кластеры (рис. 4.5). Пусть есть некоторое новое изображение x. Чтобы осуществить классификацию этого изображения, необходимо вычислить его векторное представление 𝑓𝑓(𝑥𝑥). В обученной модели этот вектор будет близок к другим векторам определенного класса, поэтому в простейшем случае можно найти ближайшее векторное представление из обучающей выборки и отнести изображение к соответствующему классу. В рассматриваемом примере расстояние 𝑑𝑑1 до вектора одного из представителей класса С1 является наименьшим, поэтому изображение x относится к классу С1 . 91
Рис. 4.5. Классификация по ближайшему соседу В более сложных реализациях необходимо учитывать, что кластеры, соответствующие разным классам, могут быть близки и даже частично пересекаться. Например, существуют внешне похожие люди, для которых векторные представления будут не сильно отличаться. Наиболее очевидная модификация, повышающая надежность классификации, состоит в использовании метода классификации kNN (k ближайших соседей). Итоговый класс определяется большинством среди k векторных представлений обучающей выборки, наиболее близких к векторному представлению классифицируемого объекта. В примере на рис. 4.6 используется классификация по 5 ближайшим соседям, среди которых 3 объекта относятся к классу С1 и по одному – к классам С2 и С3 , поэтому изображение x по принципу большинства будет отнесено к классу С1 . 92
Рис. 4.6. Классификация по k ближайшим соседям На вход модели могут также предъявляться изображения классов, вовсе не представленных в обучающей выборке. Хорошо обученная архитектура обладает тем свойством, что она будет объединять изображения каждого нового класса в новый, обособленный кластер. Таким образом, становится возможно добавлять в классификатор новые классы без переобучения всей архитектуры. Это открывает возможность обучения сети распознаванию новых классов объектов на основе всего лишь одного эталонного изображения. Такой подход называется обучением по одному примеру (англ. one-shot learning). В качестве сверточной основы «сиамских» сетей можно использовать предобученные основы, которые обучались на изображениях, включающих идентифицируемые в задаче объекты. Можно добавлять к ним полносвязные классификаторы, использовать дообучение верхних слоев и другие методы проектирования архитектур, описанные в главе 3. Можно также обучать всю сверточную основу «с нуля», однако это стоит делать только в том случае, если имеется достаточное количество размеченных данных. 93
4.5 Пример построения «сиамских» сетей Рассмотрим практическое построение алгоритма классификации изображений на основе «сиамских» сетей. Рассматриваемая задача состоит в определении марки и модели автомобиля по его фотографии. Это задача многоклассовой классификации изображений с потенциально очень большим количеством классов, поэтому предпочтительно использовать модель классификации с помощью векторных представлений. Рассмотрим модель, основанную на вычислении векторных представлений с использованием случайного генерирования комбинаций триплетов, функцией потерь triplet loss и финальной классификацией по методу k ближайших соседей. 4.5.1 Подготовка исходных данных В качестве исходных данных будем использовать набор данных Stanford Cars dataset [9, 10]. Этот набор включает около 16000 изображений автомобилей 196 различных марок и моделей. Размеченная часть выборки включает 8144 изображения. Будем обучать модель распознавания модели автомобиля, ограничившись для наглядности 12 моделями автомобилей из этой выборки. Для начала импортируем необходимые библиотеки. Разметка датасета находится в отдельном файле формата MATLAB, который можно загрузить с помощью команды wget и прочитать с использованием метода loadmat из модуля scipy.io. 94
Далее нужно считать и сохранить заблаговременно разархивированные изображения в список im_list_train, приводя их явным образом к трехканальному формату RGB (поскольку среди изображений встречаются одноканальные черно-белые изображения). Все изображения масштабируются к одному размеру 300×300 пикселей. После загрузки можно просмотреть любое изображение из полученного массива, извлекая его по индексу. Разметка выборки представляет собой соответствие имен файлов и названий моделей. Сохраним ее в отдельной таблице DataFrame. 95
4.5.2 Генерирование триплетов обучающей выборки Ниже приведен код функции generate_triplets, генерирующей триплеты обучающей выборки. Эта функция случайным образом выбирает из датасета подмножество, определяемое выбранным списком моделей автомобилей и максимальным количеством изображений для каждой модели. В дальнейшем триплеты будут комбинироваться из этого подмножества путем случайного перемешивания на каждой эпохе. 96
Далее можно составить триплеты для первой эпохи обучения при помощи написанной функции generate_triplets. Как говорилось, мы ограничиваемся 12 моделями автомобилей по 140 изображений на каждую модель. Можно визуализировать несколько триплетов из полученной обучающей выборки (рис. 4.7). Видно, что первые два изображения (anchor и positive) содержат фотографии автомобилей одной марки, а третье изображение (negative) – автомобиля другой марки. Рис. 4.7. Визуализация триплетов обучающей выборки 97
Определим функцию triplet_loss для подсчета функции потерь triplet loss (4.3). 4.5.3 Построение базовой модели Далее необходимо построить базовую модель, используемую в каждой из трех составных частей «сиамской» архитектуры. В качестве этой модели можно как создать новую сверточную сеть и обучать ее «с нуля», так и использовать предобученную сверточную основу. В силу небольшого размера обучающей выборки целесообразно использовать предобученную основу, например, ResNet152, включенную в модуль tensorflow.keras.applications и обученную на наборе изображений ImageNet, включающем изображения автомобилей. Выход этой основы включает 2048 карт признаков размером 10×10. Эти значения можно линеаризовать при помощи слоя Flatten и обрабатывать полносвязной сверточной сетью. Однако ввиду большой размерности выходного пространства (2048 ∙ 10 ∙ 10 ≈ 200 000) гораздо эффективнее будет обрабатывать их дополнительным одним или несколькими сверточными слоями, значительно уменьшив размерность входа полносвязного классификатора. В данном примере выбрана архитектура, включающая два сверточных слоя (ядра размерности 3×3, 128 и 64 карт признаков соответственно), слой Flatten и один полносвязный слой Dense, размерность выхода которого равна размерности векторных представлений. 98
Затем происходит построение непосредственно «сиамской» архитектуры. Эта модель имеет три входа – anchor_input, positive_input, negative_input для якорного, положительного и отрицательного примеров соответственно. Выходом модели являются векторные представления этих трех примеров, которые вычисляются с помощью одной общей модели embedding_model и передаются в общую функцию потерь triplet_loss. 4.5.4 Построение генератора мини-батчей Алгоритм перемешивания триплетов между эпохами реализуется путем создания собственного генератора мини-батчей. Это можно сделать путем расширения класса tensorflow.keras.utils.Sequence и переопределения его методов on_epoch_end, __len__ и __getitem__. После завершения каждой эпохи обучения неявно вызывается метод on_epoch_end, который производит случайное перемешивание positive- и negative-подвыборок. Подвыборка якорных изображений (anchor) остается неизменной. Метод __getitem__ реализует алгоритм выбора мини-пакетов триплетов заданной длины из полученных подвыборок. Объект полученного класса BatchGenerator будет передаваться методу fit(), непосредственно осуществляющему обучение полученной «сиамской» модели. 99
Зададим гиперпараметры модели: размерность входных изображений (300×300), отступ между кластерами (𝛼𝛼 = 20), размерность векторных представлений (350), количество эпох обучения (40), алгоритм оптимизации (алгоритм Adam со скоростью обучения α = 0,00005). Все эти гиперпараметры, а также архитектура сверточной основы подбираются экспериментально из соображения максимизации точности предсказаний на тестовой выборке при приемлемых затратах временных и вычислительных ресурсов. Итоговая модель включает в себя около 3 млн обучаемых параметров. 100
4.5.5 Обучение модели Теперь всё готово для запуска процесса обучения. Метод fit может принимать в качестве первого аргумента объект созданного нами генератора batchGenerator. В более старых версиях библиотеки Keras для этой цели использовался отдельный метод fit_generator. По окончании обучения можно посмотреть на динамику изменения функции потерь на обучающей выборке. Валидация на данном этапе не производится, поскольку классификация будет производиться с использованием отдельной модели kNN. 101
Построим двумерную визуализацию пространственного распределения векторных представлений обучающей выборки при помощи метода t-SNE (рис. 4.8). Рис. 4.8. Пространственное распределение векторных представлений обучающей выборки Видно, что после обучения модели векторы, соответствующие всем 12 моделям автомобилей, собрались в практически идеальные кластеры. 102
4.5.6 Финальная классификация Алгоритм финальной классификации мы реализуем по методу k ближайших соседей (k = 5). Для этого нужно вычислить векторные представления всех изображений обучающей выборки и обучить модель kNN на полученных данных. Модель kNN импортируется из пакета sklearn, где она реализована в классе KNeighborsClassifier. В качестве критерия качества модели можно использовать точность (accuracy), поскольку все классы в составленной выборке сбалансированы. Метод accuracy будет использован для контроля точности модели на тестовой и валидационной выборках. 4.5.7 Валидация модели В качестве тестовой и валидационной выборок были использованы вручную собранные на различных веб-сайтах изображения автомобилей тех же моделей, что и в обучающей выборке – по 30 изображений на класс для тестирования и по 10 – для валидации. Выборки расположены в поддиректориях cars_test и cars_validation соответственно. Как упоминалось в главе 1, тестовая выборка используется для эмпирического подбора архитектуры модели и настройки ее гиперпараметров. В рассматриваемой модели удалось достичь точности около 81%, что является хорошим результатом, учитывая малое количество изображений для обучения, внешнее сходство различных моделей автомобилей, многообразие их ракурсов съемки и небольшую размерность изображений (300 × 300 пикселей). 103
Валидация модели производится на независимой валидационной выборке, не принимавшей участие в обучении модели и настройке гиперпараметров. Программный код для процедуры валидации аналогичен коду, использованному для проверки точности на тестовой выборке. Точность на валидационной выборке составила почти 82% и практически не отличается от точности на тестовой выборке, что говорит о хорошей обобщающей способности полученной модели. 104
Список литературы 1. Cybenko G. V. Approximation by Superpositions of a Sigmoidal function // Mathematics of Control Signals and Systems. – 1989. – Т. 2, № 4. – С. 303-314. 2. Duchi J., Hazan E., Singer Y. Adaptive Subgradient Methods for Online Learning and Stochastic Optimization // The Journal of Machine Learning Research. – 2011. – Т. 122. – С. 2121–2159. 3. Zeiler D. M. Adadelta: An Adaptive Learning Rate Method // Режим доступа: https://arxiv.org/pdf/1212.5701.pdf 4. Kingma D., Ba J. Adam: A Method for Stochastic Optimization // International Conference on Learning Representations, 2014. Режим доступа: https://arxiv.org/pdf/1412.6980.pdf. 5. Официальный сайт проекта Anaconda [Электронный ресурс] // URL: https://www.anaconda.com. 6. Schroff F., Kalenichenko D., Philbin J. FaceNet: A unified embedding for face recognition and clustering // 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). – 2015. – C. 815-823. 7. Khosla P. et al. Contrastive Learning // Advances in Neural Information Processing Systems 33 (NeurIPS 2020). – 2020. 8. Xingping D., Jianbing S. Triplet Loss in Siamese Network for Object Tracking // Proceedings of the European Conference on Computer Vision (ECCV). – 2018. – C. 459-474. 9. Krause J., Stark M., Deng J., Fei-Fei L. 3D Object Representations for FineGrained Categorization // 4th IEEE Workshop on 3D Representation and Recognition, at ICCV 2013. – 2013. 10. Stanford Cars Dataset [Электронный ресурс] // URL: http://ai.stanford.edu/~jkrause/cars/car_dataset.html. 105
Андрей Сергеевич Алексейчук ВВЕДЕНИЕ В НЕЙРОННЫЕ СЕТИ: МОДЕЛИ, МЕТОДЫ И ПРОГРАММНЫЕ СРЕДСТВА Учебное пособие Издательство «Доброе слово и Ко» http://dobroeslovo.info Подписано в печать: 24.03.2023 П.л. 6,625. Формат 60×90/16 Тираж 200 экз.