CLIP і мультимодальність

Що буде, якщо перестати підписувати картинки числами й почати підписувати їх словами. Зображення й текст потрапляють в один простір, і мережа раптом уміє класифікувати те, чого їй ніколи не показували, — бо класи тепер пишуть реченням.

Двадцять одна тема позаду, і в кожній мережа вчилася з міток. Хтось сідав і писав навпроти кожної картинки число: це клас 3, це клас 5. Ми міняли архітектури, згортку на увагу, увагу на вікна зі зсувом — але джерело знання лишалося тим самим, і воно було дороге. Ця тема міняє саме джерело. Виявляється, у світі вже лежать мільярди зображень із текстом поруч: підпис під фотографією, alt-текст у розмітці сторінки, назва товару в оголошенні. Ніхто не писав їх для нейромереж. Але вони описують те, що на картинці, — а отже, це теж нагляд, тільки дармовий.

ДжерелоЗвідки брати нагляд

Почнемо з ціни. У темі 02 ми вже рахували, скільки коштує розмітка: класифікація — секунди на зображення, рамки — десятки секунд, маска пікселів — хвилини. ImageNet, на якому виріс увесь сучасний зір, це чотирнадцять мільйонів розмічених зображень і роки роботи багатьох людей. Такий набір роблять раз на десятиліття, і кожен новий домен доводиться розмічати наново.

У темі 16 ми знайшли один вихід: вигадати задачу з самих даних. Мітки не потрібні взагалі — беремо два види одного зображення й вимагаємо, щоб мережа впізнала в них те саме. Це працює, але має межу: вивчені ознаки хороші, а що на зображенні, модель усе одно не знає. Щоб дізнатися, доводиться приносити мітки — хай і небагато.

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

МіткаПідпис
клас 3«велике кільце вгорі»
один із шести варіантівбудь-які слова, які знає мова
каже, що цекаже, що це, яке воно, де воно і що поруч
пише людина спеціально для моделіуже написано, і не для нас

Головна різниця не в кількості інформації, хоч її і більше. Головна різниця в тому, що список класів більше не треба складати заздалегідь. Якщо модель уміє зіставляти зображення з текстом, то класи можна задавати реченням просто під час роботи — і жодного нового навчання для цього не потрібно. Саме звідси береться здатність, заради якої ми сюди й прийшли.

Наскрізний приклад теми. Ті самі шість фігур 28×28, що й у блоках 2–4, але тепер у кожної є ще два параметри: розмір (маленька або велика) і положення в кадрі (у центрі, вгорі, внизу, ліворуч, праворуч). Шість форм × два розміри × пʼять положень — 60 комбінацій. З цих параметрів генератор складає справжні описи: «велике коло вгорі», «маленький хрест у центрі», «кільце ліворуч». Ані зображень, ані підписів ми нізвідки не завантажуємо — усе малюється й складається формулами.

БудоваДві вежі

Модель складається з двох окремих мереж, які не мають жодної спільної ваги. Їх звуть вежами (towers), і кожна робить свою половину роботи.

Вежа перша · зображення

Бере картинку й видає вектор — стовпчик із фіксованої кількості чисел. У нас це знайома згорткова мережа з теми 09: три блоки «згортка → ReLU → пулінг» перетворюють 28×28 на 288 чисел, а лінійний шар стискає їх до 32. Разом 15 136 ваг.

Вежа друга · текст

Бере речення й видає вектор тієї самої довжини — теж 32 числа. У справжньому CLIP це трансформер; у нас — два лінійні шари поверх мішка слів, 2 432 ваги.

Місце зустрічі

Вежі ніде не перетинаються — аж до останнього кроку, де ми беремо косинус між двома векторами. Це і є вся звʼязка між модальностями: одне число.

Що таке косинус між двома векторами (косинусна близькість, cosine similarity). Вектор із 32 чисел — це стрілка з початку координат у 32-вимірному просторі; уявляти його можна як звичайну стрілку на площині, просто напрямків більше. Косинус міряє кут між двома такими стрілками й не залежить від їхньої довжини: 1 — дивляться рівно в один бік, 0 — під прямим кутом, тобто нічого спільного, −1 — у протилежні боки. Рахується він у два кроки: перемнож вектори поелементно й додай добутки, а тоді поділи на добуток їхніх довжин. На двовимірному прикладі: вектори (1, 0) і (1, 1) дають добуток 1·1 + 0·1 = 1, довжини 1 і √2 ≈ 1.414, отже косинус = 1 / 1.414 = 0.707 — це кут 45°. Далі в темі кожне число, яким модель відповідає, — це такий косинус.

Спинимось на мішку слів, бо це найпростіша чесна текстова вежа, і новачкові варто побачити її повністю. Заводимо словник — список слів, які модель узагалі може зрозуміти. У нас їх сімнадцять. Речення перетворюється на вектор довжини сімнадцять, де проти кожного присутнього слова стоїть одиниця, а проти відсутнього — нуль. Далі цей вектор іде у звичайні лінійні шари, як будь-які інші числа.

«велике коло вгорі» → [1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0]

