فاز 1 · درس 14

نرم‌ها و فاصله‌ها در یادگیری ماشین: از اقلیدسی تا کسینوسی و واسرشتاین

نوع
ساختنی
زمان
حدود 90 دقیقه
زبان‌ها
Python
نمودار مقایسه‌ی هندسی دایره و لوزی روی محورهای مختصات برای نمایش نواحی قید نرم L1 و L2
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. نرم‌ها: اندازه‌گیری بزرگی بردار
  5. نرم L1 (فاصله‌ی منهتن)
  6. نرم L2 (فاصله‌ی اقلیدسی)
  7. نرم‌های Lp: خانواده‌ی تعمیم‌یافته
  8. نرم L-بینهایت (فاصله‌ی چبیشف)
  9. شباهت کسینوسی و فاصله‌ی کسینوسی
  10. مقایسه‌ی شباهت ضرب نقطه‌ای و شباهت کسینوسی
  11. فاصله‌ی ماهالانوبیس
  12. شباهت جاکارد (برای مجموعه‌ها)
  13. فاصله‌ی ویرایشی (فاصله‌ی لِوِن‌اشتاین)
  14. دیورژانس کولبک-لایبلر (فاصله نیست، اما شبیه فاصله استفاده می‌شود)
  15. فاصله‌ی واسرشتاین (فاصله‌ی خاک‌بردار)
  16. چرا تسک‌های مختلف به فاصله‌های متفاوتی نیاز دارند
  17. ارتباط با توابع زیان
  18. ارتباط با منظم‌سازی
  19. جستجوی نزدیک‌ترین همسایه
  20. پیاده‌سازی از صفر
  21. گام 1: پیاده‌سازی تمام توابع نرم و فاصله
  22. گام 2: داده‌های یکسان، فاصله‌های متفاوت، همسایه‌های گوناگون
  23. گام 3: جستجوی شباهت با امبدینگ‌ها
  24. استفاده از ابزارهای واقعی
  25. تمرین‌ها
  26. راهنمایی‌ها
  27. اصطلاحات کلیدی
  28. برای مطالعه‌ی بیشتر

وقتی دو بردار عددی را با هم مقایسه می‌کنید؛ چه در یک پایگاه داده‌ی برداری (Vector Database)، چه در خوشه‌بندی یا سیستم توصیه‌گر، نخستین تصمیم شما انتخاب تابع فاصله است. متریک فاصله‌ای که برمی‌گزینید دقیقاً تعیین می‌کند که مفهوم «شباهت» چیست. اگر در داده‌های متنی یا متغیرهایی با مقیاس‌های متفاوت متریک اشتباهی انتخاب کنید، نزدیک‌ترین همسایه‌ها کاملاً اشتباه پیدا می‌شوند و مدل شما به بیراهه می‌رود.

در سیستم‌های نوین مبتنی بر امبدینگ و بازیابی اطلاعات، تمایز میان شباهت کسینوسی (Cosine Similarity)، فاصله‌ی اقلیدسی (L2) و سایر متریک‌ها مانند ماهالانوبیس تفاوت میان یک سیستم دقیق و یک خروجی غیرقابل استفاده است. در این درس مفاهیم هندسی و ریاضی تمام معیارهای پرکاربرد فاصله و نرم‌ها را بررسی می‌کنیم و می‌بینیم چگونه هر کدام هندسه‌ی متفاوتی برای فضای ویژگی‌ها می‌سازند.

تابع فاصله‌ی انتخابی شما، معنای «شباهت» را تعریف می‌کند. اگر اشتباه انتخاب کنید، همه‌چیز در ادامه‌ی مسیر خراب می‌شود.

اهداف یادگیری

  • پیاده‌سازی توابع فاصله‌ی L1، L2، کسینوسی، ماهالانوبیس (Mahalanobis)، جاکارد (Jaccard) و ویرایشی (edit distance) از صفر
  • انتخاب متریک فاصله‌ی مناسب برای یک تسک یادگیری ماشین معین و توضیح دلیل ناکارآمدی گزینه‌های دیگر
  • ارتباط میان نرم‌های L1 و L2 با منظم‌سازی‌های لاسو (LASSO) و ریج (Ridge) و نواحی قید هندسی آن‌ها
  • نشان دادن اینکه چگونه یک دیتاست واحد، تحت متریک‌های مختلف نزدیک‌ترین همسایه‌های متفاوتی تولید می‌کند

صورت مسئله

دو بردار دارید. شاید این بردارها امبدینگ‌های کلمات باشند، شاید پروفایل کاربران و شاید هم آرایه‌هایی از پیکسل‌ها. می‌خواهید بدانید: این دو بردار چقدر به هم نزدیک‌اند؟

پاسخ این پرسش کاملاً به تابع فاصله‌ای بستگی دارد که انتخاب می‌کنید. دو نقطه‌ی داده ممکن است تحت یک متریک نزدیک‌ترین همسایه باشند و تحت متریکی دیگر فرسنگ‌ها از هم فاصله داشته باشند. طبقه‌بند KNN، موتور توصیه‌گر، پایگاه داده‌ی برداری، الگوریتم خوشه‌بندی و تابع زیان شما همگی به این انتخاب وابسته‌اند. اگر اشتباه انتخاب کنید، مدل شما برای هدفی نادرست بهینه‌سازی می‌شود.

هیچ «بهترین فاصله‌ی مطلقی» وجود ندارد. فاصله‌ی L2 برای داده‌های مکانی عالی است. شباهت کسینوسی بر دنیای NLP حکمرانی می‌کند. جاکارد به کار مجموعه‌ها می‌آید. فاصله‌ی ویرایشی برای رشته‌های متنی است. ماهالانوبیس همبستگی میان متغیرها را لحاظ می‌کند. واسرشتاین (Wasserstein) جرم احتمالی را جابه‌جا می‌کند. هر یک از این متریک‌ها فرض متفاوتی را درباره‌ی معنای «شبیه بودن» در دل خود جای داده‌اند.

در این درس تمام توابع فاصله‌ی اصلی را از صفر پیاده‌سازی می‌کنیم، نشان می‌دهیم هر کدام در چه شرایطی ابزار مناسبی هستند و بررسی می‌کنیم که چگونه داده‌های یکسان، بسته به متریک انتخابی شما، نزدیک‌ترین همسایه‌های کاملاً متفاوتی پیدا می‌کنند.

مفاهیم پایه

نرم‌ها: اندازه‌گیری بزرگی بردار

نرم، «بزرگی» یا اندازه‌ی یک بردار را می‌سنجد. هر تابع فاصله‌ای میان دو بردار را می‌توان به‌صورت نرم تفاضل آن‌ها نوشت: d(a,b)=∥a−b∥d(a, b) = \lVert a - b \rVert. بنابراین درک نرم‌ها مساوی با درک فاصله‌هاست.

نرم L1 (فاصله‌ی منهتن)

نرم L1 مجموع قدرمطلق تمام مؤلفه‌ها را محاسبه می‌کند.

∥x∥1=∣x1∣+∣x2∣+⋯+∣xn∣\lVert x \rVert_1 = |x_1| + |x_2| + \cdots + |x_n|

به این دلیل فاصله‌ی منهتن نامیده می‌شود که فاصله‌ی پیاده‌روی روی یک شبکه‌ی خیابانی شطرنجی را نشان می‌دهد؛ جایی که فقط می‌توانید در امتداد محورها حرکت کنید و از مسیرهای مورب خبری نیست.

Point A = (1, 1)
Point B = (4, 5)

L1 distance = |4-1| + |5-1| = 3 + 4 = 7

On a grid, you walk 3 blocks east and 4 blocks north.

چه زمانی از L1 استفاده کنیم:

  • داده‌های خلوت (sparse) با ابعاد بالا (ویژگی‌های متنی، کدگذاری‌های one-hot)
  • زمانی که مقاومت در برابر داده‌های پرت (outliers) برایتان مهم است (یک اختلاف بسیار بزرگ کل نتیجه را تحت‌الشعاع قرار نمی‌دهد)
  • مسائل انتخاب ویژگی (منظم‌سازی L1 باعث خلوت شدن وزن‌ها می‌شود)

ارتباط با منظم‌سازی L1 (لاسو): افزودن ∥w∥1\lVert w \rVert_1 به تابع زیان، مجموع قدرمطلق مقادیر وزن‌ها را جریمه می‌کند. این کار وزن‌های کوچک را دقیقاً به صفر push می‌کند و عملاً نوعی انتخاب ویژگی خودکار انجام می‌دهد. جریمه‌ی L1 نواحی قید لوزی‌شکل در فضای وزن‌ها ایجاد می‌کند و گوشه‌های این لوزی‌ها دقیقاً روی محورها قرار دارند؛ یعنی جایی که برخی از وزن‌ها صفرند.

ارتباط با توابع زیان: میانگین خطای مطلق (MAE) در واقع میانگین فاصله‌ی L1 میان پیش‌بینی‌ها و مقادیر هدف است. این تابع تمام خطاها را به‌صورت خطی جریمه می‌کند، بنابراین در مقایسه با MSE مقاومت بسیار بیشتری در برابر داده‌های پرت دارد.

نرم L2 (فاصله‌ی اقلیدسی)

نرم L2 همان فاصله‌ی خط مستقیم است؛ یعنی جذر مجموع توان دوم مؤلفه‌ها.

∥x∥2=x12+x22+⋯+xn2\lVert x \rVert_2 = \sqrt{x_1^2 + x_2^2 + \cdots + x_n^2}

این همان فاصله‌ای است که در کلاس هندسه خوانده‌اید؛ فیثاغورس در nn بعد.

Point A = (1, 1)
Point B = (4, 5)

L2 distance = sqrt((4-1)^2 + (5-1)^2) = sqrt(9 + 16) = sqrt(25) = 5.0

The straight line, cutting diagonally through the grid.

چه زمانی از L2 استفاده کنیم:

  • داده‌های پیوسته با ابعاد کم تا متوسط
  • زمانی که مقیاس ویژگی‌ها با هم قابل مقایسه‌اند
  • فاصله‌های فیزیکی (داده‌های مکانی، مقادیر حسگرها)
  • شباهت تصاویر در سطح پیکسل

ارتباط با منظم‌سازی L2 (ریج): افزودن ∥w∥22\lVert w \rVert_2^2 به تابع زیان، وزن‌های بزرگ را جریمه می‌کند. برعکس L1، وزن‌ها را به صفر push نمی‌کند، بلکه تمام وزن‌ها را به شکلی متناسب به سمت صفر کوچک می‌کند. جریمه‌ی L2 نواحی قید دایره‌ای ایجاد می‌کند، در نتیجه هیچ گوشه‌ای روی محورها وجود ندارد. وزن‌ها کوچک می‌شوند اما به‌ندرت دقیقاً برابر با صفر خواهند شد.

ارتباط با توابع زیان: میانگین مربعات خطا (MSE) همان میانگین مجذور فاصله‌های L2 است. به توان دو رساندن باعث می‌شود خطاهای بزرگ بسیار سنگین‌تر از خطاهای کوچک جریمه شوند.

MAE (L1 loss):∣y−y^∣Linear penalty. Robust to outliers.MSE (L2 loss):(y−y^)2Quadratic penalty. Sensitive to outliers.\begin{aligned} \text{MAE (L1 loss):} \quad & |y - \hat{y}| && \text{Linear penalty. Robust to outliers.} \\ \text{MSE (L2 loss):} \quad & (y - \hat{y})^2 && \text{Quadratic penalty. Sensitive to outliers.} \end{aligned}

نرم‌های Lp: خانواده‌ی تعمیم‌یافته

نرم‌های L1 و L2 حالت‌های خاصی از نرم Lp هستند:

∥x∥p=(∣x1∣p+∣x2∣p+⋯+∣xn∣p)1/p\lVert x \rVert_p = (|x_1|^p + |x_2|^p + \cdots + |x_n|^p)^{1/p}

مقادیر مختلف pp، «گوی‌های واحد» متفاوتی تولید می‌کنند (مجموعه‌ی تمام نقاطی که فاصله‌شان از مبدأ حداکثر 1 است؛ شکل‌های زیر مرز این گوی‌ها را نشان می‌دهند):

