Natural Language Processingপড়তে ১১ মিনিট লাগবে

অ্যাটেনশন মেকানিজম (Attention Mechanism)

শুধু সেসব শব্দের দিকেই মনোযোগ দিন, যেগুলো আসলেই গুরুত্বপূর্ণ
scope:কোর কনসেপ্ট (মূল ধারণা)difficulty:মাঝারি

বইয়ের পাতায় হাইলাইট করা

যখন আপনি কোনো পাঠ্যবই বা টেক্সটবুক পড়েন, তখন কিন্তু প্রতিটি শব্দকে সমান গুরুত্ব দেন না। আপনি শুধু গুরুত্বপূর্ণ লাইনগুলো হাইলাইট বা মার্ক করেন। আপনার চোখ "এবং", "ও", "এর"-এর মতো সাধারণ শব্দগুলো এড়িয়ে গিয়ে সরাসরি মূল বিষয়গুলোর দিকেই মনোযোগ বা 'অ্যাটেনশন' দেয়। কোনো একটা প্যারাগ্রাফ থেকে প্রশ্নের উত্তর খোঁজার সময় আপনি শুধু দরকারি বাক্যগুলোর দিকে ফোকাস করেন আর বাকি সব অপ্রয়োজনীয় কথা মাথা থেকে একেবারে ঝেড়ে ফেলেন।

এআইয়ের ক্ষেত্রে অ্যাটেনশন (Attention) ঠিক এই কাজটাই করে। কোনো কিছু আউটপুট দেওয়ার সময় ইনপুটের ঠিক কোন শব্দ বা অংশের দিকে কতটা ফোকাস করতে হবে, এআই মডেলকে সেটা ডাইনামিকভাবে নির্ধারণ করতে সাহায্য করে এই অ্যাটেনশন মেকানিজম।

অ্যাটেনশন যে সমস্যার সমাধান করে

অ্যাটেনশন আবিষ্কারের আগে ল্যাঙ্গুয়েজ মডেলগুলোতে একটা বড় বটলনেক (bottleneck) বা আটকে থাকার সমস্যা ছিল। ধরুন, ইংরেজি ভাষার একটা বড় বাক্যকে বাংলায় অনুবাদ করতে হবে। আগের দিনের নিয়মটা ছিল এরকম:

  1. পুরো ইংরেজি বাক্যটা আগে শুরু থেকে শেষ পর্যন্ত পড়ো এবং সব তথ্য একত্র করে নির্দিষ্ট সাইজের একটা মাত্র ভেক্টরে (যাকে "কনটেক্সট বা context" বলে) ঢুকিয়ে ফেলো।
  2. তারপর ওই একটা মাত্র ভেক্টর থেকে পুরো বাংলা অনুবাদটা তৈরি করো।

কিন্তু ব্যাপারটা দেখুন, ৫০ শব্দের একটা বিশাল বাক্যকে জোর করে একটা ছোট ভেক্টরে ঢোকানো মানে হলো — আস্ত একটা বই পড়ে সেটাকে মাত্র এক বাক্যে বোঝানোর চেষ্টা করা! এতে করে অনেক দরকারি তথ্য হারিয়ে যায়। যে কারণে বড় বাক্যগুলোর অনুবাদের ক্ষেত্রে আগের মডেলগুলো একেবারে জঘন্য ফলাফল দিত।

অ্যাটেনশন ঠিক এখানেই জাদুর মতো কাজ করে। এটি মডেলকে প্রতিটি অনুবাদ করার সময় বা আউটপুট দেওয়ার সময় পুরো ইনপুট বাক্যটির দিকে আবার পেছন ফিরে তাকানোর সুযোগ করে দেয়। এর ফলে মডেল বুঝতে পারে যে, বর্তমানে যে শব্দটি সে বানাচ্ছে, তার জন্য ইনপুটের ঠিক কোন শব্দটি সবচেয়ে বেশি দরকারি।

অ্যাটেনশন কীভাবে কাজ করে: কোয়েরি, কি (Key), এবং ভ্যালু (Value)

অ্যাটেনশনকে আপনি একটা লাইব্রেরিতে বই খোঁজার সাথে তুলনা করতে পারেন:

  • কোয়েরি (Q) বা Query — এটি হলো আপনার করা প্রশ্ন: "আমার ঠিক এখন কোন তথ্যটা দরকার?"
  • কি (K) বা Key — এটি হলো প্রতিটি বইয়ের গায়ে লাগানো লেবেল বা ট্যাগ: "আমার ভেতরে কী তথ্য আছে?"
  • ভ্যালু (V) বা Value — এটি হলো ওই বইয়ের ভেতরের আসল লেখা বা কনটেন্ট।

