Негативна вибірка та контрастне навчання — від word2vec до CLIP
Підручникова версія word2vec покладається на рівень виводу softmax, щоб перетворити необроблені оцінки моделі на ймовірність для кожного слова в словнику — і ось звідки виникає проблема масштабування. У тренуванні програш завжди використовує лише одну ймовірність на пару, P(target | center). Але softmax визначає це як частку загального словникового запасу:
P(target) = exp(score_target) / Σ_w exp(score_w)Знаменник підсумовує всі V слів, тому, щоб отримати єдине число, яке вам дійсно потрібно, ви повинні обчислити всі V оцінки — не тому, що ви цього хочете, а тому, що вони потрібні нормалізатору. Відпустіть будь-яку окрему оцінку, і нормалізація порушиться.
Завдяки словниковим словам V = 10⁶ і вбудованому dim d = 300 оцінка центру проти кожного слова становить V × d matmul — 300 мільйонів множень-додавання — плюс мільйон зведень до степеня для знаменника за кожну навчальну пару.
Щоб відчути масштаб, порівняйте обчислення для кожного прикладу з MNIST:
INPUT HIDDEN OUTPUT OUTPUT-LAYER MATMUL
MNIST 784 128 10 128 × 10 = 1,280 ops
word2vec (V = 10⁶) V → 1 300 V 300 × 10⁶ = 300,000,000 opsMNIST — задача класифікації 10 класів; word2vec — це мільйонний нейрон — один вихідний нейрон на слово словника. Кожна вартість у вихідному рівні — ваги, matmul, softmax — масштабується лінійно відповідно до кількості класів.
Дослідження за 2013 рік представило негативну вибірку як альтернативу ієрархічному softmax. Він замінює словникове передбачення бінарною класифікацією: розрізняйте спостережувані пари слово–контекст від пар, отриманих із розподілу шуму. Це змінює ціль, а не просто наближення знаменника softmax.
Один позитивний і k негативний зразки потребують скалярних добутків k+1, вартість яких O((k+1)d) замість O(Vd). Лише вибіркові вихідні вбудовування отримують градієнти; повторні зразки підраховуються повторно. Тут ми зберігаємо вихідні вектори як рядки Ep із формою (V, d) — транспонування макета E' у статті word2vec.
Порівняння між спостережуваними та вибірковими парами пов’язує негативну вибірку з контрастним навчанням. CLIP і dense retriever використовують схожі ідеї, але їхні звичайні softmax втрати відрізняються від незалежних сигмоїдних термінів word2vec.
Від пар до мінусів
Навчальні дані word2vec — це пари (center, context) із ковзного вікна над корпусом: the cat sat on the mat виробляє (sat, cat), (sat, on), (sat, the) і так далі — мільярди справжніх співпадань.
Негативна вибірка зберігає пари ідентичними, але замість того, щоб просто максимізувати ймовірність справжнього збігу (center, context), вона додає k випадкових пар на крок як противагу — коригуючи ваги так, щоб їхня ймовірність також була мінімізована.
Обидва типи пар поділяють один центр, але по-різному вибирають супровідне слово (партнер):
Позитивні пари надходять із контекстних вікон. Negative samples draw a partner independently of the center, usually with probability proportional to count(w)^0.75. Вибіркове слово також може бути справжнім контекстним словом: «негативний» описує, як його було відібрано, а не твердження, що пара ніколи не зустрічається. Це потенційні помилкові негативи.
Пошуковий і скалярний добутки не змінюються. The difference is which words are scored and how those scores enter the loss.
Необроблений скалярний добуток v_c · v'_w може бути будь-яким дійсним числом — додатним, від’ємним, великим, малим — але для програшу потрібна ймовірність між 0 і 1: «наскільки ймовірно ця пара реальна?» The sigmoid function σ is what gets us there.
Once we have the scores, we can turn each into a probability with sigmoid. σ squashes any real-valued score into (0, 1):
скалярний добуток v_c · v'_w | σ | модель говорить |
|---|---|---|
| великий позитив | ~1 | ”справжня пара” |
| ~0 | 0.5 | невпевнений |
| великий мінус | ~0 | ”випадкова пара” |
For each real pair we want σ to climb toward 1; for each random pair, toward 0 — training pushes the dot products in those directions.
On the same five-word toy from the word2vec article, the widget below runs that score step. Виберіть навчальну пару (center, target), перемкніть, які слова відбираються як негативні, а потім перейдіть через скалярний добуток k+1 — score[w] = v_c · v'_w, розширений термін за терміном, а потім через його сигмовид. Оцінюється лише ціль і негативи; the other rows of Ep stay greyed, never read.
| word | role | score | σ(score) | direction |
|---|---|---|---|---|
| on | positive | +0.394 | 0.597 | → pushed toward 1 |
| cat | negative | -0.187 | 0.453 | → pushed toward 0 |
| mat | negative | +0.260 | 0.565 | → pushed toward 0 |
Each sigmoid estimates a data-versus-noise label under the chosen sampling scheme. Це не P(context word | center), і залежить як від розподілу шуму, так і від кількості негативів. Сума значень не обов’язково дорівнює одному слову.
Як відбираються негативи?
Є два корисні способи отримання негативів: вибірка слів із розподілу шуму, як у word2vec, або повторне використання інших прикладів у групі, як у CLIP і DPR.
Raising counts to a power below one reduces the dominance of frequent words while preserving their ranking. The amount of probability assigned to stop words depends on the corpus; універсального відсотка не існує.
The negative-sampling paper reports that exponent 0.75 outperformed unigram and uniform sampling in its experiments:
P(w) — ймовірність вибірки шуму. Знаменник нормалізує ступеневі підрахунки; it is computed from corpus frequencies, not the model’s current scores.
Маючи на руках розподіл, вибірка проста: обчисліть P(w) для кожного слова у словнику, використовуючи наведену вище формулу, а потім для кожної позитивної пари (center, context) витягніть k випадкових слів із цього розподілу — зважене кидання кубика над словником, повторене k разів, де слова з вищим P(w) вибираються частіше.
З у групі негативів інші приклади в поточній групі пропонують контрастні кандидати.
In a batch of N labeled pairs (Qi, Pi), use Pi as the positive for Qi and the other candidates as negatives. Це призначає навчальні мітки; це не встановлює, що кожна недіагональна пара семантично не пов’язана:
batch: (Q1, P1) (Q2, P2) (Q3, P3) (Q4, P4)
for Q1: positive = P1, negatives = {P2, P3, P4}
for Q2: positive = P2, negatives = {P1, P3, P4}
for Q3: positive = P3, negatives = {P1, P2, P4}
for Q4: positive = P4, negatives = {P1, P2, P3}Кодери вже обчислили всі потенційні вбудовування N. Повторне їх використання дозволяє уникнути додаткових проходів кодувальника, але матриця показників N×N все одно вимагає обчислень і пам’яті. A batch of 256 supplies 255 candidate negatives per query.
Деякі інші кандидати також можуть мати відношення до запиту, створюючи помилкові негативи. Склад партії, обробка дублікатів і жорсткий негативний відбір впливають на навчання; пакетні негативи не є автоматично кращими негативами.
Втрата
Втрата. Втрата на пару є сумою k+1 логарифмічних сигмоїдних членів — по одному для позитивного, по одному для кожного негативного — замість повного softmax −log P(target | center):
loss = − log σ(v_c · v'_t) − Σ log σ(−v_c · v'_n)
───────────────── ───────────────────────
true (positive) pair k sampled negativesДе v_c — це вбудовування центрального слова, v'_t — це вбудовування виходу справжньої цілі, v'_n — це вбудовування вихідного негативного слова, а σ — сигмоїдна функція. Перший член штовхає скалярний добуток істинної пари вгору (до σ(·) = 1); другий член штовхає скалярний добуток кожного мінуса вниз (до σ(·) = 0).
У негативному терміні використовується σ(−v_c · v'_n) — негативне скалярного добутку — що працює через ідентичність σ(−x) = 1 − σ(x). Отже, −log σ(−v_c · v'_n) — це просто −log(1 − σ(v_c · v'_n)): стандартна половина крос-ентропії «неправильного класу», застосована до напрямку «це несправжня пара». Кожен член у втраті є двійковою крос-ентропією (BCE), застосованою до однієї пари (center, w) — мітка 1 для позитивного, мітка 0 для кожного негативного. Загальна сума втрат дорівнює k+1 BCE разом.
Втрата зростає, коли модель присвоює спостережуваній мітці низьку ймовірність. Його похідна по відношенню до логіту дорівнює σ(z) − y, обмежена між −1 і 1. Отже, великі втрати не означають необмеженого логіт-градієнта.
Кожне оцінене слово додає один термін — −log σ для позитивного, −log(1 − σ) для кожного негативного:
| слово | роль | σ | термін | значення |
|---|---|---|---|---|
on | позитивний | 0.5973 | −log(0.5973) | 0.5153 |
cat | негативний | 0.4534 | −log(1 − 0.4534) | 0.6041 |
mat | негативний | 0.5647 | −log(1 − 0.5647) | 0.8318 |
Разом: L ≈ 1,95. mat вносить найбільший внесок — його σ (0,56) є найдальшим від того, де має бути мінус (0).
Ми моделюємо вибіркові мітки як умовно незалежні спостереження Бернуллі з урахуванням їхніх оцінок. Помноживши їхні ймовірності та взявши від’ємний логарифм, ви отримаєте цю суму. Терміни все ще мають спільні параметри через центральне вбудовування.
P(all right) = P(positive right) × P(neg₁ right) × … × P(neg_k right)−log перетворює добуток на суму:
−log P(all right) = −log P(positive) + −log P(neg₁) + … + −log P(neg_k)Softmax моделює категорію контекстного слова; негативна вибірка моделює мітку даних проти шуму. Вони оптимізують різні ймовірності, тому нормалізовані softmax ймовірності та сигмоіди негативної вибірки відповідають на різні запитання. Жодна з них не калібрується автоматично за невидимими даними.
Градієнт
Для простого SGD без регулярізації оновлення отримують лише вхідний рядок центру та вибіркові вихідні рядки. Якщо слово вибирається повторно, підсумуйте його внески. Обчислюйте кожен градієнт на основі однакових значень параметрів до оновлення.
Щоб мінімізувати L, нам потрібен його градієнт щодо кожного параметра, який торкався прямого проходу: v_c (центральний рядок у E), v'_t (цільовий рядок у Ep) і кожен v'_n (один рядок на мінус). З одним фактом числення -
d/dz [ −log σ(z) ] = σ(z) − 1— правило ланцюга дає всі три:
∂L / ∂v'_t = (σ_t − 1) · v_c ← target's output row
∂L / ∂v'_n = σ_n · v_c ← each negative's output row
∂L / ∂v_c = (σ_t − 1) · v'_t + Σ_n σ_n · v'_n ← center's input rowде σ_t = σ(v_c · v'_t) і σ_n = σ(v_c · v'_n) — точно ті числа з втрати вище.
Зверніть увагу на симетрію: кожен градієнт вихідного рядка (∂L/∂v'_t, ∂L/∂v'_n) є скалярним, помноженим на v_c, а градієнт центру є зваженою сумою вихідних рядків, за якими він оцінюється. Це прямий наслідок того, що скалярний добуток є симетричним у своїх аргументах — диференціюючи будь-які f(v_c · v'_w) відносно. v'_w завжди дає щось пропорційне v_c, і навпаки.
Оновлення позитивного результату додає кратне v_c; негативне оновлення результату віднімає одиницю. Це збільшує або зменшує скалярний добуток, коли v_c утримується фіксованим. «Тягнути» та «штовхати» описують цю зміну оцінки, а не гарантоване зменшення або збільшення евклідової відстані.
Використовуючи неокруглені значення сигмоїда з віджета оцінки, центральний градієнт:
∂L/∂v_c = (σ_on − 1) · v'_on + σ_cat · v'_cat + σ_mat · v'_mat
≈ [−0.0435, 0.5269, 0.0717]Позитивні оновлення мають спільний коефіцієнт η(1 − σ_t), але їх довжина η(1 − σ_t)‖v_c‖ і η(1 − σ_t)‖v'_t‖. Вони рівні лише тоді, коли векторні норми рівні. Центр також отримує всі негативні внески.
Оновлення
Градієнтний спуск зі швидкістю навчання η:
v'_t ← v'_t + η · (1 − σ_t) · v_c ← step toward v_c
v'_n ← v'_n − η · σ_n · v_c ← step away from v_c
v_c ← v_c + η · (1 − σ_t) · v'_t − η · Σ_n σ_n · v'_n
← toward v'_t, away from each v'_nБільша сигмоподібна помилка дає більший коефіцієнт, але векторна норма також впливає на довжину оновлення. Різні пари можуть створювати суперечливі градієнти, і велика швидкість навчання може перевищувати. Втрати при навчанні не повинні зменшуватися на кожному кроці.
Додавання градієнта зверху за допомогою η = 0.1 зсуває центр:
v_c = [0.33, −0.27, 0.84]
v_c_new = v_c − 0.1 · ∂L/∂v_c ≈ [0.3344, −0.3227, 0.8328]Маленький крок, але в тому напрямку, якого вимагає втрата. v'_on, v'_cat і v'_mat отримують власні оновлення одночасно за допомогою наведених вище формул; ми зосереджуємося на v_c тут, щоб зберегти коротке відстеження.
Перевірка кроку
Спочатку оновіть лише v_c, утримуючи всі вихідні вектори фіксованими, щоб ізолювати внесок центру:
| слово | раніше | після | напрям |
|---|---|---|---|
v_c · v'_on | 0.39 | 0.41 | вгору — позитивний більш вирівняний ✓ |
v_c · v'_cat | −0.19 | −0.22 | вниз — негатив розсунутий ✓ |
v_c · v'_mat | 0.26 | 0.25 | вниз — негатив розсунутий ✓ |
Для цього оновлення лише в центрі втрати зменшуються з 1,9512 до 1,9229. Одночасне оновлення вихідних векторів із тих самих старих значень дає 1,8626. Це результати для цього прикладу та швидкість навчання, а не гарантія для кожного кроку навчання.
Чому негативна вибірка вивчає корисні вбудовування
Негативна вибірка не є об’єктивною оцінкою повного м’якого максимального градієнта. Обидві цілі винагороджують спостережувані асоціації, але зважують конкуруючі слова по-різному. Негативна вибірка може навчитися корисним уявленням, оскільки розрізнення спільного виникнення від шуму фіксує статистичні зв’язки між словами; йому не потрібно відтворювати рішення softmax.
Цей двовимірний приклад постійно тренує одну позитивну пару та три фіксовані негативні. Спостерігайте за сигмоїдами та втратами, коли змінюються вхідний і вихідний вектори. Це ілюструє одну мету; це не навчена семантична карта цих п’яти слів.
Наступний віджет тренується на кількох парах і показує, як змінюються введення введення:
Ця демонстрація веб-переглядача працює на спеціально структурованому синтетичний корпус. Кожен крок обробляє одну пару та малює п’ять негативів із заміною зі згладженого розподілу частот, включаючи можливі зіткнення з позитивом. На графіку показано тільки введення вхідних даних; вбудовування виводу навчається окремо. Кольори позначають групи для читача і не є вхідними даними для навчання. Модель обмежена двома вимірами для відображення, тому чисті семантичні кластери не гарантуються.
Наведений нижче крок NumPy робить знімки всіх необхідних векторів перед оновленням будь-якої таблиці. np.add.at правильно накопичує повторювані вихідні індекси, включно зі словом, намальованим як позитивним, так і негативним. E і Ep є окремими масивами з плаваючою комою форми (V, d).
import numpy as np
def sgns_step(E, Ep, c, t, negatives, lr=0.1):
rows = np.r_[t, np.asarray(negatives, dtype=int)]
labels = np.zeros(len(rows))
labels[0] = 1
center = E[c].copy()
outputs = Ep[rows].copy()
logits = outputs @ center
z = np.exp(-np.abs(logits))
probabilities = np.where(logits >= 0, 1 / (1 + z), z / (1 + z))
errors = probabilities - labels
grad_center = errors @ outputs
grad_outputs = errors[:, None] * center
loss = np.sum(np.logaddexp(0, logits) - labels * logits)
np.add.at(Ep, rows, -lr * grad_outputs)
E[c] -= lr * grad_center
return float(loss) # loss before the update
# rng is a NumPy Generator; neg_dist sums to 1 over V words.
for c, t in pairs:
negatives = rng.choice(len(E), size=k, replace=True, p=neg_dist)
loss = sgns_step(E, Ep, c, t, negatives, lr)Для необмеженої оцінки та k незалежних негативних результатів розподілу q оптимум сукупності становить s*(c,w) = log[P_data(w|c) / (k q(w))]. Якщо q(w) = P_data(w), це стає PMI(c,w) − log(k). Використання q(w) ∝ count(w)^0.75 змінює термін корекції. Скінченновимірні вкладення можуть лише наблизити цю матрицю ідеальних показників.
Цей зв’язок є основою аналізу PMI Леві та Голдберга. Тут пояснюється, що охоплює оцінка SGNS; це не робить SGNS, SVD і повний softmax взаємозамінними об’єктивами.
Коли що використовувати
Використовуйте повний softmax, коли завдання потребує нормалізованого розподілу за фіксованим набором альтернатив і обчислення це доступно. Використовуйте вибіркову ціль, якщо якість представлення та вартість навчання виправдовують цей вибір. Жодна ціль не гарантує кращої точності для кожного завдання.
Прогнозування замаскованих токенів BERT і авторегресійне моделювання мови зазвичай використовують softmax словника. Системи пошуку часто порівнюють відповідний елемент із вибірковими або пакетними кандидатами. Вибір набору кандидатів відокремлений від вибору сигмовидної або м’якої максимальної втрати.
DPR вивчає результати проходження запиту, використовуючи softmax над кандидатськими проходами. Натомість моделі винагороди за переваги вивчають відносні оцінки відповідей, часто через −log σ(r_preferred − r_rejected); це ціль ранжирування, а не ціль вибіркового шуму word2vec. CLIP надає інший порівняльний приклад на основі softmax.
CLIP: контрастні зображення та підписи
CLIP було навчено на 400 мільйонах пар зображення–текст. Він використовує пакетні невідповідності як негативи, але його втрата є симетричною крос-ентропією softmax, а не незалежними двійковими втратами, які використовуються негативною вибіркою word2vec.
В оригінальних експериментах CLIP використовувався текстовий трансформатор у поєднанні з ResNet або трансформатором зору. Проекційні шари відображають обидва виходи в спільний простір вбудовування; його розмір залежить від варіанту моделі.
Для кожної навчальної партії N пар (I_1, T_1), ..., (I_N, T_N):
L2-нормалізує обидва набори вбудовань і формує S[i,j] = exp(t) × dot(image[i], text[j]), де t є вивченим логарифмічним масштабом. Скалярний добуток тепер дорівнює косинусній подібності. Застосувати крос-ентропію до кожного рядка з цільовим i і до кожного стовпця з цільовим i; середнє значення двох середніх втрат. Діагональ позначається позитивною, хоча недіагональні пари можуть містити помилкові негативи. Перегляньте реалізацію CLIP.
Оригінальна навчальна партія містила 32 768 пар, що давало кожному зображенню 32 767 негативних підписів. Вихідні дані кодера використовуються повторно, але обчислення попарних балів і синхронізація вбудовування між пристроями все ще має певну вартість.
Що ви отримуєте: простір для вбудовування, де семантично пов’язані зображення та тексти потрапляють близько, а непов’язані – далеко. Ось чому CLIP може виконувати нульову класифікацію зображень — обчислювати вбудовані тексти для назв класів («фото собаки», «фото кота» тощо), а потім класифікувати зображення за класом вбудованого класу, до якого воно найближче. Геометрія, вирізана контрастною втратою, вже кодує значення в двох модальностях; класифікатор з мітками не потрібен.
Необроблений скалярний добуток не є косинусом: SGNS може змінювати векторні норми, а також кути. CLIP нормалізує вектори та вивчає шкалу балів. Ці різні геометрії не передбачають універсального цільового кута для негативів, а також самі по собі не пояснюють розмір партії, який потрібен моделі.
Загальна ідея полягає в тому, щоб вчитися на порівняннях. Деталі мають значення: word2vec SGNS класифікує обрані пари незалежно, а CLIP змушує кандидатів конкурувати через softmax. Виберіть схему вибірки та втрату разом, відповідно до того, що мають відображати отримані бали.