12,584 পড়া
12,584 পড়া

অন্তর্ভুক্ত 101: টেক্সট মধ্যে সিমেন্টিক সম্পর্ক খুলুন

দ্বারা Ritesh Modi14m2025/03/27
Read on Terminal Reader
Read this story w/o Javascript

অতিদীর্ঘ; পড়তে

Embeddings মেশিন ভাষা বোঝার ক্ষেত্রে সীমাবদ্ধতাগুলি মোকাবেলা করে. তারা শুধুমাত্র একটি চমৎকার নতুন কৌশল নয় - তারা ভাষা বোঝার মৌলিক সীমাবদ্ধতাগুলি মোকাবেলা করে।
featured image - অন্তর্ভুক্ত 101: টেক্সট মধ্যে সিমেন্টিক সম্পর্ক খুলুন
Ritesh Modi HackerNoon profile picture
0-item
1-item


যখন আমি কয়েক বছর আগে টেক্সট ডেটা নিয়ে কাজ শুরু করেছিলাম, তখন ইনব্যাডিংয়ের পুরো ধারণাটি অপ্রয়োজনীয়ভাবে জটিল মনে হয়েছিল. আমি আমার বাক্স-ফোর্ড পদ্ধতি এবং সরল টিএফ-আইডিএফ ভেক্টরগুলির সাথে সন্তুষ্ট ছিলাম. আমি বিশ্বাস করেছিলাম যে তারা সরল, সহজেই বোঝা যায় এবং কার্যকরভাবে কাজটি সম্পন্ন করেছে।


আমি একটি অনুভূতি বিশ্লেষণ প্রকল্পে একটি চ্যালেঞ্জের মুখোমুখি না হওয়া পর্যন্ত আমি অন্তর্ভুক্তগুলি গুরুত্বপূর্ণভাবে বিবেচনা করিনি. আমি পণ্য পর্যালোচনাগুলির সাথে কাজ করছিলাম, এবং আমার ঐতিহ্যগত মডেলগুলি সারাক্সম বা রঙিন ভাষা দিয়ে পর্যালোচনাগুলি ভুলভাবে শ্রেণীকরণ করে।


তারা শুধু একটি চমৎকার নতুন কৌশল নয় - তারা মেশিন ভাষা বুঝতে মৌলিক সীমাবদ্ধতাগুলি মোকাবেলা করে।


The Old Days: Life Before Embeddings

The Old Days: Embeddings এর আগে জীবন

এই পদ্ধতি এবং পদ্ধতিগুলির বিবরণগুলিতে প্রবেশ না করে embeddings আগে টেক্সট প্রতিনিধিগুলি ব্যবহার করার ইতিহাস বোঝা যাক. They are very well covered in other places.

One-Hot Encoding

It represented each word as a sparse vector with all zeros except for a single "1" at the position corresponding to that word in a vocabulary. It represented words as massive, sparse vectors where every word got its own dimension. If your vocabulary had 100,000 words (which is modest), each word vector had 99,999 zeros and a single 1. These representations told us absolutely nothing about meaning. The words "excellent" and "fantastic" were mathematically just as different as "excellent" and "terrible" – completely missing the obvious semantic relationships.


"cat" → [1, 0, 0, 0, ..., 0] (position 5432 in vocabulary) "dog" → [0, 1, 0, 0, ..., 0] (position 8921 in vocabulary)


সীমাবদ্ধতা

  • মাত্রা বিস্ফোরণ: ভেক্টরগুলি শব্দের আকারের মতো মাত্রা ছিল (সাধারণত 100,000+)
  • কোন উল্লেখযোগ্য সম্পর্ক নেই: "ক্যাটি" এবং "ক্যাটি" "ক্যাটি" এবং "এয়ারলাইন" (সব সমান দূরত্ব) মত আলাদা ছিল।
  • কম্পিউটিং অক্ষমতা: এই বিরল ম্যাট্রিজগুলি সংখ্যাগরিষ্ঠ করা অত্যন্ত সম্পদ ব্যয়বহুল ছিল
  • কোন সাধারণকরণ: সিস্টেমটি তার মূল শব্দব্যাগের বাইরে শব্দগুলি বুঝতে পারে না

Bag-of-Words Approach

তিনি কাগজপত্রে শব্দের সংখ্যা হিসাবে শব্দের সংগ্রহ হিসাবে আচরণ করেছিলেন, পুরোপুরি শব্দের অর্ডারটি ছাড়িয়ে দিয়েছিলেন।