পুরো প্রক্রিয়াটা এভাবেই কাজ করে:

  1. শুরুতেই প্রতিটি কি (Key)-এর সাথে আপনার কোয়েরি (Query)-টা মিলিয়ে দেখা হয় যে, কোনটা কতটা প্রাসঙ্গিক (relevance score)।
  2. এরপর সেই স্কোরগুলোকে ওয়েট বা weight-এ পরিণত করা হয় (সফটম্যাক্স বা softmax ব্যবহার করে — যাতে সবগুলোর যোগফল ১ হয়)।
  3. সবশেষে সেই ভ্যালুগুলোর ওয়েট দিয়ে গুণ করে যোগফল (weighted sum) বের করা হয়।

গণিতের ভাষায় একে বলা হয়: Attention(Q, K, V) = softmax(QK^T / sqrt(d)) * V

এখানে sqrt(d) শুধু একটা ছোট স্কেলিং ফ্যাক্টর, যার কাজ হলো সংখ্যাগুলোকে খুব বড় হয়ে যাওয়া থেকে বাঁচিয়ে স্থিতিশীল বা স্টেবল রাখা। ব্যস, এতটুকুই! এটাই হলো অ্যাটেনশনের পুরো ফর্মুলা বা সূত্র। দেখতে একেবারেই সাধারণ, কিন্তু এটিই আর্টিফিশিয়াল ইন্টেলিজেন্সের ইতিহাস পালটে দিয়েছে।

সেলফ-অ্যাটেনশন (Self-Attention): শব্দগুলো যখন নিজেরা কথা বলে

সেলফ-অ্যাটেনশন-এর ক্ষেত্রে একটা পুরো বাক্য তার নিজের দিকেই মনোযোগ বা অ্যাটেনশন দেয়। বাক্যের প্রতিটি শব্দ অন্য শব্দগুলোকে প্রশ্ন করে: "আমাকে ভালোভাবে বোঝার জন্য এই বাক্যের আর কোন কোন শব্দ দরকারি?"

উদাহরণস্বরূপ ধরুন: "the animal didn't cross the street because it was too tired."

এখানে "it" বা "সেটা" বলতে কাকে বোঝানো হচ্ছে? প্রাণীটিকে (animal) নাকি রাস্তাকে (street)? মডেল এখানে সেলফ-অ্যাটেনশনের মাধ্যমে বের করে ফেলে যে "it"-এর সাথে "animal"-এর সবচেয়ে বেশি মিল বা সম্পর্ক আছে (কারণ প্রাণীই তো ক্লান্ত হতে পারে, রাস্তা তো আর ক্লান্ত হয় না)। তাই সে এই দুই শব্দের মধ্যে সবচেয়ে বেশি অ্যাটেনশন স্কোর দেয়।

সহজ ভাষায় অ্যাটেনশন মেকানিজম

import numpy as np
def softmax(x):
"""স্কোরগুলোকে সম্ভাবনা বা প্রোবাবিলিটিতে (probabilities) রূপান্তর করে।"""
exp_x = np.exp(x - np.max(x))
return exp_x / exp_x.sum(axis=-1, keepdims=True)
def attention(Q, K, V):
"""স্কেল করা ডট-প্রোডাক্ট অ্যাটেনশন (Scaled dot-product attention)।"""
d_k = K.shape[-1]
# ধাপ ১: প্রাসঙ্গিকতা বা relevance স্কোর বের করা
scores = Q @ K.T / np.sqrt(d_k)
# ধাপ ২: স্কোরগুলোকে ওয়েট বা সম্ভাবনায় রূপান্তর করা
weights = softmax(scores)
# ধাপ ৩: ভ্যালুগুলোর ওয়েটসহ যোগফল (Weighted sum)
output = weights @ V
return output, weights
# ধরি আমাদের কাছে ৪টি শব্দ আছে, যাদের প্রতিটির ৩-মাত্রিক এম্বেডিং রয়েছে
np.random.seed(42)
words = ["The", "cat", "is", "sleeping"]
# আসল মডেলগুলোতে Q, K ও V আসে মডেলের শেখা কিছু প্রজেকশন থেকে
# কিন্তু এখানে আমরা সাধারণ এম্বেডিং ব্যবহার করেছি
embeddings = np.array([
[0.1, 0.0, 0.2], # The
[0.8, 0.9, 0.1], # cat
[0.2, 0.1, 0.3], # is
[0.7, 0.8, 0.2], # sleeping
])
Q = K = V = embeddings # সেলফ-অ্যাটেনশন
output, weights = attention(Q, K, V)
print("অ্যাটেনশন ওয়েট (কে কার দিকে ফোকাস করছে):")
for i, word in enumerate(words):
focus = [(words[j], f"{weights[i][j]:.2f}") for j in range(len(words))]
print(f" {word:>10}{focus}")
print(f"\n'sleeping' শব্দটি সবচেয়ে বেশি ফোকাস করছে '{words[np.argmax(weights[3])]}'-এর দিকে (কারণ ঘুমানোর সাথে বিড়াল বা cat-এর সম্পর্ক সবচেয়ে বেশি!)")
Output
অ্যাটেনশন ওয়েট (কে কার দিকে ফোকাস করছে):
       The → [('The', '0.23'), ('cat', '0.27'), ('is', '0.24'), ('sleeping', '0.27')]
       cat → [('The', '0.15'), ('cat', '0.35'), ('is', '0.16'), ('sleeping', '0.34')]
        is → [('The', '0.22'), ('cat', '0.27'), ('is', '0.23'), ('sleeping', '0.27')]
  sleeping → [('The', '0.16'), ('cat', '0.34'), ('is', '0.16'), ('sleeping', '0.34')]

