Відстань, подібність і розкид

Модуль 1Урок 6 з 56Безкоштовний модуль

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

Коли ці дві міри розходяться

Візьміть «кіт» [0.2, 0.8] і подвойте його: [0.4, 1.6]. Евклідова відстань між ними помітна — точки не в одному місці. Косинусна подібність рівно 1 — напрямок не змінився. Це і є практична різниця: довжина вектора в embedding часто відповідає радше за те, наскільки часте слово, ніж за його значення, тому напрямок цікавіший. Саме тому пошук за схожістю майже завжди рахує косинус, а не відстань.

Подвоєння вектора [0.2, 0.8][0.2,\,0.8] збільшує евклідову відстань dd, але косинус лишається 11 — напрямок не змінюється.
d(a,b)=∑i(ai−bi)2,cos⁡(a,b)=a⋅b∥a∥∥b∥d(\mathbf{a}, \mathbf{b}) = \sqrt{\sum_i (a_i - b_i)^2}, \quad \cos(\mathbf{a}, \mathbf{b}) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|}

Вправа

Python

Напишіть функцію cosine_similarity(a, b), яка повертає косинус кута між двома векторами: скалярний добуток, поділений на добуток довжин. Вважайте, що вектори однакової довжини й жоден з них не нульовий.

Python
import math


def cosine_similarity(a, b):
    # ваш код
    return 0.0

Тести

Ще не перевіряли

    Примітка

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

    Середнє, дисперсія, стандартне відхилення

    Коли чисел багато, потрібен знімок усієї групи. Середнє — центр ваги: для [2, 4, 6, 8] це 5. Дисперсія каже, наскільки точки розʼїхалися від центру, а стандартне відхилення переводить дисперсію в ті самі одиниці, у яких записані самі числа. Для [2, 4, 6, 8] воно приблизно 2.24 — «типово на 2.2 в бік від пʼятірки». Це та сама пара величин, яку ви вже рахували у вправі на нормалізацію.

    Python
    import math
    
    def stats(values):
        mean = sum(values) / len(values)
        variance = sum((x - mean) ** 2 for x in values) / len(values)
        return mean, variance, math.sqrt(variance)
    
    for label, vals in [("щільні", [2, 2, 2, 2]), ("розкидані", [1, 5, 9, 13])]:
        mean, variance, std = stats(vals)
        print(label, "-> середнє", mean, "відхилення", round(std, 3))
    Вивід

    Натисніть «Запустити» — вивід зʼявиться тут

    Підказка

    Замініть один елемент у «щільному» наборі на 100 і подивіться, наскільки одне значення здатне зрушити відхилення всієї групи.

    Приклад

    Три набори для порівняння: [2, 2, 2, 2] — відхилення 0, повна тиша; [1, 5, 9, 13] — приблизно 4.47; [0, 10, 20, 30] — середнє 15, відхилення близько 11.18. Різниця між першим і третім набором і є те, за чим стежать під час навчання: чи активації тримаються купи, чи розлітаються.

    Порада

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

    У цій арифметиці є одна пастка. Стандартне відхилення само по собі не відрізняє «дані розкидані» від «в даних є один викид»: набір [1, 1, 1, 20] і набір [2, 6, 10, 14] дадуть схожі відхилення з дуже різних причин. Для активацій шару це важлива різниця: у першому випадку проблема в одному каналі, у другому шар просто працює в широкому діапазоні. Тому в модулі про статистику зʼявиться медіана — величина, якій один викид не страшний.

    Що запамʼятати

    Евклідова відстань відповідає на «як далеко», косинусна подібність — на «чи в один бік», і для embedding друге питання зазвичай корисніше. Середнє, дисперсія й стандартне відхилення описують типовість і розкид групи чисел, і на них тримається нормалізація. Разом ці ідеї зшивають статистику token, геометрію embedding і спокій шарів в одну картину першого модуля.

    Перевірка

    4 питання

    Кілька питань за матеріалом уроку. Спроб — скільки завгодно.

    1.Коли cosine similarity особливо корисна?
    2.Standard deviation для [2, 4, 6, 8] близько 2.24 означає…
    3.Як модель обирає наступне слово геометрично?
    4.Набір [2, 2, 2, 2] має std = 0. Це означає…