Skip to content

Лекція 13 · Сучасне навчання подань ​

Досі ознаки для моделі готувала людина. Сьогодні розберемо, як модель будує їх сама з нерозмічених даних — і чому саме це вміння стоїть за словниковими векторами, BERT, SimCLR і CLIP.

Зміст лекції ​

Лекція йде від простого питання «як перетворити слово чи картинку на числа» до сучасних моделей, які вчаться на даних без жодної мітки.

  1. Подання як окрема задача. Чому ознаки вигідніше вивчати, ніж конструювати, і чим це відрізняється від усього попереднього курсу.
  2. Вектори слів. Матриця співвживань, матричний розклад, GloVe, word2vec і геометрія простору значень.
  3. Контекстні подання. Одне слово має кілька значень; ELMo, GPT і BERT як три відповіді на цю проблему.
  4. Самонавчання. Допоміжна задача, яка перетворює нерозмічені дані на навчальний сигнал.
  5. Контрастивне навчання. SimCLR: притягнути два види одного об'єкта, відштовхнути чужі.
  6. Мультимодальність і базові моделі. CLIP і те, чому одну модель тепер навчають раз, а використовують усюди.

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

Чого ви навчитеся ​

Після цієї лекції ви зможете:

  • пояснити, чим подання (representation) відрізняється від сирої ознаки і чому якість подання визначає якість усієї моделі;
  • побудувати матрицю співвживань за корпусом тексту й дістати з неї вектори слів матричним розкладом;
  • розрізнити CBOW і skip-gram та пояснити роль негативного семплування;
  • прочитати геометрію простору слів: косинусну подібність, аналогії та їхні межі;
  • пояснити, навіщо потрібні контекстні подання і чим маскована мовна модель відрізняється від передбачення наступного токена;
  • сформулювати допоміжну задачу (pretext task) для нерозмічених даних і пояснити, чому спільні подання схильні до колапсу;
  • записати контрастивну втрату SimCLR і назвати роль температури, проєктора та аугментацій;
  • виміряти якість подання лінійним зондуванням і показати, скільки міток воно економить.

Задача: ознаки, які модель будує сама ​

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

Навчання подань (representation learning) прибирає людину з цього кроку. Замість того щоб конструювати ознаки вручну, ми вчимо відображення x↦z∈RK, яке зберігає структуру даних і водночас зручне для наступних задач.

"Constructing good feature representations (= representation learning) benefits all ML applications." — EPFL CS-433, лекція «Text Representation Learning»

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

Джерело: EPFL CS-433 Machine Learning

Дані лекції: рукописні цифри 8×8 ​

Щоб не говорити про подання абстрактно, весь практичний бік лекції побудовано на одному наборі даних.

Optical Recognition of Handwritten Digits. 1797 зображень розміром 8×8 пікселів, кожен піксель — ціле число від 0 до 16. Класів десять, за цифрами від 0 до 9. Ділимо на 1257 зображень для навчання і 540 для перевірки.

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

digits dataset samples and one image as 64 pixel values

Джерело даних: UCI · Optical Recognition of Handwritten Digits

Мітки коштують дорого, дані — ні ​

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

На рисунку — класифікація текстів із набору 20 newsgroups. Модель, навчена на всіх мітках, дає micro-F1 0,90. Та сама модель на 20 % міток падає до 0,77. Але якщо до тих самих 20 % міток додати решту документів без міток і застосувати самонавчання, результат піднімається до 0,83 — половина втраченого повертається безкоштовно.

semi supervised text classification recovers accuracy lost to missing labels

Саме цей розрив і закриває решта лекції, тільки значно потужнішими засобами.

Джерело: scikit-learn · Semi-supervised classification on a text dataset

Слово як номер у словнику ​

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

Такий вектор називають унітарним кодуванням (one-hot encoding). Для словника з V слів кожне слово стає вектором довжини V, де одиниця стоїть на позиції цього слова, а решта — нулі.

one hot encoding of a word inside a small output vocabulary

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

Джерело: The Illustrated Transformer

Щільний вектор замість розрідженого ​

Альтернатива — вкладення (embedding): відображення слова в щільний вектор невеликої розмірності K, зазвичай від 50 до 500.

wi⟼wi∈RK,K≪V

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