ডকুমেন্ট: "ক্যাটি মাটিতে বসে" BoW: {"the": 2, "cat": 1, "sat": 1, "on": 1, "mat": 1}

সীমাবদ্ধতা :

  • শব্দের অর্ডার হ্রাস: "কুকুর মানুষকে কামড়ায়" এবং "মানুষ কুকুরকে কামড়ায়" একই প্রতিনিধি ছিল
  • Sparse উচ্চ-দৈর্ঘ্য ভেক্টর: এখনও প্রয়োজন শব্দের আকার ভেক্টর
  • কোন সিমেন্টিক বোঝা: সিনিয়ামগুলি সম্পূর্ণ ভিন্ন বৈশিষ্ট্য হিসাবে প্রতিনিধিত্ব করা হয়েছিল
  • কোনও প্রাসঙ্গিক অর্থ নেই: প্রতিটি শব্দটি প্রাসঙ্গিকতা ছাড়াও একটি স্থিতিশীল প্রতিনিধিত্ব ছিল।

N-grams

কিছু শব্দ অর্ডার ক্যাপচার করার জন্য, আমরা N-গ্রাম ব্যবহার শুরু করেছি (ন ক্রমান্বয়ে শব্দগুলির সেকেন্ড)।


ইউনিগ্রাম (একটি শব্দ) সঙ্গে, আপনি 100,000 একটি শব্দব্যাগ থাকতে পারে. বিগ্রাম (শব্দ জুড়ি) সঙ্গে, হঠাৎ আপনি সম্ভাব্য লক্ষ লক্ষ বৈশিষ্ট্যগুলি খুঁজছেন. ট্রিগ্রামের সাথে? বিলিয়ন, তাত্ত্বিকভাবে।

Limitations:

সীমাবদ্ধতা :
  • সংমিশ্রণ বিস্ফোরণ: সম্ভাব্য n-গ্রামের সংখ্যা অতিক্রম করে
  • ডেটা খারাপতা: অধিকাংশ সম্ভাব্য n-গ্রাম ট্রেনিং ডেটাতে কখনো দেখা যায় না
  • সীমিত সংশ্লিষ্ট উইন্ডো: শুধুমাত্র ছোট উইন্ডোগুলির মধ্যে সংশ্লিষ্ট সম্পর্ক (সাধারণত 2-5 শব্দ)

TF-IDF (Term Frequency-Inverse Document Frequency)

টিএফ-আইডিএফ শব্দগুলি কতটা গুরুত্বপূর্ণ একটি নির্দিষ্ট ডকুমেন্টের সাথে সম্পর্কিত একটি নির্দিষ্ট ডকুমেন্টের উপর ভিত্তি করে ওজনের মাধ্যমে জিনিসগুলি উন্নত করে।

Limitations:

সীমাবদ্ধতা :

কোন উল্লেখযোগ্য অর্থ নেই: শব্দগুলির সংখ্যা এবং ফ্রিকোয়েন্সি তাদের ব্যবহারের গুরুত্ব নির্ধারণ করে।

The Embedding Revolution: What Changed?

বিপ্লব: কী পরিবর্তন হয়েছে?

অন্তর্ভুক্তির জন্য স্থানান্তরটি কেবলমাত্র একটি ক্রমবর্ধমান উন্নতি ছিল না; এটি ভাষা প্রতিনিধিত্ব করার পদ্ধতিতে একটি প্যাডামি পরিবর্তন ছিল।

Meaning Through Context

অন্তর্ভুক্তির পেছনে মৌলিক দৃষ্টিভঙ্গি প্রতারণামূলকভাবে সহজ: যেসব শব্দগুলি অনুরূপ পরিবেশে প্রদর্শিত হয়, তাদের সম্ভবত একই ধরনের শব্দগুলির চারপাশে "কুকুর" এবং "কুকুর" প্রদর্শিত হয়, তারা সম্ভবত সিমেন্টিকভাবে সম্পর্কিত।


Word2Vec মত প্রাথমিক embedding মডেলগুলি নিউরোনাল নেটওয়ার্কগুলি পূর্বাভাস করতে প্রশিক্ষণ করে এই বিষয়টি ক্যাপচার করেছে:


  • একটি শব্দ যা তার চারপাশের পরিবেশের উপর ভিত্তি করে (Continuous Bag of Words)
  • একটি শব্দের উপর ভিত্তি করে চারপাশের পরিবেশ (Skip-gram)