Одна деталь, без якої вся тема розсипалась би, і вона суто мовна. В українській прикметник змінюється за родом: «велике коло», але «великий квадрат». Якби ми вважали ці два слова різними, то слово «велике» модель побачила б лише з двома формами із шести — і перевірити композиційність у розділі 7 стало б неможливо. Тому наш токенізатор ріже слово до основи: «велик-» покриває обидві форми, «кол-» покриває і «коло», і «кола» в «фото кола». Справжні моделі роблять по суті те саме субслівними токенізаторами — розбивають рідкісне слово на частіші шматки.

Дві вежі й одне число між ними

Ліворуч зображення йде в згорткову вежу, знизу опис іде в текстову. Обидві видають по 32 числа. Перемкни пару й подивись, як міняється косинус між ними — і що буде, якщо підставити чужий опис.

пара
який опис підставити
фігура—
косинус—
Дві мережі, які нічого не знають одна про одну, домовляються про спільну систему координат. Вежа зображень бачить лише пікселі, вежа тексту — лише мішок слів. Спільного в них немає нічого, крім одного числа в кінці й того, що обидві вчаться від нього. Цього досить: після навчання вектор картинки й вектор її опису дивляться майже в один бік.
Чому саме дві вежі, а не одна мережа на два входи. Можна було б зшити зображення й текст в одну послідовність і подати трансформеру разом. Так теж роблять, і якість буває вища. Але тоді, щоб знайти картинку за запитом, довелося б прогнати мережу для кожної пари «запит + картинка». Дві вежі дозволяють порахувати вектори мільярда зображень один раз, а далі кожен запит коштує один прогін текстової вежі й одне множення матриці на вектор. Саме тому CLIP так швидко опинився в пошукових системах по фотоархівах.

ВтратаКонтрастна втрата між модальностями

Тепер серце теми. Формула тут одна, і ми вже її писали — у темі 16, і зветься вона NT-Xent: у чисельнику свій, у знаменнику всі. Там ми брали два види одного зображення й вимагали, щоб вони зійшлися ближче, ніж кожен із них до чужих. Тут формула та сама, слово в слово.

Різниця рівно одна: два вектори тепер беруться з різних модальностей. Замість «зображення та його зсунута копія» — «зображення та його опис». Усе інше — температура, знаменник із чужих, мінус логарифм частки — переїжджає без жодної зміни.

Якщо ти цієї втрати ще не бачив, ось вона повністю — читати сусідню сторінку не доведеться. Назва NT-Xent — скорочення від normalized temperature-scaled cross entropy, і кожне слово в ній щось означає. Нормовані (normalized): усі вектори наперед стиснуто до довжини 1, і саме тому сума їхніх поелементних добутків одразу дає косинус — ділити на довжини вже не треба, бо обидві дорівнюють одиниці. Поділені на температуру (temperature-scaled): перед softmax усі схожості діляться на маленьке число τ, від чого різниці між ними стають різкішими. Перехресна ентропія (cross entropy) — звичайна втрата класифікатора: беремо частку, яку правильна відповідь відхопила після softmax, і ставимо перед її логарифмом мінус. Частка, близька до одиниці, дає втрату близько нуля; маленька частка — велику втрату. Логарифм тут і далі натуральний, за основою e ≈ 2.718.

Задача, яку така втрата ставить перед моделлю, формулюється одним реченням: серед усіх описів партії впізнай свій. Зображення порівнюється не з абстрактним «правильно», а з живими конкурентами — рештою описів, які того ж кроку потрапили в партію. Звідси й слово «контрастна»: модель учиться не з того, який опис правильний, а з того, чим він відрізняється від сусідніх. І звідси ж головний наслідок, до якого ми повернемось у розділі 10: що більша партія, то важча задача й то кориснішим виявляється кожен крок.

Одна нова деталь усе-таки зʼявляється, і вона важлива. Матриця схожості в темі 16 була квадратна й симетрична: всі 2N видів були однорідні, і схожість виду i до виду j дорівнювала схожості j до i. Тут не так. Рядки — зображення, стовпці — описи, і це різні сутності. Тому питання «який опис підходить цьому зображенню» і «яке зображення підходить цьому опису» — два різні питання, і відповідати треба на обидва.

Крок 1 · матриця

Беремо партію з N пар. Нормуємо всі вектори на довжину 1 і множимо матрицю зображень на матрицю описів. Виходить квадрат N×N, де в клітинці (i, j) стоїть косинус між i-м зображенням і j-м описом. Правильні пари — на діагоналі.

Крок 2 · перший напрямок

Ділимо все на температуру τ і рахуємо звичайну перехресну ентропію по рядках: для кожного зображення правильна відповідь — номер його стовпця. Це «зображення шукає свій опис».

Крок 3 · другий напрямок

Те саме по стовпцях: для кожного опису правильна відповідь — номер його рядка. Це «опис шукає своє зображення».

Крок 4 · середнє

Береться півсума двох втрат. Через це втрату й називають симетричною: не тому, що матриця симетрична — вона якраз ні, — а тому, що ми однаково караємо за помилку в обидва боки.