words mapped to dense embedding vectors of four numbers each

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

Джерело: Visualizing Neural Machine Translation

Матриця співвживань: сигнал із нерозміченого тексту ​

Джерело сигналу сформулював ще Дж. Ферт: слово характеризується компанією, у якій воно з'являється. Формалізуємо це лічильником

nij:=#{контекстів, де слово wi трапилося поруч зі словом wj}

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

Ліворуч — фрагмент реальної матриці, побудованої за 6000 повідомлень корпусу 20 newsgroups для словника з 400 найчастіших слів. Блокова структура видно неозброєним оком: god, jesus, church, bible тримаються разом, windows, software, computer, file — окремо. Жодних міток для цього не знадобилося, лише текст.

word co-occurrence counts and their rank 50 reconstruction

Праворуч — те, що дає наближення рангу 50, до якого ми зараз перейдемо.

Подання слів як матричний розклад ​

Матриця X величезна (V×V) і майже порожня. Стиснемо її тим самим прийомом, що в лекції 09 для рекомендаційних систем: наблизимо добутком двох вузьких матриць.

minW,Z12∑(i,j)∈Ωfij(xij−(WZ⊤)ij)2
ПозначенняЗначення
xij=log⁡(1+nij)логарифм лічильника; логарифм гасить розрив між дуже частими й рідкісними парами
W∈RV×Kподання слів, рядок i — шуканий вектор wi
Z∈RV×Kподання контекстних слів
K≪Vрозмірність подання, зазвичай 50–500
Ωмножина пар із ненульовим лічильником
fijвага важливості пари

Це буквально та сама задача, що й розклад матриці «користувач × фільм». Різниця лише в тому, що замість оцінок глядачів у клітинках стоять лічильники сумісних появ слів.

GloVe: як зважити пари слів ​

Якби всі пари важили однаково, найчастіші сполучення на кшталт «of the» задавили б собою решту. Модель GloVe (Global Vectors) розв'язує це ваговою функцією, що зростає до певної межі й далі не росте:

fij=min{1, (nij/nmax)α},α=3/4

Рідкісні пари отримують малу вагу, бо їхні лічильники ненадійні; наддомінантні пари обрізаються одиницею і не можуть перекричати всіх інших. Значення α=3/4 автори підібрали емпірично.

Числовий приклад. Нехай nmax=100. Пара з лічильником 1 отримає вагу (0,01)0,75≈0,032, пара з лічильником 25 — (0,25)0,75≈0,354, а будь-яка пара з лічильником від 100 — рівно 1. Тобто зростання ваги сповільнюється, але не обривається різко.

Джерело: Pennington, Socher, Manning. GloVe (EMNLP 2014)

Код: від корпусу до векторів слів ​

Уся конструкція вміщується в двадцять рядків: зібрати лічильники, взяти логарифм, зробити усічений сингулярний розклад.

Вивід код запущено, вивід не редагувався
text
матриця (400, 400) · ненульових 88.6%
подання (400, 50) · пояснена дисперсія 0.749

На що дивитися: матриця 400 × 400 заповнена на 88,6 %, а 50 чисел на слово зберігають 74,9 % її дисперсії.

CBOW: передбачити слово за оточенням ​

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

Перший варіант — CBOW (continuous bag of words). Беремо вікно тексту, ховаємо центральне слово і вимагаємо від моделі відновити його за сусідами. На рисунку: за словами the, man, his, son треба назвати loves.

cbow model predicts the centre word from its surrounding context words

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

Джерело: Dive into Deep Learning · Word2vec

Skip-gram: передбачити оточення за словом ​

Другий варіант — skip-gram — розвертає задачу. Тепер вхід один, центральне слово, а передбачити треба кожне слово з вікна навколо нього.

skip gram model predicts each context word from the centre word

На перший погляд це складніше, але саме skip-gram виявився кращим на рідкісних словах: кожна поява рідкісного слова породжує стільки навчальних пар, скільки слів у вікні, тоді як у CBOW вона розчиняється в усередненні. Розмір вікна в оригінальній роботі — п'ять слів у кожен бік.

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

Джерело: Mikolov et al. Efficient Estimation of Word Representations (2013)

Негативне семплування замість softmax по словнику ​

