Attention: 'কোন শব্দে বেশি মনোযোগ' — Transformer বিপ্লবের বীজ

self-attention-এর intuition (Series 07, Episode 05)

🔴 ADVANCED Series 07 — NLP, Transformers ও LLM Episode 05 / 08

📑 এই পর্বে যা যা আছে

🧩 ১. গল্প: অনুবাদ করতে গিয়ে যে সমস্যা

ধরুন আমরা একটা model বানাতে চাই যা ইংরেজি থেকে বাংলা অনুবাদ করে। পুরনো (RNN) পদ্ধতিতে model প্রথমে পুরো ইংরেজি বাক্য পড়ে একটা একক সারাংশ vector-এ চাপত, তারপর সেটা থেকে বাংলা লিখত।

Maya: "Rahim, ভাবো — 'The cat that the dog chased ran away' — এই দীর্ঘ বাক্যকে যদি একটাই ছোট vector-এ চেপে ফেলি, তাহলে কি সব তথ্য টিকবে?"

Rahim: "না আপা, শুরুর 'cat'-এর কথা তো হারিয়ে যাবে, ঠিক RNN-এর সেই ভুলে যাওয়ার সমস্যা!"

Maya: "একদম। ২০১৪-১৭ সালে গবেষকরা ভাবলেন — বাংলা প্রতিটা শব্দ লেখার সময় model যদি ইংরেজি বাক্যের সবচেয়ে প্রাসঙ্গিক শব্দগুলোর দিকে ফিরে তাকাতে পারত? এই 'ফিরে তাকিয়ে সঠিক শব্দে মনোযোগ দেওয়া'-ই attention। আর এটাই পুরো AI দুনিয়া বদলে দিল।"

২. সমস্যা: এক সারাংশে পুরো বাক্য চাপা

RNN/LSTM পুরো বাক্যকে একটা fixed-size hidden state-এ চাপে। বাক্য যত দীর্ঘ, তত বেশি তথ্য এক জায়গায় গাদাগাদি হয় — এটাকে বলে information bottleneck। attention এই bottleneck ভেঙে দেয়: প্রতিটা শব্দ প্রয়োজনমতো যেকোনো শব্দের তথ্য সরাসরি টেনে নিতে পারে।

মূল idea: একটা শব্দের মানে বুঝতে হলে বাক্যের কোন কোন শব্দ বেশি গুরুত্বপূর্ণ — model সেটা নিজে হিসাব করে নেয় আর সেই অনুযায়ী "মনোযোগের ওজন" (attention weight) দেয়।

🎯 ৩. Attention-এর মূল ধারণা

Self-attention-এ বাক্যের প্রতিটা শব্দ বাকি প্রতিটা শব্দের সাথে নিজের সম্পর্ক মাপে, তারপর সেই সম্পর্কের ওজন দিয়ে বাকি শব্দগুলোর তথ্য মিশিয়ে নিজের একটা নতুন, context-সমৃদ্ধ representation বানায়।

বাক্য: "কুকুরটা ক্লান্ত ছিল কারণ সেটা দৌড়েছিল" "সেটা" শব্দটার নতুন representation বানাতে গিয়ে self-attention হিসাব করে: সেটা --> কুকুরটা : ওজন 0.7 (সবচেয়ে প্রাসঙ্গিক!) সেটা --> ক্লান্ত : ওজন 0.1 সেটা --> দৌড়েছিল: ওজন 0.2 তাই "সেটা" মূলত "কুকুরটা"-র অর্থ টেনে নেয় = reference বোঝা

🪜 ৪. তিন স্তরে attention

Level 1 — সহজ intuition:
একটা মিটিংয়ে সবাই কথা বলছে, কিন্তু আপনি নির্দিষ্ট একটা বিষয়ে সবচেয়ে প্রাসঙ্গিক মানুষের কথায় বেশি কান দেন। attention ঠিক তাই — প্রতিটা শব্দ বাকি সব শব্দের কথা "শোনে", কিন্তু প্রাসঙ্গিক শব্দে বেশি "কান দেয়"।