এই মডেলগুলি থেকে লুকানো স্তর ওজনগুলি আমাদের শব্দ ভেক্টর হয়ে ওঠে, ভেক্টর স্পেসের জিওমেট্রিক বৈশিষ্ট্যগুলিতে সিমেন্টিক সম্পর্কগুলি কোড করে।


যখন আমি প্রথম শব্দ ভেক্টর পরিকল্পনা করেছিলাম এবং দেখলাম যে "রাজা" - "মানুষ" + "নারী" ≈ "রানী", আমি জানতাম যে আমরা কিছু বিপ্লবী নিয়েছিলাম।


পূর্ববর্তী মডেলগুলি যেমন Word2Vec এবং GloVe প্রতিটি শব্দকে একটি একক ভেক্টর দিয়েছে, অথচ একই শব্দটি বিভিন্ন পরিস্থিতিতে বিভিন্ন জিনিসের অর্থ হতে পারে:


"I need to bank the money" vs. "I'll meet you by the river bank"


BERT এবং GPT এর মতো মডেলগুলি একই শব্দের জন্য বিভিন্ন ইনব্যাডিংগুলি উৎপাদন করে সমাধান করে, যা তার চারপাশের পরিবেশের উপর নির্ভর করে. এটি নামক সংস্থা স্বীকৃতি এবং অনুভূতি বিশ্লেষণ যেমন কাজগুলির জন্য একটি গেম পরিবর্তনকারী ছিল, যেখানে পরিবেশ মান নির্ধারণ করে।


সুতরাং, প্রথমে আমরা বুঝতে পারি ইনব্যাডিংগুলি কি এবং তারা কিভাবে NLPকে রূপান্তরিত করে এবং পূর্ববর্তী পদ্ধতিগুলির সীমাবদ্ধতাগুলি মোকাবেলা করে।

What Are Embeddings?

Embeddings কি?

ইনব্যাডিংগুলি একটি ক্রমাগত ভেক্টর স্পেসে ডেটা (টেক্সট, ইমেজ, অডিও, ইত্যাদি) এর সংখ্যাগত প্রতিনিধিত্ব।

Key Concepts:

  • ভেক্টর: বহু-মাত্রিক মহাকাশে একটি পয়েন্টকে প্রতিনিধিত্ব করার সংখ্যাগুলির সার্বজনীন তালিকা
  • মাত্রা: প্রতিটি ভেক্টর মধ্যে মানের সংখ্যা (যেমন, 768-dim, 1024-dim)
  • ভেক্টর স্পেস: যেখানে অন্তর্ভুক্ত থাকে সেই গণিত স্পেস
  • সিম্যান্টিক অনুরূপতা: ভেক্টরগুলির মধ্যে দূরত্ব বা কোণ দ্বারা পরিমাপ করা হয় (বিক্রম = আরো অনুরূপ)

What Do Dimensions Represent?

একটি অন্তর্নির্মিত ভেক্টরের প্রতিটি মাত্রা তথ্যের একটি শিখা বৈশিষ্ট্য বা দিক প্রতিনিধিত্ব করে. ক্লাসিক বৈশিষ্ট্য প্রকৌশলের বিপরীতে, যেখানে মানুষ প্রতিটি মাত্রা কী মানে তা নির্ধারণ করে, আধুনিক অন্তর্নির্মিত মডেলগুলিতে:


  • প্রশিক্ষণের সময় মাত্রা উত্থাপিত হয় abstract "concepts" এর প্রতিনিধিত্ব করার জন্য
  • ব্যক্তিগত মাত্রা প্রায়ই নির্দিষ্ট মানব-প্রকৃত অর্থের অভাব
  • যাইহোক, সম্পূর্ণ ভেক্টর সামগ্রিকভাবে সিমেন্টিক তথ্য ধারণ করে
  • কিছু মাত্রা অনুভূতি, আনুষ্ঠানিকতা, বিষয় বা সিন্ট্যাক্সের সাথে মিলিত হতে পারে, কিন্তু অধিকাংশ বৈশিষ্ট্যগুলির জটিল সংমিশ্রণ প্রতিনিধিত্ব করে।

Why We Need Embeddings