У прямій постановці skip-gram знаменник softmax пробігає весь словник — сотні тисяч доданків на кожен крок. Це надто дорого.

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

p(справжня пара)=σ(wi⊤zj)

Це знову логістична регресія з лекції 05, тільки ознаками є скалярний добуток двох векторів, які й навчаються. Прийом називають негативним семплуванням (negative sampling); на кожну справжню пару беруть кілька випадкових підроблених.

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

Джерело: Mikolov et al. Distributed Representations of Words and Phrases (NIPS 2013)

Геометрія простору слів: близькість означає схожість ​

Подивімося, що насправді виходить. Візьмемо готові вектори GloVe, навчені на Вікіпедії та корпусі Gigaword: 400 000 слів по 50 чисел на кожне.

Матриця показує косинусну подібність дванадцяти слів із трьох різних тем. Усередині кожної теми значення високі (italy і spain — 0,86, computer і software — 0,88), між темами падають майже до нуля або нижче (software і prince — мінус 0,11). Червоні лінії розділяють теми; блокова структура виникла сама, ніхто не повідомляв моделі, які слова до якої теми належать.

cosine similarity matrix of glove word vectors in three topics

Джерело векторів: GloVe · Stanford NLP

Семантичний пошук: коли запит не збігається словами ​

Близькість векторів — не самоціль: її головне застосування це пошук. Класичний пошук шукає збіг рядків, тож запит іншими словами він не знаходить; пошук за вкладеннями порівнює зміст. Перевірмо на 600 документах 20 Newsgroups: запит перетворюємо на вектор тією самою моделлю, що й документи, і беремо п'ять найближчих за косинусом.

Вивід код запущено, вивід не редагувався
text
документів 600, вектор — 768 чисел, довжина 1.000

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

Вивід код запущено, вивід не редагувався
text
запит                                          слова вкладення
nasa shuttle launch orbit                        1.0       1.0
spacecraft departing our planet                  1.0       1.0
a machine that leaves the earth and circles it   0.4       0.8
goaltender stopped every shot                    0.6       1.0
picture made by a computer from shapes           0.6       1.0
середнє: ключові слова 0.72, вкладення 0.96

На що дивитися: у стовпцях — частка документів потрібної теми серед п'яти знайдених; коли запит не повторює слів із документів, пошук за словами помиляється, а вкладення тримаються: у середньому 0,72 проти 0,96.

Результат залежить від того, як сформульовано запит. «nasa shuttle launch orbit» — словами самих документів — обидва методи дають влучність@5 рівно 1,0. «goaltender stopped every shot» замість слова «hockey»: ключові слова 0,6, вкладення 1,0. «a machine that leaves the earth and circles it», зовсім без термінів: 0,4 проти 0,8.

Середнє по п'яти запитах: 0,72 за словами проти 0,96 за вкладеннями. Що далі формулювання від лексики документів, то більший розрив. Саме на цьому стоять сучасні пошукові системи й схема RAG, де знайдені за змістом фрагменти підставляють у запит до мовної моделі.

Напрямки в просторі слів кодують відношення ​

Подібність — лише половина історії. Виявилося, що різниця двох векторів теж має сенс: вона кодує відношення між словами.

Ліворуч шість пар «чоловіче — жіноче» у проєкції на дві головні компоненти. Стрілки майже паралельні: різниця wwoman−wman приблизно дорівнює wqueen−wking і waunt−wuncle. Отже, у просторі є стійкий напрямок роду.

Звідси — знаменита арифметика: обчислимо wking−wman+wwoman і знайдемо найближче до результату слово. Праворуч п'ять найближчих кандидатів: перемагає queen з косинусом 0,852.

parallel offsets between word pairs and the king minus man plus woman result

Приклад походить із робіт Mikolov та співавторів; у слайдах EPFL наведено споріднений тест на аналогіях фраз, де найкраща модель дала 72 % правильних відповідей на 3218 прикладах.

Арифметика у просторі слів
Справжні вектори GloVe (50 вимірів), ті самі, що вантажить код лекції. Обчислення просте: v = вектор(b) − вектор(a) + вектор(c), далі шукаємо найближче слово за косинусом. Словник тут скорочено до 80 слів, щоб усе рахувалося миттєво.
:=:queen
queen
0,852
prince
0,759
daughter
0,747
princess
0,742
son
0,708
0,852схожість найкращої відповіді
0,531пряма схожість «man» і «king»
50вимірів на слово