Level 2 — technical:
প্রতিটা শব্দের জন্য তিনটা vector বানানো হয়: Query (Q), Key (K), Value (V)। একটা শব্দের Q বাকি সব শব্দের K-এর সাথে dot product করে similarity score পায়; সেই score-এ softmax দিয়ে ওজন (০–১, যোগফল ১) বানায়; তারপর সেই ওজন দিয়ে সব V-এর weighted sum নেয় = নতুন representation।

Level 3 — AI Engineer perspective:
একজন engineer হিসেবে আপনি সাধারণত attention নিজে implement করবেন না — PyTorch/Transformers-এ এটা তৈরি। কিন্তু বোঝা জরুরি: attention-ই ব্যাখ্যা করে কেন LLM দীর্ঘ context ধরতে পারে, কেন context window গুরুত্বপূর্ণ, আর কেন খরচ বাক্যের দৈর্ঘ্যের সাথে দ্রুত বাড়ে (n² জটিলতা)।

📚 ৫. Query, Key, Value — লাইব্রেরির রূপক

ভাবুন একটা লাইব্রেরি:

Query (Q): আপনি যা খুঁজছেন — "মেশিন লার্নিং বই"।
Key (K): প্রতিটা বইয়ের তাকের লেবেল/সূচক।
Value (V): বইয়ের আসল বিষয়বস্তু।

আপনার Query প্রতিটা বইয়ের Key-র সাথে মেলে — যেটা সবচেয়ে বেশি মেলে, সেই বইয়ের Value (বিষয়বস্তু) আপনি বেশি নেন। attention ঠিক এই "Query দিয়ে Key খুঁজে, মিল অনুযায়ী Value টানা" কাজটাই করে — কিন্তু সংখ্যায়।

🖼️ ৬. Visual: self-attention কীভাবে কাজ করে

প্রতিটা শব্দ -> Q, K, V vector Step 1: score = Q · Kᵀ (প্রতি জোড়া শব্দের similarity) Step 2: scale ( ÷ √d ) + softmax -> attention weights (যোগফল = 1) Step 3: output = weights · V (প্রাসঙ্গিক তথ্যের weighted mix) কুকুরটা ক্লান্ত সেটা কুকুরটা [ 0.6 0.1 0.3 ] ক্লান্ত [ 0.2 0.7 0.1 ] <- attention weight matrix সেটা [ 0.7 0.1 0.2 ] (প্রতি row-এর যোগফল 1) "সেটা" row -> "কুকুরটা"-তে সবচেয়ে বেশি ওজন

🔢 ৭. অঙ্কের গল্প: score → softmax → weighted sum

ভয় পাবেন না — মূল সূত্র একটাই, আর প্রতিটা অংশের মানে আমরা জানি:

Attention(Q, K, V) = softmax( (Q · Kᵀ) / √d_k ) · V - Q · Kᵀ : প্রতি জোড়া শব্দের মিল কত (dot product) - ÷ √d_k : সংখ্যা খুব বড় হয়ে softmax যেন নষ্ট না হয় (scaling) - softmax: score-কে ০–১ ওজনে রূপান্তর, যোগফল ১ - · V : সেই ওজন দিয়ে value-র weighted average

💻 ৮. Code: NumPy-তে ছোট self-attention

কেন NumPy? — attention আসলে কয়েকটা matrix গুণ ছাড়া কিছু নয়, সেটা নিজের চোখে দেখাতে NumPy-ই যথেষ্ট, কোনো framework-এর জাদু ছাড়াই।

import numpy as np def softmax(x): e = np.exp(x - x.max(axis=-1, keepdims=True)) return e / e.sum(axis=-1, keepdims=True) def self_attention(X): # X: (seq_len, d) -- প্রতিটা row একটা শব্দের embedding d = X.shape[-1] # সরলতার জন্য Q=K=V=X ধরছি (বাস্তবে আলাদা weight matrix থাকে) Q, K, V = X, X, X scores = Q @ K.T / np.sqrt(d) # (seq_len, seq_len) weights = softmax(scores) # প্রতি row-এর যোগফল 1 output = weights @ V # context-সমৃদ্ধ নতুন representation return output, weights # 3টি শব্দ, প্রতিটা 4-মাত্রার embedding X = np.array([ [1.0, 0.0, 1.0, 0.0], # কুকুরটা [0.0, 1.0, 0.0, 1.0], # ক্লান্ত [0.9, 0.1, 0.8, 0.1], # সেটা (কুকুরটার কাছাকাছি!) ]) out, w = self_attention(X) print("Attention weights:\n", w.round(2)) # "সেটা" row -> "কুকুরটা"-তে সবচেয়ে বেশি ওজন দেখা যাবে

