Перейти к основному контенту

Контрастивное обучение: как модели учатся через сравнение

Практический обзор контрастивного обучения — как модели учатся, сравнивая похожие и непохожие примеры, какие функции потерь и методы за этим стоят и как реализовать это в PyTorch.
Обновлено 12 авг. 2026 г.  · 13 мин читать

Изучить с помощью AI

ChatGPTClaudePerplexity

Заставить модель учиться без размеченных данных звучит невероятно, но именно это и лежит в основе контрастивного обучения.

Как вы знаете, разметка данных — это долго и дорого. Один датасет для классификации изображений обычно требует тысячи часов ручной аннотации — и это ещё до учёта ошибок и несоответствий.

Контрастивное обучение обходит проблему разметки, обучая модели сравнению. Вместо того чтобы говорить модели, что это такое, вы показываете ей, какие вещи похожи, а какие отличаются, — и позволяете ей вывести остальное самостоятельно.

В этой статье я разберу интуицию контрастивного обучения, объясню, как оно работает «под капотом», где применяется на практике — от распознавания изображений до NLP-эмбеддингов — и как реализовать его в PyTorch.

Что именно такое компьютерное зрение? Прочитайте наш руководство для начинающих по анализу изображений.

Что такое контрастивное обучение?

Контрастивное обучение — это подход к обучению, при котором модель учится через сравнение, а не через классификацию.

Вместо того чтобы говорить модели «это кошка» или «это собака», вы показываете ей пары примеров и позволяете самой понять, что относится друг к другу, а что — нет. Модель учится, определяя, похожи ли две вещи или нет.

Иными словами, вы подаёте модели по два объекта данных за раз. Если они связаны — скажем, две фотографии одной и той же собаки, снятые под разными углами, — это положительная пара. Если не связаны — фото собаки и фото автомобиля — это отрицательная пара.

Задача модели — формировать представления (числовые векторы), отражающие эту структуру. Положительные пары должны располагаться близко друг к другу в векторном пространстве. Отрицательные — далеко друг от друга.

Интуиция контрастивного обучения

Проще всего понять контрастивное обучение на примере изображений.

Возьмите фото собаки. Создайте две его версии — одну обрезанную, другую с изменённой яркостью. Содержимое одно и то же, но пиксели отличаются. Модель контрастивного обучения воспринимает эти две версии как положительную пару и учится отображать их в близкие позиции векторного пространства.

Если показать модели рядом с этим фото собаки фото автомобиля, вы получите отрицательную пару. Модель учится раздвигать их представления.

Вам не нужно вручную указывать «это собака» или «это автомобиль». Модель формирует понимание из структуры сходства и различия.

В этом и сила контрастивного обучения.

Сигнал приходит от сравнения. При достаточном количестве пар модель может сформировать представления, понимающие, что делает вещи похожими и что их различает.

Эти представления оказываются действительно полезными. Модель, обученная на изображениях таким образом, может быть дообучена для задач классификации, детекции или поиска с очень небольшим количеством размеченных данных, потому что она уже усвоила что-то существенное о визуальном мире.

Применения контрастивного обучения

Контрастивное обучение встречается во многих областях — вот где чаще всего.

Компьютерное зрение

Именно здесь контрастивное обучение впервые показало свои возможности.

Модели, обученные таким образом на изображениях, учатся формировать представления, которые понимают визуальное сходство, не видя ни одной метки. Две фотографии одной сцены, снятые под разными углами или при разном освещении, должны отображаться в близкие точки векторного пространства. Две несвязанные сцены — далеко друг от друга.

Вы можете взять контрастивно предобученную модель и дообучить её для классификации или детектирования объектов, используя лишь часть размеченных данных, которые потребовались бы иначе.

Обработка естественного языка

В NLP контрастивное обучение используют для обучения эмбеддингов предложений — векторных представлений, которые улавливают смысл предложения целиком.

Предложения с похожим смыслом должны располагаться близко друг к другу в векторном пространстве, а несвязанные — дальше. Модели, обученные таким образом, способны решать задачи вроде семантического поиска и оценки сходства предложений без больших объёмов размеченных пар.

Рекомендательные системы

Рекомендательные системы используют контрастивное обучение для моделирования сходства пользователь—объект.