কম্পিউটারগুলি মূলত সংখ্যার সাথে কাজ করে, শব্দগুলি নয়. ভাষা প্রক্রিয়াকরণ করার সময়, আমাদের টেক্সটকে সংখ্যাগত প্রতিনিধিত্বে রূপান্তর করতে হবে যা:


  1. সিমেন্টিক সম্পর্কগুলি ক্যাপচার করুন - অনুরূপ ধারণাগুলির অনুরূপ প্রতিনিধিত্ব থাকতে হবে
  2. একই শব্দ ভিন্ন জায়গায় বিভিন্ন জিনিসের অর্থ হতে পারে।
  3. বৈজ্ঞানিক অপারেশনগুলি সক্ষম করুন – যেমন অনুরূপতা খুঁজে বা অনুরূপতাগুলি চালাতে
  4. স্কেলে দক্ষভাবে কাজ করুন – কম্পিউটার বিস্ফোরণ ছাড়াই বড় পরিমাণে পাঠ্য প্রক্রিয়া করুন


Embeddings এই সমস্যাগুলি সমাধান করে শব্দ, বাক্য বা ডকুমেন্টগুলি একটি ক্রমাগত স্থানে ঘন ভেক্টর হিসাবে প্রতিনিধিত্ব করে যেখানে সিমেন্টিক সম্পর্কগুলি জিওমিটিক সম্পর্ক হিসাবে সংরক্ষিত হয়।

Embeddings এর ভিত্তি

ভেক্টর প্রতিনিধিত্ব

হাজার বা মিলিয়ন মাত্রার বিরল ভেক্টরগুলির পরিবর্তে, embeddings কয়েক শতাধিক ঘন মাত্রা ব্যবহার করে যেখানে প্রতিটি মাত্রা মানের অবদান রাখে।


"cat" → [0.2, -0.4, 0.1, -0.8, ..., 0.3] (300 dimensions)

"kitten" → [0.19, -0.38, 0.15, -0.75, ..., 0.29] (similar to "cat")


এটি মাত্রার কম্পিউটিং অর্ডারগুলি আরও কার্যকর করে এবং একই সময়ে সমৃদ্ধ সিমেন্টিক প্রতিনিধিত্বের অনুমতি দেয়।

বিতরণীয় সেমেন্টিক্স

ইনব্যাডিংগুলি নীতিমালার উপর ভিত্তি করে তৈরি করা হয় যে "তুমি একটি শব্দকে তার কোম্পানির দ্বারা জানবে" (জে.আর. ফাইট)।


উদাহরণস্বরূপ, "রানী" এবং "রানী" একটি অনুরূপ পরিস্থিতি থাকবে, তাই তাদের একটি অনুরূপ embeddings থাকবে, যদিও তারা বিরলভাবে একই অবস্থানে দেখা যায়।

গণিতিক সম্পত্তি

অন্তর্ভুক্ত স্পেস অসাধারণ গণিত বৈশিষ্ট্য আছে:


vector("king") - vector("man") + vector("woman") ≈ vector("queen")


এটি এনালগ রেজিস্ট্রেশন এবং সিমেন্টিক অপারেশনগুলি সরাসরি ভেক্টর স্পেসে অনুমতি দেয়।

শিক্ষার স্থানান্তর

প্রাক প্রশিক্ষিত অন্তর্ভুক্তগুলি সাধারণ ভাষা জ্ঞানগুলি ক্যাপচার করে যা নির্দিষ্ট কাজগুলির জন্য চমৎকারভাবে কাস্টমাইজ করা যেতে পারে, নতুন অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় তথ্যগুলি উল্লেখযোগ্যভাবে হ্রাস করে।

পরিবেশগত বোঝা

আধুনিক সংশ্লিষ্ট embeddings (যেমন BERT, GPT, ইত্যাদি থেকে) একই শব্দ ভিন্নভাবে সংশ্লিষ্ট ভিত্তিতে প্রতিনিধিত্ব করে:


"I'll deposit money in the bank" → "bank" relates to finance

"I'll sit by the river bank" → "bank" relates to geography


অন্তর্ভুক্তগুলির ইতিহাস এবং বোঝার সমস্ত জ্ঞান সঙ্গে, এটি তাদের ব্যবহার করার সময় এসেছে।

LLM / SLM মডেলগুলি ইনব্যাডিংগুলি উত্পাদন করতে ব্যবহার করুন

