পাঠ ০৫ · ৩৫-এর মধ্যে · মডিউল ২
Home / AI Courses / Math for AI & ML / ভেক্টর নর্ম ও দূরত্ব

ভেক্টর নর্ম ও দূরত্ব

Vector norms & distance
৯ মিনিট পড়া শুরু-মধ্যম · Beginner NumPy কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • $L_1$, $L_2$ ও $L_\infty$ নর্মের সংজ্ঞা এবং তাদের মধ্যে পার্থক্য
  • ইউক্লিডিয়ান দূরত্ব কীভাবে নর্ম থেকে সরাসরি আসে
  • ইউনিট ভেক্টর ও নরমালাইজেশন কীভাবে করা হয়
  • কেন এই নর্মগুলো পরে রেগুলারাইজেশনে গুরুত্বপূর্ণ হয়ে উঠবে (পাঠ ৩২-এর পূর্বাভাস)

১ · নর্ম কী — ভেক্টরের "দৈর্ঘ্য" পরিমাপ

একটি নর্ম হলো একটি ফাংশন যা একটি ভেক্টরকে একটি অ-ঋণাত্মক সংখ্যা দেয়, যা সেই ভেক্টরের "আকার" বা "দৈর্ঘ্য" বোঝায়। বিভিন্ন নর্ম "দৈর্ঘ্য" বোঝার ভিন্ন ভিন্ন উপায় — ঠিক যেমন শহরে এক জায়গা থেকে আরেক জায়গায় যাওয়ার দূরত্ব "সরলরেখায়" নাকি "রাস্তা ধরে" মাপা হচ্ছে তার উপর ভিন্ন হতে পারে। এই পাঠে আমরা তিনটি সবচেয়ে বেশি ব্যবহৃত নর্ম দেখব: $L_1$, $L_2$ ও $L_\infty$।

২ · $L_2$ নর্ম (ইউক্লিডিয়ান)

সবচেয়ে পরিচিত নর্ম হলো $L_2$ নর্ম বা ইউক্লিডিয়ান নর্ম — পিথাগোরাসের উপপাদ্যের সরাসরি সাধারণীকরণ:

$$\|\mathbf{x}\|_2 = \sqrt{\sum_{i=1}^{n} x_i^2} = \sqrt{x_1^2+x_2^2+\dots+x_n^2}$$

যেমন $\mathbf{x}=(3,4)$ হলে $\|\mathbf{x}\|_2=\sqrt{3^2+4^2}=\sqrt{9+16}=\sqrt{25}=5$ — ঠিক ২D-তে একটি সমকোণী ত্রিভুজের অতিভুজের (hypotenuse) দৈর্ঘ্যের মতো। লক্ষ্য করুন, $\|\mathbf{x}\|_2^2 = \mathbf{x}\cdot\mathbf{x}$ (নিজের সাথে নিজের ডট প্রোডাক্ট, পাঠ ০৪) — অর্থাৎ $L_2$ নর্ম ও ডট প্রোডাক্ট একে অপরের সাথে সরাসরি যুক্ত।

৩ · $L_1$ নর্ম (ম্যানহাটন)

$L_1$ নর্ম প্রতিটি উপাদানের পরম মান (absolute value) যোগ করে:

$$\|\mathbf{x}\|_1 = \sum_{i=1}^{n} |x_i| = |x_1| + |x_2| + \dots + |x_n|$$

একে "ম্যানহাটন নর্ম"ও বলা হয়, কারণ এটি এমন একটি শহরের গ্রিড-আকৃতির রাস্তায় হাঁটার দূরত্বের মতো, যেখানে তির্যকভাবে (diagonally) যাওয়া যায় না — শুধু সমান্তরাল ও লম্ব রাস্তা ধরে। $\mathbf{x}=(3,4)$-এর জন্য $\|\mathbf{x}\|_1=|3|+|4|=7$ — লক্ষ্য করুন এটি $L_2$ নর্ম ($5$)-এর চেয়ে বড়, কারণ এটি "সরলরেখার" বদলে "গ্রিড ধরে" দূরত্ব মাপে।

৪ · $L_\infty$ নর্ম

$L_\infty$ নর্ম শুধু সবচেয়ে বড় (পরম মানে) উপাদানটি বেছে নেয়:

$$\|\mathbf{x}\|_\infty = \max_i |x_i|$$

$\mathbf{x}=(3,4)$-এর জন্য $\|\mathbf{x}\|_\infty=\max(3,4)=4$। এটি বোঝায় "সবচেয়ে খারাপ/বড় একক উপাদান" — যা কখনো কখনো ব্যবহারিক গুরুত্ব রাখে (যেমন, একটি নেটওয়ার্কের কোনো একটি ওজনও যদি খুব বড় হয়ে যায়, সেটা ধরতে)।

এক নজরে তিনটি নর্ম — $\mathbf{x}=(3,4)$-এর উদাহরণ