p=1:    Diamond shape      (corners on axes)
p=2:    Circle/sphere      (the usual round ball)
p=3:    Superellipse       (rounded square)
p=inf:  Square/hypercube   (flat sides along axes)

نرم L-بینهایت (فاصله‌ی چبیشف)

وقتی pp به سمت بینهایت میل می‌کند، نرم Lp به بزرگ‌ترین قدرمطلق مؤلفه‌ها همگرا می‌شود.

∥x∥∞=max⁡(∣x1∣,∣x2∣,…,∣xn∣)\lVert x \rVert_\infty = \max(|x_1|, |x_2|, \ldots, |x_n|)

فاصله‌ی بین دو نقطه را تنها بُعدی تعیین می‌کند که بیشترین اختلاف را در آن دارند؛ بقیه‌ی ابعاد کاملاً نادیده گرفته می‌شوند.

Point A=(1,1)Point B=(4,5)L∞ distance=max⁡(∣4−1∣,∣5−1∣)=max⁡(3,4)=4\begin{aligned} \text{Point } A &= (1, 1) \\ \text{Point } B &= (4, 5) \\[6pt] L_\infty \text{ distance} &= \max(|4-1|, |5-1|) = \max(3, 4) = 4 \end{aligned}

چه زمانی از L-بینهایت استفاده کنیم:

  • زمانی که بیشترین انحراف در هر تک‌بُعد تعیین‌کننده است
  • صفحات بازی (شاه در شطرنج با متریک L-بینهایت حرکت می‌کند: یک گام در هر جهتی هزینه‌ی 1 دارد)
  • تلورانس‌های تولید (هر بُعد باید به‌طور مجزا در محدوده‌ی استاندارد باشد)

شباهت کسینوسی و فاصله‌ی کسینوسی

شباهت کسینوسی زاویه‌ی بین دو بردار را اندازه می‌گیرد و بزرگی آن‌ها را نادیده می‌گیرد.

cos_sim(a,b)=a⋅b∥a∥2 ∥b∥2\text{cos\_sim}(a, b) = \frac{a \cdot b}{\lVert a \rVert_2 \, \lVert b \rVert_2}

این مقدار بین 1- (جهت‌های کاملاً مخالف) تا 1+ (جهت کاملاً یکسان) متغیر است. بردارهای عمود بر هم شباهت کسینوسی برابر با 0 دارند.

فاصله‌ی کسینوسی این مقدار را به یک فاصله تبدیل می‌کند: cosine_distance = 1 - cosine_similarity. بازه‌ی این فاصله از 0 (جهت یکسان) تا 2 (جهت کاملاً مخالف) است.

a=(1,0)b=(1,1)cos_sim=1⋅1+0⋅11⋅2=12=0.707cos_dist=1−0.707=0.293\begin{aligned} & a = (1, 0) \qquad b = (1, 1) \\[6pt] & \text{cos\_sim} = \frac{1 \cdot 1 + 0 \cdot 1}{1 \cdot \sqrt{2}} = \frac{1}{\sqrt{2}} = 0.707 \\ & \text{cos\_dist} = 1 - 0.707 = 0.293 \end{aligned}

چرا کسینوسی بر NLP و امبدینگ‌ها مسلط است: در متن، طول سند نباید روی شباهت تأثیر بگذارد. سندی درباره‌ی گربه‌ها که طولش دو برابر سندی دیگر درباره‌ی گربه‌هاست، همچنان باید «شبیه» تلقی شود. شباهت کسینوسی بزرگی (طول) را نادیده می‌گیرد و فقط به جهت نگاه می‌کند. دو سند با توزیع کلمات یکسان اما طول‌های متفاوت، به یک جهت اشاره می‌کنند و شباهت کسینوسی آن‌ها دقیقاً 1.0 خواهد بود.

چه زمانی از شباهت کسینوسی استفاده کنیم:

  • شباهت متنی (بردارهای TF-IDF، امبدینگ‌های کلمات، امبدینگ‌های جملات)
  • هر حوزه‌ای که بزرگی بردار نویز محسوب می‌شود و سیگنال اصلی در جهت نهفته است
  • سیستم‌های توصیه‌گر (بردارهای ترجیحات کاربران)
  • جستجوی امبدینگ (پایگاه‌های داده‌ی برداری تقریباً همیشه از کسینوسی یا ضرب نقطه‌ای استفاده می‌کنند)

مقایسه‌ی شباهت ضرب نقطه‌ای و شباهت کسینوسی

ضرب نقطه‌ای (dot product) دو بردار عبارت است از:

a⋅b=a1b1+a2b2+⋯+anbn=∥a∥ ∥b∥cos⁡(angle)\begin{aligned} a \cdot b &= a_1 b_1 + a_2 b_2 + \cdots + a_n b_n \\ &= \lVert a \rVert \, \lVert b \rVert \cos(\text{angle}) \end{aligned}

شباهت کسینوسی در واقع همان ضرب نقطه‌ای است که بر بزرگی هر دو بردار تقسیم (نرمال‌سازی) شده است. اگر هر دو بردار از قبل نرمال شده باشند (اندازه‌ی هر کدام برابر با 1 باشد)، ضرب نقطه‌ای و شباهت کسینوسی کاملاً یکسان خواهند بود.

If ∥a∥=1 and ∥b∥=1:a⋅b=cos⁡(angle between a and b)\text{If } \lVert a \rVert = 1 \text{ and } \lVert b \rVert = 1: \quad a \cdot b = \cos(\text{angle between } a \text{ and } b)

تفاوت در کجاست: ضرب نقطه‌ای اطلاعات بزرگی بردار را در خود دارد. برداری با اندازه‌ی بزرگ‌تر، امتیاز ضرب نقطه‌ای بالاتری می‌گیرد. این موضوع در برخی سیستم‌های بازیابی اهمیت دارد؛ جایی که می‌خواهید آیتم‌های «محبوب‌تر» رتبه‌ی بالاتری کسب کنند. در این سناریو، بزرگی بردار مثل یک سیگنال ضمنی برای کیفیت یا اهمیت آیتم عمل می‌کند.

a = (3, 0)    b = (1, 0)    c = (0, 1)

