Відстань, подібність і розкид
Модуль 1Урок 6 з 56Безкоштовний модуль
Коли слова стали точками, можна питати по-людськи: наскільки вони схожі? «Кіт» і «пес» — сусіди, «кіт» і «банан» — ні. Модель не відчуває схожості, вона міряє. Два інструменти, і вони відповідають на різні питання. Евклідова відстань — це довжина прямої між точками. Косинусна подібність — чи дивляться вектори в один бік, навіть якщо один із них довший.
Коли ці дві міри розходяться
Візьміть «кіт» [0.2, 0.8] і подвойте його: [0.4, 1.6]. Евклідова відстань між ними помітна — точки не в одному місці. Косинусна подібність рівно 1 — напрямок не змінився. Це і є практична різниця: довжина вектора в embedding часто відповідає радше за те, наскільки часте слово, ніж за його значення, тому напрямок цікавіший. Саме тому пошук за схожістю майже завжди рахує косинус, а не відстань.
Вправа
PythonНапишіть функцію cosine_similarity(a, b), яка повертає косинус кута між двома векторами: скалярний добуток, поділений на добуток довжин. Вважайте, що вектори однакової довжини й жоден з них не нульовий.
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 в бік від пʼятірки». Це та сама пара величин, яку ви вже рахували у вправі на нормалізацію.
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 питанняКілька питань за матеріалом уроку. Спроб — скільки завгодно.