Generative AI/LLM-এর ভিত্তি/Lesson 03
Next-token prediction
LLM-এর একমাত্র কাজ পরের token অনুমান করা। গোনা দিয়ে একটা bigram language model বানাও, তা দিয়ে লেখা generate করো, আর দেখো GPT আসলে এরই এক বিশাল রূপ।
- সময়
- 24 মিনিট
- Exercise
- 1
- Challenge
- 1
- Quiz
- 3 প্রশ্ন
সহজ ভাষায়
তোমার phone-এর keyboard "আমি ভাত" লিখলে পরের শব্দ suggest করে, যেমন "খাই"। ChatGPT ঠিক এই কাজটাই করে, শুধু অনেক অনেক ভালোভাবে:
একটা token অনুমান করো, যোগ করো, আবার পরেরটা অনুমান করো। এভাবে পুরো উত্তর তৈরি হয়। একে বলে autoregressive generation।
"আমি ভাত" → খাই (0.7), রান্না (0.2), ...
"আমি ভাত খাই" → । (0.8), না (0.1), ...
"আমি ভাত খাই ।" → ...
কেন দরকার?
LLM-এর প্রায় সব আচরণ এখান থেকে বোঝা যায়:
- Hallucination: Model "সত্য" বলার জন্য train হয়নি, train হয়েছে "সম্ভাব্য পরের token"-এর জন্য। শুনতে বিশ্বাসযোগ্য ভুল তথ্যও সম্ভাব্য হতে পারে।
- Streaming: উত্তর token-by-token আসে।
- Prompt engineering: Prompt বদলালে আগের token বদলায়, তাই পরের token-এর probability বদলায়।
গোনা দিয়ে language model
সবচেয়ে সহজ model হলো bigram। এটা শুধু ঠিক আগের token দেখে। Training মানে corpus-এ গোনা: প্রতিটা শব্দের পরে কোন শব্দ কতবার এসেছে।
এটাই একটা language model। খুব ছোট আর খুব বোকা, কিন্তু GPT-র মতোই probability দেয়।
Bigram থেকে GPT
| Bigram | GPT/Claude | |
|---|---|---|
| কতটা আগে দেখে | ১টা token | হাজার হাজার token (context window) |
| কীভাবে শেখে | গুনে | Neural network + gradient descent |
| Parameter | শব্দ-জোড়ার table | শত শত কোটি weight |
| মূল কাজ | পরের token-এর probability | একই |
মূল কাজ একই। পার্থক্য হলো কতটা context দেখতে পারে আর কতটা ভালোভাবে সাধারণীকরণ (generalize) করে। Bigram কখনো না দেখা শব্দ-জোড়ার জন্য কিছু বলতে পারে না। Neural network embedding দিয়ে বোঝে যে "মাছ" আর "ভাত" দুটোই খাবার।
Training loss: কতটা অবাক হলো
Model ঠিক token-কে কত probability দিয়েছিল, তার উপর ভিত্তি করে cross-entropy loss মাপা হয়:
নিশ্চিতভাবে ঠিক হলে loss ছোট। ঠিক token-কে কম probability দিলে, অর্থাৎ "অবাক" হলে, loss বড়। GPT-র pre-training মানে trillion-খানেক token-এ এই loss কমানো।
Exercise
Exercise
Bigram গোনা
bigram_counts(tokens) লেখো। প্রতিটা token-এর পরে কোন token কতবার এসেছে, তার nested dict return করবে:
{আগের_token: {পরের_token: সংখ্যা}}
উদাহরণ: ["আমি", "ভাত", "খাই", "আমি", "মাছ", "খাই"] →
{"আমি": {"ভাত": 1, "মাছ": 1}, "ভাত": {"খাই": 1}, "খাই": {"আমি": 1}, "মাছ": {"খাই": 1}}
Quiz
Challenge
Challenge
একটা ছোট্ট language model
Bigram count থেকে একটা model:
next_probs(counts, token)—token-এর পরে প্রতিটা সম্ভাব্য token-এর probability-র dict। প্রতিটা count-কে মোট দিয়ে ভাগ করবে।tokenকখনো না দেখে থাকলে খালি dict{}।generate(counts, start, n)— greedy generation।startথেকে শুরু করে বারবার সবচেয়ে বেশি probability-র পরের token যোগ করবে। সমান হলে যেটা dict-এ আগে আছে। মোটnটা নতুন token যোগ হলে, অথবা পরের token না থাকলে থামবে। Return: পুরো token list (start সহ)।
বাস্তবে কোথায় ব্যবহার হয়?
Challenge-এ তোমার greedy generation সবসময় একই লেখা দেয়, আর প্রায়ই একই লুপে আটকে যায় ("খাই । আমি ভাত খাই । আমি ভাত ...")। আসল LLM তাই সবসময় সবচেয়ে সম্ভাব্য token নেয় না, probability অনুযায়ী নমুনা (sample) নেয়। কতটা এলোমেলোভাবে নেবে, সেটা ঠিক করে একটা setting যেটা তুমি API-তে দেখবে: temperature।
Interview প্রশ্ন
- Beginner: Language model কী? "Autoregressive" মানে কী?
- Intermediate: LLM কেন hallucinate করে? Next-token prediction দিয়ে ব্যাখ্যা করো।
- Advanced: N-gram model-এর sparsity সমস্যা কী? Neural language model কীভাবে এটা সমাধান করে?
এরপর কী?
Probability আছে। এখন কোন token বেছে নেবে? সবচেয়ে সম্ভাব্যটা, নাকি একটু ঝুঁকি নেবে? পরের lesson: Sampling আর temperature।