বিভিন্ন গবেষণা দলগুলি বিভিন্ন ভাষা এবং ডোমেইনগুলি অন্তর্ভুক্ত বিভিন্ন ডেটা সেটগুলিতে প্রশিক্ষিত embedding মডেলগুলি বিকাশ করেছে। এই বৈচিত্র্যটি অত্যন্ত ভিন্ন শব্দব্যাগ এবং সিমেন্টিক বোঝার ক্ষমতাগুলির সাথে মডেলগুলির ফলাফল। উদাহরণস্বরূপ, প্রধানত ইংরেজি বৈজ্ঞানিক সাহিত্যে প্রশিক্ষিত মডেলগুলি বহুভাষী সামাজিক মিডিয়া বিষয়বস্তুতে প্রশিক্ষিত মডেলগুলির তুলনায় প্রযুক্তিগত ধারণাগুলি আলাদাভাবে কোড করবে।


Hugging Face এর SentenceTransformer প্যাকেজের মতো লাইব্রেরিগুলি অন্তর্ভুক্তির বাস্তব বাস্তবায়নকে ব্যাপকভাবে সহজ করে দিয়েছে, যা বিভিন্ন অন্তর্ভুক্ত মডেলগুলির সাথে কাজ করার জন্য একটি ব্যাপক SDK সরবরাহ করে। একইভাবে, OpenAI এর SDK তাদের অন্তর্ভুক্ত মডেলগুলিতে সরাসরি অ্যাক্সেস সরবরাহ করে, যা অনেক রেফারেলগুলিতে চমৎকার কর্মক্ষমতা প্রদর্শন করেছে।


মডেলগুলি, এই নিবন্ধের জন্য, একটি কালো বাক্স হিসাবে বিবেচনা করা উচিত যা বাক্যগুলি একটি ইনপুট হিসাবে গ্রহণ করে এবং তাদের সংশ্লিষ্ট ভেক্টর প্রতিনিধিত্ব ফেরত দেয়।

Embeddings জন্য SentenceTransformers লাইব্রেরি ব্যবহার

SentenceTransformer ব্যবহার করে embeddings জেনারেট করার সবচেয়ে সহজ উপায়:

from sentence_transformers import SentenceTransformer

# Load a pre-trained model
model = SentenceTransformer('all-MiniLM-L6-v2')  # 384 dimensions

# Generate embeddings
texts = ["This is an example sentence", "Each sentence becomes a vector"]

embeddings = model.encode(texts)

print(f"Shape: {embeddings.shape}")  # (2, 384)

max_seq_length = model.tokenizer.model_max_length

print(max_seq_length) # 256


​​HuggingFace থেকে উপলব্ধ "All-MiniLM-L6-v2" মডেলটি 384 মাত্রা রয়েছে. এর মানে এটি একটি নির্দিষ্ট শব্দ বা বাক্যের জন্য 384 বৈশিষ্ট্য বা ছায়াগুলি ক্যাপচার করতে পারে। এই মডেলের সিরিজের দৈর্ঘ্য 256 টোকেন। বাক্যগুলি অন্তর্ভুক্ত প্রক্রিয়ার সময় টোকেনজারের দ্বারা শব্দ এবং শব্দগুলি টোকেনে ভাগ করা হয়। একটি বাক্যের জন্য উত্পাদিত টোকেনগুলির সংখ্যা সাধারণত বাক্যের শব্দগুলির চেয়ে 25% থেকে 40% বেশি।


সিরিজের দৈর্ঘ্য মডেল দ্বারা প্রদত্ত ইনপুট হিসাবে প্রক্রিয়াকরণ করা যেতে পারে এমন টোকেনের সংখ্যাকে নির্দেশ করে। এটি 256 লম্বা করার জন্য কম কিছু প্যাড করা হয়, এবং আরও কিছু বাদ দেওয়া হয়।


SentenceTransformer ক্লাসের কোডিং পদ্ধতিটি মডেলটি ব্যবহার করার জন্য PyTorch অনুমান মোডে একটি wrapper।


from sentence_transformers import SentenceTransformer
import torch

# Load the model directly with SentenceTransformer
model = SentenceTransformer("sentence-transformers/msmarco-distilbert-base-tas-b")

# Input text
texts = ["This is an example sentence", "Each sentence becomes a vector"]

# Get embedding directly
with torch.no_grad():
    embedding = model.encode(texts, convert_to_tensor=True)
print(embedding)


এখানে, torch.no_grad ফাংশন নিশ্চিত করে যে পিছনে প্রসারণের সময় কোনও gradients গণনা করা হয় না।


PyTorch ব্যবহার করে embeddings জেনারেট করার আরেকটি, আরো সাধারণ উপায়:


# Load the model
model = AutoModel.from_pretrained("sentence-transformers/msmarco-distilbert-base-tas-b")