втрата = ½ · ( CE(S / τ, по рядках) + CE(ST / τ, по стовпцях) )

Тут S — матриця косинусів, CE — перехресна ентропія (та сама, що й у будь-якому класифікаторі: мінус логарифм частки, яку правильна відповідь відхопила після softmax), T угорі означає транспонування, тобто «поверни матрицю так, щоб рядки стали стовпцями».

Порахуємо її руками на чотирьох парах, щоб число перестало бути абстракцією. Візьмемо τ = 0.07 і найперший крок навчання: модель ще нічого не вміє, і всі шістнадцять косинусів однакові. Тоді після softmax кожен із чотирьох описів забирає в рядку рівно ¼, тобто частка свого = 0.250, а втрата = −log 0.250 = 1.386. Це рівень повного незнання — той самий log N, тільки для N = 4.

Тепер хай навчання зрушило з місця й свій опис обійшов кожного чужого всього на 0.05 косинуса. Ділення на температуру перетворює цей відрив на 0.05 / 0.07 = 0.714, після експоненти частка свого підскакує з 0.250 до 0.405, а втрата падає до 0.904. Без ділення на температуру той самий відрив 0.05 дав би частку 0.259 — тобто майже нічого. Ось навіщо температура стоїть у формулі: вона перетворює дрібну перевагу на помітну. А в уже навченій моделі, матрицю якої показує наступна фігура, перший рядок дає частку 0.9986 і втрату 0.001 — задача для неї практично розвʼязана.

Втрата по кроках

Сім кроків від матриці косинусів до одного числа. Тисни «крок» і дивись, що саме потрапляє в чисельник, що — у знаменник і навіщо все це рахується двічі.

крок1 / 7
У чисельнику свій, у знаменнику всі — і так двічі. Кроки 1–3 лише готують числа: косинуси діляться на температуру й проходять через експоненту. Втрата зʼявляється аж на кроці 4, коли ми питаємо, яку частку рядка забрав свій опис. Кроки 5–6 повторюють те саме по стовпцю, і аж крок 7 дає число, яке піде в градієнт.

ЗамірМатриця схожості

Перше твердження, яке треба перевірити числом: після навчання спільний простір справді існує. Формально це означає, що зображення лежить близько до свого опису й далеко від чужих. Беремо дванадцять тестових зображень, складаємо для кожного правильний повний опис і дивимось на матрицю косинусів.

Що помірянозначеннярівень вгадування
косинус зі своїм описом0.869 ±0.007—
косинус із чужим описом0.050 ±0.010—
пошук опису за зображенням (з 12)0.889 ±0.0390.083

Розрив між 0.869 і 0.050 — це і є весь результат навчання. До навчання обидва числа були б однаковими: випадкові вектори дивляться куди завгодно. Третій рядок — уже готова корисна задача: пошук. Найбільше число в рядку стоїть саме на діагоналі у 0.889 випадків — тобто, показавши моделі зображення, ми майже завжди дістаємо його власний опис першим із дванадцяти. Дзеркальна задача — знайти зображення за текстом — читається з тієї самої матриці по стовпцях, і саме вона працює в пошуку по фотоархівах.

Матриця схожості

Вісім зображень проти восьми описів. Кнопка перемикає між сирими косинусами й частками після softmax, а повзунок температури міняє контраст цих часток. Діагональ обведена — саме вона має світитися.

діагональ—
поза нею—
максимум на діагоналі—
втрата—
Косинуси не міняються від температури — міняються частки. Сира матриця вивчена раз і назавжди; температура лише вирішує, наскільки різко softmax перетворює її на розподіл. Тому втрата при τ = 0.02 дорівнює 0.000, а при τ = 1.0 виростає до 1.439 при стелі повного незнання log 8 = 2.079 — і це при тій самій, незмінній матриці.
Партія — це і є задача, і в неї є пастка. Контрастна втрата вважає своїм лише опис на діагоналі, а решту описів партії — чужими. Якщо два різні зображення в одній партії дістануть однаковий підпис, ми накажемо моделі розсунути те, що насправді однакове. У нашому наскрізному прикладі партія будується так, щоб описи не повторювались. У даних з інтернету цієї розкоші немає: однакові підписи там трапляються постійно, і це один із відомих шумів у навчанні справжнього CLIP.

РучкаТемпература

Температура τ (грецька літера «тау» — просто число) ділить усі схожості перед експонентою. У темі 16 ми дивились на неї з боку навчання: мала температура робить втрату майже повністю залежною від найсхожішого чужого прикладу. Тут вона показує друге обличчя — вона формує саму геометрію спільного простору.

Навчимо моделі з чотирма різними температурами й подивимось не лише на якість, а й на те, як розкладені вектори після навчання.

τсвій описчужий описzero-shot
0.020.8640.5530.871 ±0.034
0.070.8690.0500.863 ±0.017
0.200.933-0.0270.888 ±0.010
0.500.951-0.0120.816 ±0.030