Класичний приклад працює: man : king = woman : queen зі схожістю 0,852 — те саме число друкує код лекції. Так само знаходяться столиці й ступені порівняння: напрямок «країна → столиця» у цьому просторі один і той самий для Франції та Італії. Але візьміть останню кнопку — cat : dog = car : ? — і відповідь буде беззмістовною, хоча схожість лишиться високою. Це і є межа методу: модель завжди повертає найближче слово, а чи існує сама аналогія, вона не перевіряє.

Код: аналогії й межі методу ​

Вивід код запущено, вивід не редагувався
text
man : king = woman : ?
    queen 0.852 · throne 0.766 · prince 0.759
paris : france = rome : ?
    italy 0.861 · spain 0.793 · portugal 0.760
walking : walked = swimming : ?
    athletics 0.725 · olympic 0.680 · championships 0.672

На що дивитися: дві перші аналогії розв'язано правильно (queen, italy), а третя провальна: замість дієслова модель видає спортивні слова, бо swimming у корпусі живе серед спорту.

Третій рядок — чесна межа методу. Граматичну аналогію «йти : йшов = плавати : плавав» п'ятдесятивимірні вектори не тримають: замість дієслова модель видає назви видів спорту, бо в корпусі swimming живе серед спортивних термінів, а не серед дієслів.

Одне слово має кілька значень ​

У всього побудованого досі є спільна вада: слову відповідає рівно один вектор незалежно від того, де воно стоїть.

Візьмімо українське «коса». У реченні «дівчина заплела косу» це зачіска, у «косою косять траву» — інструмент, у «пароплав обійшов косу» — мілина. Один вектор мусить бути середнім арифметичним трьох різних значень, і жодне з них не подане добре. Англійське bank (берег і банк) або mouse (миша і мишка) — така сама історія.

Потрібні контекстні подання (contextual representations): вектор слова має обчислюватися заново для кожного речення, з урахуванням сусідів. Технічно це означає, що подання видає не таблиця пошуку, а мережа, яка читає все речення — тобто трансформер із лекції 12.

РеченняЩо означає «bank»Вектор GloVe
He sat on the river bank.берег річкитой самий
She works at a bank.фінансова установатой самий
The plane will bank left.крен літакатой самий

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

Три покоління: ELMo, GPT і BERT ​

Рисунок зіставляє три підходи, які з'явилися один за одним протягом двох років.

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

evolution from elmo through gpt to bert with pretraining and fine tuning

Ця картинка задає й загальну схему роботи, яка тримається донині: спершу попереднє навчання (pretraining) на величезному нерозміченому корпусі, потім донавчання (fine-tuning) на маленькій розміченій вибірці цільової задачі.

Джерело: Dive into Deep Learning · BERT

Вхід BERT: сума трьох вкладень ​

BERT приймає одну або дві послідовності одразу. Службовий токен [CLS] стоїть на початку і збирає подання всього входу; [SEP] розділяє речення.

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

bert input as the sum of token segment and positional embeddings

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

Джерело: Devlin et al. BERT (2018)

Маскована мовна модель як навчальний сигнал ​

Лишається питання, на чому саме BERT навчається, якщо міток немає. Відповідь — маскована мовна модель (masked language modelling).

Приблизно 15 % токенів у реченні замінюють на [MASK], а модель має відновити, що там було. Приклад зі слайдів EPFL CS-433: She [MASK] her coffee → She drank her coffee.

"Forces the model to learn a comprehensive representation of the language that is very useful for many downstream tasks. Can train on huge corpora of text (books, Wikipedia, etc) without any labelling." — EPFL CS-433, лекція «Self-supervised Learning»

Щоб угадати пропущене слово, модель мусить розібратися і в граматиці, і в сполучуваності, і в тому, що взагалі роблять із кавою. Функція втрат — звичайна перехресна ентропія з лекції 05, тільки класів стільки, скільки токенів у словнику.

Джерело: EPFL CS-433 Machine Learning

Замаскувати слово чи передбачити наступне ​

BERT і GPT розв'язують ту саму задачу самонавчання двома різними способами, і різниця між ними визначає, для чого кожна модель придатна.

BERT: маскуванняGPT: наступний токен
Архітектуратрансформер-енкодертрансформер-декодер
Напрямок увагидвонапрямна, кожен токен бачить усіпричинна, лише попередні токени
Навчальна задачавідновити ~15 % замаскованих токенівпередбачити наступний токен
Сильна сторонаподання для класифікації, розмітки, пошукугенерація тексту довільної довжини

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

Самонавчання: означення й загальна схема ​

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

"Self-supervised learning: use the input itself to generate supervisory signals. The base task is an artificial pretext task that requires learning useful features and structure in the input data." — EPFL CS-433, лекція «Self-supervised Learning»

Формально: беремо нерозмічену точку x і перетворенням g розщеплюємо її на вхід і ціль,

g:x↦(xin,xout),навчаємо f:xin↦xout

де g зазвичай містить випадковість. Допоміжна задача (pretext task) сама по собі не потрібна — цінне те подання, яке модель мусила збудувати, щоб її розв'язати.

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

Допоміжна задача на цифрах: відновити приховане ​

Перевіримо це на наших даних. Візьмемо 1257 зображень без міток, у кожному випадково приховаємо 35 % пікселів і навчимо автокодувальник відновлювати оригінал.

Мережа стискає 64 пікселі до 16 чисел і розгортає назад. Функція втрат — середньоквадратична похибка між відновленим і вихідним зображенням; за 200 епох вона падає з 0,1713 до 0,0221.

denoising pretext task input corrupted and reconstruction rows

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

Спільні подання і пастка колапсу ​

Є й інший спосіб позбутися міток, без відновлення входу. Ідея спільних подань (joint embedding): зробити два випадкові «види» тієї самої точки й вимагати, щоб енкодер видав для них близькі вектори.

g:x↦(x1,x2),вимога f(x1)≈f(x2)

Звучить розумно, але має очевидну поломку.

"Problem: constant f is a trivial encoder that is invariant!" — EPFL CS-433, лекція «Self-supervised Learning»

Енкодер, який на будь-який вхід відповідає нулем, задовольняє вимогу ідеально й не містить жодної інформації. Це називають колапсом подань. Отже, самої вимоги близькості замало — потрібна протидійна сила, яка утримує різні об'єкти на відстані.

Джерело: EPFL CS-433 Machine Learning

Контрастивне навчання: притягнути своє, відштовхнути чуже ​

Протидійна сила знаходиться там само, де ми її вже бачили в word2vec: додати негативні приклади.

s(f(x),f(x+))>s(f(x),f(x−))

Тут x+ — другий вид тієї самої точки, x− — вид іншої точки, s — міра подібності. Тепер константний енкодер програє: він робить усі подібності однаковими й не задовольняє нерівність.

На рисунку — реальні аугментації з нашого набору. Вихідна трійка, два її випадкові види (поворот до 15°, зсув на піксель, зміна яскравості, витирання квадрата 2×2, гаусів шум) і вид зовсім іншої цифри.

two random views of one digit to attract and a view of another digit to repel

Аугментації тут — не косметика, а формулювання задачі: вони кажуть моделі, які зміни вважати неістотними.

Втрата SimCLR ​

SimCLR — контрастивна схема з кількома вдалими інженерними рішеннями. Її функція втрат:

L(x)=−log⁡es(f(x),f(x+))es(f(x),f(x+))+∑i=1Mes(f(x),f(xi−))
ПозначенняЗначення
x+другий вид тієї самої точки — єдиний позитив
xi−, Mвиди решти точок батча як негативи та їхня кількість
s(e1,e2)косинусна подібність, поділена на температуру τ
f=f2∘f1енкодер f1 і проєктор f2; для цільової задачі беруть лише f1

Придивіться до дробу: це softmax, у якому «правильний клас» — це власний позитив серед усіх негативів. Тобто перед нами перехресна ентропія з лекції 05, а контрастивне навчання — задача класифікації, у якій мітки виготовляє сам генератор видів.

Температура τ керує різкістю: мала τ змушує модель зосередитися на найважчих негативах.

Джерело: Chen et al. SimCLR (ICML 2020)

Код: SimCLR на PyTorch ​

Вивід код запущено, вивід не редагувався
text
у пікселях два види однієї цифри різняться на 0.238,
дві різні цифри — на 0.264

