Дата актуальности: 29 апреля 2026 г.
Что такое «обучение триплетам»?
Обучение триплетам — это методика обучения моделей машинного обучения, в которой алгоритт учится различать объекты, опираясь на триплеты примеров:
- Anchor (якорь) — исходный объект;
- Positive (позитив), объект того же класса, что и якорь;
- Negative (негатив) — объект другого класса.
Цель — научить модель такому представлению данных, при котором якорь оказывается ближе к позитиву и дальше от негатива в скрытом пространстве признаков.
Зачем применяют обучение триплетам?
- Распознавание лиц и биометрия — FaceNet, DeepFace, ArcFace;
- Поиск похожих товаров в e-commerce (одежда, мебель, запчасти).
- Рекомендательные системы — «покупатели, которым понравился этот товар, также интересовались…».
- Семантический поиск документов и изображений.
- Кластеризация и дедупликация данных.
Математическая формулировка: Triplet Loss
Функция потерь Triplet Loss формулируется как:
L = max(d(a, p) − d(a, n) + margin, 0)
где
- d(a, p) — расстояние между якорем и позитивом;
- d(a, n) — расстояние между якорем и негативом;
- margin — положительный гиперпараметр-«зазор», который модель обязана обеспечивать между классами.
Как подготовить триплеты данных?
Сбор и разметка
Каждый класс должен содержать как минимум два примера, чтобы можно было выбрать якорь и позитив.
Для негатива выбирают примеры из других классов.
Стратегии выборки
- Random Negative Sampling — случайный негатив из всех остальных классов.
- Semi-hard Negative Mining — выбирается негатив, который дальше якоря, чем позитив, но ближе, чем позитив + margin.
- Hard Negative Mining — берётся самый «трудный» негатив, который ещё ближе якоря, чем позитив.
Архитектура сети
На практике используют siamese или triplet-сети:
- Общий backbone (ResNet, EfficientNet, Transformer) выдаёт вектор признаков.
- Три копии backbone обрабатывают якорь, позитив и негатив.
- На этапе инференса берёт одну копию сети и использует её как энкодер признаков.
Код на PyTorch (минимальный пример)
import torch
import torch.nn as nn
class TripletLoss(nn.Module):
def __init__(self, margin=0.5):
super.__init__
self.margin = margin
def forward(self, anchor, positive, negative):
pos_dist = (anchor ― positive).pow(2).sum(1)
neg_dist = (anchor ― negative).pow(2).sum(1)
loss = torch.relu(pos_dist ⎯ neg_dist + self.margin)
return loss.mean
Реальные кейсы
Google Photos
Обучают модель на триплетах лиц, чтобы группировать фотографии одного человека.
VK AutoML
Внутренняя платформа VK использует вариант Triplet Learning для визуального поиска товаров во «ВКонтакте Маркет».
Microsoft Lobe
Встроенный модуль «Similarity» в Lobe позволяет пользователям без кода обучать триплет-модели на собственных наборах изображений.
Ловушки и практические советы
- Переподбор margin: большие значения могут привести к коллапсу градиентов.
- Баланс классов: неравномерные датасеты дают смещённые эмбеддинги.
- Augmentation: критична для визуальных данных, особенно color jitter и random crop.
- Early stopping по Recall@k: следить за качеством на валидации, а не только по loss.
Инструменты и библиотеки
| Название | Язык | Особенности |
|---|---|---|
| PyTorch Metric Learning | Python | Готовые miners, losses, trainers |
| TensorFlow Similarity | Python | Высокоуровневый Keras-like API |
| FaceNet-pytorch | Python | Предобученные веса, быстрый старт |
| MLflow | Python, REST | Эксперименты, логирование, деплой |
Что дальше?
Обучение триплетам эволюционирует в сторону contrastive learning (SimCLR, CLIP) и meta-learning, но базовые принципы остаются неизменными: научиться сравнивать, а не классифицировать.
© 2026 — Подготовлено с любовью к Data Science и машинному обучению.