Пользователь и объект, с которым он взаимодействовал, образуют положительную пару. Пользователь и случайный незнакомый объект — отрицательную. При обучении на достаточном количестве таких пар модель осваивает общее пространство, где релевантные пользователи и объекты группируются.

Мультимодальные модели

Здесь контрастивное обучение становится особенно интересным.

Модели вроде CLIP используют его для выравнивания текста и изображений в общем векторном пространстве. Фото собаки и предложение «a dog playing in the park» должны оказаться рядом. Фото собаки и предложение «a red sports car» — нет. Это позволяет мультимодальным моделям сопоставлять изображения с текстовыми описаниями и генерировать подписи.

Как работает контрастивное обучение

Контрастивное обучение всегда следует одним и тем же четырём шагам — будь то изображения, текст или аудио.

Шаг 1: Создайте пары

Каждый обучающий пример начинается как пара. Вы выбираете две точки данных и помечаете их отношение как похожее (положительное) или непохожее (отрицательное). На практике положительные пары часто получают из одного и того же входа через две разные аугментации, а отрицательные — из несвязанных примеров.

Шаг 2: Закодируйте в эмбеддинги

Обе точки данных проходят через энкодер, который преобразует их в векторы. Эти векторы, называемые эмбеддингами, — числовые представления в общем векторном пространстве. Цель — чтобы это пространство отражало семантический смысл, а не сырые пиксели или токены.

Шаг 3: Посчитайте сходство

Получив два эмбеддинга, вы измеряете их близость. Наиболее часто используют косинусное сходство. Оно даёт балл между -1 и 1, где 1 означает, что векторы направлены в одну сторону, а -1 — в противоположные.

Шаг 4: Обновите модель

Модель сравнивает свои оценки сходства с тем, какими они должны быть. Для положительных пар оценка должна быть высокой. Для отрицательных — низкой. Функция потерь измеряет отклонение, а обратное распространение ошибки настраивает веса энкодера, чтобы в следующий раз было лучше.

Повторяя эти шаги на достаточном количестве пар, энкодер научится создавать эмбеддинги, которые группируют похожие вещи и раздвигают разные.

Положительные и отрицательные примеры

Качество вашей контрастивной модели зависит от того, как вы формируете пары.

Положительные пары — это две точки данных, которые следует считать похожими. В компьютерном зрении это обычно две аугментированные версии одного изображения. В NLP это могут быть два перефразирования одного предложения или предложение и его перевод. Модель учится тому, что различия между ними несущественны. Важно лишь общее.

Отрицательные пары — две точки данных, которые следует считать разными. В большинстве реализаций отрицательные примеры выбираются случайно из остального датасета. Если вы обучаете на изображениях, любые два изображения разных объектов образуют корректную отрицательную пару.

Здесь начинается самое сложное.

Не все отрицательные одинаково полезны. Случайный отрицательный пример, который явно отличается от исходного — скажем, фото собаки вместе с фото самолёта — не заставляет модель особенно напрягаться. Их называют лёгкие отрицательные, и избыток таких замедляет обучение.

С другой стороны, сложные отрицательные — это точки данных, которые выглядят похожими на исходную, но относятся к другому классу — например, две породы собак или два предложения с похожей формулировкой, но разным смыслом. Чтобы их различать, модель должна выработать более тонкие представления, что в итоге даёт лучшие эмбеддинги.

Та же логика применима к положительным парам. Если аугментации слишком слабы, модель мало чему учится. Если слишком агрессивны, пара перестаёт быть осмысленно похожей.

Функции потерь в контрастивном обучении

Функция потерь превращает сравнение пар в обучающий сигнал.

Каждая функция потерь работает по-своему, но цель у всех одна: поощрять модель, когда похожие объекты близки в векторном пространстве, и наказывать, когда это не так.

Contrastive loss

Функция contrastive loss была предложена вместе с ранними работами по контрастивному обучению.

Она работает с парами. Для положительной пары она наказывает модель, если их эмбеддинги слишком далеко. Для отрицательной — если их эмбеддинги слишком близко, то есть попадают внутрь заданного отступа (margin). Отрицательные, которые уже достаточно далеко, не вносят вклад в потерю.

Формула функции contrastive loss

Формула функции contrastive loss