На що дивитися: у пікселях два види однієї цифри (0,238) майже так само далекі, як дві різні цифри (0,264), — схожості, яку пікселі не бачать, енкодеру доведеться навчитися.

Вивід код запущено, вивід не редагувався
text
до навчання NT-Xent 6.236; навмання — ln(2·256 − 1) = 6.236

На що дивитися: до навчання втрата дорівнює ln 511 = 6,236 — рівно стільки дає вгадування позитивної пари навмання серед 511 кандидатів.

Вивід код запущено, вивід не редагувався
text
епоха   0   NT-Xent 6.216
епоха 100   NT-Xent 4.834
епоха 200   NT-Xent 4.749
епоха 299   NT-Xent 4.700

На що дивитися: NT-Xent падає з 6,216 до 4,700 за 300 епох: модель дедалі впевненіше знаходить другий вид тієї самої цифри серед 511 кандидатів.

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

Що вивчив енкодер ​

Подивімося на результат очима. Обидві панелі — проєкція t-SNE тестових зображень, які модель не бачила; ліворуч проєктуються сирі 64 пікселі, праворуч — 32 числа з навченого енкодера.

Кластери є в обох випадках: цифри 8×8 — легкі дані, і навіть сирі пікселі вже майже розділяються. Але подання групує їх щільніше: силует за справжніми класами зростає з 0,16 до 0,29, тобто відстань усередині класу зменшилася відносно відстані між класами майже вдвічі.

t-sne of raw digit pixels next to t-sne of the learned simclr representation

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

Код: лінійне зондування замороженого енкодера ​

Картинка переконує, але не вимірює. Стандартний спосіб оцінити подання — лінійне зондування (linear probing): заморозити енкодер, поставити зверху звичайну логістичну регресію і навчити її на кількох мітках.

Вивід код запущено, вивід не редагувався
text
міток на клас  1:  сирі пікселі 0.564   SimCLR 0.716
міток на клас  5:  сирі пікселі 0.841   SimCLR 0.853
міток на клас 50:  сирі пікселі 0.956   SimCLR 0.941

На що дивитися: з однією міткою на клас подання SimCLR дає 0,716 проти 0,564 на сирих пікселях, а з 50 мітками перевага зникає — 0,941 проти 0,956.

Кожне число — середнє з десяти випадкових виборів розмічених прикладів.

Чужий енкодер допомагає не завжди ​

Природна думка після лекції 11: навіщо навчати власний енкодер, якщо є resnet18 з ImageNet? Поставмо його третьою колонкою — заморозимо й проженемо ті самі цифри, домалювавши їх до трьох каналів і 64 пікселів.

Міток на класСирі пікселіВласний SimCLRЗаморожений resnet18
10,5640,7160,404
50,8410,8530,767
500,9560,9410,945

Результат протилежний очікуванню: мережа з одинадцяти мільйонів параметрів, навчена на мільйоні фотографій, програє навіть сирим пікселям — 0,404 проти 0,564 на одній мітці.

Причина в тому, що переносити нема чого. ImageNet — це кольорові фотографії з текстурами й тлом; наші цифри — вісім на вісім градацій сірого. Ознаки resnet18 тут просто не спрацьовують, а власний SimCLR, який не бачив жодної мітки, але вчився саме на цих даних, виграє там, де міток мало.

Порівняйте з лекцією 11: там та сама resnet18 на супутникових знімках дала 0,910 проти 0,752 у навчання з нуля. Різниця не в моделі, а у відстані між доменами. Правило: перенесення працює, коли джерело й ціль поділяють низькорівневу структуру, і не працює, коли ні — а перевіряється це лінійним зондуванням за десять хвилин.

Подання економить мітки, а не замінює їх ​

Розгорнімо ці три рядки в криву. Горизонтальна вісь — скільки розмічених прикладів на клас дозволено використати, вертикальна — частка правильних відповідей на всіх 540 тестових зображеннях.

test accuracy versus number of labels per class for raw pixels autoencoder and simclr

Читати треба так. При одній мітці на клас контрастивне подання дає 71,6 % проти 56,4 % на сирих пікселях — виграш у 15 відсоткових пунктів. При п'яти мітках розрив звужується до 1,2 пункту, а після двадцяти сирі пікселі виходять уперед і при п'ятдесяти мітках виграють 95,6 % проти 94,1 %.

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