'sleeping' শব্দটি সবচেয়ে বেশি ফোকাস করছে 'cat'-এর দিকে (কারণ ঘুমানোর সাথে বিড়াল বা cat-এর সম্পর্ক সবচেয়ে বেশি!)
Note: মাল্টি-হেড অ্যাটেনশন (Multi-Head Attention): আসল ট্রান্সফরমার মডেলগুলো শুধু একটা মাত্র অ্যাটেনশন মেকানিজম ব্যবহার করে না — তারা একই সাথে অনেকগুলো "মাথা (heads)" বা প্যারালাল অ্যাটেনশন ব্যবহার করে। এদের প্রতিটা মাথা তথ্যের ভিন্ন ভিন্ন দিক নিয়ে কাজ করে। কোনো একটা মাথা হয়তো ব্যাকরণের দিকে ফোকাস করে (কে কাজ করছে এবং কী কাজ করছে), আরেকটা মাথা হয়তো সর্বনাম বা প্রোনাউন নিয়ে ভাবে ('ইহা' বা 'সে' বলতে কাকে বোঝানো হয়েছে), আরেকটা হয়তো শব্দের অর্থের মিল খোঁজে। সব শেষে এই সব মাথার চিন্তাভাবনা এক জায়গায় জোড়া লাগানো হয়। উদাহরণস্বরূপ বলা যায়, GPT-4 তার প্রতিটা লেয়ারে এমন ৯৬টি আলাদা আলাদা অ্যাটেনশন হেড ব্যবহার করে।

অ্যাটেনশন কীভাবে পুরো পৃথিবীকে বদলে দিল

২০১৪ সালের আগে, সিকোয়েন্স মডেলগুলো (যেমন: অনুবাদ করার মডেল) যেকোনো লেখাকে বাম থেকে ডানে একটা একটা করে শব্দ হিসেবে পড়ত এবং একটা হিডেন স্টেটের মাধ্যমে সব তথ্য মনে রাখত। এর ফলে বড় কোনো বাক্য দিলে সে তালগোল পাকিয়ে ফেলত — কারণ, বাক্যের ৫০ নম্বর শব্দে পৌঁছাতে পৌঁছাতে সে ১ নম্বর শব্দটা প্রায় ভুলেই যেত!

অ্যাটেনশন এসে এই ঝামেলার মুলে কুঠারাঘাত করল। এটি বাক্যের যেকোনো দুই জায়গার মধ্যে সরাসরি সংযোগ তৈরি করার সুযোগ করে দিল। ৫০ নম্বর শব্দ এখন যত দূরেই থাক না কেন, সে সরাসরি ১ নম্বর শব্দের দিকে মনোযোগ দিতে পারে। শুধু এই একটা অভাবনীয় ধারণার কারণেই আজকের দিনে নিচে দেওয়া এই ম্যাজিকগুলো সম্ভব হয়েছে:

  • মেশিন ট্রান্সলেশন (Machine translation), যা বিশাল বড় বাক্যকেও নিখুঁত অনুবাদ করতে পারে।
  • বড় কোনো আর্টিকেল বা টেক্সট পড়ে তার থেকে সঠিক মূলভাব বা সারসংক্ষেপ (Text summarization) তৈরি করা।
  • বিশাল বড় কোনো ডকুমেন্ট পড়ে তার মধ্যে থেকে সঠিক উত্তরটা (Question answering) খুঁজে বের করে দেওয়া।
  • এবং সবশেষে — ট্রান্সফরমার (Transformer) আর্কিটেকচার, যা আজকের দিনের সব বড় বড় এলএলএম-কে (LLMs) পরিচালিত করছে।

ছোট কুইজ

সিকোয়েন্স-টু-সিকোয়েন্স (seq2seq) মডেলগুলোতে অ্যাটেনশন ঠিক কোন সমস্যার সমাধান করেছে?
Challenge

পড়া চালিয়ে যান