Дивись на другий стовпець згори вниз. Він падає з 0.553 до -0.027, тобто саме температура вирішує, наскільки сильно модель розсуває чужі пари. При τ = 0.02 чужий опис лежить майже так само близько, як свій, і спільний простір виходить тісним. При τ = 0.20 чужі відсунуті вже за прямий кут. Це велика, наочна, легко відтворювана зміна геометрії.

А тепер подивись на четвертий стовпець — і побач те, чого я, чесно кажучи, не чекав. Точність zero-shot при τ = 0.02, 0.07 і 0.20 дорівнює 0.871, 0.863 і 0.888 при розкиді від зерна 0.010–0.034. Це одне й те саме число: різниця, менша за розкид, не є різницею. Гіршає лише правий край — 0.816 при τ = 0.50.

Це «гіршає» варто назвати точно, бо розкид тут вирішує все. Купа правого краю — від 0.786 до 0.846 — не перетинається з купою найкращої точки, 0.878…0.898 при τ = 0.20: на цьому порівнянні висновок тримається. А з купами сусідів, 0.846…0.880 і 0.837…0.905, вона дотикається краєм. Тож чесне формулювання таке: τ = 0.50 доведено гірша за 0.20 і не доведено гірша за 0.07 — на трьох зернах різниці там не видно.

Тут заховано ще одне корисне попередження. Найкрасивіша геометрія (діагональ 0.951, чужі при -0.012) вийшла саме там, де якість найгірша. Матриця схожості на дванадцяти прикладах виглядає переконливо, але метрикою вона не є — оцінювати треба на всьому тестовому наборі й на кількох зернах.

Що температура робить із простором

Чотири моделі з таблиці вище, по одній на панель. Горизонтальна стрілка — вектор зображення; бірюзова — вектор його власного опису, рожева — вектор чужого. Кут між стрілками взято просто з поміряних косинусів (кут = arccos косинуса), пунктир показує прямий кут.

Геометрія міняється сильно, точність — ні. Зліва направо чужий опис відʼїжджає з 56° аж за прямий кут, а свій підтягується з 30° до 18°: простір розсувається на очах. Але точність zero-shot під цими панелями стоїть 0.871 · 0.863 · 0.888 · 0.816 при розкиді до 0.034 — тобто три перші панелі нерозрізненні. Красива картинка простору не є метрикою.

Практичний висновок такий самий, як із багатьма гіперпараметрами в цьому курсі: температура має робоче вікно, а не оптимум. Обидва краї шкідливі з різних причин, а всередині широкої середини різниця тоне в розкиді від зерна. Справжній CLIP стартує з τ = 0.07 і вчить її разом із вагами, обмежуючи знизу, — саме щоб не звалитись у лівий край.

НовинаZero-shot: класи, задані реченням

Ось нова здатність, якої в курсі ще не було. Щоб класифікувати зображення, нам не потрібен класифікатор. Досить написати шість речень — по одному на клас, — прогнати їх через текстову вежу й спитати, до якого з шести векторів зображення ближче. Це й зветься zero-shot — дослівно «нуль пострілів», але shot тут означає навчальний приклад, а не постріл: нуль прикладів на клас, нуль ваг класифікатора, нуль додаткового навчання. Назву лишаємо англійською, бо саме в такому вигляді читач зустріне її в статтях, у назвах метрик і в іменах аргументів бібліотек.

Порівняємо три способи дістати відповідь «яка це фігура». Усі — на тому самому тестовому наборі з 600 зображень, усі — на трьох зернах.

Два з трьох способів треба назвати, бо далі вони стоятимуть у таблиці. Навчання з нуля — звичайний шлях усіх попередніх тем: беремо чисту згорткову мережу, показуємо їй N розмічених зображень і вчимо все, від першого фільтра до останнього шару. Лінійна проба (linear probe) — компроміс: вежу зображень залишаємо замороженою, тобто жодної її ваги не чіпаємо, а поверх готового вектора з 32 чисел довчаємо один-єдиний лінійний шар на шість класів. Це стандартний спосіб спитати «а скільки корисного вже лежить у цьому векторі?»: якщо навіть найпростіший шар поверх нього дає високу точність, то роботу зробила вежа, а не шар.

Спосібмітокточність
zero-shot00.863 ±0.017
лінійна проба600.866 ±0.029
навчання з нуля600.379 ±0.047
лінійна проба3000.876 ±0.012
навчання з нуля3000.684 ±0.031
рівень вгадування—0.167

Читати цю таблицю треба знизу вгору. Навчання з нуля на 60 мітках дає 0.379 при рівні вгадування 0.167 — шістдесяти прикладів мережі просто мало. На 300 мітках воно доростає до 0.684. А zero-shot, який не бачив жодної мітки, дає 0.863 — тобто більше, ніж повноцінне навчання на 300 мітках. Лінійна проба поверх тієї самої вежі дає 0.866 на 60 мітках і 0.876 на 300: шістдесят міток додають до zero-shot приблизно нічого.

Пояснення просте й важливе: вежа зображень уже вивчила все потрібне — не з міток, а з описів. Мітки лишень перекладають вивчене на мову шести номерів, і цю роботу однаково добре виконує і лінійний шар, і шість речень.