# Get the tokenizer
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/msmarco-distilbert-base-tas-b")

# Tokenize input
text = ["This is an example sentence"]
encoded_input = tokenizer(text, padding=True, truncation=True, return_tensors='pt')

# Get embedding of the [CLS] token
with torch.no_grad():
    outputs = model(**encoded_input, return_dict=True)
    cls_embedding = outputs.last_hidden_state[:, 0]
print(cls_embedding)


এই এবং পূর্ববর্তী কোড স্ক্রিপ্টের মধ্যে পার্থক্য হল যে কোড ফাংশনটি স্পষ্টভাবে টোকেনজার এবং মডেল ব্যবহার করে প্রতিস্থাপন করা হয়েছে।


আরেকটি পার্থক্য হল যে আমরা outputs.last_hidden_state[:, 0] ব্যবহার করছি CLS টোকেনের সাথে সম্পর্কিত ভেক্টরটি পুনরুদ্ধার করতে।


এটি উল্লেখ করা উচিত যে একটি CLS টোকেন যোগ করার এই পদ্ধতিটি শুধুমাত্র নির্দিষ্ট ট্রান্সফরমার-ভিত্তিক আর্কিটেকচারগুলির জন্য প্রযোজ্য, এবং এটি BERT এবং তার বিকল্পগুলি এবং কেবলমাত্র কোডার-ভিত্তিক ট্রান্সফরমারগুলি অন্তর্ভুক্ত করে।


Best for:শ্রেণীকরণ এবং পরিসংখ্যান স্তরের পূর্বাভাস কাজ


Why they work:BERT-স্টাইলের মডেলগুলিতে [CLS] টোকেনটি প্রাক প্রশিক্ষণের সময় পুরো সিরিজ থেকে তথ্য সংগ্রহ করার জন্য বিশেষভাবে প্রশিক্ষণ দেওয়া হয়. এটি একটি "সংক্ষিপ্ত" টোকেন হিসাবে কাজ করে যা সামগ্রিক অর্থ ধারণ করে।


When to choose:

  • বার্ট, রোবার্টা বা অনুরূপ মডেলগুলি শ্রেণীকরণের জন্য ব্যবহার করার সময়
  • যখন আপনি একটি পুরো সিরিজকে প্রতিনিধিত্ব করার জন্য একটি একক ভেক্টর প্রয়োজন
  • যখন আপনার নীচের কাজটি পুরো টেক্সটের একটি বৈশিষ্ট্য পূর্বাভাস করে


ব্যবহার করা CLS পদ্ধতি একটি বাক্যের জন্য অন্তর্ভুক্তগুলি ক্যাপচার করার জন্য কেবলমাত্র একটি পদ্ধতি।

Mean Pooling

সমস্ত টোকেন অন্তর্ভুক্তির গড় গ্রহণ অনেক কাজের জন্য আশ্চর্যজনকভাবে কার্যকরী।


Best for:সিমেন্টিক অনুরূপতা, পুনরুদ্ধার এবং সাধারণ উদ্দেশ্য উপস্থাপনা।


Why it works:সমস্ত টোকেন প্রতিনিধিগুলির মধ্যে গড় দ্বারা, মাঝারি পুলিং সংগৃহীত সিমেন্টিক বিষয়বস্তু ধারণ করে এবং শব্দগুলি হ্রাস করে।


When to choose:

  • ডকুমেন্ট অনুরূপতা বা সিমেন্টিক অনুসন্ধান অ্যাপ্লিকেশন জন্য
  • যখন আপনাকে শক্তিশালী প্রতিনিধিগুলি প্রয়োজন যা কোনও একক টোকেন দ্বারা dominated হয় না
  • When empirical testing shows it outperforms other methods (it often does for similarity tasks)


import torch
from transformers import AutoTokenizer, AutoModel

model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")

# Mean pooling
with torch.no_grad():
    outputs = model(**inputs)
    
    # Get attention mask to ignore padding tokens
    attention_mask = inputs['attention_mask']
    
    # Sum token embeddings and divide by the number of tokens
    sum_embeddings = torch.sum(outputs.last_hidden_state * attention_mask.unsqueeze(-1), dim=1)
    count_tokens = torch.sum(attention_mask, dim=1, keepdim=True)
    mean_embeddings = sum_embeddings / count_tokens

print(f"Shape: {mean_embeddings.shape}")  # (2, 768)


Max Pooling