dot(a, b) = 3     dot(a, c) = 0
cos(a, b) = 1.0   cos(a, c) = 0.0

Both agree on direction, but dot product also reflects magnitude.

در عمل:

  • اگر صرفاً شباهت جهتی را می‌خواهید، از شباهت کسینوسی استفاده کنید
  • اگر اندازه‌ی بردار اطلاعات معناداری دارد، از ضرب نقطه‌ای استفاده کنید
  • بسیاری از پایگاه‌های داده‌ی برداری (مانند Pinecone، Weaviate و Qdrant) به شما اجازه‌ی انتخاب بین این دو را می‌دهند
  • اگر امبدینگ‌های شما با نرم L2 نرمال شده باشند، تفاوتی میان این دو نخواهد بود

فاصله‌ی ماهالانوبیس

فاصله‌ی اقلیدسی با تمام ابعاد رفتاری یکسان دارد. اما اگر ویژگی‌های شما همبسته باشند یا مقیاس‌های متفاوتی داشته باشند، فاصله‌ی L2 نتایج گمراه‌کننده‌ای خواهد داد.

فاصله‌ی ماهالانوبیس ساختار کوواریانس داده‌ها را در نظر می‌گیرد.

dM(x,y)=(x−y)TS−1(x−y)d_M(x, y) = \sqrt{(x - y)^T S^{-1} (x - y)}

که در آن SS ماتریس کوواریانس داده‌هاست.

به زبان ساده: فاصله‌ی ماهالانوبیس ابتدا ناهمبسته‌سازی و نرمال‌سازی داده‌ها (سفیدسازی یا whitening) را انجام می‌دهد و سپس فاصله‌ی L2 را در آن فضای تبدیل‌یافته حساب می‌کند. اگر SS ماتریس همانی باشد (ویژگی‌های ناهمبسته با واریانس برابر با 1)، فاصله‌ی ماهالانوبیس به همان فاصله‌ی اقلیدسی تقلیل می‌یابد.

Example: height and weight are correlated.
Someone 6'2" and 180 lbs is not unusual.
Someone 5'0" and 180 lbs is unusual.

Euclidean distance might say they are equally far from the mean.
Mahalanobis distance correctly identifies the second as an outlier
because it accounts for the height-weight correlation.

چه زمانی از فاصله‌ی ماهالانوبیس استفاده کنیم:

  • تشخیص داده‌های پرت (نقاطی با فاصله‌ی ماهالانوبیس زیاد از میانگین، داده‌ی پرت هستند)
  • طبقه‌بندی در شرایطی که ویژگی‌ها مقیاس‌ها و همبستگی‌های متفاوتی دارند
  • زمانی که داده‌ی کافی برای برآورد یک ماتریس کوواریانس مطمئن در اختیار دارید
  • کنترل کیفیت در فرایندهای تولید (پایش فرایندهای چندمتغیره)

شباهت جاکارد (برای مجموعه‌ها)

شباهت جاکارد هم‌پوشانی میان دو مجموعه را اندازه می‌گیرد.

J(A,B)=∣A∩B∣∣A∪B∣J(A, B) = \frac{|A \cap B|}{|A \cup B|}

این مقدار بین 0 (بدون هم‌پوشانی) تا 1 (مجموعه‌های کاملاً یکسان) متغیر است. فاصله‌ی جاکارد نیز برابر است با: Jaccard distance = 1 - Jaccard similarity.

A = {cat, dog, fish}
B = {cat, bird, fish, snake}

Intersection = {cat, fish}         size = 2
Union = {cat, dog, fish, bird, snake}  size = 5

Jaccard similarity = 2/5 = 0.4
Jaccard distance = 0.6

چه زمانی از جاکارد استفاده کنیم:

  • مقایسه‌ی مجموعه‌ای از برچسب‌ها (tags)، دسته‌بندی‌ها یا ویژگی‌ها
  • شباهت اسناد بر اساس حضور کلمات (نه بسامد آن‌ها)
  • تشخیص موارد تقریباً تکراری (تقریب جاکارد به کمک MinHash)
  • مقایسه‌ی بردارهای ویژگی دودویی (داده‌های حضور/غیاب)
  • ارزیابی مدل‌های قطعه‌بندی (معیار Intersection over Union یا IoU همان جاکارد است)

فاصله‌ی ویرایشی (فاصله‌ی لِوِن‌اشتاین)

فاصله‌ی ویرایشی، کمترین تعداد عملیات تک‌کاراکتری لازم برای تبدیل یک رشته به رشته‌ی دیگر را می‌شمارد. این عملیات شامل درج (insert)، حذف (delete) یا جایگزینی (substitute) هستند.

"kitten" -> "sitting"

kitten -> sitten  (substitute k -> s)
sitten -> sittin  (substitute e -> i)
sittin -> sitting (insert g)

Edit distance = 3

این فاصله با استفاده از برنامه‌نویسی پویا (dynamic programming) محاسبه می‌شود؛ به این صورت که ماتریسی را پر می‌کنیم که درایه‌ی (i,j)(i, j) آن، فاصله‌ی ویرایشی میان ii کاراکتر اول رشته‌ی A و jj کاراکتر اول رشته‌ی B است.

        ""  s  i  t  t  i  n  g
    ""   0  1  2  3  4  5  6  7
    k    1  1  2  3  4  5  6  7
    i    2  2  1  2  3  4  5  6
    t    3  3  2  1  2  3  4  5
    t    4  4  3  2  1  2  3  4
    e    5  5  4  3  2  2  3  4
    n    6  6  5  4  3  3  2  3

چه زمانی از فاصله‌ی ویرایشی استفاده کنیم:

  • غلط‌یابی و تصحیح املایی
  • هم‌ترازسازی توالی‌های DNA (با وزن‌دهی به عملیات مختلف)
  • تطبیق فازی رشته‌ها (fuzzy string matching)
  • حذف موارد تکراری در داده‌های متنی شلخته

دیورژانس کولبک-لایبلر (فاصله نیست، اما شبیه فاصله استفاده می‌شود)