Чесна межа цього порівняння. «Нуль міток» не означає «безкоштовно». Наша вежа побачила 500 партій по 32 пари — шістнадцять тисяч зображень із описами. Правильне формулювання таке: нуль людських міток проти 300 людських міток. Описи згенерував той самий генератор, що й картинки, а мітки довелося б проставляти руками — і саме в цьому вся економія. У справжньому CLIP та сама логіка: підписи вже лежали в вебі й нікому не коштували.

І ще одне, чого мітка не дала б у принципі. Опис знає про картинку більше, ніж клас, — тож спитаємо модель не «яка це фігура», а «вона велика чи маленька» і «де вона в кадрі». Класифікатора для цих питань ніколи не існувало й не зʼявиться: класи задаються текстом просто зараз.

Питання, задане текстомваріантівточністьвгадування
яка це фігура60.863 ±0.0170.167
велика чи маленька20.999 ±0.0010.500
де вона в кадрі50.998 ±0.0010.200

0.999 і 0.998 — практично безпомилково. Задача, звісно, легша за розпізнавання форми: у двох підказках різниться одне слово, а саму форму ми називаємо правильно самі. Але важлива тут не висота числа, а те, що жодного класифікатора для цих питань не існує й не існувало. Хочеш питати про розмір — питай про розмір; хочеш про положення — питай про положення; мережа лишається та сама, і донавчати її не треба. Це і є та зміна інженерії, заради якої CLIP розійшовся по галузі.

Класифікація без класифікатора

Обери зображення й подивись на шість косинусів — це весь механізм рішення. Ніякої голови, ніяких навчених ваг класів: є вектор картинки, є шість векторів речень, перемагає найбільший косинус.

зображення
насправді—
модель каже—
відрив переможця—
Класи тут не в мережі, а в тексті. Щоб додати сьомий клас, не треба нічого донавчати — досить дописати сьоме речення. Щоб прибрати клас, досить стерти рядок. Це принципово інша інженерія, ніж усе, що ми робили в перших двадцяти одній темі. Прогорни всі шість зображень: на двох із них модель помиляється — це один конкретний набір із шести картинок, а не зріз тесту, де точність 0.863.

ПеревіркаКомпозиційність

А тепер найцікавіше питання теми — і найризикованіше, бо відповідь могла виявитись (і виявилась) не тією, якої хотілося.

Модель бачила «велике коло». Модель бачила «маленьке кільце». Чи впізнає вона велике кільце, якщо такої пари в навчанні не було жодного разу? Якщо так — вона склала два слова, яких разом не бачила, і це справжня композиційність: здатність зібрати нове значення зі знайомих частин. Саме на неї спираються всі обіцянки про «мережа розуміє мову».

Замір простий. Забираємо з навчання всі пʼять комбінацій «кільце × великий розмір» — лишається 55 комбінацій із 60. Навчаємо три нові моделі. Перевіряємо на дванадцяти підказках виду «розмір + форма»: модель має вибрати «велике кільце». Рівень вгадування — 1/12 = 0.083.

Модель і набірпара цілкомформарозмір
без пари → великі кільця0.140 ±0.0430.140 ±0.0430.967 ±0.047
без пари → бачені пари0.850 ±0.0160.859 ±0.0120.987 ±0.009
з парою → великі кільця1.000 ±0.0001.000 ±0.0001.000 ±0.000
з парою → бачені пари0.865 ±0.0180.866 ±0.0190.996 ±0.001
рівень вгадування0.0830.1670.500

Композиційності не виявлено. Модель, яка не бачила пари, впізнає її в 0.140 випадків при розкиді 0.043. Та сама модель на парах, які вона бачила, дає 0.850. Контрольна модель, у навчанні якої велике кільце було, дає на ньому 1.000. Різниця між 0.140 і 0.850 — це не «трохи гірше», це «не працює».

Розклад по стовпцях пояснює, чому саме. Розмір модель бере правильно в 0.967 випадків: слово «велик-» вона зрозуміла й переносить на незнайому форму без жодних проблем. Форму бере правильно лише в 0.140. І ось деталь, яка робить результат остаточним: якщо модель майже завжди каже «велике», то реальний вибір у неї не з дванадцяти підказок, а з шести — тих, що починаються на «велик-». Рівень вгадування там 0.167, а модель дає 0.140. Тобто форму вона обирає не краще, ніж навмання.

Видно й те, куди саме вона показує. Великих кілець у тесті рівно пʼятдесят — пʼять положень по десять зображень, — і на одному з трьох прогонів вони розклалися так: 29 разів «великий хрест», 12 разів «велике коло», 5 разів «великий ромб» — і лише 4 рази правильно. Не дай числам розійтись: чотири з пʼятдесяти — це 0.080, а в таблиці стоїть 0.140, бо там середнє по трьох прогонах, і розкид між ними ±0.043. Слово «кільце» у неї міцно зрослося з маленьким розміром, і розчепити їх нічим.