ম্যাক্স পুলিং সব টোকেনগুলির মধ্যে প্রতিটি মাত্রার জন্য সর্বোচ্চ মান নেয়. এটি প্রবন্ধে যেখানেই প্রদর্শিত হোক না কেন, গুরুত্বপূর্ণ বৈশিষ্ট্যগুলি ক্যাপচারে আশ্চর্যজনকভাবে ভাল।


Best for:বৈশিষ্ট্য সনাক্তকরণ এবং তথ্য অপসারণ কাজ


Why it works:ম্যাক্স পুলিং সমস্ত টোকেনগুলির মধ্যে প্রতিটি মাত্রার জন্য সবচেয়ে শক্তিশালী সক্রিয়তা নির্বাচন করে, কার্যকরভাবে সবচেয়ে উল্লেখযোগ্য বৈশিষ্ট্যগুলি ক্যাপচার করে, যেখানে তারা টেক্সটে প্রদর্শিত হোক না কেন।


When to choose:

  • যখন নির্দিষ্ট বৈশিষ্ট্যগুলি তাদের ফ্রিকোয়েন্সি বা অবস্থানের চেয়ে বেশি গুরুত্বপূর্ণ
  • যখন নির্দিষ্ট ধারণা বা সত্তার উপস্থিতি অনুসন্ধান করা হয়
  • যখন দীর্ঘ টেক্সটের সাথে মোকাবেলা করা হয় যেখানে গুরুত্বপূর্ণ সংকেতগুলি মাঝারি হিসাবে হ্রাস পেতে পারে


import torch
from transformers import AutoTokenizer, AutoModel

model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")

# Max pooling
with torch.no_grad():
    outputs = model(**inputs)
    
    # Create a mask to ignore padding tokens for max pooling
    attention_mask = inputs['attention_mask'].unsqueeze(-1)
    
    # Replace padding token representations with -inf so they're never selected as max
    token_embeddings = outputs.last_hidden_state.masked_fill(attention_mask == 0, -1e9)
    
    # Take max over token dimension
    max_embeddings = torch.max(token_embeddings, dim=1)[0]

print(f"Shape: {max_embeddings.shape}")  # (2, 768)

Weighted Mean Pooling

সব শব্দ অর্থের জন্য সমানভাবে অবদান রাখে না. ওজনযুক্ত সমন্বয় পদ্ধতিটি অবস্থান উপর ভিত্তি করে আরো গুরুত্বপূর্ণ টোকেনগুলিকে আরও ওজন দেওয়ার চেষ্টা করে (উদাহরণস্বরূপ, পরবর্তী টোকেনগুলিকে আরও ওজন দেয়)।


Best for:কাজ যেখানে ইনপুটের বিভিন্ন অংশের বিভিন্ন গুরুত্ব রয়েছে


Why it works: Not all words contribute equally to meaning. Weighted pooling allows you to emphasize certain tokens based on their position, attention scores, or other relevance metrics.


When to choose:

  • যখন সিরিজের আদেশ গুরুত্বপূর্ণ (উদাহরণস্বরূপ, পরবর্তী টোকেনগুলি আরও ওজন দেয়)
  • যখন নির্দিষ্ট টোকেনগুলি অভ্যন্তরীণভাবে আরও তথ্যপ্রিয় (উদাহরণস্বরূপ, নাম্বার এবং বাক্যগুলি বিপরীতে নিবন্ধগুলি)
  • যখন আপনি একটি নির্দিষ্ট গুরুত্ব heuristic যা আপনার কাজের জন্য মানসিক


import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModel

model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")

# Weighted mean pooling - more weight to later tokens
with torch.no_grad():
    outputs = model(**inputs)
    
    # Get token embeddings and attention mask
    token_embeddings = outputs.last_hidden_state
    attention_mask = inputs['attention_mask']
    
    # Create position-based weights (later positions get higher weights)
    input_lengths = torch.sum(attention_mask, dim=1).unsqueeze(-1)
    position_indices = torch.arange(token_embeddings.size(1)).unsqueeze(0).expand_as(attention_mask)
    position_weights = position_indices.float() / input_lengths.float()
    position_weights = position_weights * attention_mask
    
    # Normalize weights to sum to 1
    position_weights = position_weights / torch.sum(position_weights, dim=1, keepdim=True)
    
    # Apply weights and sum
    weighted_embeddings = torch.sum(token_embeddings * position_weights.unsqueeze(-1), dim=1)

print(f"Shape: {weighted_embeddings.shape}")  # (2, 768)


শেষ টোকেন পলিং