Где d — расстояние между двумя эмбеддингами, y равно 1 для отрицательных пар и 0 для положительных, а m — это отступ (margin). Отступ — гиперпараметр, который вы задаёте вручную, из‑за чего эта функция потерь чувствительна к настройке.

Triplet loss

Triplet loss работает сразу с тремя точками данных: якорем, положительным и отрицательным примером.

Формула функции triplet loss

Формула функции triplet loss

Модель наказывается всякий раз, когда расстояние якорь—положительный d(a, p) не меньше расстояния якорь—отрицательный d(a, n) хотя бы на отступ m. Если условие уже выполнено, потеря равна нулю.

Такая формулировка даёт модели больше контекста за одно обновление, чем contrastive loss, потому что сравниваются обе связи сразу, а не по одной.

InfoNCE loss

InfoNCE — это функция потерь за большинством современных методов контрастивного обучения, включая SimCLR и CLIP.

Формула функции InfoNCE loss

Формула функции InfoNCE loss

Для каждого якоря z_i модель должна определить его положительный пример z_j среди всех прочих N примеров в батче. Параметр температуры τ управляет резкостью распределения: меньшие значения повышают уверенность модели, большие смягчают контраст между парами.

Вы получаете больше отрицательных за одно обновление, что даёт модели более насыщенный обучающий сигнал. Это также означает, что большие батчи предъявляют модели более сложные отрицательные примеры и в целом дают лучшие представления.

Контрастивное обучение в самоконтролируемом обучении

Контрастивное обучение и самоконтролируемое обучение хорошо сочетаются, и, понимая почему, вы поймёте, куда движется современный ML.

Самоконтролируемое обучение — это подход, при котором модель генерирует метки из самих данных, без участия человека. Вместо того чтобы кто-то размечал тысячи изображений как «кошка» или «собака», сигнал надзора обеспечивает сам набор данных.

Контрастивное обучение делает именно это. Когда вы берёте изображение, создаёте две его аугментированные версии и сообщаете модели, что это положительная пара, — вы фактически создаёте метку.

Это важно, потому что размеченные данные — узкое место большинства ML-пайплайнов. Сбор идёт медленно, аннотация дорога, а в некоторых областях, таких как медицинская визуализация, данных просто недостаточно.

Пока результаты обнадёживают. Модели, предобученные контрастивными самоконтролируемыми целями на больших неразмеченных датасетах, сравнялись или приблизились к контролируемым базовым линиям на ряде последующих задач после дообучения на небольшом количестве размеченных данных.

Общий тренд — уход от задачеспецифичного контролируемого обучения к универсальным представлениям, извлечённым из сырых данных в больших масштабах. Методы вроде SimCLR, MoCo и BYOL следуют этому тренду, и далее я их разберу.

Популярные методы контрастивного обучения

Вот три наиболее влиятельные платформы контрастивного обучения в 2026 году.

SimCLR

SimCLR, представленная Google Research, — одна из самых наглядных реализаций идеи контрастивного обучения.

Для каждого изображения в батче она создаёт два аугментированных представления и считает их положительной парой. Все остальные изображения в батче становятся отрицательными. Модель — CNN с небольшой проекционной головкой — учится сближать положительные пары, используя InfoNCE loss.

Особенность SimCLR — важность размера батча. Более крупные батчи дают больше отрицательных примеров за обновление, что ведёт к лучшим представлениям. Обратная сторона — память. Поскольку SimCLR для эффективной работы нужны большие батчи, чтобы раскрыть потенциал метода, требуется мощное «железо».

MoCo

MoCo (Momentum Contrast) от Meta AI Research был разработан, чтобы решить именно эту проблему.

Вместо опоры на большой батч для отрицательных примеров MoCo поддерживает очередь — скользящий буфер закодированных представлений из предыдущих батчей. Это развязывает количество отрицательных от размера батча, так что можно обучаться с куда меньшими затратами памяти и при этом давать модели большой пул отрицательных примеров.

Также используется momentum-энкодер — медленно обновляемая копия основного энкодера — чтобы поддерживать согласованность представлений в очереди со временем.

BYOL

BYOL (Bootstrap Your Own Latent) стоит упомянуть, хотя он вовсе не использует отрицательные пары.

