Большинство из нас думают о машинном обучении как о "черном ящике", который принимает некоторые данные и выдает отличные результаты. В последние годы этот черный ящик работает как имитация человека в соответствующих областях, где он используется, и достигает выдающихся результатов.   Но, по моему опыту, изучение этого черного ящика может быть увлекательным, забавным и иногда разочаровывающим. Этот черный ящик делает много вещей, которые никто не мог предсказать десять лет назад. Самая интересная часть машинного обучения - понять, как этот черный ящик делает что-то за кулисами, что делает возможным чудесные вещи.  Когда я недавно столкнулся с моделью распознавания лиц под названием FaceNet, я был поражен ее невероятной точностью в распознавании лиц, несмотря на то, что она была обучена на одном кадре. Я хотел понять, что происходит за кулисами этой модели, и, прочитав немного о FaceNet, звездой шоу для меня стала используемая функция потерь, которая была ничем иным, как функцией тройных потерь. Меня поразил тот факт, что небольшие интуитивные мыслительные процессы, происходящие в нашем мозгу каждую секунду, могут решать необычные проблемы. Это и побудило меня написать эту статью. Здесь я попытаюсь объяснить, что я понимаю под концепцией тройной функции потерь (Triplet Loss). Эта функция потерь стала популярной после того, как модель Facenet, созданная компанией Google, стала современной моделью распознавания лиц, которая использует тройную функцию потерь под капотом.  В этом разделе функция тройных потерь объясняется с помощью аналогии, чтобы помочь вам понять ее интуитивно. Предположим, у вас есть два друга (назовем их A и B). Вы учитесь в одном классе (т.е. на одном курсе); известно, что А - лучший ученик в классе. В день подведения итогов вы получили 50 баллов, а два других ваших друга (А и Б) - 95 и 93 балла соответственно. Если предположить, что ваши родители теперь знают результаты и знают, что А - лучший, то они делают вывод, что между оценками Б и лучшего (А) нет большой разницы, а вы тоже задохлик, поэтому естественно, что Б тоже лучший. Потому что есть большая разница между твоей оценкой и лучшей (А). Мы, люди, почти всегда проводим подобную категоризацию и рассуждаем в соответствии с правилом, согласно которому вещи, принадлежащие к одной категории, имеют схожие свойства (в данном сценарии - метки).  Другими словами, мы пытаемся уменьшить расстояния и различия между похожими вещами и увеличить расстояния и различия между разными вещами. Давайте проанализируем приведенную выше диаграмму в соответствии с текущим сценарием: А - якорь, поскольку известно, что он является вершиной (идентифицирован); Б - считается отрицательным (поскольку разница в оценках между А и якорем велика); В - считается положительным (поскольку разница в оценках между Б и якорем невелика). Таким образом, обучая модель классификации, веса параметров можно настроить так, чтобы минимизировать тройные потери, то есть уменьшить разницу между похожими и увеличить разницу между разными.  Теперь мы готовы понять, как тройные потери работают в модели Facenet: На этапе обучения модели Facenet каждый вход состоит из трех изображений лиц. Два из них - изображения одного и того же человека (одно якорное, одно положительное), а последнее - другого человека (отрицательное). Модель Facenet обрабатывает изображение лица каждого человека и кодирует его признаки в 128-мерном пространстве, т.е. выдает вектор размером 128. Следуя процессу мысленной аналогии, описанному выше, можно сказать, что в 128-мерном пространстве два лица различны, если расстояние между двумя кодированными точками велико, и одинаковы, если расстояние мало (в принципе, пороговое значение для определения размера расстояния сохраняется). Поэтому модель корректирует веса таким образом, чтобы расстояние между кодированными точками было больше.  Расстояние между опорным изображением и позитивным изображением мало. Расстояние между опорным изображением и отрицательным изображением большое. Это поможет вам понять формулу для тройной функции потерь.   f(x) принимает x в качестве входных данных и возвращает 128-мерный вектор w. i обозначает i-й вход. Нижний индекс a указывает на изображение привязки , p указывает на положительное изображение, n указывает на отрицательное изображение. Наша цель - минимизировать вышеприведенное уравнение.   Минимизация первого члена → расстояние между якорем и позитивным изображением. Максимизация (поскольку перед ним отрицательный знак) второго члена → расстояние между якорем и отрицательным изображением. Третий член - это смещение, которое действует как порог (и здесь его можно игнорировать).   Ну а теперь, самое интересное, ради чего мы все здесь собрались - реализация обучения модели Triplet Loss на языке Python. Загружает набор данных MNIST из файлов CSV. Определяет функции, используемые для выборки пакетов из набора данных, и для этого набор данных реорганизуется более удобным способом с помощью словаря, где ключи обращаются ко всем образцам из каждого класса. Мы допускаем что вы знакомы с библиотеками tensorflow, matplotlib, seaborn и pandas и что для вас не составит труда найти и скачать набор данных MNIST. В любом случае, надеемся, что это будет для вас полезной практикой! Глядя на вложения t-SNE из необработанных данных пикселей, мы можем получить базовую информацию о том, как данные распределяются, прежде чем какая-либо работа по кластеризации будет выполнена моделью Triplet Loss. Функция Triplet Loss определена на основе реализаций FaceNet и In Defense of the Triplet Loss for Person Re-Identification. В реализацию можно внести множество небольших изменений, таких как определение мягкого поля или использование различных функций расстояния. Эта реализация определяет жесткий запас на уровне 0,2 и использует евклидово расстояние (а не квадратное евклидово расстояние, как в FaceNet) в качестве функции потерь. Теперь мы в течение некоторого времени подаем модели некоторые данные, а затем визуализируем вложения результатов с помощью t-SNE. Вот так вместе с вами мы смогли разобрать такую очень интересную тему машинного обучения, как функцию тройных потерь (Triplet Loss) и даже произвести обучение модели на наборе данных MNIST.   ML engineer