$\|\mathbf{x}\|_1=7$ (যোগফল) · $\|\mathbf{x}\|_2=5$ (সরলরেখা দূরত্ব) · $\|\mathbf{x}\|_\infty=4$ (সর্বোচ্চ উপাদান)। সবসময় $\|\mathbf{x}\|_\infty \le \|\mathbf{x}\|_2 \le \|\mathbf{x}\|_1$ — এই ক্রমটা মনে রাখলে ভুল চেনা সহজ হয়।

৫ · দূরত্ব: $\|\mathbf{u}-\mathbf{v}\|$

দুটি ভেক্টরের মধ্যে দূরত্ব বলতে বোঝায় তাদের পার্থক্য-ভেক্টরের নর্ম। সবচেয়ে বেশি ব্যবহৃত হলো ইউক্লিডিয়ান দূরত্ব — $L_2$ নর্ম ব্যবহার করে:

$$\text{dist}(\mathbf{u},\mathbf{v}) = \|\mathbf{u}-\mathbf{v}\|_2 = \sqrt{\sum_i (u_i-v_i)^2}$$

যেমন $\mathbf{u}=(1,2)$ ও $\mathbf{v}=(4,6)$ হলে $\mathbf{u}-\mathbf{v}=(-3,-4)$, এবং $\|\mathbf{u}-\mathbf{v}\|_2=\sqrt{9+16}=5$। ML-এ এই দূরত্ব সূত্রটি সর্বত্র ব্যবহৃত হয় — যেমন k-nearest-neighbors-এ "কাছাকাছি" বিন্দু খোঁজা, অথবা ক্লাস্টারিং-এ কোন বিন্দু কোন কেন্দ্রের সবচেয়ে কাছে তা ঠিক করা।

৬ · ইউনিট ভেক্টর ও নরমালাইজেশন

একটি ভেক্টরের দৈর্ঘ্য ঠিক $1$ হলে তাকে ইউনিট ভেক্টর বলে। যেকোনো অ-শূন্য ভেক্টর $\mathbf{x}$-কে তার নিজের $L_2$ নর্ম দিয়ে ভাগ করলে সমান দিকের একটি ইউনিট ভেক্টর পাওয়া যায় — একে নরমালাইজেশন বলে:

$$\hat{\mathbf{x}} = \frac{\mathbf{x}}{\|\mathbf{x}\|_2}$$

এই $\hat{\mathbf{x}}$-এর নর্ম সবসময় ঠিক $1$ (এটা যাচাই করাই পরের অনুশীলনের একটি অংশ)। নরমালাইজেশন গুরুত্বপূর্ণ যখন আমরা শুধু "দিক" নিয়ে আগ্রহী, "মাত্রা/দৈর্ঘ্য" নিয়ে নয় — যেমন পাঠ ০৪-এর কোসাইন সিমিলারিটি আসলে দুটো ভেক্টরকে প্রথমে নরমালাইজ করে তারপর ডট প্রোডাক্ট নেওয়ার সমতুল্য।

পূর্বাভাস — পাঠ ৩২: $L_1$ ও $L_2$ নর্ম এখানে শুধু ভেক্টরের "মাপ" হিসেবে দেখলেও, এই কোর্সের অনেক পরে (পাঠ ৩২) দেখবেন মডেলের ওজন ভেক্টরের $L_2$ নর্মকে ছোট রাখতে বাধ্য করাই Ridge regression, আর $L_1$ নর্মকে ছোট রাখাই Lasso regression — একই সূত্র, সম্পূর্ণ ভিন্ন প্রসঙ্গে ব্যবহৃত।

৭ · কোড দিয়ে দেখুন — NumPy-তে নর্ম ও নরমালাইজেশন

NumPy-র np.linalg.norm ফাংশন দিয়ে যেকোনো নর্ম হিসাব করা যায়, শুধু ord প্যারামিটার বদলে।

Python · NumPy
import numpy as np

x = np.array([3.0, 4.0])

print("L1 norm:", np.linalg.norm(x, ord=1))       # 7.0
print("L2 norm:", np.linalg.norm(x, ord=2))       # 5.0
print("L-inf norm:", np.linalg.norm(x, ord=np.inf))  # 4.0

u = np.array([1.0, 2.0])
v = np.array([4.0, 6.0])
distance = np.linalg.norm(u - v)
print("euclidean distance(u, v):", distance)      # 5.0

# নরমালাইজেশন -> ইউনিট ভেক্টর
x_hat = x / np.linalg.norm(x)
print("normalized x:", x_hat)
print("norm of normalized x:", np.linalg.norm(x_hat))  # 1.0 হওয়া উচিত

    
মূল কথা · Key takeaway

np.linalg.norm(x) ডিফল্টভাবে $L_2$ নর্ম দেয়। কোনো ভেক্টরকে ইউনিট দৈর্ঘ্যে আনতে চাইলে x / np.linalg.norm(x) — এই একটি লাইনই যথেষ্ট, এবং এটি বহু ML পাইপলাইনে (embedding তুলনা, ফিচার স্কেলিং) ব্যবহৃত হয়।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ $L_2$ নর্মকে "ইউক্লিডিয়ান" বলা হয় কেন? পিথাগোরাসের উপপাদ্যের সাথে এর সম্পর্ক কী?