🔬 ৯. Experiment: "it" কাকে বোঝায়

উপরের কোডে "সেটা"-র embedding ইচ্ছে করে "কুকুরটা"-র কাছাকাছি রাখা হয়েছে। চালিয়ে দেখুন — weight matrix-এ "সেটা" row-এ "কুকুরটা" column সবচেয়ে বড় ওজন পায়। এবার "সেটা"-র embedding বদলে "ক্লান্ত"-র কাছাকাছি করুন আর দেখুন ওজন কীভাবে সরে যায়। এটাই attention-এর "reference resolution" — কোন শব্দ কাকে বোঝাচ্ছে তা ধরা।

🧩 ১০. Multi-head attention (সংক্ষেপে)

একটা attention "head" এক ধরনের সম্পর্ক ধরে (যেমন কর্তা-ক্রিয়া)। কিন্তু ভাষায় অনেক ধরনের সম্পর্ক থাকে। তাই Transformer একসাথে একাধিক head চালায় — প্রতিটা head ভিন্ন ধরনের সম্পর্কে মনোযোগ দেয়, তারপর সব মিলিয়ে নেওয়া হয়। একে বলে multi-head attention। এটাই পরের পর্বের Transformer-এর মূল component।

১১. কেন attention RNN-কে হারায়

বিষয়RNN/LSTMAttention
দীর্ঘ dependencyদুর্বল (ভুলে যায়)যেকোনো দূরত্ব সরাসরি দেখে
গতিsequential, ধীরparallel, দ্রুত (GPU-বান্ধব)
ব্যাখ্যাhidden state অস্বচ্ছattention weight দেখা যায়
খরচদৈর্ঘ্যে linearদৈর্ঘ্যে n² (দীর্ঘ বাক্যে দামি)
লক্ষ্য করুন — attention নিখুঁত নয়; দীর্ঘ input-এ n² খরচ একটা বাস্তব সমস্যা (তাই context window সীমিত)। কিন্তু parallel হওয়া আর দীর্ঘ dependency ধরার ক্ষমতা এটাকে বিজয়ী করেছে।

💼 ১২. Boss Question ও AI Engineer perspective

Boss: "এই attention জিনিসটা আমার business-এ সরাসরি কোথায় লাগবে?"

উত্তর: সরাসরি হয়তো আপনি attention লিখবেন না — কিন্তু আপনার ব্যবহার করা প্রতিটা আধুনিক AI (ChatGPT, translation, summarization, semantic search) এই attention-এর উপরেই দাঁড়ানো। কেন আমাদের chatbot দীর্ঘ context মনে রাখে, কেন খরচ input দৈর্ঘ্যের সাথে বাড়ে, কেন context window সীমিত — এসব সিদ্ধান্ত ও খরচ হিসাব attention না বুঝলে ব্যাখ্যা করা যায় না।
Must Know: attention-এর intuition, Q/K/V, কেন এটা RNN-কে হারায়।
Good to Know: softmax scaling, multi-head, self vs cross attention।
Learn Later: attention-এর সম্পূর্ণ ম্যাট্রিক্স গণিত, efficient attention (FlashAttention ইত্যাদি)।

🔎 ১৩. Job Requirement Decoder: "Attention Mechanism"

JD-তে: "Understanding of attention mechanisms and transformers."
প্রশ্নউত্তর
কী বোঝায়?model কীভাবে বাক্যের প্রাসঙ্গিক শব্দে মনোযোগ দেয় সেই ধারণা।
কেন চায়?সব আধুনিক NLP/LLM attention-ভিত্তিক; এটা না বুঝলে LLM ব্যবহারের গভীরতা থাকে না।
কোন সমস্যা সমাধান করে?দীর্ঘ dependency + parallel training — RNN-এর দুই বড় দুর্বলতা।
junior-এর কী জানা লাগে?Q/K/V intuition, self-attention কী করে, কেন RNN-এর চেয়ে ভালো।
এখনই কী master লাগে না?নিজে multi-head attention scratch থেকে optimize করা।
GitHub-এ কীভাবে দেখাবেন?একটা ছোট self-attention NumPy notebook + attention weight visualize।
Interview-তে?"self-attention ব্যাখ্যা করুন", "Q/K/V কী?", "attention কেন RNN-কে হারায়?"