Вместо раздвигания отрицательных BYOL обучает одну сеть предсказывать представления другой — медленно обновляемой целевой сети. Здесь нет отрицательных и нет контрастивной функции потерь. Метод работает на удивление хорошо, и его успех поставил под сомнение необходимость отрицательных пар в обучении контрастивного типа.

BYOL находится где-то на границе контрастивного обучения, но это хороший следующий шаг, когда вы разберётесь с базовыми методами.

Контрастивное обучение vs контролируемое обучение

Оба подхода решают одну и ту же задачу, но исходят из разных предпосылок, которые важно понимать.

Контролируемое обучение требует размеченных данных. Каждый обучающий пример должен иметь назначенную человеком метку, и модель учится сопоставлять входы с этими метками. Это прямой подход, хорошо работающий при достаточном количестве размеченных примеров. Модель знает, что за вход и каков правильный ответ.

Контрастивное обучение генерирует надзор из самой структуры данных — сходства и различия — и учится представлениям, не видя меток вообще.

Ниже — более наглядное сравнение этих подходов:

Сравнение контрастивного и контролируемого обучения

Сравнение контрастивного обучения с контролируемым

Основные различия проявляются в масштабе. Контролируемое обучение зависит от размеченных данных — а размечать дорого. Контрастивное обучение может продолжать улучшаться по мере подачи всё большего объёма неразмеченных данных, которые обычно доступны в избытке.

Но важно отметить: представления, которые выучивает модель контрастивного обучения, — общие, а не задачеспецифичные. Это обычно требует этапа дообучения для высокой точности на конкретной задаче. Контролируемым моделям этот этап не нужен, потому что они обучаются на целевой задаче напрямую.

Выбор зависит от ваших данных. Если у вас есть разметка и конкретная задача, контролируемое обучение часто быстрее. Если вы работаете с большими объёмами неразмеченных данных или вам нужны переносимые между задачами представления, контрастивное обучение может оправдать дополнительные усилия при настройке.

Контрастивное обучение на практике (пример на Python)

Теперь сделаем минимальную реализацию на PyTorch. Пример ниже охватывает три ключевые идеи, описанные ранее: модель эмбеддингов, косинусное сходство и NT-Xent — функцию потерь, используемую в SimCLR и основанную на InfoNCE.

Модель эмбеддингов

Энкодер — это простая полносвязная сеть, которая отображает входные векторы в пространство эмбеддингов меньшей размерности.

import torch
import torch.nn as nn
import torch.nn.functional as F

class Encoder(nn.Module):
    def __init__(self, input_dim, embedding_dim):
        super().__init__()
        self.network = nn.Sequential(
            nn.Linear(input_dim, 128),
            nn.ReLU(),
            nn.Linear(128, embedding_dim)
        )

    def forward(self, x):
        return self.network(x)

На практике вы замените это на CNN для изображений или трансформер для текста. Архитектура менее важна, чем то, что следует после неё.

Вычисление сходства

Получив два эмбеддинга, вы измеряете их близость с помощью косинусного сходства. Нормализация векторов заранее удерживает оценки в диапазоне от -1 до 1.

def cosine_similarity(z1, z2):
    z1 = F.normalize(z1, dim=-1)
    z2 = F.normalize(z2, dim=-1)
    return torch.matmul(z1, z2.T)

Результат — матрица, где каждая ячейка [i, j] представляет сходство между эмбеддингом i и эмбеддингом j в пределах батча.

Потери NT-Xent

NT-Xent (Normalized Temperature-scaled Cross Entropy) — это функция потерь на основе InfoNCE. Для каждого якоря она рассматривает спаренный вид как положительный, а все остальные примеры в батче — как отрицательные.

def nt_xent_loss(z1, z2, temperature=0.5):
    batch_size = z1.shape[0]

    z = torch.cat([z1, z2], dim=0)
    z = F.normalize(z, dim=-1)
    sim_matrix = torch.matmul(z, z.T) / temperature

    mask = torch.eye(2 * batch_size, dtype=torch.bool)
    sim_matrix = sim_matrix.masked_fill(mask, float("-inf"))

    labels = torch.arange(batch_size)
    labels = torch.cat([labels + batch_size, labels])

    return F.cross_entropy(sim_matrix, labels)