Це не вада нашої іграшки. Спокуса списати результат на мішок слів велика, але вона хибна: композиційність — відома відкрита проблема великих контрастних моделей, які мають повноцінний текстовий трансформер. Для неї придумали окремі перевірки саме тому, що моделі на них падають. Наш замір відтворює справжню властивість підходу, а не свою власну кострубатість. Механізм, найімовірніше, той самий: контрастна втрата винагороджує за те, щоб відрізнити свій підпис від чужих у партії, а для цього досить кількох сильних слів. Розбирати речення до кінця вигоди немає.

Пара, якої не було

Одне й те саме велике кільце, дванадцять підказок і дві моделі: одна бачила цю пару під час навчання, друга не бачила жодного разу. Перемкни й порівняй.

пара «велике кільце» в навчанні
модель каже—
«велике кільце»—
переможець—
Слово взяте правильно, форма — ні. Модель, яка не бачила великих кілець, майже завжди ставить у відповідь щось «велике» — прикметник вона зрозуміла. Але іменник «кільце» вона знає тільки маленьким, і зібрати з двох знайомих слів незнайому пару не виходить.

ФормулюванняІнженерія підказок

Класи в режимі zero-shot задаються текстом — а текст можна написати по-різному. Це звучить як дрібниця, поки не поміряєш. Порівняємо чотири способи назвати ті самі шість класів: голу назву («коло»), шаблон із «фото» («фото кола»), надто конкретний опис («маленьке коло вгорі») і ансамбль — коли клас описують двома реченнями відразу, беруть вектор кожного й порівнюють зображення вже з їхнім середнім.

Формулюванняточністьпо зернах
«коло»0.867 ±0.0200.893 · 0.847 · 0.860
«фото кола»0.863 ±0.0170.887 · 0.848 · 0.855
«маленьке коло вгорі»0.849 ±0.0140.868 · 0.842 · 0.837
ансамбль двох0.863 ±0.0170.887 · 0.847 · 0.857

Перше, що тут треба зробити, — не повірити середнім. Розкид від зерна тут 0.014–0.020, а вся відстань між найкращим і найгіршим варіантом — 0.018. По середніх довести не можна нічого. Правильний спосіб — рахувати різницю в межах кожного зерна окремо: спільна частина розкиду тоді скорочується, і лишається чистий ефект формулювання.

Ось ці різниці, порахувані по кожному зерну окремо:

Отже єдиний надійний висновок нашого заміру: надто конкретна підказка стабільно шкодить, а решта відмінностей тоне в шумі. Причина видима: підказка «маленьке коло вгорі» бреше про більшість зображень — не всі кола маленькі й не всі вгорі. Модель чесно відповідає на те, що написано, і платить за це точністю.

А чому «фото кола» не допомогло, хоча в справжньому CLIP підказка «a photo of a {клас}» стабільно допомагає? Ми нічого не зробили не так — річ у розподілі навчальних описів. Наші пʼять шаблонів включали і голу назву («коло»), і форму з «фото» («фото кола»), і траплялися вони однаково часто. Для нашої моделі обидва формулювання однаково звичні, тому вибирати між ними нема з чого. У справжнього CLIP не так: у підписах із вебу голе слово стоїть рідко, а речення на кшталт «a photo of a cat» — часто. Шаблон виграє саме тому, що схожий на те, чим модель годували.

Це той самий механізм, що зіпсував нашу надто конкретну підказку, тільки з іншим знаком. Обидва випадки кажуть одне: модель відповідає не на поняття, а на фразу, і виграє та фраза, яка ближча до її навчального розподілу.

Це радше вада, ніж перевага. Коли якість моделі залежить від того, як саме ти сформулював запит, — це означає, що модель розуміє не поняття, а звичні для неї фрази. Саме тому інженерія підказок перетворилася на окреме ремесло з ансамблями формулювань і довгими списками шаблонів — ремесло, якого не було б, якби модель розуміла слова, а не звички. І зверни увагу на другий бік того самого: наш ансамбль двох формулювань не дав нічого (-0.007, 0.000, -0.003), бо усереднювати варто варіанти, різні за якістю, а в нас вони однакові.

Формулювання вирішує

Ті самі шість класів, чотири способи їх назвати. Стовпець — середнє по трьох зернах, крапки — самі зерна. Пунктир — рівень вгадування.

формулювання
варіант—
точність—
Крапки важливіші за стовпці. Три зерна розкидані ширше, ніж відстань між деякими варіантами, — і це означає, що частина різниць між формулюваннями просто не існує. Читати такі таблиці треба по зернах, а не по середніх: різниця, менша за розкид, не є різницею.

МежіДе воно ламається

Три речі, яких контрастна модель не вміє. Не «вміє погано» — саме не вміє, і корисно побачити, чому саме.

Заперечення

Дамо моделі шість підказок: «не коло», «не квадрат» і так далі. Для зображення кола правильною є будь-яка з них, крім «не коло». Порахуємо, як часто модель обирає рівно ту єдину, що точно хибна.

Результат: 0.822 ±0.024. Тобто у 82 % випадків модель обирає рівно ту єдину підказку, яка гарантовано хибна. Для порівняння: на звичайних підказках, де правильна відповідь одна з шести, та сама модель влучає в 0.867 ±0.020 випадків. Тобто заперечення майже не доходить до моделі: вона майже з тією самою впевненістю показує на те саме слово, тільки тепер це слово стоїть у підказці, яка нічого не значить.