دیورژانس KL (یا Kullback-Leibler divergence) میزان تفاوت یک توزیع احتمال با توزیعی دیگر را می‌سنجد. این مبحث را در درس 09 بررسی کردیم، اما لازم است در این درس هم بیاید؛ زیرا با وجود اینکه فاصله نیست، مهندسان اغلب مثل یک «فاصله» از آن استفاده می‌کنند.

DKL(P ∥ Q)=∑xp(x)log⁡p(x)q(x)D_{KL}(P \,\|\, Q) = \sum_x p(x) \log\frac{p(x)}{q(x)}

یک ویژگی بسیار مهم: دیورژانس KL متقارن نیست.

DKL(P ∥ Q)≠DKL(Q ∥ P)D_{KL}(P \,\|\, Q) \ne D_{KL}(Q \,\|\, P)

این یعنی دیورژانس KL شرایط اولیه‌ی یک متریک فاصله را ندارد. در نامساوی مثلث هم صدق نمی‌کند. بنابراین یک دیورژانس است، نه یک فاصله.

دیورژانس KL مستقیم (DKL(P∥Q))(D_{KL}(P \Vert Q)) تمایل به پوشش میانگین دارد (mean-seeking): توزیع QQ تلاش می‌کند تمام مُدهای توزیع PP را پوشش دهد. دیورژانس KL معکوس (DKL(Q∥P))(D_{KL}(Q \Vert P)) تمایل به تمرکز روی مُد دارد (mode-seeking): توزیع QQ روی یک تک‌مُد از PP متمرکز می‌شود.

کاربردهای دیورژانس KL:

  • مدل‌های VAE (جمله‌ی KL در ELBO توزیع نهفته را به سمت یک توزیع پیشین push می‌کند)
  • تقطیر دانش یا Knowledge Distillation (مدل دانش‌آموز تلاش می‌کند با توزیع مدل معلم مطابقت پیدا کند)
  • روش RLHF (جریمه‌ی KL مدل ریزتنظیم‌شده را نزدیک به مدل پایه نگه می‌دارد)
  • روش‌های گرادیان خط‌مشی یا Policy Gradient (ایجاد قید روی به‌روزرسانی‌های خط‌مشی)

فاصله‌ی واسرشتاین (فاصله‌ی خاک‌بردار)

فاصله‌ی واسرشتاین حداقل «کار» لازم برای تبدیل یک توزیع احتمال به توزیعی دیگر را اندازه می‌گیرد. این‌طور فرض کنید: اگر یک توزیع تلی از خاک و دیگری یک گودال باشد، چه مقدار خاک را تا چه فاصله‌ای باید جابه‌جا کنید؟

W(P,Q)=inf⁡γE[d(x,y)](over all transport plans γ)W(P, Q) = \inf_{\gamma} \mathbb{E}[d(x, y)] \quad \text{(over all transport plans } \gamma\text{)}

برای توزیع‌های تک‌بعدی، این فرمول به انتگرال قدرمطلق تفاضل توابع توزیع تجمعی (CDF) ساده می‌شود:

W1(P,Q)=∫∣CDFP(x)−CDFQ(x)∣ dxW_1(P, Q) = \int |\text{CDF}_P(x) - \text{CDF}_Q(x)| \, dx

چرا واسرشتاین مهم است:

  • یک متریک واقعی است (متقارن است و در نامساوی مثلث صدق می‌کند)
  • حتی زمانی که توزیع‌ها هیچ هم‌پوشانی ندارند گرادیان تولید می‌کند (در این حالت دیورژانس KL به سمت بینهایت می‌رود)
  • همین ویژگی باعث شد تا نقش محوری در شبکه‌های Wasserstein GAN (یا WGAN) ایفا کند و ناپایداری آموزش در GANهای اولیه را رفع کند
Distributions with no overlap:

P: [1, 0, 0, 0, 0]    Q: [0, 0, 0, 0, 1]

KL divergence: infinity (log of zero)
Wasserstein: 4 (move all mass 4 bins)

Wasserstein gives a meaningful gradient. KL does not.

چه زمانی از واسرشتاین استفاده کنیم:

  • آموزش شبکه‌های زاینده (WGAN و WGAN-GP)
  • مقایسه‌ی توزیع‌هایی که ممکن است هیچ هم‌پوشانی نداشته باشند
  • مسائل حمل‌ونقل بهینه (optimal transport)
  • بازیابی تصاویر (مقایسه‌ی هیستوگرام‌های رنگی)

چرا تسک‌های مختلف به فاصله‌های متفاوتی نیاز دارند

تسک بهترین فاصله دلیل
شباهت متنی کسینوسی اندازه نویز است و جهت مفهوم را نشان می‌دهد
مقایسه‌ی پیکسلی تصاویر L2 روابط مکانی مهم‌اند، ویژگی‌ها مقیاس مقایسه‌پذیری دارند
ویژگی‌های تنک با ابعاد بالا L1 مقاوم است و اختلافات بزرگ و نادر را تشدید نمی‌کند
هم‌پوشانی مجموعه‌ها (برچسب‌ها، دسته‌ها) جاکارد داده‌ها ذاتاً مجموعه‌ای هستند، نه برداری
تطبیق رشته‌ها فاصله‌ی ویرایشی عملیات آن با شهود انسان از ویرایش متن همخوانی دارد
تشخیص داده‌های پرت ماهالانوبیس همبستگی و مقیاس‌های مختلف ویژگی‌ها را لحاظ می‌کند
مقایسه‌ی توزیع‌ها دیورژانس KL میزان اطلاعات هدررفته در صورت استفاده از QQ به‌جای PP را می‌سنجد
آموزش GAN واسرشتاین حتی وقتی توزیع‌ها هم‌پوشانی ندارند گرادیان تولید می‌کند
امبدینگ‌ها (پایگاه داده‌ی برداری) کسینوسی یا ضرب نقطه‌ای امبدینگ‌ها طوری آموزش دیده‌اند که معنا را در جهت بردار کدگذاری کنند
سیستم‌های توصیه‌گر ضرب نقطه‌ای اندازه‌ی بردار می‌تواند محبوبیت یا اطمینان را کدگذاری کند
توالی‌های DNA فاصله‌ی ویرایشی وزن‌دار هزینه‌ی جایگزینی جفت نوکلئوتیدها با هم متفاوت است
کنترل کیفیت در فرایندهای تولید L-بینهایت بیشترین انحراف در هر تک‌بُعد تعیین‌کننده است

