14
правок
Изменения
м
Исправлены мелкие ошибки
[[Файл: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>.
Как сиамская сеть, так и сеть триплетов показывают хорошие результаты при сравнении изображений. Однако, в отличие от сиамской сети, сеть триплетов не требует нормализации данных.