CLIP: текст і зображення в спільному просторі ​

Досі текст і зображення жили в різних просторах. CLIP з'єднує їх, і механізм — уже знайомий контрастивний.

Навчальні дані — пари «зображення та його підпис», зібрані з інтернету. Два енкодери, один для картинок, другий для тексту, проєктують обидві модальності в один простір розмірності K. Мета формулюється по батчу з N пар одразу: для кожного зображення правильний підпис має бути найближчим із усіх N підписів у батчі.

clip contrastive objective as a caption by image similarity matrix

"Use captioned images to learn a joint multimodal embedding space. Objective: maximize cosine similarity of caption and image embeddings while minimizing unrelated pairs." — EPFL CS-433, лекція «Self-supervised Learning»

Джерело: Radford et al. CLIP (ICML 2021)

Класифікація без жодного навчального прикладу ​

Спільний простір дає несподівану здатність. Щоб класифікувати зображення на нові класи, CLIP не треба донавчати взагалі.

Порядок дій: беремо назви класів, вставляємо кожну в шаблон "A photo of [class]", проганяємо ці речення через текстовий енкодер і отримуємо по вектору на клас. Зображення проганяємо через свій енкодер і оголошуємо переможцем клас із найбільшою косинусною подібністю.

Це називають класифікацією без прикладів (zero-shot classification) — на відміну від навчання за кількома прикладами (few-shot), де хоч кілька розмічених зразків потрібно. Набір класів задається текстом, тому змінити його можна за секунду, без жодного дотику до ваг.

Практичний наслідок: набір класів перестав бути частиною архітектури. Модель, навчена один раз на різнорідних парах з інтернету, обслуговує задачі, яких її автори не передбачали.

Базові моделі: одна модель на багато задач ​

Остання зміна — організаційна: раніше під кожну задачу навчали свою модель, тепер одну велику навчають раз на нерозміченому корпусі, а під задачу лише адаптують. Такі моделі називають базовими (foundation models) — термін зі звіту Стенфордського CRFM 2021 року; суть не в розмірі, а в тому, що модель є спільною основою, тож і її хиби успадковують усі застосування одразу.

МодельПараметрівДаніЩо з'явилося
GPT-1, 2018117 млнBooksCorpus, 7000 книгпопереднє навчання працює, але під кожну задачу потрібне своє донавчання
GPT-2, 20191,5 млрдWebText, 40 ГБрозв'язує задачі без донавчання, лише за формулюванням
GPT-3, 2020175 млрд600 ГБ текстунавчання з прикладів у самому запиті, без зміни ваг

Джерело: Bommasani et al. On the Opportunities and Risks of Foundation Models (2021)

Обмеження навчання подань ​

Метод потужний, але має чіткі межі, і про них варто знати заздалегідь.

Подання успадковує все, що є в даних. Вектори слів відтворюють упередження корпусу разом із його знаннями; жоден етап навчання їх не фільтрує. У лекції 14 ми побачимо, чим це обертається на практиці.

Допоміжна задача визначає результат. Наш експеримент це показав прямо: контрастивне навчання дало на цифрах 71,6 % при одній мітці на клас, відновлення прихованих пікселів — 63,6 %, і жодна зміна архітектури цього розриву не закриє.

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

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

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

Підсумок лекції ​

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

Текст дає навчальний сигнал сам. Матриця співвживань, розкладена на дві вузькі матриці, дає вектори слів; word2vec приходить до того самого через задачу передбачення.

Геометрія простору слів осмислена, але не всесильна. Близькість означає схожість, різниця векторів кодує відношення; граматичні аналогії п'ятдесятивимірні вектори вже не тримають.

Один вектор на слово — замало. Контекстні моделі перераховують подання для кожного речення: BERT двонапрямно, GPT причинно.

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

Користь вимірюється економією міток. Контрастивне подання дало +15 відсоткових пунктів при одній мітці на клас і поступилося сирим пікселям при п'ятдесяти.

Джерела й додаткові матеріали ​

Курси

Статті

Підручники й інструменти

Матеріали курсу. Схеми із зовнішніх джерел належать їхнім авторам — посилання під кожною ілюстрацією.