ارتباط با توابع زیان

توابع زیان در واقع همان توابع فاصله هستند که روی مقادیر پیش‌بینی‌شده در برابر مقادیر هدف اعمال می‌شوند.

Loss function       Distance it uses       Behavior
MSE                 L2 squared             Penalizes large errors heavily
MAE                 L1                     Penalizes all errors equally
Huber loss          L1 for large errors,   Best of both: robust to outliers,
                    L2 for small errors    smooth gradient near zero
Cross-entropy       KL divergence          Measures distribution mismatch
Hinge loss          max(0, margin - d)     Only penalizes below margin
Triplet loss        L2 (typically)         Pulls positives close, pushes
                                           negatives away
Contrastive loss    L2                     Similar pairs close, dissimilar
                                           pairs beyond margin

ارتباط با منظم‌سازی

منظم‌سازی جریمه‌ای از جنس نرم روی وزن‌ها به تابع زیان اضافه می‌کند.

L1 regularization (Lasso):   loss + lambda * ||w||_1
  -> Sparse weights. Some weights become exactly zero.
  -> Automatic feature selection.
  -> Solution has corners (non-differentiable at zero).

L2 regularization (Ridge):   loss + lambda * ||w||_2^2
  -> Small weights. All weights shrink toward zero.
  -> No feature selection (nothing goes to exactly zero).
  -> Smooth solution everywhere.

Elastic Net:                  loss + lambda_1 * ||w||_1 + lambda_2 * ||w||_2^2
  -> Combines sparsity of L1 with stability of L2.
  -> Groups of correlated features are kept or dropped together.

چرا L1 تنکی ایجاد می‌کند اما L2 نه: ناحیه‌ی قید را در یک فضای دوبعدی وزن تجسم کنید. قید L1 یک لوزی و قید L2 یک دایره است. منحنی‌های تراز بیضی‌شکل تابع زیان به احتمال زیاد لوزی را در یکی از گوشه‌ها لمس می‌کنند؛ یعنی جایی که یکی از وزن‌ها صفر است. در مقابل، این بیضی‌ها دایره را در نقطه‌ای هموار لمس می‌کنند که در آن هر دو وزن غیرصفر هستند.

هر تابع فاصله‌ای به یک مسئله‌ی جستجوی نزدیک‌ترین همسایه منتهی می‌شود: به ازای یک نقطه‌ی کوئری مشخص، نزدیک‌ترین نقاط را در یک دیتاست پیدا کن.

جستجوی دقیق نزدیک‌ترین همسایه برای یک کوئری در دیتاستی با nn نقطه و dd بُعد دارای پیچیدگی زمانی O(n⋅d)O(n \cdot d) است. برای دیتاست‌های بزرگ، این سرعت بسیار پایین است.

الگوریتم‌های تقریبی نزدیک‌ترین همسایه (Approximate Nearest Neighbor یا ANN) مقدار اندکی از دقت را فدای افزایش چشمگیر سرعت می‌کنند:

Algorithm         Approach                      Used by
KD-trees          Axis-aligned space partition   scikit-learn (low-dim)
Ball trees        Nested hyperspheres            scikit-learn (medium-dim)
LSH               Random hash projections        Near-duplicate detection
HNSW              Hierarchical navigable         FAISS, Qdrant, Weaviate
                  small-world graph
IVF               Inverted file index with       FAISS (billion-scale)
                  cluster-based search
Product quant.    Compress vectors, search       FAISS (memory-constrained)
                  in compressed space

الگوریتم HNSW (گراف دنیای کوچک ناوبر سلسله‌مراتبی) الگوریتم غالب در پایگاه‌های داده‌ی برداری امروزی است. این روش گرافی چندلایه می‌سازد که در آن هر گره به نزدیک‌ترین همسایه‌های تقریبی خود متصل است. جستجو از بالاترین لایه (تنک، با پرش‌های بلند) شروع می‌شود و به پایین‌ترین لایه (متراکم، با پرش‌های کوتاه) می‌رسد.

گوی‌های واحد نرمانتخاب یک نُرم
NORM UNIT BALLSA norm measures length, and its unit ball is every vector of length one. L2 sums squares and gives a circle; L1 sums absolute values and gives a diamond; Linf takes the largest coordinate and gives a square. Which norm you choose changes what counts as close, which is why it shapes regularization and distance.
نرم طول را اندازه می‌گیرد و گوی واحد آن شامل تمام بردارهایی با طول یک است. نرم L2 مجذورها را جمع می‌زند و یک دایره می‌سازد؛ L1 قدر مطلق‌ها را جمع می‌زند و یک لوزی ایجاد می‌کند؛ Linf بزرگ‌ترین مؤلفه را در نظر می‌گیرد و یک مربع به دست می‌دهد. انتخاب نرم، مفهوم «نزدیک بودن» را تغییر می‌دهد و به همین دلیل بر فاصله‌ و منظم‌سازی (regularization) اثر مستقیم دارد.

پیاده‌سازی از صفر

گام 1: پیاده‌سازی تمام توابع نرم و فاصله

برای دیدن کد کامل پیاده‌سازی به code/distances.py مراجعه کنید. هر تابع از پایه و تنها با محاسبات پایه‌ای ریاضی پایتون پیاده‌سازی شده است.

گام 2: داده‌های یکسان، فاصله‌های متفاوت، همسایه‌های گوناگون

دموی موجود در distances.py دیتاستی می‌سازد، یک نقطه‌ی کوئری تعیین می‌کند و نشان می‌دهد که چگونه نزدیک‌ترین همسایه با تغییر متریک فاصله عوض می‌شود. نقطه‌ای که تحت نرم L1 «نزدیک‌ترین» است، ممکن است تحت L2 یا کسینوسی دیگر نزدیک‌ترین نباشد.

این کد شامل یک جستجوی شباهت امبدینگ ماک (mock) است که شبیه‌ترین «اسناد» به یک کوئری را با شباهت کسینوسی در برابر فاصله‌ی L2 پیدا می‌کند و نشان می‌دهد رتبه‌بندی نتایج در این دو حالت متفاوت خواهد بود.