⚠️ ১৪. সাধারণ ভুল

ভুল ১: attention আর LSTM-এর memory এক ভাবা। → attention memory রাখে না; প্রতিবার সব শব্দের সম্পর্ক নতুন করে হিসাব করে।

ভুল ২: softmax scaling (÷√d) বাদ দেওয়া গুরুত্বহীন ভাবা। → বড় dot product softmax-কে অতি-তীক্ষ্ণ করে ফেলে, শেখা কঠিন হয়।

ভুল ৩: attention = পুরো Transformer ভাবা। → attention একটা component; Transformer-এ এর সাথে positional encoding, feed-forward ইত্যাদিও থাকে (পরের পর্ব)।

ভুল ৪: attention খরচ input দৈর্ঘ্যে linear ভাবা। → আসলে n² — তাই খুব দীর্ঘ context দামি।

🎤 ১৫. Interview Prep

প্রশ্ন ১: Self-attention কীভাবে কাজ করে?
উত্তর: প্রতিটা শব্দের Q বাকি শব্দের K-এর সাথে dot product করে score পায়, softmax দিয়ে ওজন বানায়, সেই ওজন দিয়ে V-এর weighted sum নিয়ে context-সমৃদ্ধ representation বানায়।

প্রশ্ন ২: Q, K, V কী?
উত্তর: Query (কী খুঁজছি), Key (কীসের সাথে মিলাব), Value (আসল তথ্য) — প্রতিটা শব্দের embedding থেকে আলাদা weight দিয়ে তৈরি।

প্রশ্ন ৩: attention কেন RNN-এর চেয়ে ভালো?
উত্তর: যেকোনো দুই শব্দের সরাসরি সম্পর্ক দেখে (দীর্ঘ dependency), এবং parallelize করা যায় (দ্রুত training)।

✍️ ১৬. হাতে-কলমে ও Project Connection

১. উপরের NumPy self-attention-এ ৪র্থ একটা শব্দ যোগ করুন আর weight matrix কীভাবে বদলায় দেখুন।
২. Q, K, V-এর জন্য আলাদা random weight matrix (W_q, W_k, W_v) যোগ করে "শেখার যোগ্য" attention বানান।
৩. নিজের ভাষায় লিখুন: কেন attention-এর খরচ বাক্যের দৈর্ঘ্যের বর্গের (n²) সমানুপাতিক।

আমাদের flagship "Bangladesh Tech Career Assistant" সরাসরি attention লিখবে না, কিন্তু এই পর্ব ছাড়া আমরা বুঝতে পারতাম না কেন আমাদের ব্যবহার করা sentence-embedding ও LLM এত ভালো context ধরে। এটাই আমাদের পরের বড় ধাপ — Transformer ও LLM — বোঝার চাবি।

📌 ১৭. সারসংক্ষেপ ও পরবর্তী পর্ব

এই পর্বে শিখলাম:

✓ Attention = প্রতিটা শব্দ বাকি প্রাসঙ্গিক শব্দে "মনোযোগ" দিয়ে context টেনে নেয়
✓ Q (query), K (key), V (value) — লাইব্রেরির রূপকে
✓ সূত্র: softmax(Q·Kᵀ/√d)·V — score → ওজন → weighted sum
✓ NumPy-তে ছোট self-attention চালিয়ে "সেটা → কুকুরটা" reference ধরা
✓ Multi-head = একসাথে অনেক ধরনের সম্পর্কে মনোযোগ
✓ attention RNN-কে হারায় (দীর্ঘ dependency + parallel), কিন্তু খরচ n²
পরবর্তী পর্ব (S07E06): attention তো বুঝলাম — এবার সেটা দিয়ে পুরো Transformer architecture বানানো। positional encoding, encoder, decoder, আর "Attention Is All You Need" পেপারের সম্পূর্ণ ছবি — conceptual ভাবে, সহজ বাংলায়।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.