পিথাগোরাসের উপপাদ্য বলে, একটি সমকোণী ত্রিভুজে অতিভুজের বর্গ = অন্য দুই বাহুর বর্গের যোগফল ($c^2=a^2+b^2$)। ২D-তে $\mathbf{x}=(x_1,x_2)$-এর $L_2$ নর্ম $\sqrt{x_1^2+x_2^2}$ ঠিক এই সূত্রটাই — মূলবিন্দু থেকে বিন্দু $(x_1,x_2)$ পর্যন্ত সরলরেখার দৈর্ঘ্য। $n$-মাত্রায় সাধারণীকরণ করলে $\sqrt{\sum_i x_i^2}$ হয়ে যায়, যা পিথাগোরাসের উপপাদ্যকেই বহু-মাত্রায় প্রসারিত করে — তাই একে "ইউক্লিডিয়ান" (ইউক্লিডীয় জ্যামিতির) নর্ম বলা হয়।

প্র ০২ $L_1$ ও $L_2$ নর্মের মধ্যে ব্যবহারিক পার্থক্য কী — কেন একটা রেগুলারাইজেশনে "sparse" সমাধান দেয়, আরেকটা দেয় না (শুধু স্বজ্ঞাগতভাবে বলুন)?

এটি সম্পূর্ণ গাণিতিকভাবে দেখা হবে পাঠ ৩২-এ, কিন্তু স্বজ্ঞাগতভাবে: $L_1$ নর্ম ($\sum|x_i|$) ছোট রাখতে চাইলে মডেল প্রায়ই কিছু ওজনকে ঠিক শূন্য বানিয়ে দেয় (কারণ কোণাকৃতির আকার শূন্যের কাছাকাছি "কোণ"-এ সমাধান পছন্দ করে), যা কিছু ফিচারকে সম্পূর্ণ বাদ দিয়ে দেয় — এটাই Lasso-র "sparse" বৈশিষ্ট্য। $L_2$ নর্ম ($\sum x_i^2$) সব ওজনকে সমানভাবে ছোট করে, কিন্তু ঠিক শূন্য বানায় না (Ridge)। আপাতত এই পার্থক্যটা মনে রাখুন, পূর্ণ ডেরিভেশন পরে আসবে।

প্র ০৩ যদি একটি ভেক্টরকে ইতিমধ্যেই নরমালাইজ করা হয় ($\|\hat{\mathbf{x}}\|=1$), তাহলে তাকে আবার নরমালাইজ করলে কী হবে?

কিছুই বদলাবে না — $\hat{\mathbf{x}}/\|\hat{\mathbf{x}}\|_2 = \hat{\mathbf{x}}/1 = \hat{\mathbf{x}}$। এটি নরমালাইজেশনের একটি স্বাভাবিক ধর্ম (idempotent হওয়া) — একবার ইউনিট দৈর্ঘ্যে আনার পর বারবার একই অপারেশন প্রয়োগ করলে ফলাফল অপরিবর্তিত থাকে, ঠিক যেমন কোনো সংখ্যাকে $1$ দিয়ে বারবার গুণ করলে সংখ্যাটা বদলায় না।

অনুশীলন

  1. হাতে হিসাব করুন: $\mathbf{x}=(6,-8)$-এর $L_1$, $L_2$ ও $L_\infty$ নর্ম বের করুন, তারপর কোড দিয়ে যাচাই করুন।

    $\|\mathbf{x}\|_1=|6|+|-8|=14$। $\|\mathbf{x}\|_2=\sqrt{36+64}=\sqrt{100}=10$। $\|\mathbf{x}\|_\infty=\max(6,8)=8$।

  2. নরমালাইজ করুন: $\mathbf{x}=(6,-8)$-কে নরমালাইজ করে $\hat{\mathbf{x}}$ বের করুন, এবং যাচাই করুন $\|\hat{\mathbf{x}}\|_2=1$।

    $\|\mathbf{x}\|_2=10$ (আগের প্রশ্ন থেকে), তাই $\hat{\mathbf{x}}=(6/10,\,-8/10)=(0.6,-0.8)$। যাচাই: $\|\hat{\mathbf{x}}\|_2=\sqrt{0.6^2+0.8^2}=\sqrt{0.36+0.64}=\sqrt{1}=1$। ✓

  3. দূরত্ব বের করুন: দুটি বিন্দু $\mathbf{p}=(0,0,0)$ ও $\mathbf{q}=(1,2,2)$-এর মধ্যে ইউক্লিডিয়ান দূরত্ব বের করুন।

    $\mathbf{p}-\mathbf{q}=(-1,-2,-2)$, তাই $\|\mathbf{p}-\mathbf{q}\|_2=\sqrt{1+4+4}=\sqrt{9}=3$।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
ডট প্রোডাক্ট ও কোসাইন সিমিলারিটি