ডট প্রোডাক্ট ও কোসাইন সিমিলারিটি
এই পাঠে যা শিখবেন
- ডট প্রোডাক্টের বীজগাণিতিক সংজ্ঞা এবং হাতে গণনা
- ডট প্রোডাক্টের জ্যামিতিক অর্থ ও কোণের সাথে সম্পর্ক
- অর্থোগোনালিটি (perpendicularity) চেনার শর্ত
- কোসাইন সিমিলারিটি — এবং কেন এটি word/document embedding তুলনায় ডট প্রোডাক্টের চেয়ে বেশি ব্যবহৃত হয়
১ · ডট প্রোডাক্টের সংজ্ঞা — বীজগাণিতিক রূপ
একই মাত্রার দুটি ভেক্টর $\mathbf{u},\mathbf{v}\in\mathbb{R}^n$-এর ডট প্রোডাক্ট (স্ক্যালার প্রোডাক্টও বলা হয়) সংজ্ঞায়িত হয় প্রতিটি জোড়া উপাদান গুণ করে, তারপর সব গুণফল যোগ করে:
$$\mathbf{u}\cdot\mathbf{v} = \sum_{i=1}^{n} u_i v_i = u_1v_1 + u_2v_2 + \dots + u_nv_n$$লক্ষ্য করুন — ইনপুট দুটো ভেক্টর, কিন্তু আউটপুট একটি একক স্কেলার (সংখ্যা)। যেমন $\mathbf{u}=(1,2,3)$ এবং $\mathbf{v}=(4,-1,2)$ হলে:
$$\mathbf{u}\cdot\mathbf{v} = (1)(4) + (2)(-1) + (3)(2) = 4 - 2 + 6 = 8$$পাঠ ০২-এ আমরা দেখেছি $\mathbf{w}^T\mathbf{x}$ ঠিক এই একই গণনা বোঝায় — ম্যাট্রিক্স নোটেশনে একটি রো ভেক্টর ($\mathbf{w}^T$) ও একটি কলাম ভেক্টরের ($\mathbf{x}$) গুণফল। এই কারণেই একটি নিউরনের গণনা $z=\mathbf{w}^T\mathbf{x}+b$ (পাঠ ০১-এ দেখা) আসলে একটি ডট প্রোডাক্ট, তারপর একটি স্কেলার বায়াস যোগ।
২ · জ্যামিতিক অর্থ — $\mathbf{u}\cdot\mathbf{v}=\|\mathbf{u}\|\|\mathbf{v}\|\cos\theta$
ডট প্রোডাক্টের শুধু একটা বীজগাণিতিক সূত্র নয় — এর একটা গভীর জ্যামিতিক অর্থও আছে। যদি $\theta$ হয় $\mathbf{u}$ ও $\mathbf{v}$-এর মধ্যকার কোণ, তাহলে:
$$\mathbf{u}\cdot\mathbf{v} = \|\mathbf{u}\|\,\|\mathbf{v}\|\,\cos\theta$$এখানে $\|\mathbf{u}\|$ ও $\|\mathbf{v}\|$ হলো ভেক্টরদুটির দৈর্ঘ্য (নর্ম — সম্পূর্ণ কভার হবে পাঠ ০৫-এ)। এই সূত্রটি কসাইন সূত্র (Law of Cosines) থেকে আসে: ত্রিভুজের তিন বাহু $\mathbf{u}$, $\mathbf{v}$ ও $\mathbf{u}-\mathbf{v}$ বিবেচনা করে $\|\mathbf{u}-\mathbf{v}\|^2$ দুইভাবে বিস্তৃত করলে (বীজগাণিতিকভাবে এবং কসাইন সূত্র দিয়ে) এই সমীকরণ বেরিয়ে আসে। এখান থেকে বোঝা যায়:
- $\theta=0°$ (একই দিক) হলে $\cos\theta=1$ — ডট প্রোডাক্ট সর্বোচ্চ ধনাত্মক (দৈর্ঘ্যের গুণফলের সমান)।
- $\theta=90°$ (লম্ব) হলে $\cos\theta=0$ — ডট প্রোডাক্ট শূন্য।
- $\theta=180°$ (বিপরীত দিক) হলে $\cos\theta=-1$ — ডট প্রোডাক্ট সর্বোচ্চ ঋণাত্মক।
অর্থাৎ ডট প্রোডাক্টের চিহ্ন (sign) সরাসরি বলে দেয় দুটি ভেক্টর মোটামুটি একই দিকে, বিপরীত দিকে, নাকি লম্বভাবে অবস্থান করছে।
৩ · অর্থোগোনালিটি (Orthogonality)
উপরের সূত্র থেকে সরাসরি একটি গুরুত্বপূর্ণ ফলাফল আসে: দুটি অ-শূন্য ভেক্টর অর্থোগোনাল (পরস্পর লম্ব) হয় ঠিক তখনই যখন তাদের ডট প্রোডাক্ট শূন্য হয় — কারণ $\cos 90°=0$।
$$\mathbf{u}\perp\mathbf{v} \iff \mathbf{u}\cdot\mathbf{v}=0$$পাঠ ০৩-এর স্ট্যান্ডার্ড বেসিস ভেক্টরগুলো এর একটি ভালো উদাহরণ: $\mathbf{e}_1\cdot\mathbf{e}_2 = (1)(0)+(0)(1)=0$, তাই $\mathbf{e}_1$ ও $\mathbf{e}_2$ পরস্পর অর্থোগোনাল — যা জ্যামিতিকভাবেও স্বাভাবিক, কারণ এরা যথাক্রমে $x$ ও $y$ অক্ষ বরাবর, যা পরস্পরের সাথে ৯০° কোণে থাকে।
অর্থোগোনালিটির ধারণা পাঠ ১০-১১-তে আইগেনভেক্টর ও SVD-তে গুরুত্বপূর্ণ ভূমিকা রাখবে (orthogonal matrices), এবং পাঠ ০৬-এ বেসিসের সংজ্ঞাতেও পরোক্ষভাবে জড়িত থাকবে।
৪ · কোসাইন সিমিলারিটি
উপরের জ্যামিতিক সূত্র থেকে $\cos\theta$-কে বিচ্ছিন্ন করলে পাওয়া যায় কোসাইন সিমিলারিটি:
$$\cos\theta = \frac{\mathbf{u}\cdot\mathbf{v}}{\|\mathbf{u}\|\,\|\mathbf{v}\|}$$এটি দুটি ভেক্টরের মধ্যকার কোণের কোসাইন — যার মান সবসময় $[-1, 1]$-এর মধ্যে থাকে। $1$ মানে হুবহু একই দিক (সর্বোচ্চ মিল), $0$ মানে অর্থোগোনাল (সম্পর্কহীন), $-1$ মানে সম্পূর্ণ বিপরীত দিক।
কেন এটি শুধু ডট প্রোডাক্টের চেয়ে বেশি উপযোগী? কারণ ডট প্রোডাক্ট $\mathbf{u}\cdot\mathbf{v}$-এর মান দৈর্ঘ্যের উপরও নির্ভরশীল — দুটো ভেক্টর ঠিক একই দিকে থাকলেও, একটি লম্বা হলে ডট প্রোডাক্ট বড় দেখাবে। কিন্তু ভাগ করে $\|\mathbf{u}\|\|\mathbf{v}\|$ দিয়ে নরমালাইজ করলে দৈর্ঘ্যের প্রভাব বাতিল হয়ে যায় — শুধু "দিকের মিল" থেকে যায়। এই কারণেই NLP-তে দুটি শব্দ বা ডকুমেন্টের embedding ভেক্টর তুলনা করতে সবসময় কোসাইন সিমিলারিটি ব্যবহার করা হয়, কাঁচা ডট প্রোডাক্ট নয় — একটি ছোট বাক্য ও একটি লম্বা ডকুমেন্টের embedding-এর "মাত্রা" ভিন্ন হতে পারে, কিন্তু তাদের বিষয়বস্তু কাছাকাছি হলে কোসাইন সিমিলারিটি এখনও উচ্চ থাকবে।
৫ · কোড দিয়ে দেখুন — NumPy-তে ডট প্রোডাক্ট ও কোসাইন সিমিলারিটি
নিচে দুটি সাধারণ ভেক্টর নিয়ে ডট প্রোডাক্ট ও কোসাইন সিমিলারিটি হিসাব করে দেখানো হলো — লক্ষ্য করুন একই দিকের কাছাকাছি দুটি ভেক্টরের কোসাইন সিমিলারিটি ১-এর কাছাকাছি হয়।
import numpy as np
def cosine_similarity(u, v):
dot = np.dot(u, v)
norm_u = np.linalg.norm(u)
norm_v = np.linalg.norm(v)
return dot / (norm_u * norm_v)
u = np.array([1.0, 2.0, 3.0])
v = np.array([4.0, -1.0, 2.0])
print("u . v =", np.dot(u, v)) # ডট প্রোডাক্ট -> 8.0
print("cosine similarity(u, v) =", cosine_similarity(u, v))
# একই দিকের কাছাকাছি দুটি ভেক্টর -> সিমিলারিটি ১-এর কাছাকাছি
a = np.array([1.0, 2.0, 3.0])
b = np.array([2.0, 4.0, 6.1]) # প্রায় a-এর স্কেলার গুণ
print("cosine similarity(a, b) =", cosine_similarity(a, b))
# অর্থোগোনাল ভেক্টর -> সিমিলারিটি ০
print("cosine similarity(e1, e2) =",
cosine_similarity(np.array([1.0, 0.0]), np.array([0.0, 1.0])))
np.dot(u, v) ডট প্রোডাক্ট গণনা করে, আর np.linalg.norm(u) ভেক্টরের দৈর্ঘ্য
(পাঠ ০৫-এ বিস্তারিত)। এই দুটোকে একসাথে ভাগ করলেই কোসাইন সিমিলারিটি — যা বাস্তবে প্রতিটি embedding-ভিত্তিক
সিস্টেমে (সার্চ, রিকমেন্ডেশন, semantic similarity) ব্যবহৃত হয়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ দুটো embedding ভেক্টরের মিল মাপার সময় কেন কোসাইন সিমিলারিটি ব্যবহার করা হয়, শুধু কাঁচা ডট প্রোডাক্ট নয়?
কাঁচা ডট প্রোডাক্ট ভেক্টরের দৈর্ঘ্যের প্রতি সংবেদনশীল — যদি একটি ডকুমেন্ট-embedding অন্যটির চেয়ে "বড়" হয় (উদাহরণস্বরূপ, বেশি শব্দ থাকার কারণে), তার ডট প্রোডাক্ট মান বেশি দেখাবে, এমনকি বিষয়বস্তুর মিল কম হলেও। কোসাইন সিমিলারিটি $\|\mathbf{u}\|\|\mathbf{v}\|$ দিয়ে ভাগ করে এই দৈর্ঘ্যের প্রভাব বাতিল করে দেয়, তাই এটি শুধু "দিক" বা "বিষয়বস্তুর মিল" মাপে — যা তুলনার জন্য বেশি ন্যায্য।
প্র ০২ ডট প্রোডাক্ট কি ঋণাত্মক হতে পারে? এর জ্যামিতিক অর্থ কী?
হ্যাঁ, অবশ্যই। $\mathbf{u}\cdot\mathbf{v}=\|\mathbf{u}\|\|\mathbf{v}\|\cos\theta$ সূত্র অনুযায়ী, দৈর্ঘ্য ($\|\mathbf{u}\|,\|\mathbf{v}\|$) সবসময় অ-ঋণাত্মক, কিন্তু $\cos\theta$ ঋণাত্মক হতে পারে যখন কোণ $90°$-এর বেশি হয় (অর্থাৎ ভেক্টরদুটি মোটামুটি "বিপরীত" দিকে)। তাই ঋণাত্মক ডট প্রোডাক্ট মানে দুটি ভেক্টর একে অপরের থেকে দূরে সরে যাচ্ছে এমন কিছু দিকে অবস্থিত — সিমিলারিটির প্রেক্ষাপটে এটি "অমিল" নির্দেশ করে।
প্র ০৩ কোসাইন সিমিলারিটি কি একটি "দূরত্ব" (distance) — অর্থাৎ কম মানে কাছাকাছি?
না, উল্টো — কোসাইন সিমিলারিটি একটি মিলের পরিমাপ, যেখানে বেশি মান মানে বেশি কাছাকাছি (দিক অনুযায়ী)। প্রকৃত দূরত্ব পেতে হলে সাধারণত কোসাইন দূরত্ব ব্যবহার করা হয়, যা সংজ্ঞায়িত করা হয় $1 - \cos\theta$ হিসেবে — এখন কম মান মানে কাছাকাছি, বেশি মান মানে দূরে। এই পার্থক্যটা কোড লেখার সময় ভুল করার একটি সাধারণ জায়গা, তাই কোনো লাইব্রেরি ব্যবহারের আগে দেখে নেওয়া ভালো এটি সিমিলারিটি ফেরত দিচ্ছে নাকি দূরত্ব।
অনুশীলন
-
হাতে হিসাব করুন: $\mathbf{u}=(3,0,4)$ এবং $\mathbf{v}=(0,5,0)$-এর ডট প্রোডাক্ট বের করুন, তারপর বলুন এরা অর্থোগোনাল কি না।
$\mathbf{u}\cdot\mathbf{v} = (3)(0)+(0)(5)+(4)(0) = 0$। যেহেতু ডট প্রোডাক্ট শূন্য, তাই $\mathbf{u}$ ও $\mathbf{v}$ অর্থোগোনাল (পরস্পর লম্ব)।
-
যাচাই করুন: $\mathbf{a}=(1,1)$ এবং $\mathbf{b}=(-1,1)$-এর কোসাইন সিমিলারিটি হাতে বের করুন, তারপর কোড দিয়ে মিলিয়ে দেখুন। কোণটা কত ডিগ্রি হবে বলে মনে হয়?
$\mathbf{a}\cdot\mathbf{b}=(1)(-1)+(1)(1)=0$, তাই কোসাইন সিমিলারিটি $=0$। ডট প্রোডাক্ট শূন্য মানে এরা অর্থোগোনাল, অর্থাৎ কোণ $90°$।
-
প্রয়োগ করুন: ধরুন দুটি ডকুমেন্টের embedding ভেক্টর $\mathbf{d}_1$ ও $\mathbf{d}_2$-এর কোসাইন সিমিলারিটি $0.92$। এর ব্যবহারিক অর্থ কী, এবং কেন এটি সরাসরি $\mathbf{d}_1\cdot\mathbf{d}_2$-এর কাঁচা মানের চেয়ে বেশি তথ্যবহুল?
$0.92$ একটি $1$-এর কাছাকাছি মান, অর্থাৎ দুটি ডকুমেন্ট বিষয়বস্তুর দিক থেকে খুব কাছাকাছি — সম্ভবত একই বা সম্পর্কিত বিষয়ে। এই মানটি কাঁচা ডট প্রোডাক্টের চেয়ে বেশি তথ্যবহুল কারণ এটি স্বতন্ত্রভাবে ডকুমেন্টের দৈর্ঘ্য/embedding-এর ম্যাগনিটিউডের উপর নির্ভর করে না — তাই ভিন্ন ভিন্ন দৈর্ঘ্যের ডকুমেন্টের মধ্যেও ন্যায্য তুলনা করা যায়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পরবর্তী পাঠ · ভেক্টর নর্ম ও দূরত্ব পাঠ ০৫ $\|\mathbf{u}\|$ যা এখানে ব্যবহার করলাম, তার সম্পূর্ণ সংজ্ঞা ও প্রকারভেদ।
- AI Foundations কোর্স স্বজ্ঞা দরকার হলে ফিরে দেখুন কোসাইন সিমিলারিটি ও embedding-এর ধারণা প্রথম থেকে দেখতে চাইলে এখানে ফিরুন।
- সব AI Courses দেখুন ABCL TECH AI Foundations, Python for AI, Machine Learning, Deep Learning, Math for AI ও আরও অনেক কিছু — সব এক জায়গায়।