Как поместить текст и изображение в одно пространство?
Контрастивное обучение помещает согласованные тексты и изображения рядом в
общем пространстве. Оно не переводит пиксели в слова буквально: два encoder-а
учатся сохранять ровно те признаки, которые помогают выбрать правильную пару
среди отрицательных. Значит, всё решает вопрос — кого мы объявили парой, а кого
соперником.
Подпись нельзя перевести дословно
Слово «собака» не спрятано в конкретном пикселе, а фотография не разбирается на
буквы. Между картинкой и текстом нет пословного словаря, поэтому нельзя обучать
модель переводу «пиксель за пиксель». Зато есть задача попроще и честнее:
положить перед моделью партию снимков и партию подписей и попросить расставить,
кто с кем.
Такая формулировка сразу превращает семантику в геометрию. Мы не требуем, чтобы
координата 17 означала «собака». Мы требуем, чтобы вектор снимка и вектор его
подписи оказались ближе друг к другу, чем к любым другим кандидатам из партии.
Всё остальное — расстояния, углы, кластеры — модель придумает сама, лишь бы
задача выбора решалась.
Фёрт говорил о словах, но правило шире: смысл объекта в контрастивной модели
задаётся тем, среди кого он стоит и от кого отличается. Отсюда весь дальнейший
разговор: температура, размер партии, ложные отрицательные пары — это не
технические мелочи, а способ определить «компанию».
Партия подписей превращается в матрицу
В батче лежат B пар (Ii,Ti). Image encoder строит вектор vi, text
encoder — вектор uj. После ℓ2-нормировки
vˉi=∥vi∥vi,uˉj=∥uj∥uj
обе модальности живут на одной единичной сфере, и близость сводится к косинусу
угла:
cij=vˉi⊤uˉj∈[−1,1],sij=τcij.
Для изображения i правильный текст имеет индекс i, остальные B−1 служат
отрицательными. Потери «изображение к тексту»:
LI→T=−B1i=1∑Blog∑j=1Besijesii.
Симметрично, по столбцам, строится «текст к изображению»:
LT→I=−B1j=1∑Blog∑i=1Besijesjj,
и обучают полусумму:
L=21(LI→T+LT→I).
Одна матрица B×B порождает B положительных и B(B−1) отрицательных
сопоставлений: при B=64 это 64 пары и 4032 противопоставления, полученные без
единой дополнительной разметки. Именно поэтому метод так дёшев — и именно
поэтому он так легко обманывается.
Модельный опыт: два сенсора, один объект
Настоящие пары «фотография — подпись» весят сотни гигабайт, поэтому в классе мы
поставим уменьшенный, но полностью честный опыт на реальных данных. Возьмём
классический набор рукописных цифр load_digits: 1797 изображений 8×8.
Каждое изображение разрежем на две «модальности»: чётные строки развёртки —
«снимок», нечётные — «подпись». Это модельный пример: две подписи не являются
текстом, но обладают главным нужным свойством — два разных набора чисел
описывают один и тот же объект, и никакого пословного соответствия между ними
нет.
Два маленьких encoder-а (один скрытый слой из 64 нейронов, выход — 32 числа)
обучены симметричным InfoNCE при τ=0,1, батче B=64, 4000 шагов Adam,
что даёт около 213 проходов по обучающей части. Обучающих объектов 1200,
тестовых — 597; тестовые объекты encoder не видел ни разу.
На тесте модель ищет для каждого «снимка» его подпись среди всех 597
кандидатов:
^(i)=argjmaxvˉi⊤uˉj.
Уровень случайного угадывания задаётся размером пула:
R@1случ=N1=5971=0,17%.
Правильная подпись оказывается первой в 63,1% случаев, попадает в первую
пятёрку в 90,6% и в первую десятку в 94,5%; медианный ранг равен 1.
Случайный выбор дал бы 100/597=0,17%. Мы не сообщали модели ни одной
метки класса — только то, какие две половинки принадлежат одному объекту.
Слева — запрос, справа три ближайших «подписи» с косинусной близостью. Зелёная
рамка — та самая размеченная пара, жёлтая — чужая подпись, но той же цифры,
красная — содержательно чужая. Две нижние строки формально считаются ошибками
поиска, хотя человек назвал бы предложенные подписи уместными.
Что видит матрица B×B
Матрица косинусов — главный объект урока. По диагонали стоят размеченные пары,
вне диагонали — соперники. Но соперники неоднородны: часть из них не имеет
ничего общего с запросом, а часть описывает объект того же сорта.
Двенадцать реальных тестовых объектов. Зелёные рамки — положительные пары,
красный пунктир — «отрицательные», у которых на самом деле та же цифра. Справа
одна и та же строка матрицы после softmax при τ=0,02 и τ=0,5:
холодный softmax отдаёт почти всю вероятность одному кандидату, тёплый
размазывает её по всем.
Посчитаем, сколько ложных отрицательных приходится на строку. В наборе десять
классов, распределённых почти поровну; при случайном батче B=64 среднее число
объектов того же класса в строке равно 6,28, то есть 10,0% всех
соперников. Модель на каждом шаге получает приказ оттолкнуть примерно шесть
подписей, которые человек счёл бы подходящими.
Температура: кому достаётся штраф
Температура τ — это масштаб логитов, а не косметика. Производная потерь по
логиту равна расхождению между предсказанной вероятностью и меткой:
Через цепное правило штраф превращается в силу, действующую на сами векторы:
∂vˉi∂LI→T=Bτ1j=1∑B(pij−1{i=j})uˉj,
а нормировка пропускает через себя лишь составляющую, перпендикулярную самому
вектору:
∂v∂vˉ=∥v∥1(I−vˉvˉ⊤).
Итог прост:
положительная пара притягивается, каждый соперник отталкивается с весом
pij. А распределение этих весов целиком задано температурой.
τ→0limpij→1{j=argkmaxcik},τ→∞limpij→B1.
На нашей обученной модели это измеримо. Доля отталкивающего градиента,
доставшаяся самому трудному сопернику строки, равна 76,8% при
τ=0,02 и всего 0,6% при τ=0,5. Холодный softmax — это почти
метод «отталкивай ближайшего», тёплый — «отталкивай всех понемногу».
Перебор температуры при прочих равных даёт неожиданно поучительную картину:
Recall@1 равен 60,3% при τ=0,02, 63,1% при τ=0,1 и
падает до 48,9% при τ=1. А вот доля случаев, когда найденная подпись
принадлежит той же цифре, ведёт себя иначе: её максимум 95,0% достигается
при τ=0,2. Холодная температура заостряет опознание конкретного
экземпляра, тёплая бережнее сохраняет классовую структуру. Одного «правильного»
τ не существует — есть выбор между двумя разными задачами.
Рис. 84.3. Температура выбирает, какую задачу решать
Слева: точность поиска конкретной пары и точность попадания в тот же класс
ведут себя по-разному. Справа: доля отталкивающего градиента, доставшаяся
ближайшему сопернику. В обучаемых моделях τ обычно параметр, но его
ограничивают снизу — иначе один-единственный трудный сосед определяет весь шаг.
Сколько нужно соперников
Расхожий лозунг гласит: «чем больше батч, тем больше отрицательных, тем лучше
пространство». Проверим его на своих данных, уравняв число проходов по выборке
(иначе маленький батч получит больше шагов и сравнение станет нечестным).
Измерения: B=8 даёт Recall@1 65,8%, B=16 — 64,0%, B=32 —
62,1%, B=64 — 63,8%, B=128 — 58,5%, B=256 — 59,6%.
Весь разброс укладывается в 7,4 процентных пункта и не образует
монотонного роста. Более того, повтор той же конфигурации B=64 с чуть иным
числом шагов дал 63,1% вместо 63,8% — это оценка шума перезапуска,
примерно 0,7 пункта, и меньшие различия обсуждать нельзя.
Вывод честный и полезный: на коллекции из 1200 объектов десятки соперников
уже исчерпывают полезную информацию, а дальше растёт лишь число ложных
отрицательных — при B=256 их около 25 на строку. Выигрыш от гигантских
батчей в промышленных моделях связан с коллекциями в миллиарды пар, где
случайный соперник почти никогда не бывает подходящим.
Рис. 84.4. Батч решает не всё, а пул кандидатов решает многое
Слева: при равном числе проходов размер батча не даёт монотонного улучшения, а
ожидаемое число ложных отрицательных растёт линейно. Справа: та же самая
обученная модель на пуле из 8 кандидатов показывает 97,5%, а на полном
пуле из 597 — 63,1%. Ничего не изменилось, кроме условий экзамена.
Ложный negative и мультипозитивный числитель
Если две подписи одинаково верны для снимка, одна из них в обычной схеме
объявлена соперником. Лечение известно: расширить числитель множеством
положительных P(i):
Li=−log∑jesij∑j∈P(i)esij,
или, в варианте с усреднением по положительным,
Li=−∣P(i)∣1j∈P(i)∑log∑kesikesij.
Но расширять множество положительных надо аккуратно, и это тоже можно измерить.
Обучим ту же архитектуру, объявив положительными все объекты того же класса.
Точность попадания в верный класс поднимается с 92,6% до 94,3%, зато
Recall@1 по конкретной паре рушится с 63,1% до 2,7%. Модель поняла,
что от неё требовали: она собрала все «тройки» в одну точку и перестала
различать почерк.
Что значит «общее пространство»
После нормировки от вектора остаётся только направление. Косинус лежит в
[−1,1], но его абсолютное значение ничего не говорит о «проценте смысла»:
масштаб зависит от модели, от температуры обучения и от набора кандидатов.
Смысл распределён по всем координатам, и координата номер 17 не означает
«собака».
Проверим геометрию на числах. Средняя близость размеченной пары равна
0,735, средняя близость случайной несогласованной пары — 0,001: центр
распределения ровно там, где ему полагается быть у независимых направлений. Но
средний максимум по строке (то есть близость самого трудного соперника) равен
0,713 — почти как у настоящей пары. Хвосты пересекаются, и именно в этом
пересечении живут все ошибки поиска.
Рис. 84.5. Пары и не-пары: два распределения с общим хвостом
Распределения косинусной близости на 597 тестовых объектах. Разрыв между
средними велик, но верхний хвост «не-пар» дотягивается до области настоящих
пар. Порог по абсолютной величине близости поэтому ненадёжен: калибровать надо
на целевом домене и на нужном пуле кандидатов.
Связь с эмбеддингами и низким рангом прямая, а язык расстояний и
проекций мы разбирали в уроке про PCA. Разница здесь одна, но
принципиальная: два разных encoder-а должны договориться об одной системе
координат, хотя видят совершенно разные входные данные.
Загоруйко: сходство имеет смысл только рядом с соперником
Мысль, что близость нельзя мерить в одиночку, была явно сформулирована в
новосибирской школе распознавания образов. Николай Григорьевич Загоруйко
(1931–2015), работавший в Институте математики Сибирского отделения, предложил
функцию конкурентного сходства — FRiS. Идея проста до дерзости: спрашивать «как
похож объект z на образ a» бессмысленно, пока не назван конкурент b.
Осмысленная величина — относительная:
F(z∣a,b)=r(z,b)+r(z,a)r(z,b)−r(z,a)∈[−1,1],
где r — расстояние; на единичной сфере удобно взять
r(z,a)=1−cos(z,a).
Если z вдвое ближе к своему образу, чем к сопернику,
FRiS равен 1/3; если расстояния равны, ровно нулю; знак сразу говорит, кто
победил.
Сходство наших формул с FRiS не поверхностное. Разложим потери одной строки при
единственном сопернике:
Li=log(1+e(cij−cii)/τ),
то есть потери зависят только от разности «своё минус чужое» — в точности от
конкурентного превосходства. При малых значениях аргумента
Li≈log2+2τcij−cii,
и градиент толкает именно разность, а не каждое сходство по отдельности.
Загоруйко строил на этой мере алгоритмы таксономии, отбора признаков и
цензурирования обучающей выборки — задач, которые сегодня формулируются как
«выбрать хорошие негативы».
Zero-shot: классификатор, собранный из подписей
Общее пространство позволяет строить классификатор без обучения классификатора.
Для класса c берут описания, кодируют их text encoder-ом и усредняют:
Заметим, что после нормировки прототипов это обычный линейный классификатор
над эмбеддингом снимка:
c^(i)=argcmax(Wvˉi)c,W=wˉ1⊤⋮wˉ10⊤,
только его веса не обучались градиентом, а собраны из текстов.
В нашем опыте роль «промптов» играют закодированные подписи обучающих объектов
класса. Прототип, усреднённый по всем обучающим примерам класса, даёт точность
71,4% на тесте. Если же взять по одному случайному примеру на класс —
аналог единственной неудачной формулировки промпта, — точность падает до
31,1% при разбросе ±3,1 пункта между попытками.
Это и есть измеренная цена формулировки. Ансамбль описаний не добавляет модели
знаний: он усредняет случайные отклонения отдельных векторов, оставляя общее
направление класса. Тот же эффект в больших моделях достигают набором шаблонов
вроде «фотография {класса}», «размытое фото {класса}», «рисунок {класса}».
Витгенштейн объясняет, почему промпт вообще имеет значение. Text encoder видел
слово не в словаре, а в потоке употреблений; фраза «спутниковый снимок кошки»
попадает в область, где употреблений почти не было, и вектор оказывается в
пустой части пространства. Промпт — это не заклинание, а указание области, из
которой модель будет доставать смысл.
Recall@K, margin и право на отказ
Метрика поиска устроена просто:
R@K=N1i=1∑N1{естьрелевантныйсредипервыхK}.
У неё два уязвимых места. Первое мы уже видели: значение зависит от размера
пула. Второе — определение «релевантного». Если в наборе одна подпись на
изображение, любая другая, даже верная по смыслу, считается ошибкой. В нашем
опыте 80,0% ошибок top-1 приходятся на подпись объекта того же класса.
Значит, «настоящая» доля бессмысленных ответов почти впятеро меньше, чем
показывает метрика.
Полезно помнить и теоретический смысл величины logB−L: она
оценивает снизу взаимную информацию между модальностями,
I(V;U)≥logB−L,
поэтому потери контрастивной модели упираются в потолок logB и никакая
идеальная модель не опустит их ниже нуля при конечном батче.
Полезнее всего разность между первым и вторым кандидатом:
mi=ci,(1)−ci,(2).
Отвечая лишь на долю α самых уверенных запросов, мы измеряем условную
точность
acc(α)=#{i:mi≥m(α)}#{i:mi≥m(α),^(i)=i}.
Медиана margin у нас равна 0,058 — то есть у половины запросов победитель
опережает второго меньше чем на шесть сотых косинуса. Если отвечать только на
20% запросов с наибольшим margin, точность top-1 поднимается с 63,1% до
92,4%. Система с правом молчать намного полезнее системы, обязанной всегда
называть первого.
Слева: сортируем запросы по margin и отвечаем только на самые уверенные —
классическая кривая «точность–покрытие». Справа: Recall@K на полном пуле из
597 кандидатов рядом с уровнем случайного угадывания 0,17%.
Сдвиг домена: те же цифры, другой сенсор
Проверим устойчивость. Сдвинем все тестовые изображения на один пиксель вбок —
объекты те же, класс тот же, человек не заметит разницы. Encoder заметит.
Recall@1 падает с 63,1% до 8,0%, доля попаданий в верный класс — с
92,6% до 45,6%, точность zero-shot по прототипам — с 71,4% до
15,9%. При этом отношение средних длин векторов до нормировки
ρ=E∥v∥E∥vсдвиг∥=1,87
выросло почти вдвое: сеть «кричит», что вход непривычен, но нормировка стирает
этот крик, и в косинусной близости он не виден.
Рис. 84.7. Сдвиг на один пиксель разрушает согласие модальностей
Слева — три метрики до и после сдвига на один пиксель. Справа — распределение
длин векторов до нормировки: у сдвинутых объектов оно уходит вправо. Норма
остаётся единственным честным сигналом «я вне обученной области», и её стоит
логировать отдельно.
Отсюда правило разбиения данных. Если бы соседние наблюдения попали и в
обучение, и в тест, мы измерили бы не перенос, а память: близкие объекты
почти дублируют друг друга. Для спутниковых снимков это буквально так —
соседние фрагменты одной сцены различаются именами файлов, но не содержанием.
Географическое разбиение вместо случайного — тот же принцип, что и в
уроке про train/val/test, только «утечка» здесь географическая.
Смещения веб-пар: подпись описывает не то, что на снимке
В настоящих web-парах текст часто говорит о странице, а не об изображении.
Подпись «нажмите для покупки» ничего не сообщает о товаре. Мем содержит слова
прямо в пикселях, и модель может научиться их читать вместо распознавания
сцены. Водяной знак фотобанка коррелирует с тематикой снимка.
Контрастивная модель усваивает всё, что помогает отличать пары: шаблоны
подписей, стиль фотостока, разрешение, географические и социальные стереотипы,
популярность знаменитостей. Она не отличает признак «полезный» от признака
«удобный», потому что objective спрашивает только про выбор пары.
Отсюда обязательная часть работы — аудит. Строят сбалансированные наборы
изображений и контрфактические промпты, в которых меняется единственный
чувствительный атрибут при сохранении профессии или занятия, и смотрят на сдвиг
близости. Вывод о конкретном человеке по такой близости делать нельзя никогда:
цель аудита — обнаружить смещение представления, а не «измерить» людей. Тема
продолжает разговор о том, откуда берётся бесплатная разметка, из
урока 78.
Лаборатория общего пространства
Окружность, температура и ложный negative
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
После нормировки всё пространство помещается на окружность, поэтому лаборатория
рисует именно её. Круги — снимки, квадраты — подписи; стрелки показывают силы,
действующие на подписи со стороны первого снимка: зелёная притягивает свою
пару, красные отталкивают соперников. Сдвиньте подпись T2 вплотную к снимку
I1 и уменьшайте температуру: смотрите, как доля отталкивания, доставшаяся
ближайшему сопернику, растёт к сотне процентов, а остальные соперники перестают
получать хоть какой-то сигнал.
Затем переключите режим на «две верных подписи». Числитель становится
мультипозитивным, красная стрелка у T2 гаснет — модель больше не расталкивает
то, что должно стоять рядом. Кнопка «шаг обучения» честно применяет градиент к
обеим модальностям: нажмите её несколько раз в обоих режимах и сравните
итоговую картину. При одном положительном пары выстраиваются равномерно по
окружности, при двух — сливаются в общий кластер. Это и есть выбор между
«различать экземпляры» и «различать классы», который мы измеряли числами.
Куда это ведёт: генерация и переоптимизация метрики
Text-image пространство редко остаётся самостоятельным продуктом. Его вектор
служит условием для генератора, отбирает подписи, работает перцептивной
метрикой качества. В diffusion-модели текстовое условие обычно
входит через cross-attention, а CLIP-подобный encoder участвует в фильтрации
обучающих данных и в оценке результата.
И здесь подстерегает ловушка. Пусть кто-то решает задачу
x⋆=argxmaxvˉ(x)⊤uˉ(текст),
то есть максимизирует близость к тексту прямо в пикселях, получится изображение с артефактами и высокой близостью: метрика
измеряет то, что ей задали, а не то, что мы имели в виду.
Практический вывод: держать оценку и оптимизацию врозь. Модель, по которой
считается перцептивная близость, не должна совпадать с моделью, которую
оптимизируют; независимая человеческая оценка обязательна; сравнение двух
систем при разных настройках приближённого индекса поиска нечестно, потому что
инфраструктурная погрешность легко съедает разницу представлений.
Пара определяет пространство
Контрастивный loss создаёт общий язык не тем, что «понимает» смысл, а тем, что
заставляет решать задачу выбора. Всё, что мы измерили, — следствия того, как эта
задача поставлена: температура решает, кому достанется штраф (76,8%
одному сопернику при τ=0,02 против 0,6% при τ=0,5); размер
партии определяет число соперников и вместе с ним число ложных отрицательных
(6,28 на строку при B=64); определение положительного выбирает между
поиском экземпляра (63,1%) и поиском класса (94,3%); размер пула
меняет метрику вчетверо при неизменной модели; сдвиг на один пиксель роняет
Recall@1 в восемь раз.
Общее пространство полезно ровно настолько, насколько честно определены пары.
Это старая мысль Загоруйко о конкурентном сходстве, записанная через softmax:
близость не абсолютна, она всегда «ближе, чем кто».