Изменения

Перейти к: навигация, поиск

Сиамская нейронная сеть

238 байт добавлено, 11:20, 1 сентября 2022
Нет описания правки
'''Сиамская нейронная сеть''' (англ. Siamese neural network) — это разновидность [[Нейронные сети, перцептрон|искусственной нейронной сети]] (англ. artificial neural network), которая состоит из двух идентичных нейронных подсетей с одинаковыми наборами весов. Данный вид сетей позволяет сравнить вектора признаков двух объектов с целью выделить их семантическое сходство или различие. Сиамская нейронная сеть представляет собой нелинейное [[Отображения|отображение]] данных с целью приблизить друг к другу схожие объекты и разнести различные объекты на максимально возможное расстояние. Сиамские сети получили свое название от сиамских близнецов, физически приросших друг к другу, из-за использования сразу двух подсетей, разделяющих один набор весов. Эти подсети могут быть представлены многослойными [[Нейронные сети, перцептрон|перцептронами]] (англ. multilayer perceptron), [[Сверточные нейронные сети|сверточными нейронными сетями]] (англ. convolutional neural network) и другими.
== Мотивация ==
Рассмотрим следующую ситуацию: некоторая компания хочет создать систему, которая, основываясь на фотографии лица человека, могла бы установить, является ли он ее сотрудником. В этом случае она, например, разрешает ему доступ на территорию предприятия. Пусть в компании работает <math>n</math> человек. Тогда может быть выделено <math>n+1</math> классов (<math>n</math> классов сотрудников и один класс не сотрудника). Каждый из этих классов может быть записан в форме вектора длины <math>n+1</math> с помощью one-hot кодирования. Для решения задачи классификации фотографии в один из выделенных <math>n+1</math> классов может быть использована сверточная нейронная сеть, возвращающая класс сотрудника в векторной форме. Однако число сотрудников компании может меняться, старые работники могут увольняться, а на их место приходить новые. Каждое такое изменение потребовало бы переобучения всей сети, что может быть накладно для крупных компаний. Более того, не все сотрудники имеют большое количество своих фотографий (необходимое для обучения сверточной нейронной сети), или не желают делиться большей их частью.
Решением данной проблемы может быть обучение сети не распознавать каждого отдельного сотрудника, а находить сходство между фотографиями двух людей. В качестве таких фотографий могут быть использованы фотография человека, который пытается попасть на территорию предприятия, и фотография одного из сотрудников компании. Например, мы можем задаться некоторым пределом выбрать некоторый предел <math>\tau</math> и обучить сеть так, чтобы она возвращала значение <math>\phi < \tau</math>, если фотографии похожи, и <math>\phi \geq \tau</math>, если они разные. В таком случае нам будет достаточно попарно сравнить с помощью нашей сети фотографию посетителя с фотографиями сотрудников компании, и, если выходное значение для одной из пар будет меньше <math>\tau</math>, мы можем с высокой уверенностью сказать, что наш посетитель является сотрудником компании. Такое решение может быть реализовано с помощью сиамских нейронных сетей, которые рассмотрены ниже.
== Сиамская нейронная сеть ==
[[Файл:Siamese neural net architecture types.png|thumb|300px| Рисунок 2 — основные типы архитектур сиамской нейронной сети.]]
Зададимся набором данных <math>\{(x_i, y_i), i = 1, \dots, n\}</math>, состоящим из <math>n</math> векторов признаков <math>x_i \in R^m</math> размера <math>m</math> с метками <math>y_i \in \{1, 2, \dots, C\}</math>, где <math>C</math> — число классов. Создадим обучающий набор данных <math>S = \{(x_i, x_j, z_{ij}), i = 1, \dots, n; j = 1, \dots, n\}</math>, состоящих из пар <math>(x_i, x_j)</math> с бинарными метками <math>z_{ij}</math>. Если оба вектора признаков <math>x_i</math> и <math>x_j</math> принадлежат к одному и тому же классу, то <math>z_{ij} = 0</math>, иначе <math>z_{ij} = 1</math>. Разделим обучающий набор данных <math>S</math> на два подмножества: одно — со схожими парами (или с <math>z_{ij} = 0</math>), другое — с различающимися парами (или с <math>z_{ij} = 1</math>). Будем подавать наши пары векторов на вход сиамской сети.
В общем случае сиамская сеть состоит из двух подсетей, выходы которых подаются на вход другого модуля, который генерирует конечный выход. Рассмотрим Рис. 1, на котором <math>x_i</math> и <math>x_j</math> — это входы, <math>W</math> — общие веса/параметры, а <math>h_i \in R^D</math> и <math>h_j \in R^D</math> — выходы обеих подсетей. Сиамская сеть представляет собой отображение <math>h_i = f(x_i)</math>, для которого Евклидово расстояние <math>d(h_i, h_j)</math> максимально мало́ при <math>y_i=y_j</math> и максимально велико при <math>y_i \neq y_j</math>. Сеть возвращает оценку <math>o_W</math> того, насколько различны <math>x_i</math> и <math>x_j</math>.
Третья архитектура полезна для детального сравнения двух объектов, необходимого, например, при отслеживании пешеходов<ref name="pedestrian">L. Leal-Taixé, C. Canton-Ferrer and K. Schindler, "Learning by Tracking: Siamese CNN for Robust Target Association," 2016 IEEE Conference on Computer Vision and Pattern Recognition Workshops (CVPRW), Las Vegas, NV, 2016, pp. 418-425, doi: 10.1109/CVPRW.2016.59.</ref>. Первые две архитектуры показывают хорошие результаты при классификации.
Существует много различных [[Функция потерь и эмпирический риск|функций потерь]] (англ. loss function) для обучения сиамских нейронных сетей. Рассмотрим две наиболее популярные из них. Первая — '''contrastive loss function ''' — использует пары объектов <math>(x_i, x_j)</math>, которые могут принадлежать как одному, так и разным классам:
<math>l(x_i, x_j, z_{ij}) = (1-z_{ij})||h_i-h_j||_2^2+z_{ij}\max(0, \tau-||h_i-h_j||_2^2)</math>,
где <math>\tau</math> — это заранее заданный предел. Вторая функция потерь — '''triplet loss function ''' — использует объект рассматриваемого класса (или якорь, англ. anchor) <math>h_i</math>, с которым будет проводиться сравнение, а также два других объекта: один принадлежащий к тому же классу (англ. neighbor) <math>h_j</math>, и один не принадлежащий к этому классу (англ. distant) <math>h_k</math>:
<math>l(x_i, x_j, x_k) = \max(0, ||h_i-h_j||_2^2 - ||h_i-h_k||_2^2 + \alpha)</math>,
<math>L(W) = \sum l + \mu R(W)</math>,
где <math>\sum l</math> — это результат суммирования значений функции потерь по всему обучающему набору данных, <math>R(W)</math> — это член, регуляризующий обобщающую способность сети, <math>W</math> — это матрица параметров нейронных подсетей, а <math>\mu</math> — это гиперпараметр, отвечающий за степень регуляризации. Для минимизации этой функции обычно применяется [[Стохастический градиентный спуск|градиентный спуск]] (англ. gradient descent).
== Сеть триплетов ==
[[Файл:Triplet neural net.png|thumb|300px| Рисунок 3 — обобщенная архитектура сети триплетов.]]
'''Сеть триплетов''' (англ. Triplet network) (см. Рис. 3) представляет собой модификацию сиамской сети с тремя сверточными нейронными подсетями с общими параметрами. В центральную подсеть подается объект <math>x_i</math> рассматриваемого класса <math>y</math>, принадлежность к которому мы хотим научиться определять. В одну из двух оставшихся подсетей подается объект <math>x_j</math> того же класса <math>y</math> (положительный пример), а в другую — объект <math>x_k</math>, не принадлежащий к классу <math>y</math> (негативный пример). Сочетание центральной подсети с каждой из двух других подсетей образует сиамскую сеть. Выходы <math>o_W^{(0)}</math> и <math>o_W^{(1)}</math> обеих сиамских сетей подаются на последний слой-компаратор. Было отмечено, что при обучении сети триплетов в качестве функции потерь удобнее использовать среднеквадратическую ошибку<ref name="triplet">Elad Hoffer, Nir Ailon, "Deep metric learning using Triplet network", 2018.[https://arxiv.org/abs/1412.6622]</ref>.
Как сиамская сеть, так и сеть триплетов показывают хорошие результаты при сравнении изображений. Однако, в отличие от сиамской сети, сеть триплетов не требует нормализации данных.
* Coursera. Convolutional Neural Networks [https://www.coursera.org/learn/convolutional-neural-networks/home/welcome].
[[Категория:Нейронные сети]] [[Категория:Глубокое обучение]]
Анонимный участник

Навигация