استفاده از ابزارهای واقعی

رایج‌ترین کاربرد عملیاتی این مبحث، یافتن آیتم‌های مشابه در پایگاه‌های داده‌ی برداری است.

import numpy as np

def cosine_similarity_matrix(X):
    norms = np.linalg.norm(X, axis=1, keepdims=True)
    norms = np.where(norms == 0, 1, norms)
    X_normalized = X / norms
    return X_normalized @ X_normalized.T

embeddings = np.random.randn(1000, 768)

sim_matrix = cosine_similarity_matrix(embeddings)

query_idx = 0
similarities = sim_matrix[query_idx]
top_k = np.argsort(similarities)[::-1][1:6]
print(f"Top 5 most similar to item 0: {top_k}")
print(f"Similarities: {similarities[top_k]}")

وقتی متد model.encode(text) را صدا می‌زنید و بعد در یک پایگاه داده‌ی برداری جستجو می‌کنید، دقیقاً این اتفاق زیر هود رخ می‌دهد: مدل امبدینگ متن را به بردار تبدیل می‌کند. سپس پایگاه داده‌ی برداری شباهت کسینوسی (یا ضرب نقطه‌ای) بین بردار کوئری شما و تک‌تک بردارهای ذخیره‌شده را با استفاده از الگوریتم‌های ANN محاسبه می‌کند تا مجبور به بررسی همه‌ی آن‌ها نباشد.

تمرین‌ها

  1. فاصله‌های L2 ،L1 و L-بینهایت را بین دو نقطه‌ی (1, 2, 3) و (4, 0, 6) محاسبه کنید. بررسی کنید که رابطه‌ی L∞≤L2≤L1L_\infty \le L_2 \le L_1 برای هر جفت نقطه همواره برقرار است. اثبات کنید که چرا این ترتیب همیشه تضمین‌شده است.

  2. دو بردار بسازید که شباهت کسینوسی بالایی دارند (بیشتر از 0.9) اما فاصله‌ی L2 آن‌ها زیاد است (بیشتر از 10). به شکل هندسی توضیح دهید چه اتفاقی می‌افتد. سپس دو بردار بسازید که شباهت کسینوسی پایینی دارند (کمتر از 0.3) اما فاصله‌ی L2 آن‌ها کوچک است (کمتر از 0.5).

  3. تابعی پیاده‌سازی کنید که یک دیتاست و یک نقطه‌ی کوئری را دریافت کند و نزدیک‌ترین همسایه را تحت فاصله‌های L2 ،L1، کسینوسی و ماهالانوبیس برگرداند. دیتاستی پیدا کنید که در آن هر چهار متریک بر سر نزدیک‌ترین نقطه با هم اختلاف‌نظر داشته باشند.

  4. فاصله‌ی واسرشتاین را برای دو توزیع [0.5, 0.5, 0, 0] و [0, 0, 0.5, 0.5] به‌صورت دستی و با روش CDF محاسبه کنید. سپس این مقدار را برای [0.25, 0.25, 0.25, 0.25] و [0, 0, 0.5, 0.5] حساب کنید. کدام مقدار بزرگ‌تر است و چرا؟

  5. الگوریتم MinHash را برای تقریب شباهت جاکارد پیاده‌سازی کنید. 100 مجموعه‌ی تصادفی بسازید، جاکارد دقیق را برای تمام جفت‌ها حساب کنید و با تقریب MinHash به ازای 50، 100 و 200 تابع هش مقایسه کنید. خطای تقریب را رسم کنید.

راهنمایی‌ها

تمرین 1. بردار تفاضل برابر با (-3, 2, -3) است؛ سه نرم این بردار را با توابع l1_norm، l2_norm و linf_norm به دست آورید. برای اثبات، بزرگ‌ترین ∣di∣\lvert d_i \rvert را با مجموع توان‌های دوم و مجموع توان‌های دوم را با توان دوم مجموع قدرمطلق‌ها مقایسه کنید.

تمرین 2. از آنجا که شباهت کسینوسی طول بردار را نادیده می‌گیرد، با دو بردار شروع کنید که تقریباً هم‌جهت هستند و طول یکی را بسیار بزرگ‌تر در نظر بگیرید. برای حالت دوم، دو بردار کوتاه نزدیک به مبدأ بسازید که جهت‌های متفاوتی دارند و هر دو شرط را با cosine_similarity و l2_distance بررسی کنید.

تمرین 3. تابع find_nearest_neighbor(query, dataset, distance_fn) را به ازای هر یک از توابع l1_distance، l2_distance، cosine_distance و mahalanobis_distance یک‌بار فراخوانی کنید. تابع demo_different_neighbors دیتاستی را نشان می‌دهد که این متریک‌ها در آن هم‌نظر نیستند؛ ابتدا آن را بررسی کنید و سپس نقاط را طوری تغییر دهید که پاسخ هر چهار مورد متفاوت شود.

تمرین 4. مجموع تجمعی هر توزیع را بنویسید و سپس قدرمطلق اختلاف‌های دو مجموع تجمعی را با هم جمع کنید. هر دو نتیجه‌ی محاسبات دستی را با تابع wasserstein_1d(p, q) بررسی کنید و علت بزرگ‌تر بودن مقدار را بر اساس مسافتی که جرم احتمال باید جابه‌جا شود، توضیح دهید.

تمرین 5. به ازای هر تابع هش، امضای MinHash یک مجموعه برابر با کمترین مقدار هش در بین عناصر آن است. نسبتی از توابع هش که در آن‌ها دو مجموعه به کمینه‌ی یکسانی می‌رسند، تخمینی از شباهت جاکارد آن‌ها خواهد بود. هر تخمین را با jaccard_similarity مقایسه کنید؛ خطا باید به ازای kk تابع هش، تقریباً با نرخ 1/k1/\sqrt{k} کاهش یابد.

اصطلاحات کلیدی