Параметр temperature управляет резкостью распределения. Более низкие значения делают модель более уверенной в том, какая пара положительная; более высокие смягчают контраст.

Собираем всё вместе

encoder = Encoder(input_dim=64, embedding_dim=32)
optimizer = torch.optim.Adam(encoder.parameters(), lr=1e-3)

# Simulate a batch of positive pairs
x1 = torch.randn(32, 64)
x2 = torch.randn(32, 64)

# Training
optimizer.zero_grad()
z1, z2 = encoder(x1), encoder(x2)
loss = nt_xent_loss(z1, z2)
loss.backward()
optimizer.step()

print(f"Loss: {loss.item():.4f}")

Вывод контрастивного цикла

Вывод контрастивного цикла

Это полный контрастивный цикл в самом простом виде. В реальной реализации x1 и x2 были бы двумя аугментированными представлениями одного и того же входа, а не случайным шумом, — но структура останется той же.

Заключение

Контрастивное обучение — простая идея с широкими возможностями.

Оно учит модели понимать структуру через сравнение, не полагаясь на размеченные данные. Сближайте похожее, разводите различное — вот весь принцип. Этого оказывается достаточно, чтобы выучить представления, хорошо переносимые между задачами.

Отрасль уходит от пайплайнов с тяжёлой аннотацией, и контрастивное обучение — одна из главных причин. Алгоритмы вроде SimCLR, MoCo и CLIP дошли до реальных продуктов, что многое говорит о практической эффективности подхода.

Если хотите углубиться, следующий шаг — поработать с реальной реализацией. Пример на PyTorch в этой статье — отправная точка, но запуск SimCLR на реальном датасете изображений — даже небольшом — даст вам больше, чем любое объяснение.

А если вам нужен лучший ресурс по продвинутым темам машинного обучения, запишитесь на наш трек Machine Learning Scientist in Python.

Частые вопросы о контрастивном обучении

Что такое контрастивное обучение простыми словами?

Контрастивное обучение — это способ обучать модели, показывая им пары примеров и обучая тому, что является похожим, а что — разным. Вместо использования размеченных данных модель учится из структуры самих данных. Со временем она формирует представления, которые группируют похожие объекты и разделяют непохожие.

Чем контрастивное обучение отличается от контролируемого?

Контролируемому обучению нужны размеченные данные — каждый пример должен иметь назначенную человеком категорию или значение. Контрастивному обучению метки не нужны вовсе. Оно генерирует обучающий сигнал из пар похожих и непохожих примеров, что делает масштабирование гораздо дешевле, когда размеченных данных мало.

Для чего используется контрастивное обучение?

Контрастивное обучение применяется в компьютерном зрении, NLP, рекомендательных системах и мультимодальных моделях. В компьютерном зрении его используют для предобучения энкодеров изображений без меток. В NLP оно лежит в основе эмбеддингов предложений, которые улавливают семантическое сходство. Модели вроде CLIP используют его, чтобы выравнивать текст и изображения в общем векторном пространстве.

В чём разница между contrastive loss, triplet loss и InfoNCE?

Contrastive loss работает с парами и наказывает модель, когда похожие пары слишком далеко или непохожие — слишком близко, используя фиксированный отступ. Triplet loss добавляет якорь и одновременно сравнивает его расстояние до положительного и отрицательного. InfoNCE формулирует задачу как классификацию в пределах батча — модель должна найти правильную положительную пару среди всех прочих примеров — что даёт более насыщенный обучающий сигнал и лежит в основе современных методов вроде SimCLR и CLIP.

Почему размер батча важен в контрастивном обучении?

В методах вроде SimCLR, использующих InfoNCE, отрицательные примеры берутся из других объектов в том же батче. Более крупный батч означает больше отрицательных за обновление, что даёт модели более сложные сравнения и обычно приводит к лучшим представлениям. Поэтому контрастивное обучение часто требовательно к памяти — нужны большие батчи, чтобы получить максимум от обучающего сигнала.

Темы
Машинное обучение
Искусственный интеллект

Учитесь с DataCamp

Course

Введение в машинное обучение

2 ч
306.8K
Введение в машинное обучение без программирования.
ПодробнееRight Arrow
Начать Курс
Смотрите большеRight Arrow