Але назвемо різницю чесно, бо вона є. 0.867 − 0.822 = 0.045, а розкид від зерна тут ±0.024 і ±0.020. Різниця майже вдвічі більша за розкид, купи не перетинаються (0.798…0.846 проти 0.847…0.887) — отже казати «числа збігаються» не можна: із запереченням модель усе-таки трохи менш категорична. Правильне формулювання таке: слово «не» забирає 0.045 із 0.867, а не перевертає відповідь. Якби модель бачила заперечення, ця частка впала б до нуля, у найгіршому разі — до рівня випадкового вибору 1/6 = 0.167. Замість цього вона лишилась на 0.822.

Причина проста й видима. Слово «не» додає в мішок слів одну одиницю, і решта мішка лишається та сама, тож два речення виходять із текстової вежі майже однаковими: косинус між векторами описів «коло» і «не коло» — 0.909. Заперечення в мішку слів — це не операція над змістом, а ще одне слово поруч.

Порядок

Опис «коло над квадратом» і опис «квадрат над колом» описують різні картинки. Наш мішок слів складається з тих самих трьох основ в обох випадках, тож вектори збігаються побітово: косинус між ними 1.000000, різниця косинусів із зображенням — 0.000000.

Розкид тут називати нема чого, і саме це найважливіше: це не замір, а тотожність. Два однакові мішки слів дають два однакові вектори на будь-яких вагах, на будь-якому зерні й до будь-якого навчання. Перевіряти нічого — досить подивитись на вхід.

Лічба

У нашому словнику немає жодного числівника, тому «два кола» дає той самий мішок, що й «коло»: косинус між цими двома описами 1.000000. Кількість не виражена нічим — отже, і розрізнити її нічим. Це знову тотожність, а не замір: розкид тут дорівнює нулю за побудовою.

Отже з трьох меж розділу заміром є лише перша: у заперечення є своє число з розкидом, 0.822 ±0.024, а в порядку й лічбі міряти нема чого — там тотожність, яку видно з самого входу.

Чесна межа цього заміру. Наша модель провалює порядок і лічбу за побудовою: мішок слів фізично не може їх виразити, і довести це можна без жодного навчання. Справжній CLIP має текстовий трансформер, який порядок бачить, — і все одно провалює ці самі задачі, тільки не рівно, а майже. Ось це і є справжня знахідка галузі: механізм для порядку є, а користуватися ним контрастна втрата не змушує. Нашу картинку варто читати як найпростіший випадок того самого явища, а не як його доказ.

Чотири типи опису

Один і той самий механізм — косинус із текстом — на звичайному описі, на запереченні, на описі з порядком і на лічбі. Перший працює, три інші ні.

тип опису
тип—
модель обрала—
Косинус не має де тримати логіку. Уся відповідь моделі — одне число між двома векторами. Заперечення, порядок і кількість — це відношення між частинами речення, а не властивості мішка слів; у механізмі, який зводить речення до однієї точки простору, їх просто нікуди покласти.

МасштабСправжній CLIP

Усе, що ми зробили, — це та сама ідея в мініатюрі. Тепер числа справжньої роботи. Усе в цьому розділі — цитовані числа з літератури, а не наші заміри: ваг справжнього CLIP ми нізвідки не завантажуємо й не запускаємо.

ЩоСкільки
Пар «зображення + текст»400 мільйонів, зібраних із відкритого вебу
Партія32 768 пар — тобто в кожному кроці 32 767 чужих описів
Вежа зображеньResNet або ViT; найкращий варіант — ViT-L/14 із входом 336 пікселів
Вежа текстутрансформер, 63 мільйони параметрів
Температурастартує з 0.07 і вчиться разом із вагами

Головний результат роботи 2021 року формулювався так: zero-shot CLIP на ImageNet приблизно дорівнює ResNet-50, навченому на самому ImageNet із мітками. Модель, яка не бачила жодної мітки ImageNet, зрівнялася з моделлю, навченою рівно на них. І, що виявилось важливішим за саму цифру, вона тримала цю якість на зсунутих версіях того самого набору — там, де звичайні класифікатори просідали.

Партія в 32 768 варта окремої уваги, бо це прямий наслідок формули з розділу 3. Знаменник — це і є складність задачі: при партії 32 768 модель має відрізнити свій підпис від 32 767 чужих. Саме тому контрастне навчання вимагає кластерів відеокарт — не через розмір моделі, а через розмір партії.

Що з цього виросло

Пошук за текстом. Порахувати вектори мільярда зображень один раз, а далі кожен запит — одне множення. Так працюють сучасні пошуки по фотоархівах.

Фільтрація датасетів. Виявилось, що CLIP зручно застосовувати до самих даних: беремо мільярди пар із вебу й лишаємо ті, де косинус між картинкою й підписом достатньо високий. Так зібрано відкриті набори, на яких навчено наступне покоління моделей. Тут є замкнене коло, і про нього чесно кажуть: набір відібрано моделлю, яка сама вчилася на схожому наборі.

Основа для генерації. Текстовий енкодер CLIP став тим містком, через який речення потрапляє в модель, що малює зображення. Коли ми дійдемо до дифузійних моделей у блоці 8, ми побачимо саме цю вежу на вході.

Метрика. Косинус між згенерованим зображенням і текстом запиту почали використовувати як міру «чи те намалювалося». Метрика зручна й тому популярна; її вади — рівно ті, що ми поміряли в розділах 7 і 9.

Зоопарк відкритих ваг. Бібліотека open_clip відтворила навчання на відкритих даних і виклала десятки моделей різного розміру. Це та бібліотека, з якої в реальній роботі починають, — але вона тягне ваги з мережі, тому в наших замірах її немає: усе, що ти прочитав вище, зроблено на власній крихітній моделі, навченій офлайн.

СпадокЩо успадковано від даних

Один технічний факт, який має практичні наслідки й тому належить темі, а не післямові.

Модель, навчена на підписах із вебу, успадковує розподіл цих підписів. Це не оцінка й не докір — це те саме твердження, що ми повторюємо з теми 10: модель вивчає той світ, який їй показали. Просто тут «світ» складніший, ніж набір фотографій: це ще й те, якими словами люди звикли ці фотографії підписувати.

Наслідки цілком інженерні. По-перше, якість zero-shot нерівна між поняттями: те, що в вебі підписують часто й однаково, розпізнається краще за те, що підписують рідко або різними словами. По-друге, звідси й береться чутливість до формулювання з розділу 8 — модель відтворює не поняття, а звичні для неї фрази. По-третє, модель не має способу сказати «я цього не знаю»: вона завжди поверне найбільший косинус, навіть якщо всі шість описів однаково далекі.

Практичний висновок один і простий: zero-shot треба міряти на своїх даних і своїх формулюваннях, а не покладатися на опубліковану цифру. Число з таблиці отримане на іншому розподілі й іншими підказками, і переносити його на свою задачу — та сама помилка, що переносити чужу швидкість навчання з підручника.

ПідсумокПідсумок блоку

Чотири теми тому ми почали з простого спостереження, яке доводиться трьома рядками коду: увага не бачить порядку. Переставиш патчі на вході — переставляться й виходи, і більше не зміниться нічого. З цього одного факту виріс увесь блок.

ТемаЩо вона додала
19 · Від згортки до уваги Кожен елемент сам обирає, з ким рахуватися. Ціна — квадратична за кількістю токенів; геометрію треба підказати окремо.
20 · Vision Transformer Зображення ріжеться на патчі й стає послідовністю. Три припущення згортки викинуто — і платити за них доводиться даними.
21 · Swin і гібриди Локальність і пірамідку повертають назад у трансформер: увага у вікні, злиття патчів між рівнями.
22 · CLIP Нагляд переїжджає з мітки в підпис. Зображення й текст опиняються в спільному просторі, і класи починають задаватися реченням.

Що трансформери дали зору насправді — питання, на яке чесно відповісти складніше, ніж здається. У замірі теми 20 на нашій маленькій задачі ViT програв згортковій мережі скрізь, маючи у вісім із половиною разів більше ваг. Це не аномалія: без величезних даних локальність, яку згортка знає задарма, доводиться купувати прикладами, і двох тисяч прикладів на це не вистачає.

Тому справжня відповідь не «трансформери кращі за згортки». Вона така: трансформери зробили можливими дві речі, яких згортка не давала. Перша — загальний енкодер, який без переробок їсть будь-яку послідовність векторів: патчі, слова, звукові кадри. Друга випливає з першої й саме вона стала темою цього розділу: якщо текст і зображення обробляються однорідно, їх можна навчити одному спільному простору. І тоді нагляд перестає бути числом зі списку.

Заразом блок дав кілька уроків, які не про трансформери зовсім. Що параметри не дорівнюють обчисленням — ViT-B/32 має більше ваг за ViT-B/16 і рахується швидше. Що канонічний результат зі статті не зобовʼязаний відтворитися на твоїх даних, і коли він не відтворився, писати треба те, що вийшло. І що негативний результат — теж результат: розділ 7 цієї теми не знайшов композиційності, і це корисніше знання, ніж якби ми його просто не міряли.

ДаліМісток далі

Усе, що ми робили двадцять дві теми поспіль, стосувалося зображення цілком. Класифікація дає одну відповідь на кадр. Zero-shot теж дає одну відповідь на кадр — просто вибрану з речень, а не зі списку. Навіть карта уваги з теми 17 лише пояснює, куди мережа дивилась, коли ухвалювала цю одну відповідь.

Наступний блок ставить інше питання: де саме на зображенні предмет — і скільки їх там. Відповіддю стає не один вектор, а список рамок із класами. Зміниться все: розмітка, метрика, будова виходу мережі й навіть те, що вважати помилкою. Зате багато чого зі зробленого поїде далі майже без змін — енкодер із блоків 2 і 4 стане backbone детектора.