اصطلاح آنچه گفته می‌شود معنای دقیق فنی
نرم (Norm) «بزرگی بردار» تابعی که یک بردار را به یک اسکالر نامنفی نگاشت می‌کند و شرایط نامساوی مثلث، تجانس مطلق و شرط صفر بودن فقط برای بردار صفر را برآورده می‌سازد
نرم L1 «فاصله‌ی منهتن» مجموع قدرمطلق مؤلفه‌ها. در بهینه‌سازی تنکی ایجاد می‌کند و در برابر داده‌های پرت مقاوم است
نرم L2 «فاصله‌ی اقلیدسی» جذر مجموع توان‌های دوم مؤلفه‌ها. همان فاصله‌ی خط مستقیم در فضای اقلیدسی
نرم Lp «نرم تعمیم‌یافته» ریشه‌ی ppام از مجموع توان‌های ppام قدرمطلق مؤلفه‌ها. L1 و L2 حالت‌های خاص آن هستند
نرم L-بینهایت «نرم ماکزیمم» یا «فاصله‌ی چبیشف» بزرگ‌ترین قدرمطلق بین تمام مؤلفه‌ها. حد نرم Lp زمانی که pp به سمت بینهایت میل می‌کند
شباهت کسینوسی «زاویه‌ی بین بردارها» ضرب نقطه‌ای تقسیم بر بزرگی هر دو بردار. در بازه‌ی 1- تا 1+ قرار دارد و طول بردار را نادیده می‌گیرد
فاصله‌ی کسینوسی «1 منهای شباهت کسینوسی» تبدیل شباهت کسینوسی به یک فاصله. در بازه‌ی 0 تا 2 تغییر می‌کند
ضرب نقطه‌ای «کسینوسی نرمال‌نشده» مجموع حاصل‌ضرب مؤلفه‌به‌مؤلفه. برابر با شباهت کسینوسی ضرب در بزرگی هر دو بردار
فاصله‌ی ماهالانوبیس «فاصله‌ی آگاه از همبستگی» فاصله‌ی L2 در فضایی که با استفاده از ماتریس کوواریانس داده‌ها سفیدسازی (سلب همبستگی و نرمال‌سازی) شده است
شباهت جاکارد «هم‌پوشانی مجموعه‌ها» اندازه‌ی اشتراک تقسیم بر اندازه‌ی اجتماع. مخصوص مجموعه‌هاست، نه بردارها
فاصله‌ی ویرایشی «فاصله‌ی لِوِن‌اشتاین» حداقل تعداد درج، حذف و جایگزینی برای تبدیل یک رشته به رشته‌ای دیگر
دیورژانس KL «فاصله‌ی بین توزیع‌ها» یک فاصله‌ی واقعی نیست (نامتقارن است). تعداد بیت‌های اضافی ناشی از کدگذاری PP با استفاده از QQ را می‌سنجد
فاصله‌ی واسرشتاین «فاصله‌ی خاک‌بردار» حداقل کار لازم برای انتقال جرم از یک توزیع به توزیع دیگر. یک متریک واقعی است
نزدیک‌ترین همسایه‌ی تقریبی «جستجوی ANN» الگوریتم‌هایی (مانند HNSW ،LSH و IVF) که نقاط تقریباً نزدیک را بسیار سریع‌تر از جستجوی دقیق پیدا می‌کنند
الگوریتم HNSW «الگوریتم پایگاه داده‌ی برداری» گراف دنیای کوچک ناوبر سلسله‌مراتبی. گرافی چندلایه برای جستجوی سریع نزدیک‌ترین همسایه‌های تقریبی
منظم‌سازی L1 «لاسو» افزودن نرم L1 وزن‌ها به تابع زیان. وزن‌ها را دقیقاً به سمت صفر push می‌کند (تنکی)
منظم‌سازی L2 «ریج» یا «کاهش وزن (weight decay)» افزودن مجذور نرم L2 وزن‌ها به تابع زیان. وزن‌ها را بدون صفر کردن کامل، به سمت صفر کوچک می‌کند
الاستیک نت (Elastic Net) «L1 + L2» ترکیبی از منظم‌سازی‌های L1 و L2. با گروه‌های ویژگی همبسته بهتر از هر یک به‌تنهایی کار می‌کند

برای مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسشباهت کسینوسی چه چیزی را میان دو بردار اندازه می‌گیرد؟
  2. پیش از درسچرا به فاصله L1 «فاصله منهتن» می‌گویند؟
  3. پس از درسچرا منظم‌سازی L1 (Lasso) وزن‌های تنک (sparse) تولید می‌کند اما منظم‌سازی L2 (Ridge) این‌طور نیست؟
  4. پس از درسفاصله واسراشتاین (Wasserstein) چه مزیتی نسبت به واگرایی KL در مقایسه توزیع‌های احتمال دارد؟
  5. پس از درسچه زمانی از فاصله ماهالانوبیس (Mahalanobis) به جای فاصله اقلیدسی استفاده می‌کنید؟

سؤالات متداول

تفاوت اصلی شباهت کسینوسی و فاصله‌ی اقلیدسی (L2) چیست؟

شباهت کسینوسی فقط زاویه‌ی بین دو بردار را اندازه می‌گیرد و طول آن‌ها را نادیده می‌گیرد، بنابراین برای متن و امبدینگ بسیار مناسب است؛ اما فاصله‌ی اقلیدسی فاصله‌ی مستقیم هندسی را می‌سنجد و شدت یا طول بردار مستقیماً روی نتیجه اثر دارد.

چرا نرم L1 (منهتن) باعث تنکی وزن‌ها می‌شود اما L2 (ریج) نه؟

ناحیه‌ی قید نرم L1 در فضای پارامترها به شکل لوزی با گوشه‌های تیز روی محورهاست، در نتیجه خطوط تراز تابع زیان معمولاً در نقطه‌ای با آن برخورد می‌کنند که یک یا چند وزن دقیقاً صفر می‌شوند. در مقابل، قید L2 دایره‌ای و هموار است و وزن‌ها را فقط کوچک می‌کند.

چه زمانی باید از فاصله‌ی ماهالانوبیس به‌جای اقلیدسی استفاده کرد؟

هنگامی که ویژگی‌های ورودی با یکدیگر همبستگی دارند یا مقیاس‌های آن‌ها یکسان نیست؛ فاصله‌ی ماهالانوبیس با استفاده از ماتریس کوواریانس، فضا را ناهمبسته و مقیاس‌ها را نرمال می‌کند.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.