Last token pooling একটি টেকনোলজি যা শুধুমাত্র চূড়ান্ত টোকেনের প্রতিনিধিত্ব নির্বাচন করে টোকেন অন্তর্ভুক্তির একটি সিরিজ থেকে একটি একক অন্তর্ভুক্ত ভেক্টর তৈরি করে।


Best for:Autoregressive মডেল এবং sequential processing


Why it works:জিপিটি মত বাম থেকে ডান মডেলগুলিতে, চূড়ান্ত টোকেনটি পুরো সিরিজ থেকে সংগৃহীত পরিবেশ বজায় রাখে, যা এটি নির্দিষ্ট কাজগুলির জন্য তথ্য সমৃদ্ধ করে তোলে।


When to choose:

  • GPT বা অন্যান্য ডিকোডার-মাত্র মডেল ব্যবহার করার সময়
  • যখন কাজগুলির সাথে কাজ করা হয় যা পুরো পূর্ববর্তী পরিবেশের উপর গুরুতর নির্ভর করে
  • টেক্সট জেনারেশন বা সম্পন্ন কাজের জন্য


import torch
from transformers import AutoTokenizer, AutoModel

model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")

# Last token pooling
with torch.no_grad():
    outputs = model(**inputs)
    
    # Get the last non-padding token for each sequence
    attention_mask = inputs['attention_mask']
    last_token_indices = torch.sum(attention_mask, dim=1) - 1
    batch_indices = torch.arange(attention_mask.size(0))
    
    # Extract the last token embedding for each sequence
    last_token_embeddings = outputs.last_hidden_state[batch_indices, last_token_indices]

print(f"Shape: {last_token_embeddings.shape}")  # (2, 768)



There are many more ways, and these methods can be combined together as well to create custom methods. This was just the beginning for understanding embeddings as a concept and basic implementation to get embeddings using different techniques.

Looking Forward: Where Embeddings Are Headed

ভবিষ্যতের দিকে তাকান: যেখানে ইনব্যাডিংগুলি পরিচালিত হয়

অন্তর্নির্মিত স্থান (pun intended) উন্নয়ন অব্যাহত রাখে:


  • মাল্টিমোডাল embeddings টেক্সট, ইমেজ, অডিও, এবং ভিডিও মধ্যে বাধা ভেঙে।
  • MobileBERT এবং DistilBERT এর মতো আরো দক্ষ আর্কিটেকচারগুলি সীমিত সম্পদগুলির সাথে আর্দ্র ডিভাইসগুলিতে শক্তিশালী embeddings ব্যবহার করতে সক্ষম করে।
  • বিশেষজ্ঞ corpora উপর পূর্বে প্রশিক্ষিত ডোমেইন নির্দিষ্ট embeddings যেমন ঔষধ, আইন, এবং আর্থিক ক্ষেত্রে state-of-the-art চালিয়ে যাচ্ছে।

আমি বিশেষ করে কম্পিউটিং সচেতন অন্তর্ভুক্তগুলির জন্য উত্তেজিত, যা ভালভাবে সংজ্ঞাগুলি ছোট ইউনিটগুলি থেকে কিভাবে নির্মাণ করা হয় তা ধারণ করে, যা অবশেষে অস্বীকার এবং কম্পিউটিং বাক্যগুলির সাথে দীর্ঘমেয়াদী চ্যালেঞ্জগুলি সমাধান করতে পারে।

Final Thoughts

চূড়ান্ত চিন্তা

Embeddings কেবলমাত্র আরেকটি NLP কৌশল নয় – তারা মেশিনগুলি ভাষা বুঝতে এবং প্রক্রিয়াকরণ করার উপায় একটি মৌলিক পরিবর্তন।


আপনি যে কোনও এনএলপি কাজে কাজ করছেন, সম্ভবত চিন্তাশীলভাবে প্রয়োগ করা embeddings এটি আরও ভাল করতে পারে. চাবিকাঠি শুধুমাত্র কিভাবে এটি জেনারেট করা হয় তা বোঝার নয়, কিন্তু কখন এবং কেন বিভিন্ন পদ্ধতি ব্যবহার করা উচিত।


এবং যদি আপনি এখনও টেক্সট বিশ্লেষণের জন্য শব্দের ব্যাগ বা একক গরম কোডিং ব্যবহার করছেন ...


সুতরাং, সম্ভাবনার একটি পুরো বিশ্ব আপনার জন্য অপেক্ষা করছে।

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks