Двадцять одна тема позаду, і в кожній мережа вчилася з міток. Хтось сідав і писав навпроти кожної картинки число: це клас 3, це клас 5. Ми міняли архітектури, згортку на увагу, увагу на вікна зі зсувом — але джерело знання лишалося тим самим, і воно було дороге. Ця тема міняє саме джерело. Виявляється, у світі вже лежать мільярди зображень із текстом поруч: підпис під фотографією, alt-текст у розмітці сторінки, назва товару в оголошенні. Ніхто не писав їх для нейромереж. Але вони описують те, що на картинці, — а отже, це теж нагляд, тільки дармовий.
ДжерелоЗвідки брати нагляд
Почнемо з ціни. У темі 02 ми вже рахували, скільки коштує розмітка: класифікація — секунди на зображення, рамки — десятки секунд, маска пікселів — хвилини. ImageNet, на якому виріс увесь сучасний зір, це чотирнадцять мільйонів розмічених зображень і роки роботи багатьох людей. Такий набір роблять раз на десятиліття, і кожен новий домен доводиться розмічати наново.
У темі 16 ми знайшли один вихід: вигадати задачу з самих даних. Мітки не потрібні взагалі — беремо два види одного зображення й вимагаємо, щоб мережа впізнала в них те саме. Це працює, але має межу: вивчені ознаки хороші, а що на зображенні, модель усе одно не знає. Щоб дізнатися, доводиться приносити мітки — хай і небагато.
Тут ми беремо інший вихід. Мітка — це число з наперед складеного списку: шість класів, тисяча класів, скільки завгодно, але список скінченний і складений заздалегідь. Підпис — це речення. Порівняй:
| Мітка | Підпис |
|---|---|
| клас 3 | «велике кільце вгорі» |
| один із шести варіантів | будь-які слова, які знає мова |
| каже, що це | каже, що це, яке воно, де воно і що поруч |
| пише людина спеціально для моделі | уже написано, і не для нас |
Головна різниця не в кількості інформації, хоч її і більше. Головна різниця в тому, що список класів більше не треба складати заздалегідь. Якщо модель уміє зіставляти зображення з текстом, то класи можна задавати реченням просто під час роботи — і жодного нового навчання для цього не потрібно. Саме звідси береться здатність, заради якої ми сюди й прийшли.
БудоваДві вежі
Модель складається з двох окремих мереж, які не мають жодної спільної ваги. Їх звуть вежами (towers), і кожна робить свою половину роботи.
Бере картинку й видає вектор — стовпчик із фіксованої кількості чисел. У нас це знайома згорткова мережа з теми 09: три блоки «згортка → ReLU → пулінг» перетворюють 28×28 на 288 чисел, а лінійний шар стискає їх до 32. Разом 15 136 ваг.
Бере речення й видає вектор тієї самої довжини — теж 32 числа. У справжньому CLIP це трансформер; у нас — два лінійні шари поверх мішка слів, 2 432 ваги.
Вежі ніде не перетинаються — аж до останнього кроку, де ми беремо косинус між двома векторами. Це і є вся звʼязка між модальностями: одне число.
Спинимось на мішку слів, бо це найпростіша чесна текстова вежа, і новачкові варто побачити її повністю. Заводимо словник — список слів, які модель узагалі може зрозуміти. У нас їх сімнадцять. Речення перетворюється на вектор довжини сімнадцять, де проти кожного присутнього слова стоїть одиниця, а проти відсутнього — нуль. Далі цей вектор іде у звичайні лінійні шари, як будь-які інші числа.
Одна деталь, без якої вся тема розсипалась би, і вона суто мовна. В українській прикметник змінюється за родом: «велике коло», але «великий квадрат». Якби ми вважали ці два слова різними, то слово «велике» модель побачила б лише з двома формами із шести — і перевірити композиційність у розділі 7 стало б неможливо. Тому наш токенізатор ріже слово до основи: «велик-» покриває обидві форми, «кол-» покриває і «коло», і «кола» в «фото кола». Справжні моделі роблять по суті те саме субслівними токенізаторами — розбивають рідкісне слово на частіші шматки.
Дві вежі й одне число між ними
Ліворуч зображення йде в згорткову вежу, знизу опис іде в текстову. Обидві видають по 32 числа. Перемкни пару й подивись, як міняється косинус між ними — і що буде, якщо підставити чужий опис.
ВтратаКонтрастна втрата між модальностями
Тепер серце теми. Формула тут одна, і ми вже її писали — у темі 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. Тут не так. Рядки — зображення, стовпці — описи, і це різні сутності. Тому питання «який опис підходить цьому зображенню» і «яке зображення підходить цьому опису» — два різні питання, і відповідати треба на обидва.
Беремо партію з N пар. Нормуємо всі вектори на довжину 1 і множимо матрицю зображень на матрицю описів. Виходить квадрат N×N, де в клітинці (i, j) стоїть косинус між i-м зображенням і j-м описом. Правильні пари — на діагоналі.
Ділимо все на температуру τ і рахуємо звичайну перехресну ентропію по рядках: для кожного зображення правильна відповідь — номер його стовпця. Це «зображення шукає свій опис».
Те саме по стовпцях: для кожного опису правильна відповідь — номер його рядка. Це «опис шукає своє зображення».
Береться півсума двох втрат. Через це втрату й називають симетричною: не тому, що матриця симетрична — вона якраз ні, — а тому, що ми однаково караємо за помилку в обидва боки.
Тут 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 — задача для неї практично розвʼязана.
Втрата по кроках
Сім кроків від матриці косинусів до одного числа. Тисни «крок» і дивись, що саме потрапляє в чисельник, що — у знаменник і навіщо все це рахується двічі.
ЗамірМатриця схожості
Перше твердження, яке треба перевірити числом: після навчання спільний простір справді існує. Формально це означає, що зображення лежить близько до свого опису й далеко від чужих. Беремо дванадцять тестових зображень, складаємо для кожного правильний повний опис і дивимось на матрицю косинусів.
| Що поміряно | значення | рівень вгадування |
|---|---|---|
| косинус зі своїм описом | 0.869 ±0.007 | — |
| косинус із чужим описом | 0.050 ±0.010 | — |
| пошук опису за зображенням (з 12) | 0.889 ±0.039 | 0.083 |
Розрив між 0.869 і 0.050 — це і є весь результат навчання. До навчання обидва числа були б однаковими: випадкові вектори дивляться куди завгодно. Третій рядок — уже готова корисна задача: пошук. Найбільше число в рядку стоїть саме на діагоналі у 0.889 випадків — тобто, показавши моделі зображення, ми майже завжди дістаємо його власний опис першим із дванадцяти. Дзеркальна задача — знайти зображення за текстом — читається з тієї самої матриці по стовпцях, і саме вона працює в пошуку по фотоархівах.
Матриця схожості
Вісім зображень проти восьми описів. Кнопка перемикає між сирими косинусами й частками після softmax, а повзунок температури міняє контраст цих часток. Діагональ обведена — саме вона має світитися.
РучкаТемпература
Температура τ (грецька літера «тау» — просто число) ділить усі схожості перед експонентою. У темі 16 ми дивились на неї з боку навчання: мала температура робить втрату майже повністю залежною від найсхожішого чужого прикладу. Тут вона показує друге обличчя — вона формує саму геометрію спільного простору.
Навчимо моделі з чотирма різними температурами й подивимось не лише на якість, а й на те, як розкладені вектори після навчання.
| τ | свій опис | чужий опис | zero-shot |
|---|---|---|---|
| 0.02 | 0.864 | 0.553 | 0.871 ±0.034 |
| 0.07 | 0.869 | 0.050 | 0.863 ±0.017 |
| 0.20 | 0.933 | -0.027 | 0.888 ±0.010 |
| 0.50 | 0.951 | -0.012 | 0.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 косинуса), пунктир показує прямий кут.
Практичний висновок такий самий, як із багатьма гіперпараметрами в цьому курсі: температура має робоче вікно, а не оптимум. Обидва краї шкідливі з різних причин, а всередині широкої середини різниця тоне в розкиді від зерна. Справжній CLIP стартує з τ = 0.07 і вчить її разом із вагами, обмежуючи знизу, — саме щоб не звалитись у лівий край.
НовинаZero-shot: класи, задані реченням
Ось нова здатність, якої в курсі ще не було. Щоб класифікувати зображення, нам не потрібен класифікатор. Досить написати шість речень — по одному на клас, — прогнати їх через текстову вежу й спитати, до якого з шести векторів зображення ближче. Це й зветься zero-shot — дослівно «нуль пострілів», але shot тут означає навчальний приклад, а не постріл: нуль прикладів на клас, нуль ваг класифікатора, нуль додаткового навчання. Назву лишаємо англійською, бо саме в такому вигляді читач зустріне її в статтях, у назвах метрик і в іменах аргументів бібліотек.
Порівняємо три способи дістати відповідь «яка це фігура». Усі — на тому самому тестовому наборі з 600 зображень, усі — на трьох зернах.
Два з трьох способів треба назвати, бо далі вони стоятимуть у таблиці. Навчання з нуля — звичайний шлях усіх попередніх тем: беремо чисту згорткову мережу, показуємо їй N розмічених зображень і вчимо все, від першого фільтра до останнього шару. Лінійна проба (linear probe) — компроміс: вежу зображень залишаємо замороженою, тобто жодної її ваги не чіпаємо, а поверх готового вектора з 32 чисел довчаємо один-єдиний лінійний шар на шість класів. Це стандартний спосіб спитати «а скільки корисного вже лежить у цьому векторі?»: якщо навіть найпростіший шар поверх нього дає високу точність, то роботу зробила вежа, а не шар.
| Спосіб | міток | точність |
|---|---|---|
| zero-shot | 0 | 0.863 ±0.017 |
| лінійна проба | 60 | 0.866 ±0.029 |
| навчання з нуля | 60 | 0.379 ±0.047 |
| лінійна проба | 300 | 0.876 ±0.012 |
| навчання з нуля | 300 | 0.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 приблизно нічого.
Пояснення просте й важливе: вежа зображень уже вивчила все потрібне — не з міток, а з описів. Мітки лишень перекладають вивчене на мову шести номерів, і цю роботу однаково добре виконує і лінійний шар, і шість речень.
І ще одне, чого мітка не дала б у принципі. Опис знає про картинку більше, ніж клас, — тож спитаємо модель не «яка це фігура», а «вона велика чи маленька» і «де вона в кадрі». Класифікатора для цих питань ніколи не існувало й не зʼявиться: класи задаються текстом просто зараз.
| Питання, задане текстом | варіантів | точність | вгадування |
|---|---|---|---|
| яка це фігура | 6 | 0.863 ±0.017 | 0.167 |
| велика чи маленька | 2 | 0.999 ±0.001 | 0.500 |
| де вона в кадрі | 5 | 0.998 ±0.001 | 0.200 |
0.999 і 0.998 — практично безпомилково. Задача, звісно, легша за розпізнавання форми: у двох підказках різниться одне слово, а саму форму ми називаємо правильно самі. Але важлива тут не висота числа, а те, що жодного класифікатора для цих питань не існує й не існувало. Хочеш питати про розмір — питай про розмір; хочеш про положення — питай про положення; мережа лишається та сама, і донавчати її не треба. Це і є та зміна інженерії, заради якої CLIP розійшовся по галузі.
Класифікація без класифікатора
Обери зображення й подивись на шість косинусів — це весь механізм рішення. Ніякої голови, ніяких навчених ваг класів: є вектор картинки, є шість векторів речень, перемагає найбільший косинус.
ПеревіркаКомпозиційність
А тепер найцікавіше питання теми — і найризикованіше, бо відповідь могла виявитись (і виявилась) не тією, якої хотілося.
Модель бачила «велике коло». Модель бачила «маленьке кільце». Чи впізнає вона велике кільце, якщо такої пари в навчанні не було жодного разу? Якщо так — вона склала два слова, яких разом не бачила, і це справжня композиційність: здатність зібрати нове значення зі знайомих частин. Саме на неї спираються всі обіцянки про «мережа розуміє мову».
Замір простий. Забираємо з навчання всі пʼять комбінацій «кільце × великий розмір» — лишається 55 комбінацій із 60. Навчаємо три нові моделі. Перевіряємо на дванадцяти підказках виду «розмір + форма»: модель має вибрати «велике кільце». Рівень вгадування — 1/12 = 0.083.
| Модель і набір | пара цілком | форма | розмір |
|---|---|---|---|
| без пари → великі кільця | 0.140 ±0.043 | 0.140 ±0.043 | 0.967 ±0.047 |
| без пари → бачені пари | 0.850 ±0.016 | 0.859 ±0.012 | 0.987 ±0.009 |
| з парою → великі кільця | 1.000 ±0.000 | 1.000 ±0.000 | 1.000 ±0.000 |
| з парою → бачені пари | 0.865 ±0.018 | 0.866 ±0.019 | 0.996 ±0.001 |
| рівень вгадування | 0.083 | 0.167 | 0.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.020 | 0.893 · 0.847 · 0.860 |
| «фото кола» | 0.863 ±0.017 | 0.887 · 0.848 · 0.855 |
| «маленьке коло вгорі» | 0.849 ±0.014 | 0.868 · 0.842 · 0.837 |
| ансамбль двох | 0.863 ±0.017 | 0.887 · 0.847 · 0.857 |
Перше, що тут треба зробити, — не повірити середнім. Розкид від зерна тут 0.014–0.020, а вся відстань між найкращим і найгіршим варіантом — 0.018. По середніх довести не можна нічого. Правильний спосіб — рахувати різницю в межах кожного зерна окремо: спільна частина розкиду тоді скорочується, і лишається чистий ефект формулювання.
Ось ці різниці, порахувані по кожному зерну окремо:
- «фото кола» проти голої назви: -0.007, +0.002, -0.005. Знак стрибає — ефекту немає.
- ансамбль двох формулювань: -0.007, 0.000, -0.003. Те саме — ефекту немає.
- «маленьке коло вгорі»: -0.025, -0.005, -0.023 — завжди гірше, на всіх трьох зернах.
Отже єдиний надійний висновок нашого заміру: надто конкретна підказка стабільно шкодить, а решта відмінностей тоне в шумі. Причина видима: підказка «маленьке коло вгорі» бреше про більшість зображень — не всі кола маленькі й не всі вгорі. Модель чесно відповідає на те, що написано, і платить за це точністю.
А чому «фото кола» не допомогло, хоча в справжньому CLIP підказка «a photo of a {клас}» стабільно допомагає? Ми нічого не зробили не так — річ у розподілі навчальних описів. Наші пʼять шаблонів включали і голу назву («коло»), і форму з «фото» («фото кола»), і траплялися вони однаково часто. Для нашої моделі обидва формулювання однаково звичні, тому вибирати між ними нема з чого. У справжнього CLIP не так: у підписах із вебу голе слово стоїть рідко, а речення на кшталт «a photo of a cat» — часто. Шаблон виграє саме тому, що схожий на те, чим модель годували.
Це той самий механізм, що зіпсував нашу надто конкретну підказку, тільки з іншим знаком. Обидва випадки кажуть одне: модель відповідає не на поняття, а на фразу, і виграє та фраза, яка ближча до її навчального розподілу.
Формулювання вирішує
Ті самі шість класів, чотири способи їх назвати. Стовпець — середнє по трьох зернах, крапки — самі зерна. Пунктир — рівень вгадування.
МежіДе воно ламається
Три речі, яких контрастна модель не вміє. Не «вміє погано» — саме не вміє, і корисно побачити, чому саме.
Заперечення
Дамо моделі шість підказок: «не коло», «не квадрат» і так далі. Для зображення кола правильною є будь-яка з них, крім «не коло». Порахуємо, як часто модель обирає рівно ту єдину, що точно хибна.
Результат: 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 ми нізвідки не завантажуємо й не запускаємо.
| Що | Скільки |
|---|---|
| Пар «зображення + текст» | 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 детектора.