এই পর্বে যা শিখবেন
- এক beam ধাপ, এক top-p ছাঁট আর temperature-এর ভাগ হাতে করা
- Greedy, beam, temperature, top-k, top-p, min-p আর repetition penalty NumPy-তে শূন্য থেকে লেখা
- Length penalty, EOS আর থামার নিয়ম বোঝা
- GPT-2 আর ছোট বাংলা model-এ পুনরাবৃত্তি, গড় probability আর গতি মাপা
- Seed-এর সীমা জানা, আর API-র parameter নথি থেকে যাচাই করা
১ · একই model, ভিন্ন লেখা — decoding আসলে কী
আগের পর্বগুলোয় model শিখেছে একটি কাজ: prompt দেখে পরের token-এর probability দেওয়া। কিন্তু probability তো লেখা নয়। প্রতিটি ধাপে কোন token আসলে নেওয়া হবে, সেই নিয়মের নাম decoding. AI-এর ভিত্তি কোর্সের পর্ব ৭০-এ এর প্রথম পরিচয় পেয়েছেন, পর্ব ৩০-এ greedy, আর পর্ব ৩৬-এ temperature. এই পর্বে পুরোটা একসঙ্গে, হিসাবসহ।
ধরুন মিরপুর থেকে মতিঝিল যাবেন। প্রতিটি মোড়ে যে রাস্তা তখন সবচেয়ে ফাঁকা, সেটি নিলে হলো greedy; সামনে জ্যাম থাকলেও ফেরার উপায় নেই। তিন বন্ধু তিন রাস্তায় গিয়ে প্রতি মোড়ে ফোনে কথা বলে সেরা তিন অবস্থান রাখলে হলো beam search. আর যদি লটারির বাক্স থেকে পরের রাস্তা তোলেন, যেখানে ফাঁকা রাস্তার টিকিট বেশি, তাহলে sampling. বাক্স থেকে খারাপ রাস্তার টিকিট আগেই ফেলে দেওয়াই top-k আর top-p.
ধারণাগুলো দুই পরিবারে পড়ে। একটি খোঁজে, অন্যটি তোলে:
| পরিবার | লক্ষ্য | পদ্ধতি | একই prompt-এ ফল |
|---|---|---|---|
| খোঁজা (search) | সবচেয়ে সম্ভাব্য sequence-এর কাছাকাছি যাওয়া | greedy, beam search | সাধারণত একই |
| তোলা (sampling) | বণ্টন থেকে একটি নমুনা নেওয়া | temperature, top-k, top-p, min-p | seed বদলালে ভিন্ন |
খোঁজার লক্ষ্য লেখা যায় এক লাইনে। Sequence x1…xn-এর probability হলো প্রতিটি ধাপের probability-র গুণফল (chain rule, পর্ব ৪৬ · Language modeling-এ এর বিস্তার):
log P(x1…xn) = ∑t log P(xt | x1…xt−1)
এখানে log হলো স্বাভাবিক লগ। গুণের বদলে যোগ করা হয়, কারণ অনেক ছোট সংখ্যার গুণফল কম্পিউটারে শূন্যে হারিয়ে যায়; এই যোগফলটিই log-probability. সব sequence ঘুরে দেখতে লাগত Vnটি পথ, যেখানে V হলো vocabulary-র আকার। GPT-2-এর V = 50,257 আর n = 20 হলে সংখ্যাটি প্রায় ১০৯৪. তাই সবই আসলে আপস।
Beam search নামটি নতুন নয়; ১৯৭০-এর দশকের speech recognition গবেষণায় এর দেখা মেলে। Neural লেখায় top-k জনপ্রিয় হয় ২০১৮ সালের দিকে (Fan ও সহলেখক, গল্প লেখা), repetition penalty আসে CTRL (২০১৯) থেকে, top-p আসে Holtzman ও সহলেখকদের গবেষণাপত্র থেকে (প্রথম প্রকাশ ২০১৯, ICLR ২০২০), আর min-p ২০২৪ সালে।
Decoding model-এর weight বদলায় না। একই model, একই logit; শুধু “কোন token নেব” নিয়মটি বদলায়। অথচ পরে দেখবেন, শুধু এই নিয়মে লেখা একঘেয়ে থেকে এলোমেলো পর্যন্ত যেতে পারে।
২ · Greedy আর beam search — কেন সেরা পথ হারায়
Greedy প্রতি ধাপে argmax নেয়, তাই একবার ভুল মোড় নিলে আর ফেরে না (পর্ব ৩০-এ ছোট উদাহরণ দেখেছেন)। Beam search প্রতি ধাপে সেরা W-টি আংশিক sequence ধরে রাখে; W-কে বলে beam width. W = ১ হলে এটিই greedy. বাজারঘর-এর একটি রিভিউ-বাক্যের ছোট গাছ দেখুন, যার সংখ্যাগুলো হাতে বানানো:
W = ২ সবচেয়ে ভালো পথটি প্রথম ধাপেই কেটে ফেলে
প্রতিটি ঘরে token আর সেই পর্যন্ত মোট probability. সবুজ পথের মোট সবচেয়ে বেশি, কিন্তু প্রথম ধাপে “দাম” ছিল তৃতীয়।
এক ধাপে কী ঘটে, হাতে দেখুন। W = ২, প্রথম ধাপ শেষ। সব স্কোর log-probability, তাই বড় মানে কম ঋণাত্মক:
| Beam-এ আছে | |
| যা হিসাব হচ্ছে | |
| প্রার্থী |
- শুরু. প্রথম ধাপে “ভালো” (.40) আর “মান” (.35) টিকেছে; ln .40 = −0.916, ln .35 = −1.050. “দাম” (.25) আগেই বাদ।
- “ভালো” বাড়ানো. পরের তিনটি token-এর log probability যোগ। যোগ হলো গুণের সমান, তাই −1.609 মানে .40 × .5 = .20.
- “মান” বাড়ানো. আরও দুটি প্রার্থী। মোট প্রার্থী W × (প্রতি ঘরের শাখা); আসল model-এ W × V.
- এক সারিতে সাজানো. কোন beam থেকে এলো, তা দেখা হয় না। শুধু মোট স্কোর।
- সেরা ২টি রাখা. পিছিয়ে থাকা “মান” এবার প্রথম: “মান ভালো” (.21) টপকে গেল “ভালো ছিল” (.20)-কে। Greedy এই পথ দেখতই না।
- যা হারাল. “দাম কম”-এর স্কোর −1.438, দুই বিজয়ীর চেয়েই ভালো। কিন্তু “দাম” আগের ধাপে কাটা পড়েছে, তাই আর ফিরবে না।
এবার গাছটি কোডে। সব পথ ঘুরে দেখা brute force-এর সঙ্গে beam-এর ফল মিলিয়ে নিচ্ছি। প্রথম চালাতে কয়েক সেকেন্ড লাগতে পারে:
import math
TREE = {(): {"ভালো": .40, "মান": .35, "দাম": .25},
("ভালো",): {"ছিল": .5, "না": .3, "মান": .2},
("মান",): {"ভালো": .6, "খারাপ": .4},
("দাম",): {"কম": .95, "বেশি": .05},
("ভালো", "ছিল"): {"।": .5, "না": .5}, ("ভালো", "না"): {"।": 1.0},
("ভালো", "মান"): {"ছিল": 1.0}, ("মান", "ভালো"): {"ছিল": .8, "।": .2},
("মান", "খারাপ"): {"ছিল": .9, "।": .1}, ("দাম", "কম"): {"ছিল": .98, "।": .02},
("দাম", "বেশি"): {"ছিল": .7, "।": .3}}
def brute(path=(), lp=0.0): # সব পথ ঘুরে দেখা
if path not in TREE:
return [(lp, path)]
out = []
for t, p in TREE[path].items():
out += brute(path + (t,), lp + math.log(p))
return out
def beam(W):
beams, grown = [(0.0, ())], 0
while any(p in TREE for _, p in beams):
cand = []
for lp, path in beams:
for t, q in TREE[path].items():
cand.append((lp + math.log(q), path + (t,))); grown += 1
beams = sorted(cand, reverse=True)[:W] # W-টি রাখা, বাকি চিরতরে বাদ
return beams[0], grown
paths = sorted(brute(), reverse=True)
print("সব পথ:", len(paths), "| সেরা:", " ".join(paths[0][1]), f"{math.exp(paths[0][0]):.4f}")
for W in (1, 2, 3):
(lp, p), n = beam(W)
tag = "সেরা পেয়েছে" if p == paths[0][1] else "সেরা পায়নি"
print(f"W={W} P={math.exp(lp):.4f} {' '.join(p)} | {n} বিস্তার | {tag}")আউটপুট: W=1 P=0.1000 ভালো ছিল না, W=2 P=0.1680 মান ভালো ছিল, W=3 P=0.2327 দাম কম ছিল; সব পথ ১২টি, W = ৩ ছাড়া কেউ সেরাটি পায়নি। W = ২ এখানে ১২ বার শাখা বাড়িয়েও সেরাটি হারিয়েছে। একটি সূক্ষ্ম কথা: W বাড়ালে ফল এই গাছে ভালো হলো, কিন্তু সাধারণভাবে এর নিশ্চয়তা নেই। বড় W-এর একটি বাড়তি প্রার্থী অন্য একটি ভালো পথকে ঠেলে বের করে দিতে পারে।
খরচের হিসাব: প্রতি ধাপে W-টি sequence এক batch-এ model-এ যায়, আর W × V প্রার্থীর মধ্যে সেরা W বাছাই হয়। পর্ব ৩৭-এর KV cache-ও W গুণ জায়গা নেয়, আর beam বদলালে cache-এর সারিগুলোও সাজিয়ে নিতে হয়।
৩ · কখন থামবে — EOS, length penalty আর থামার নিয়ম
Generation থামে তিনভাবে: model EOS token দিলে, max_new_tokens ফুরালে, অথবা নির্দিষ্ট লেখা (stop sequence) বেরোলে। EOS কেবল একটি সাধারণ token, model এটিও probability দিয়ে বেছে নেয়। Beam-এ কোনো প্রার্থী EOS পেলে সেটি “সমাপ্ত” তালিকায় যায়, বাকিরা এগোতে থাকে।
এখানেই ফাঁদ। প্রতি ধাপে একটি ঋণাত্মক সংখ্যা যোগ হয়, তাই লম্বা sequence-এর মোট স্কোর প্রায় সবসময় বেশি ঋণাত্মক। সরাসরি তুললে ছোট উত্তরই জেতে। এর ওষুধ length penalty. Hugging Face transformers-এর নথি অনুযায়ী (v5.22.2, ২০২৬ সালের নভেম্বরে পড়া) স্কোরকে দৈর্ঘ্যের ঘাত দিয়ে ভাগ করা হয়, যেখানে L হলো নতুন token-এর সংখ্যা আর α হলো length_penalty:
score = (∑ log P) / Lα
| প্রার্থী | ∑ log P | L | α = 0 | α = 0.5 | α = 1 |
|---|---|---|---|---|---|
| ছোট: “ভালো।” | −1.6 | 2 | −1.60 | −1.13 | −0.80 |
| লম্বা: ছয় token-এর বাক্য | −3.0 | 6 | −3.00 | −1.22 | −0.50 |
α যত বড়, লম্বা উত্তর তত এগিয়ে। α = 0 মানে কোনো ক্ষতিপূরণ নেই। ঋণাত্মক α ছোট উত্তরকে আরও সুবিধা দেয়।
ভুল ধারণা: নাম “penalty”, তাই মনে হয় বড় মান লম্বা উত্তরকে শাস্তি দেয়। স্কোর ঋণাত্মক বলে ঠিক উল্টো ঘটে: নথিই বলছে length_penalty > 0 লম্বা sequence-কে এগিয়ে দেয়। আরেকটি কথা: ডিফল্ট early_stopping নিখুঁত beam search নয়, একটি heuristic. Source-এ লেখা আছে, প্রচলিত beam search পেতে early_stopping="never" আর length_penalty=0.0 দিতে হয়।
Sampling-এ এই সমস্যা নেই, কারণ সেখানে মোট স্কোর তুলনা হয় না। আর JSON বা schema মানতে বাধ্য করা হলো constrained decoding; এটি পর্ব ৬২ (Structured output — JSON, schema আর যাচাই)-এর বিষয়।
৪ · Temperature — logit-কে ভাগ করা
এবার তোলার পরিবার। Softmax-এর আগে প্রতিটি logit zi-কে T দিয়ে ভাগ করা হয়:
pi = ezi/T / ∑j ezj/T
দুটি token-এর probability-র অনুপাত তাই pi/pj = e(zi−zj)/T. T কমলে অনুপাত বাড়ে, T বাড়লে ১-এর দিকে যায়। অনিশ্চয়তা মাপব entropy দিয়ে, H = −∑ p log2 p বিটে (AI-এর ভিত্তি কোর্সের পর্ব ৩৮).
| T | |
| z / T | |
| e^(z/T) | |
| p | |
| H (bit) |
- ভাগ আর e-ঘাত. T = ১-এ logit অপরিবর্তিত। প্রতিটির e-ঘাত নেওয়া হলো।
- যোগ দিয়ে ভাগ. 7.389 / 9.406 = .786. এটিই সাধারণ softmax. “খারাপ”-এরও ৩.৯% সুযোগ আছে।
- T = ০.৫. Logit-এর ফারাক দ্বিগুণ। “ভালো” ৯৫%; H প্রায় তিন ভাগের এক ভাগ।
- T = ২. ফারাক অর্ধেক। “খারাপ” এখন ১৩%, আগের তিন গুণের বেশি। ক্রম কিন্তু একই।
- T → ০. সবচেয়ে বড় logit-ই সব পায়; এটিই greedy. T = ০ দিয়ে সত্যি ভাগ করা যায় না, তাই কোডে আলাদা
argmaxলেখা হয়। - T → ∞. সব প্রায় সমান, H পৌঁছায় log2 3 = 1.585-এ। Model যা শিখেছে, প্রায় সবই মুছে গেল।
পরীক্ষায় অনুপাতের সূত্র দিয়ে দ্রুত যাচাই করা যায়। “ভালো” আর “মোটামুটি”-র logit-এর ফারাক ১.৫. T = ১-এ অনুপাত e1.5 = ৪.৪৮ (.786 / .175), T = ০.৫-এ e3 = ২০.১, আর T = ২-এ e0.75 = ২.১২. একবার সংখ্যা মিলিয়ে নিলে ভুল softmax সহজেই ধরা পড়ে।
একটি বিষয় মনে রাখুন। Temperature বণ্টনের আকার বদলায়, কিন্তু কোনো token বাদ দেয় না। বিশাল vocabulary-তে T = ১.৫ হলে অসংখ্য বাজে token-এর ছোট ছোট probability মিলে বড় একটি লেজ তৈরি হয়। সেই লেজ কাটার জন্যই পরের অংশ।
৫ · Top-k, top-p আর min-p — লেজ কাটা
তিনটিরই কাজ একই: কিছু token-এর probability শূন্য করে বাকিদের যোগফল আবার ১ করা। অর্থাৎ বণ্টনের support ছোট করা। পার্থক্য শুধু কাটার নিয়মে:
- Top-k: সবচেয়ে বড় k-টি রাখা। k স্থির, বণ্টন তীক্ষ্ণ হোক বা সমতল।
- Top-p (nucleus): বড় থেকে ছোট সাজিয়ে সবচেয়ে ছোট এমন দল রাখা, যাদের যোগফল অন্তত c. Model নিশ্চিত হলে দল ছোট, অনিশ্চিত হলে বড়।
- Min-p (শুধু পরিচিতি): সবচেয়ে বড় probability-র m গুণের নিচে যারা, তাদের বাদ। Nguyen ও সহলেখকরা ২০২৪ সালে এটি প্রস্তাব করেন (ICLR ২০২৫), আর ভালো ফলের দাবি তাঁদের নিজেদের পরীক্ষার; একে সর্বজনীন সিদ্ধান্ত ধরবেন না।
| token | |
| p | |
| যোগফল | |
| যোগফল ≥ .8? | |
| Support, H |
- সাজানো. Probability আগে থেকেই বড় থেকে ছোট। এখন entropy ২.০৫৮ বিট।
- প্রথম token. যোগফল .45, এখনো .8-এর নিচে।
- দ্বিতীয়. .45 + .25 = .70, এখনো নিচে।
- তৃতীয়. .85; এবার .8 ছাড়াল। যে token সীমা পার করায়, সে-ও থাকে। তাই দলের যোগফল .85, ঠিক .8 নয়।
- কাটা. মোটামুটি, খারাপ, ছেঁড়া বাদ। এদের মোট .15 সুযোগ চলে গেল।
- আবার যোগফল ১. .85 দিয়ে ভাগ: .45 / .85 = .529. আপেক্ষিক অনুপাত অপরিবর্তিত। Entropy ১.৪৪৭ বিটে নামল।
Top-k আর top-p-এর আসল পার্থক্য দেখা যায় দুই ধরনের বণ্টনে। প্রথমটিতে model প্রায় নিশ্চিত, দ্বিতীয়টিতে অনিশ্চিত:
| বণ্টন | Top-k, k = 2 | Top-p, c = .9 |
|---|---|---|
| তীক্ষ্ণ: .91 .05 .02 .01 .01 | ২টি থাকে; .৯৬ ভর | ১টি থাকে (.91 ≥ .9) |
| সমতল: .22 .20 .18 .15 .13 .12 | ২টি থাকে; মাত্র .৪২ ভর | ৬টিই থাকে (.৮৮-এ সীমা ছোঁয়নি) |
Top-k সমতল বণ্টনে অর্ধেকের বেশি ভর ফেলে দেয়, তীক্ষ্ণ বণ্টনে অপ্রয়োজনীয় token রেখে দেয়। Top-p দুই জায়গাতেই বণ্টন দেখে সিদ্ধান্ত নেয়।
এবার সব নিয়ম NumPy-তে, আটটি শব্দের হাতে বানানো logit-এ। প্রতি সারিতে support আর entropy ছাপা হবে:
import numpy as np
np.set_printoptions(precision=3, suppress=True, linewidth=60)
words = ["ভালো", "সুন্দর", "দারুণ", "মোটামুটি", "খারাপ", "ছেঁড়া", "দেরি", "ফেরত"]
z = np.array([3.0, 2.5, 2.0, 1.2, 0.3, -0.2, -0.8, -1.5]) # হাতে বানানো
def softmax(z, T=1.0):
e = np.exp(z / T - (z / T).max()) # overflow ঠেকাতে সর্বোচ্চ বিয়োগ
return e / e.sum()
def H(p): # entropy, bit-এ
q = p[p > 0]
return float(-(q * np.log2(q)).sum()) + 0.0
def keep(p, mask): # বাকিরা শূন্য, যোগফল আবার ১
q = np.where(mask, p, 0.0)
return q / q.sum()
def top_k(p, k):
return keep(p, p >= np.sort(p)[-k])
def top_p(p, c):
i = np.argsort(-p)
n = np.searchsorted(np.cumsum(p[i]), c) + 1 # c ছোঁয়ার প্রথম ঘর
m = np.zeros(len(p), bool); m[i[:n]] = True
return keep(p, m)
def min_p(p, m):
return keep(p, p >= m * p.max())
def show(name, p):
print(f"{name:10s} support={(p > 0).sum()} H={H(p):.3f} max={p.max():.3f}")
p = softmax(z)
show("T=1", p)
for T in (0.01, 0.5, 2.0, 1000.0): show(f"T={T}", softmax(z, T))
show("top-k 3", top_k(p, 3)); show("top-p 0.9", top_p(p, 0.9))
show("min-p 0.2", min_p(p, 0.2))
q = top_p(p, 0.9); draw = np.random.default_rng(42).choice(8, 20000, p=q)
print("তত্ত্ব:", q.round(3)); print("নমুনা:", (np.bincount(draw, minlength=8) / 20000).round(3))
print("ছাঁটা:", [w for w, x in zip(words, q) if x == 0])আউটপুটের প্রথম পাঁচ সারি temperature-এর: T=1 support=8 H=2.085, T=0.01 support=8 H=0.000 max=1.000, T=1000.0 support=8 H=3.000 max=0.125. Support সবসময় ৮। T কোনো token বাদ দেয় না, শুধু ভর সরায়; T = ০.০১-এ লেজ এত ছোট যে H শূন্য দেখায়। আটটি সমান শব্দের entropy log2 8 = 3, T = ১০০০ ঠিক সেখানেই পৌঁছায়।
এরপর কাট: top-k 3 support=3 H=1.472, top-p 0.9 support=4 H=1.751, min-p 0.2 support=3 H=1.472. এই বণ্টনে top-p ৪টি রাখে, কারণ প্রথম তিনটির যোগ .৮৬৫. শেষে ২০,০০০ বার তুলে দেখা হলো: তত্ত্ব: [0.467 0.283 0.172 0.077 …] আর নমুনা: [0.466 0.286 0.17 0.078 …]. সংখ্যা মিলছে, আর ছাঁটা চারটি শব্দ (খারাপ, ছেঁড়া, দেরি, ফেরত) একবারও ওঠেনি। খেয়াল করুন, “খারাপ” শব্দটিও বাদ গেল, অথচ একটি রিভিউতে সেটিই সত্য কথা হতে পারে। লেজ মানেই ভুল নয়।
বাস্তবে এই নিয়মগুলো একসঙ্গে চলে, প্রতি ধাপে একটি ছোট পাইপলাইনের মতো:
Sampling-এর এক ধাপ
One sampling step in Hugging Face transformers
- Logit
zশেষ অবস্থানের - Penalty
rদেখা token - Temperature
z / Tআকার - কাট
k, p, min-pলেজ বাদ - তোলা
multinomialপরের token
T বদলালে কাটের ফল কেমন বদলায়, আর ক্রম উল্টে দিলে কী হয়, সেটি পরের কোডে। ছবি দুটির মূল কথা: T শুধু আকার বদলায়, top-p support কাটে।
import numpy as np, matplotlib.pyplot as plt
z = np.array([3.0, 2.5, 2.0, 1.2, 0.3, -0.2, -0.8, -1.5])
def softmax(z, T=1.0):
e = np.exp(z / T - (z / T).max())
return e / e.sum()
def H(p):
q = p[p > 0]
return float(-(q * np.log2(q)).sum())
def nucleus(p, c):
i = np.argsort(-p)
n = np.searchsorted(np.cumsum(p[i]), c) + 1
q = np.zeros_like(p); q[i[:n]] = p[i[:n]]
return q / q.sum()
def minp(p, m):
q = np.where(p >= m * p.max(), p, 0.0)
return q / q.sum()
print("T top-p 0.9 min-p 0.2")
for T in (0.5, 1.0, 2.0, 4.0):
p = softmax(z, T)
print(f"{T:<4} {(nucleus(p, .9) > 0).sum():>5} {(minp(p, .2) > 0).sum():>10}")
b = nucleus(softmax(z, 2.0), .7) # আগে T, পরে top-p
c = nucleus(softmax(z), .7); s = c[c > 0] # আগে top-p, পরে T
a = s ** .5 / (s ** .5).sum()
print(f"আগে T, পরে top-p: support {(b > 0).sum()} H {H(b):.3f}")
print(f"আগে top-p, পরে T: support {len(a)} H {H(a):.3f}")
Ts = np.logspace(-1.5, 2, 60); cs = np.linspace(.05, 1, 96)
fig, ax = plt.subplots(1, 2, figsize=(7, 2.8))
ax[0].semilogx(Ts, [H(softmax(z, t)) for t in Ts]); ax[0].axhline(3, ls="--", c="gray")
ax[0].set(xlabel="temperature T", ylabel="entropy (bits)", title="T only reshapes")
ax[1].step(cs, [(nucleus(softmax(z), c) > 0).sum() for c in cs], where="post")
ax[1].set(xlabel="top-p threshold c", ylabel="tokens kept", title="top-p cuts the support")
fig.subplots_adjust(wspace=.35, bottom=.2)প্রথম টেবিল: T=0.5-এ top-p ৩টি, min-p ২টি রাখে; T=4.0-এ top-p ৭টি, min-p ৮টি। T বড় হলে দুটিই বড় হয়। এখানে min-p T = ৪-এ সবাইকে রেখে দিল, তাই “min-p সবসময় বেশি কড়া” কথাটি ঠিক নয়; m-এর মানের ওপর নির্ভর করে।
শেষ দুই সারিই আসল কথা: আগে T, পরে top-p: support 4 H 1.928 আর আগে top-p, পরে T: support 2 H 0.989. একই সংখ্যা, শুধু ক্রম বদলালে ফল ভিন্ন। T আগে এলে বণ্টন সমতল হয়, তাই .৭ ভর ছুঁতে বেশি token লাগে। Hugging Face transformers-এ ক্রম আগে T, পরে কাট; অংশ ৯-এ সেটি সত্যিকারের run থেকে ছাপানো আছে। অন্য library-র ক্রম আলাদা হতে পারে, তাই একই মান দিলেও একই ফল ধরে নেবেন না।
বাঁ দিকের ছবিতে T বাড়লে entropy মসৃণভাবে ৩ বিটে গিয়ে থামে। ডান দিকেরটি সিঁড়ি: top-p-এর c বাড়লে token এক এক করে ঢোকে, যতক্ষণ না c = ১-এ আটটিই থাকে।
৬ · Repetition penalty আর n-gram নিষেধ
লুপে আটকে গেলে দুটি জনপ্রিয় ওষুধ আছে। প্রথমটি repetition penalty, যেটি Keskar ও সহলেখকদের CTRL (২০১৯) থেকে এসেছে। আগে দেখা প্রতিটি token-এর logit z এবং penalty r > 1 হলে:
z > 0 হলে z / r; z < 0 হলে z × r
দুই শাখা কেন? ঋণাত্মক logit-কে ভাগ করলে সেটি শূন্যের দিকে যায়, মানে probability উল্টো বাড়ে। হাতে একটি উদাহরণ: z = 2, −1, 0.5, প্রথম দুটি আগে দেখা, r = 1.25. নতুন z = 1.6, −1.25, 0.5. Softmax-এর আগে-পরে p = .786, .039, .175 থেকে .719, .042, .239. না-দেখা token এগোল। কিন্তু খেয়াল করুন, দেখা হলেও ঋণাত্মক token-টির p সামান্য বাড়ল, কারণ সবচেয়ে বড় প্রতিদ্বন্দ্বী বেশি কমেছে। Penalty logit কমায়, প্রতিটি probability কমাবে এমন নিশ্চয়তা দেয় না।
দ্বিতীয় ওষুধ no_repeat_ngram_size: যে token দিলে একই n-gram দ্বিতীয়বার হবে, তাকে সরাসরি নিষিদ্ধ করা। যেমন n = ২-এ “মান ভালো মান” লেখার পরে “ভালো” আর আসতে পারবে না। এটি কড়া; বাক্যে “ঢাকা থেকে ঢাকা” বা একই নাম দুবার ন্যায্যভাবে দরকার হলেও আটকে দিতে পারে। নিচে ছোট একটি হাতে বানানো bigram model, যা নিজে থেকেই “মান ভালো মান ভালো” লুপে পড়ে:
import numpy as np
V = ["মান", "ভালো", "দাম", "কম", "।"]
# ছোট bigram model: সারি = আগের token, ঘর = পরের token-এর logit
Z = np.array([[-2.0, 1.2, 0.9, -1.0, 0.2], # মান → ভালো
[ 1.0, -2.0, 0.8, -1.0, 0.3], # ভালো → মান
[-1.0, 0.2, -2.0, 1.5, 0.4], # দাম → কম
[-1.0, 0.3, 0.6, -2.0, 1.2], # কম → ।
[ 1.0, 0.5, 0.8, -1.0, -3.0]]) #. → মান
def penalize(z, seen, r, wrong=False):
z = z.copy()
for t in seen:
z[t] = z[t] / r if (z[t] > 0 or wrong) else z[t] * r
return z
def greedy(r, n=12):
ids = [0]
for _ in range(n):
ids.append(int(penalize(Z[ids[-1]], set(ids), r).argmax()))
return ids
def uniq2(ids):
g = list(zip(ids, ids[1:]))
return len(set(g)) / len(g)
for r in (1.0, 1.1, 1.3, 2.0):
ids = greedy(r)
print(f"r={r}: uniq2={uniq2(ids):.2f}", " ".join(V[i] for i in ids))
z = np.array([1.0, -2.0, 0.0])
print("ঠিক নিয়ম:", penalize(z, {0, 1}, 1.3).round(3))
print("শুধু ভাগ:", penalize(z, {0, 1}, 1.3, wrong=True).round(3))r=1.0 আর r=1.1-এ লুপ ভাঙেনি: মান ভালো মান ভালো …, uniq2 = 0.17. Penalty ছোট হলে logit-এর ফারাক টপকাতে পারে না। r=1.3-এ একবার ভাঙল: মান ভালো দাম কম । মান ভালো মান ভালো …, uniq2 = 0.50.
কিন্তু দেখুন, লুপ আবার ফিরে এসেছে, আর r=2.0-এও একই ফল। কারণ এই penalty গোনে না; একবার দেখা token আর একশোবার দেখা token একই শাস্তি পায়। সব token একবার দেখা হয়ে গেলে সবাই সমান শাস্তি পায়, তখন penalty আর কাউকে আলাদা করে না। এজন্যই কিছু API-তে সংখ্যার সঙ্গে বাড়ে এমন frequency penalty আলাদা করে আছে।
শেষ দুই সারি ঋণাত্মক logit-এর হিসাব: ঠিক নিয়ম: [ 0.769 -2.6 0. ], শুধু ভাগ: [ 0.769 -1.538 0. ]. ভুল নিয়মে −2 বেড়ে −1.538 হলো, মানে যে token-কে শাস্তি দেওয়ার কথা, সে উল্টো সুবিধা পেল। আর logit ঠিক ০ হলে কোনো নিয়মেই বদলায় না।
ছোট alphabet-এ এই penalty আরও বিপজ্জনক। অক্ষর-স্তরের model-এ “া” বা স্পেস তো বারবার আসবেই। তাই penalty-র মান token-এর আকারের ওপর নির্ভর করে; একই r সব model-এ এক ফল দেয় না। অংশ ৮-এ এটি মাপা হয়েছে।
৭ · GPT-2-তে সত্যিকারের তুলনা — মানুষের লেখার পাশে
এবার আসল model. openai-community/gpt2 (model card অনুযায়ী MIT লাইসেন্স), transformers 5.22.2, torch 2.15.0, Python 3.14.4, GPU-তে। Holtzman ও সহলেখকদের ধারণাটি ছোট আকারে পরীক্ষা করেছি: ছয়টি পুরোনো ইংরেজি উপন্যাস (Project Gutenberg, যেমন Alice in Wonderland, Frankenstein) থেকে seed ৪২ দিয়ে ৩০টি অনুচ্ছেদ। প্রথম ৪০ token হলো prompt; পরের ৮০ token হয় model লিখেছে, নয়তো মূল লেখকের লেখা। Sampling-এ seed ৪২, ৪৩, ৪৪ (তাই ৯০টি লেখা)। প্রতিটি লেখায় তিনটি মাপ:
- Unique n-gram ratio: আলাদা n-gram ÷ মোট n-gram (n-gram মানে পরপর n token). Repetition rate = ১ − এই অনুপাত।
- Unique 1-gram: একই হিসাব, একক token-এ। “the” বা যতিচিহ্ন মানুষের লেখাতেও ফিরে আসে, তাই এটি ১-এর অনেক নিচে থাকাই স্বাভাবিক।
- গড় token probability: লেখা শেষে অপরিবর্তিত model (T = ১, কোনো কাট নেই) প্রতিটি token-কে যে probability দেয়, তার গড়।
~/bazarghar-dl$ uv run python gpt2_run.py # সত্যিকারের run
passage: 30 prompt 40 নতুন token 80
# প্রতি নিয়মের JSON থেকে সংক্ষিপ্ত করে নিচের টেবিল
| নিয়ম | Unique 1-gram | Unique 3-gram | Repetition rate | গড় p | লেখার সংখ্যা |
|---|---|---|---|---|---|
| Greedy | .257 | .376 | .624 | .606 | 30 |
| Beam 5 | .285 | .381 | .619 | .685 | 30 |
| Beam 5, no-repeat 3 | .525 | 1.000 | 0 | .360 | 30 |
| Greedy, rep 1.2 | .993 | 1.000 | 0 | .139 | 30 |
| T = 0.7 | .608 | .937 | .063 | .258 | 90 |
| Min-p 0.05 | .620 | .956 | .044 | .233 | 90 |
| Top-k 40 | .674 | .980 | .020 | .195 | 90 |
| Top-p 0.9 | .734 | .992 | .008 | .186 | 90 |
| T = 1.0 | .769 | .992 | .008 | .165 | 90 |
| Top-p 0.9, rep 1.2 | .997 | 1.000 | 0 | .096 | 90 |
| মানুষ | .751 | .992 | .008 | .168 | 30 |
এই একটি ছোট পরীক্ষায় চারটি জিনিস চোখে পড়ে:
- Beam আর greedy মানুষের থেকে অনেক দূরে: Model নিজে যে লেখাকে .৬৮৫ গড় probability দেয়, মানুষের লেখাকে দেয় মাত্র .১৬৮. প্রায় দুই-তৃতীয়াংশ 3-gram পুনরাবৃত্তি। মানুষ সবচেয়ে সম্ভাব্য পথে লেখে না।
- T = ১ আর top-p ০.৯ মাপে মানুষের কাছে: তিনটি সংখ্যাতেই কাছাকাছি। তবে এর মানে লেখাটি ভালো, এমন নয়; এই মাপগুলো অর্থ মাপে না।
- No-repeat 3 শুধু মাপ সারায়: 3-gram পুনরাবৃত্তি শূন্য, কারণ নিয়মে নিষিদ্ধ। গড় p তবু .৩৬০, মানুষের দ্বিগুণের বেশি।
- Rep ১.২ মাত্রা ছাড়ায়: Unique 1-gram .৯৯৩; “the” বা যতিচিহ্নও প্রায় ফেরে না। মানুষের .৭৫১-এর চেয়ে অনেক ওপরে, আর গড় p মানুষের নিচে নেমে গেছে। শূন্য পুনরাবৃত্তি লক্ষ্য নয়।
একটি prompt-এ আসল লেখা, seed ৪২, সম্পাদনা ছাড়া:
PROMPT: It was so long since she had been anything near the right size, that it felt quite strange at first; but she got used to it in a few minutes, and began talking to herself, as
greedy: if she were going to be able to talk to herself. "I'm not sure what I'm doing," she said, "but I'm not sure what I'm doing. I'm not sure what I'm doing. I'm not sure what I'm doing. I'm not sure what I'm doing. I'm not sure what I'm doing. I'm not sure what I
beam 5: if it were the only thing she could do. "I don't know what you're talking about," she said. "I don't know what you're talking about," I said. "I don't know what you're talking about," she said. "I don't know what you're talking about," I said. "I don't
beam 5, no-repeat 3: if it were the only thing she could do. "I'm so glad you're here," she said. "It's been a while since I've been here, but I'm glad I'm here." He looked at her, and said, with a smile, "I'm glad you like it here, too. It's so nice to be here, and it's
top-p 0.9: if to find out how much was in her back pocket. The bushy whiskers poking out of each other are emitting what looked to them like six of the six bristles and a slight hum as if they had been eaten by an angry goat, and perhaps some other creatures. Although it might take them all of three minutes to eat them, her expression had now changed as much as it
মানুষ (Lewis Carroll): usual. “Come, there’s half my plan done now! How puzzling all these changes are! I’m never sure what I’m going to be, from one minute to another! However, I’ve got back to my right size: the next thing is, to get into that beautiful garden—how _is_ that to be done, I wonder
লাইন-ভাঙা এখানে স্পেসে দেখানো হয়েছে। T = ১ আর rep ১.২-এর লেখা দেখানো হয়নি; T = ১-এর লেখায় কিছু অমার্জিত শব্দ ছিল। Top-p-এর লেখা পুনরাবৃত্ত নয়, কিন্তু সংলগ্নও নয়: ২০১৯ সালের একটি ছোট model বলে অর্থের জোর এমনই। Decoding দিয়ে model-এর সীমা পার করা যায় না।
আরও গভীরে: আমাদের ফল Holtzman ও সহলেখকদের ফলের সঙ্গে মোটের ওপর একই দিকে যায়, কিন্তু আমাদের নমুনা ছোট, লেখা ১৯শ শতকের, আর GPT-2-কে training দেওয়া হয়েছিল ভিন্ন ধরনের লেখায়। তাই সংখ্যাগুলো সাধারণ ফল নয়। দুটি পদ্ধতির পার্থক্য দাবি করতে চাইলে একই prompt ধরে জোড়ায় জোড়ায় তুলনা করুন (মেশিন লার্নিং কোর্সের পর্ব ২২). আর শুধু একটি প্রশ্ন মনে রাখুন: মাপটি কি আপনি যা চান তা-ই মাপছে? NLP মূল্যায়নের বাকি কথা পর্ব ৪৫-এ।
Beam width বাড়ালে খরচ আর ফল
পাঁচটি ছোট prompt, প্রতিটিতে ঠিক ৪০টি নতুন token (min_new_tokens আর max_new_tokens সমান, তাই থামার প্রভাব নেই)। সময় মধ্যমা, log P আর unique 3-gram গড়:
~/bazarghar-dl$ uv run python gpt2_speed.py # সত্যিকারের run, CPU-তে ৪ thread
cuda width 1 2372 ms 16.9 token/s log P -50.48 uniq3 0.65 peak 497 MiB
cuda width 2 3321 ms 12.0 token/s log P -49.87 uniq3 0.68 peak 497 MiB
cuda width 4 3160 ms 12.7 token/s log P -42.60 uniq3 0.62 peak 500 MiB
cuda width 8 2936 ms 13.6 token/s log P -37.04 uniq3 0.67 peak 532 MiB
cuda width 16 3390 ms 11.8 token/s log P -33.54 uniq3 0.56 peak 550 MiB
cuda width 32 5170 ms 7.7 token/s log P -24.86 uniq3 0.37 peak 620 MiB
cpu width 1 866 ms 46.2 token/s log P -50.48 uniq3 0.65
cpu width 2 1306 ms 30.6 token/s log P -49.87 uniq3 0.68
cpu width 4 1403 ms 28.5 token/s log P -42.60 uniq3 0.62
cpu width 8 1759 ms 22.7 token/s log P -37.03 uniq3 0.67
cpu width 16 2236 ms 17.9 token/s log P -33.54 uniq3 0.56
তিনটি শিক্ষা। এক: W বাড়লে log P সত্যিই ভালো হলো, −৫০.৪৮ থেকে −২৪.৮৬; খোঁজা তার লক্ষ্য পূরণ করছে। দুই: ঠিক তখনই লেখা বেশি পুনরাবৃত্ত, W = ৩২-এ unique 3-gram নামল .৩৭-এ। বেশি probability মানেই ভালো লেখা নয়। তিন: সময় W গুণ বাড়েনি, W = ১৬-এ CPU-তে আড়াই গুণের মতো, কারণ W-টি sequence এক batch-এ যায়, আর এত ছোট model-এ batch ভালোই কাজে লাগে। এই একই কারণে এখানে GPU-কে CPU-র চেয়ে ধীর দেখাচ্ছে: GPU তখন অন্য কাজের সঙ্গে ভাগ করা ছিল, আর একটি ছোট prompt-এ GPU-র সুবিধা কম। সময়গুলো এক দফা স্থানীয় মাপ, গতির সাধারণ তুলনা নয়। Peak-এ model-এর নিজের weight-ও আছে, তাই সংখ্যা প্রথম থেকেই বড় (পর্ব ১২).
৮ · ছোট বাংলা model-এ একই পরীক্ষা
এবার পর্ব ৩৬-এর MiniGPT একই নকশায় আবার train করা হলো: অক্ষর-স্তরের model, ১৮ লাখের কিছু বেশি parameter, vocabulary ৮৩, GPU-তে ৩,০০০ step. ডেটা উপেন্দ্রকিশোর রায়চৌধুরীর গল্প (bn.wikisource, ভারতে public domain) আর course-এর seeded বাজারঘর রিভিউ। Decoding এখানে হাতে লেখা, অংশ ৪–৬-এর নিয়মগুলোই। পরীক্ষা: training-এর বাইরের test গল্প থেকে ২০টি prompt, প্রতিটি ৬০ অক্ষর; এরপর ২০০ অক্ষর। Sampling-এ seed ৪২, ৪৩, ৪৪ (তাই ৬০টি লেখা), আর “মানুষ” মানে ওই গল্পের আসল পরের ২০০ অক্ষর। অক্ষর-স্তরে n-gram ছোট বলে এখানে ৬ অক্ষরের n-gram মাপা হয়েছে। এই টেবিল সংক্ষিপ্ত করা হয়েছে; মানগুলো run-এর JSON থেকে তিন দশমিকে নেওয়া:
~/bazarghar-dl$ uv run python bn_run.py # সত্যিকারের run, GPU-তে, torch 2.15.0
step 2500 parameters 1817280 vocab 83 # val-এ সেরা checkpoint
| নিয়ম | Unique 6-gram | Unique শব্দ | Train-এ থাকা শব্দ | সবচেয়ে লম্বা নকল (অক্ষর) | গড় p |
|---|---|---|---|---|---|
| Beam 5 | .552 | .526 | .985 | 34.2 | .788 |
| Greedy | .771 | .673 | .983 | 22.8 | .649 |
| Greedy, rep 1.2 | .822 | .725 | .978 | 28.6 | .671 |
| Top-p 0.5 | .898 | .781 | .974 | 23.0 | .649 |
| T = 0.5 | .933 | .849 | .964 | 22.2 | .643 |
| T = 0.7 | .956 | .888 | .941 | 20.0 | .615 |
| Top-p 0.9 | .965 | .900 | .939 | 20.4 | .603 |
| Min-p 0.05 | .968 | .909 | .934 | 19.4 | .599 |
| Top-k 10 | .972 | .915 | .903 | 19.8 | .572 |
| Top-p 0.9, rep 1.2 | .975 | .934 | .890 | 22.2 | .587 |
| T = 1.0 | .981 | .927 | .870 | 18.3 | .575 |
| T = 1.5 | .987 | .967 | .598 | 18.9 | .482 |
| মানুষ | .951 | .888 | .895 | 18.2 | .508 |
“Train-এ থাকা শব্দ” হলো সেই ভাগ, যা training text-এর কোনো শব্দের সঙ্গে হুবহু মেলে। “সবচেয়ে লম্বা নকল” হলো training text-এ হুবহু পাওয়া সবচেয়ে লম্বা টুকরো। মানুষের লেখাতেও এই ভাগ .৮৯৫, কারণ test গল্পে নতুন শব্দ আছে। তাই এটি সঠিকতার মাপ নয়, শুধু একটি ইঙ্গিত।
টেবিল থেকে যা পড়া যায়, এক model-এর এক দফা পরীক্ষায়:
- একটি লিভার, দুই দিক: T বা top-p কমালে শব্দ বেশি ঠিক হয়, কিন্তু পুনরাবৃত্তিও বাড়ে। T = ১.৫-এ মাত্র ৬০% শব্দ মেলে, এটি বানানো শব্দে ভরা।
- Beam সবচেয়ে একঘেয়ে: গড় p .৭৮৮ মানুষের .৫০৮-এর চেয়ে অনেক ওপরে, আর training text থেকে নকলও সবচেয়ে লম্বা।
- Unique হারে কাছাকাছি: T = ০.৭ আর top-p ০.৯ মানুষের কাছে, তবে এই মিল ভালো গল্পের প্রমাণ নয়। নিচের নমুনা পড়ুন।
- অক্ষর-স্তরে penalty: Top-p ০.৯-এ rep ১.২ যোগ করলে পুনরাবৃত্তি সামান্য কমল, কিন্তু train-এ থাকা শব্দ .৯৩৯ থেকে .৮৯০-এ নামল। Greedy-তে নকলের দৈর্ঘ্য বাড়ল। অক্ষর তো ফিরে আসবেই, তাই penalty বেশিরভাগ অক্ষরকে সমানভাবে শাস্তি দেয়।
একই ছোট prompt-এ সত্যিকারের লেখা, seed ৪২, ১২০ অক্ষর, কোনো সম্পাদনা ছাড়া:
prompt: একদিন এক শিয়াল
greedy : বললে, ‘আমার মতো কোনো করে দেখছি না।’ তখন সে বাঘ বললে, ‘আমি যে তো কি করতে পারব না।’ তখন সে বাঘ বললে, ‘আমাকে নেবে? আমার কাছ
beam 5 : বললে, ‘আচ্ছা, তাই হবে।’ শিয়াল বললে, ‘আচ্ছা, তাই হবে।’ শিয়াল বললে, ‘আচ্ছা, তাই হবে।’ বাঘ বললে, ‘আচ্ছা, তাই হবে।’ তারপর
T = 1.0 : নেমে যেতেও দেখতেই তো সেখানে নদীর জল খেতে হয়ে বাসা থেকে আবার দেখে চলতে আলতে পারে?’ সাবার চারটাকে ডাকাতি এমনি এক দজনা লুক
top-p 0.9 : নেমে যেতে পেলেই, তার সঙ্গে তাদের জল খেতে হয়ে বাসা থেকে বলল, ‘মামা, আমাকে বিয়ে দিয়ে দিয়েছিল।’ তখন সকলে পাথর মোটা গেল,
এখানে লাইন-ভাঙা স্পেস হিসেবে দেখানো হয়েছে, অক্ষর বদলানো হয়নি। Beam-এর লুপটি পড়ুন: ব্যাকরণ ঠিক, বানান ঠিক, কথা নেই। Sampling-এর লেখায় বৈচিত্র্য আছে, কিন্তু অর্থ নেই; সেটি model ছোট বলে, decoding দিয়ে সারবে না। আর ছাঁচে-বাঁধা রিভিউতে সব নিয়মই প্রায় একই ফল দেয়, কারণ সেখানে বণ্টন আগে থেকেই তীক্ষ্ণ: T = ০.৭-এ পাওয়া গেল “নকশিকাঁথা, ঢাকা থেকে সিলেট, ৬ দিনে পৌঁছেছে। রেটিং ৫। দামের তুলনায় ভালো, আবার কিনব।”
৯ · Seed, পুনরুৎপাদন আর API-র parameter
Sampling random, তাই seed ঠিক করলে আবার একই লেখা পাওয়ার কথা। কিন্তু কতটা? GPT-2-তে একই prompt-এ top-p ০.৯ দিয়ে সত্যিকারের পরীক্ষা, ১২ token:
~/bazarghar-dl$ uv run python gpt2_speed.py # সত্যিকারের run; এখানে শুধু seed-এর অংশ
GPU seed 42 ক ' for the stationery of 150,000 rupees and offers'
GPU seed 42 খ ' for the stationery of 150,000 rupees and offers'
GPU seed 43 " cheap cigarettes, cigars and lighters. It's one of"
CPU seed 42 ক ' solid Bakro meals, boiled in hot water, fresh,'
CPU seed 42 খ ' solid Bakro meals, boiled in hot water, fresh,'
GPU seed 42 B=2 ' for the stationery of 150,000 rupees and offers'
greedy CPU == GPU: True ' a range of products including a range of handbags, jew'
একই ডিভাইসে একই seed একই লেখা দিল। কিন্তু একই seed CPU আর GPU-তে সম্পূর্ণ ভিন্ন লেখা দিল, কারণ দুই ডিভাইসের random number generator আলাদা। PyTorch-এর randomness নোটও (v2.15) বলে, release, platform বা CPU ও GPU-র মধ্যে পুরোপুরি একই ফলের নিশ্চয়তা নেই। Greedy-তে random নেই, তাই এই run-এ দুই ডিভাইসে একই ফল এসেছে। Batch-এ অন্য prompt যোগ করেও এখানে প্রথম সারি বদলায়নি, তবে সেটি একটি পর্যবেক্ষণ, নিশ্চয়তা নয়।
আরেকটি নীরব ফাঁদ, একই run থেকে:
generation_config.top_k = None top_p = None temperature = None
top_k না দেওয়া == top_k=50: True == top_k=0: False
Config-এ None দেখাচ্ছে, অথচ do_sample=True লিখলে নীরবে top-k ৫০ চলে; v5.22.2-এর নথিও এই ডিফল্ট বলে। তাই “খাঁটি sampling” পেতে top_k=0 লিখতে হয়েছে। আর হুবহু ক্রমও এখান থেকে দেখা যায় (private একটি method দিয়ে ছাপানো, শুধু দেখার জন্য):
RepetitionPenaltyLogitsProcessor
NoRepeatNGramLogitsProcessor
TemperatureLogitsWarper
TopKLogitsWarper
TopPLogitsWarper
MinPLogitsWarper
Hosted API-তে নাম আর সীমা
আমাদের কাছে API key নেই, তাই এখানে কোনো hosted model চালানো হয়নি। নিচের টেবিল শুধু প্রতিটি সেবার নিজের নথি থেকে নেওয়া, ২০২৬ সালের নভেম্বরে নথিতে যেমন দেখা গেছে। এগুলো বদলায়, model-ভেদে আলাদা হয়, আর এটি কোনো তুলনা বা ক্রম নয়; ব্যবহারের আগে নিজের model-এর বর্তমান নথি দেখুন।
| সেবা ও নথি | Sampling parameter | নথিতে লেখা শর্ত |
|---|---|---|
| OpenAI Chat Completions | temperature (0–2), top_p, frequency_penalty, presence_penalty, seed, stop | temperature বা top_p একটি বদলানোর পরামর্শ; seed-এ determinism-এর নিশ্চয়তা নেই; model-ভেদে সমর্থন আলাদা। top_k ওই পাতায় নেই। |
| Gemini generateContent | temperature (0–2), topP, topK, seed, stopSequences | Temperature, topP আর topK “Gemini 3.6 Flash” ও নতুন model-এ নীরবে উপেক্ষিত। |
| Claude Messages | temperature, top_p, top_k (আগের model-এ); stop_sequences | এই তিনটি Claude 4.7 ও পরের model-এ সমর্থিত নয়; ডিফল্ট ছাড়া মান দিলে 400 error, আর API version 2026-10-21 থেকে যেকোনো মানেই। |
| DeepSeek | temperature (0–2), top_p, stop | Thinking mode-এ temperature-এর প্রভাব নেই; model ও mode-ভেদে top_p স্থির হতে পারে; penalty দুটি deprecated. top_k নেই। |
| Grok (xAI Responses) | temperature (0–2), top_p | ১-এর বেশি temperature ১ হিসেবে চলে, ফেরত আসে পাঠানো মান; penalty দুটি Responses API-তে সমর্থিত নয়। |
| Kimi | stop, max_completion_tokens | যে পাতা পড়েছি সেখানে temperature বা top_p-এর বিবরণ পাইনি, তাই এ নিয়ে কিছু দাবি করছি না। |
লক্ষ করুন, নতুন অনেক model-এ এই নিয়ন্ত্রণ কমেছে বা নেই। নথিগুলো কারণ স্পষ্ট করে না, তাই অনুমান করে লিখছি না। বাস্তব সিদ্ধান্ত একটাই: পুরোনো টিউটোরিয়ালের parameter চোখ বুজে পাঠাবেন না। একটি অনুরোধের আকার এমন হতে পারে; এটি চালানো হয়নি, শুধু আকার বোঝানোর জন্য নমুনা:
// নমুনা অনুরোধ (চালানো হয়নি)। Key কোডে লিখবেন না।
{"model": "<model-name>",
"messages": [{"role": "user", "content": "শাড়ির ছোট বিবরণ লিখুন"}],
"temperature": 0.7, "stop": ["\n\n"], "seed": 42}
কোন কাজে কোথা থেকে শুরু করবেন
নিচের টেবিল কোনো নিয়ম নয়, নিজের model-এ মাপার শুরুর জায়গা মাত্র; লাইব্রেরি নিজে চালালে তবেই এর সবগুলো হাতে থাকে:
| কাজ | শুরু | যা মাপবেন |
|---|---|---|
| লেবেল বা তথ্য বের করা | Greedy, ছোট max_new_tokens | F1, schema মানা |
| অনুবাদ, ছোট summary | Greedy বনাম ছোট beam, length_penalty দেখে | chrF, BLEU বা মানুষের বিচার (পর্ব ৪৫) |
| পণ্যের বিবরণ, গল্প | T আর top-p-এর ছোট grid, বহু seed | Repetition rate, মানুষের বিচার, তথ্যের যাচাই |
| কোড বা যে উত্তর একবার যাচাই হয় | কম T বা greedy; একাধিক নমুনা নিয়ে test দিয়ে ছাঁকা | Test পাস করার হার |
১০ · AI-এর যুগে decoding — যা যাচাই করবেন
AI সহকারীরা decoding-এর কোড খুব দ্রুত লেখে, আর ভুলগুলোও দেখতে খুব বিশ্বাসযোগ্য। এই বিষয়ে যে ভুল বেশি দেখা যায়:
| AI-এর ভুল | কী ঘটে | যাচাই |
|---|---|---|
do_sample=False-এর সঙ্গে temperature | Temperature কাজই করে না | দুই মানে চালিয়ে দেখা; library-র warning পড়া |
do_sample=True দিয়ে ধরে নেওয়া “খাঁটি sampling” | নীরবে top-k 50 চলে (অংশ ৯) | top_k নিজে লেখা, config ছাপানো |
| ঋণাত্মক logit-কেও r দিয়ে ভাগ | Penalty উল্টো কাজ করে | ছোট সংখ্যায় হাতে মেলানো |
| Top-p-তে সীমা-ছোঁয়া token বাদ | যোগফল c-এর নিচে নামে; এমনকি সব token বাদ পড়তে পারে | একটি প্রভাবশালী token দিয়ে পরীক্ষা |
| Hosted API-তে পুরোনো parameter | Error, অথবা নীরবে উপেক্ষা | সেই model-এর বর্তমান নথি পড়া |
| এক seed-এর এক লেখা দেখে সিদ্ধান্ত | ভাগ্যবান একটি নমুনা | বহু prompt, বহু seed; মানুষের লেখা ও baseline-এর সঙ্গে তুলনা |
| “T কম হলে উত্তর সত্য” | কম T মানে শুধু বেশি সম্ভাব্য; সত্য নয় | উৎসের সঙ্গে মেলানো; পর্ব ৫২ · LLM-এর ভেতরে দেখুন |
কোড চাওয়ার সময় version আর যাচাই একসঙ্গে চান। Model বা গ্রাহকের ব্যক্তিগত ডেটা আর API key কখনো prompt-এ দেবেন না:
পরীক্ষা ও ইন্টারভিউতে: Greedy আর beam-এর পার্থক্য? এক পথ বনাম W-টি পথ; কোনোটিই সেরার নিশ্চয়তা দেয় না। Top-k আর top-p? সংখ্যায় স্থির বনাম probability-র ভরে স্থির। T → 0? Greedy; T → ∞ হলে সমান বণ্টন। Beam-এ length penalty কেন? ঋণাত্মক স্কোর জমে ছোট sequence-কে সুবিধা দেয়। Repetition penalty-তে ঋণাত্মক logit? ভাগ নয়, গুণ।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১Model সবচেয়ে সম্ভাব্য বলছে, তবু সেই লেখা একঘেয়ে হয় কেন? এটি কি model-এর দোষ?
পুরোটা model-এর দোষ নয়। এর ভেতরে সম্ভাব্যতার একটি পুরোনো সত্য আছে। একটি পক্ষপাতী মুদ্রা নিন, যেখানে হেড আসে ০.৭. ১০০ বার ছুড়লে একক কোনো sequence-এর মধ্যে সবচেয়ে সম্ভাব্য হলো ১০০টিই হেড, যার probability ০.৭১০০. কিন্তু বাস্তবে এমন sequence প্রায় কখনো দেখবেন না। আপনি দেখবেন প্রায় ৭০টি হেড আর ৩০টি টেলের কোনো মিশ্রণ। এমন প্রতিটি sequence একা কম সম্ভাব্য, কিন্তু সংখ্যায় বিপুল। তথ্যতত্ত্বে একে typical set বলে।
ভাষাও অনেকটা এমন। মানুষের লেখা প্রতিটি ধাপে সবচেয়ে সম্ভাব্য শব্দ নেয় না; মাঝে মাঝে অপ্রত্যাশিত শব্দ আসে, আর সেখানেই নতুন তথ্য থাকে। সবচেয়ে সম্ভাব্য পথ ধরলে model সেই “গড়” জায়গায় থাকে, যেখানে নিরাপদ বাক্যাংশই সবচেয়ে বেশি। একবার একটি বাক্যাংশ লেখা হলে সেটি নিজের context হয়ে তার পুনরাবৃত্তির probability আরও বাড়ায়। এভাবে লুপ তৈরি হয়। Holtzman ও সহলেখকরা The Curious Case of Neural Text Degeneration (ICLR ২০২০) গবেষণাপত্রে এই ঘটনার নাম দেন text degeneration. তাঁরা মানুষের লেখা আর beam-এর লেখার বণ্টনের পার্থক্য দেখান, আর সমাধান হিসেবে nucleus sampling প্রস্তাব করেন।
তবে শুধু decoding দোষী, এটাও পুরো ছবি নয়। Welleck ও সহলেখকদের unlikelihood training (২০১৯) training-এর সময়েই পুনরাবৃত্তিকে শাস্তি দেওয়ার চেষ্টা করে, অর্থাৎ সমস্যার একটি অংশ objective-এও আছে। আর এই পরীক্ষাগুলো মূলত GPT-2 যুগের model-এ করা। বড় ও chat-এর জন্য tuned model-এ ফল ভিন্ন হতে পারে, তাই পুরোনো সিদ্ধান্ত চোখ বুজে নতুন model-এ টেনে আনা ঠিক নয়।
মূল উপলব্ধি: “সবচেয়ে সম্ভাব্য একটি sequence” আর “এই ভাষার সাধারণ একটি নমুনা” এক জিনিস নয়। কোনটি চাই, সেটি কাজ ঠিক করে দেয়।
প্র ০২তাহলে অনুবাদে beam search বহু বছর এত প্রচলিত ছিল কেন? সেখানে কি একই সমস্যা হয় না?
কারণ দুই কাজের আকার আলাদা। অনুবাদে উৎস বাক্যটি উত্তরকে শক্ত করে বেঁধে রাখে। একটি বাক্যের গ্রহণযোগ্য অনুবাদ অল্প কয়েকটি, তাই বণ্টন তীক্ষ্ণ, আর সবচেয়ে সম্ভাব্য অনুবাদ সাধারণত গ্রহণযোগ্যও। উত্তরও ছোট, আর উৎস শেষ হলে অনুবাদও শেষ হয়। তাই লুপে পড়ার সুযোগ কম। Google-এর neural অনুবাদ ব্যবস্থার ২০১৬ সালের প্রতিবেদনে (Wu ও সহলেখক) beam search-এর সঙ্গে length normalization ব্যবহারের বর্ণনা আছে, যার একটি রূপ ছিল ((৫ + L) / ৬)α দিয়ে ভাগ করা।
গল্প লেখা বা খোলা প্রশ্নের উত্তর ঠিক উল্টো। এক prompt-এর অসংখ্য ভালো উত্তর আছে, বণ্টন সমতল, আর কোথায় থামবে কেউ জানে না। সেখানে খোঁজা মানে সবচেয়ে “নিরাপদ”, প্রায়ই সবচেয়ে সাধারণ পথ খোঁজা। অংশ ৭-এ মেপেও দেখেছেন, GPT-2-এ beam-এর লেখার গড় probability মানুষের লেখার চেয়ে অনেক বেশি আর পুনরাবৃত্তিও বেশি।
এই বিভাজনটি অবশ্য কঠোর সীমা নয়। Keyword বের করা, বাক্যের সংশোধন বা ছোট summary-র মতো সীমাবদ্ধ কাজে beam এখনো যুক্তিসঙ্গত হতে পারে। আর অনেক প্রকৃত ব্যবস্থায় beam-এর খরচই বড় বাধা, কারণ W গুণ কাজ ও W গুণ cache লাগে; hosted chat API-তে সাধারণত এটি parameter হিসেবেই দেখা যায় না। সিদ্ধান্ত নেবেন নিজের কাজে মেপে: BLEU বা chrF (পর্ব ৪৫) বা মানুষের বিচার দিয়ে।
মূল উপলব্ধি: Output-এর জায়গা যত সংকীর্ণ, খোঁজা তত কাজের; যত খোলা, তোলা তত স্বাভাবিক। কোনো পদ্ধতিই সব কাজে একা জেতে না।
প্র ০৩Top-k থাকতে top-p এলো কেন, আর min-p কি তাহলে top-p-কে ছাড়িয়ে গেছে?
Top-k-র জনপ্রিয়তা বাড়ে Fan ও সহলেখকদের গল্প লেখার কাজ (২০১৮) আর GPT-2-এর প্রকাশিত নমুনা থেকে। এর দুর্বলতা স্থির সংখ্যায়। “বাংলাদেশের রাজধানী” এর পরে একটি token-ই প্রায় নিশ্চিত, তবু k = ৪০ হলে আরও ৩৯টি বাজে token থেকে যায়। আবার খোলা বাক্যের শুরুতে শত শত ভালো বিকল্প থাকে, তখন ৪০ খুব কম। Top-p এই সংখ্যাকে পরিস্থিতির সঙ্গে বদলায়: নিশ্চিত হলে দল ছোট, অনিশ্চিত হলে বড়। এটাই Holtzman-দের যুক্তি।
Top-p-এরও সমস্যা আছে। Model যখন খুব অনিশ্চিত, বা T বড়, তখন c = ০.৯ পূরণ করতে লেজের অনেক দূর পর্যন্ত যেতে হয়, ফলে বাজে token ঢুকে পড়ে। উল্টোটিও সত্য, একটি প্রবল token .৯১ পেলে বাকি সব ভালো বিকল্প কাটা যায়। অংশ ৫-এর কোডে দেখেছেন T = ৪-এ top-p ০.৯ রাখে ৭টি। Min-p সীমা ঠিক করে সবচেয়ে বড় probability-র ভগ্নাংশ হিসেবে, যাতে সীমা model-এর আত্মবিশ্বাসের সঙ্গে বদলায়।
Min-p কি তাহলে জয়ী? Nguyen ও সহলেখকদের গবেষণাপত্র (ICLR ২০২৫) কিছু benchmark আর মানুষের মূল্যায়নে উন্নতির কথা বলে। কিন্তু একটি পদ্ধতির লেখকদের নিজের পরীক্ষা চূড়ান্ত প্রমাণ নয়, আর ফল model, কাজ ও মাপকাঠির ওপর নির্ভর করে। অংশ ৭ আর ৮-এর ছোট পরীক্ষাও সীমিত। আরেকটি বিষয়: এই নিয়মগুলো একসঙ্গেও চলে, আর ক্রম ফল বদলায় (অংশ ৫). তাই একটি “সেরা মান” মুখস্থ করার চেয়ে নিজের কাজে একটি ছোট grid মাপা বেশি কাজের।
মূল উপলব্ধি: তিনটিই একই লেজ-কাটার ভিন্ন নিয়ম। পার্থক্য হলো সীমাটি কীসের ওপর নির্ভর করে: সংখ্যা, ভর, না সর্বোচ্চ probability.
প্র ০৪Temperature কমিয়ে দিলে কি LLM-এর ভুল তথ্য কমে? বাজারঘর-এর সহায়ক বটে কী করবেন?
আংশিক, আর সেটিও সব ক্ষেত্রে নয়। কম T মানে model-এর চোখে সবচেয়ে সম্ভাব্য পথের কাছে থাকা। যদি model সঠিক উত্তরে বেশি probability দেয়, কম T ভুল token তোলার সম্ভাবনা কমায়। কিন্তু যদি সবচেয়ে সম্ভাব্য উত্তরটিই ভুল হয়, কম T সেই ভুলকে আরও পাকাপাকি করে, আর প্রতিবার একই ভুল আত্মবিশ্বাসের সঙ্গে দেয়। Language model-এর training objective সত্য মাপে না, মাপে পরের token-এর সম্ভাবনা। তাই temperature সত্যের নিয়ন্ত্রক নয়। Hallucination-এর আসল কারণ নিয়ে আলোচনা পর্ব ৫২ (LLM-এর ভেতরে — tokenizer থেকে logits, context window আর hallucination)-এ।
ধরুন একজন গ্রাহক বাজারঘর-এর বটকে জিজ্ঞেস করলেন, “আমার অর্ডার ৪৫৬৭৮৯ কোথায়?” এখানে সঠিক নকশা কোনো T বেছে নেওয়া নয়, বরং উত্তরটি model-কে আন্দাজ করতে না দেওয়া। অর্ডারের অবস্থা আসবে ডেটাবেস থেকে, আর model শুধু সেই তথ্য ভদ্র ভাষায় সাজাবে। অঙ্ক, দাম, তারিখ, অর্ডার নম্বর কোড দিয়ে বসানো ও যাচাই করা হবে। এসবের পরে একটি কম T বা ছোট top-p যুক্তিসঙ্গত, কারণ একই প্রশ্নে সামঞ্জস্য চাই। পণ্যের বিজ্ঞাপনের লেখায় বরং একটু বেশি বৈচিত্র্য চাইতে পারেন, মানুষ বেছে নেবেন বলে।
আর নতুন hosted model-এ এই সিদ্ধান্ত আপনার হাতে নাও থাকতে পারে। নথি অনুযায়ী কিছু model এই parameter নেয় না বা উপেক্ষা করে (অংশ ৯). তখন আচরণ নিয়ন্ত্রণের পথ prompt, structured output আর পরের যাচাই।
মূল উপলব্ধি: Temperature বৈচিত্র্য নিয়ন্ত্রণ করে, সত্য নয়। যা তথ্য, তা তথ্যের উৎস থেকে আনুন।
প্র ০৫একই seed আর T = 0 দিলে কি LLM সবসময় একই উত্তর দেবে? পরীক্ষা পুনরুৎপাদনের জন্য কী করবেন?
নিজের কম্পিউটারে, একই কোড আর একই পরিবেশে, সাধারণত হ্যাঁ; কিন্তু “সবসময়” বলা যায় না। Random number generator ডিভাইসভেদে আলাদা, তাই একই seed CPU আর GPU-তে ভিন্ন ধারা দিতে পারে; অংশ ৯-এর সত্যিকারের run-এ এটি দেখেছেন। Batch-এ আরেকটি prompt যোগ করলে padding বা random সংখ্যার বণ্টন বদলাতে পারে, যদিও আমাদের একটি পরীক্ষায় প্রথম সারির লেখা বদলায়নি। Library-র version বদলালে ডিফল্ট বা processor-এর ক্রম বদলাতে পারে। PyTorch-এর randomness নোটও সরাসরি বলে, release, platform বা CPU ও GPU-র মধ্যে পুরোপুরি একই ফলের নিশ্চয়তা নেই।
Hosted API-তে সমস্যা আরও বড়। OpenAI-এর নথি seed-কে Beta বলে আর সরাসরি লেখে, determinism-এর নিশ্চয়তা নেই। Backend বদলেছে কি না দেখতে system_fingerprint মেলাতে বলে। Anthropic-এর নথিতে Opus 5.5-এর migration guide-এ বলা আছে, আগের model-এও temperature = 0 হুবহু একই উত্তরের নিশ্চয়তা দিত না। আর একই নামের model-এর ভেতরের সংস্করণও সময়ের সঙ্গে বদলাতে পারে।
তাই পরীক্ষায় একটি seed-এর ওপর ভরসা না করে দুই স্তরে কাজ করুন। প্রথম স্তরে যতটা সম্ভব ঠিক রাখুন: seed, model-এর revision, library-র version, সব generation parameter, prompt-এর হুবহু লেখা, আর সম্ভব হলে কাঁচা output সংরক্ষণ। দ্বিতীয় স্তরে ফলাফলকে একটি বণ্টন ধরুন: বহু prompt, বহু seed, গড়ের সঙ্গে ছড়ানো। দুটি পদ্ধতির তুলনায় একই prompt জোড়া ধরে paired পরীক্ষা করুন (মেশিন লার্নিং কোর্সের পর্ব ২২).
মূল উপলব্ধি: Seed একটি run-কে আবার চালানোর হাতিয়ার, ফলাফলের সত্যতার প্রমাণ নয়।
অনুশীলন
খাতা-কলমে করুন, তারপর উত্তর মিলিয়ে নিন।
-
হাতে হিসাব: তিনটি token-এর logit 1, 0, −1. (ক) T = 0.5-এ probability বের করুন। (খ) সেই বণ্টনে top-p, c = 0.9 প্রয়োগ করে নতুন probability লিখুন।
(ক) z / T = 2, 0, −2. e-ঘাত 7.389, 1, 0.135; যোগ 8.524. p = .867, .117, .016.
(খ) যোগফল .867, তারপর .984. দ্বিতীয় token-এ .9 পার হলো, তাই দুটি থাকে। .984 দিয়ে ভাগ করলে .881, .119, 0.
-
Beam এক ধাপ: W = 2. Beam-এ আছে A (−0.5), B (−0.9). A-র পরে x: ln .6, y: ln .4. B-র পরে x: ln .9, y: ln .1. পরের ধাপে কোন দুটি থাকবে? Greedy কোন পথ নিত?
স্কোর: A x = −0.5 − 0.511 = −1.011; A y = −0.5 − 0.916 = −1.416; B x = −0.9 − 0.105 = −1.005; B y = −0.9 − 2.303 = −3.203. থাকবে B x (−1.005) আর A x (−1.011). Greedy প্রথম ধাপে A নিয়ে তারপর x নিত, তার স্কোর −1.011; সে B x দেখতই না।
-
আউটপুট অনুমান: নিচের কোড কী ছাপবে?
import numpy as np p = np.array([.5, .3, .15, .05]) n = np.searchsorted(np.cumsum(p), .75) + 1 q = np.where(np.arange(4) < n, p, 0) print(n, (q / q.sum()).round(3))যোগফল .5, .8, .95, 1. .75 ঢোকে index 1-এ, তাই n = 2. রইল .5, .3; .8 দিয়ে ভাগ। ছাপা হবে
2 [0.625 0.375 0. 0. ]. -
নকশা ও সমালোচনা: এক সহকর্মী বাজারঘর-এর পণ্যের বিবরণ তৈরির জন্য লিখলেন
generate(num_beams=10, temperature=1.3, repetition_penalty=2.0)আর একটি সুন্দর আউটপুট দেখিয়ে বললেন, “এটাই সেরা সেটিং।” কী কী প্রশ্ন করবেন?- Temperature:
do_sampleদেওয়া নেই। Beam পরিবারে এটি প্রায় অকার্যকর। আসলে কী চান, খোঁজা না তোলা? - Penalty: ২.০ খুবই বড়। পণ্যের নাম, “শাড়ি”, যতিচিহ্নও শাস্তি পায়। Prompt-এর token-ও এতে পড়ে।
- খরচ: W = ১০ মানে ১০ গুণ model pass ও cache. এই খরচের লাভ কি মাপা হয়েছে?
- প্রমাণ: একটি নমুনা কিছু প্রমাণ করে না। বহু পণ্য, বহু seed, মানুষের বিচার আর greedy বা top-p baseline চাই।
- তথ্য: দাম ও মাপের মতো তথ্য model বানিয়ে দিচ্ছে কি না, তার যাচাই কোথায়?
- Temperature:
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমHugging Face transformers-এ sampling-এর এক ধাপ সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- শেষ অবস্থানের logit নেওয়া
- Repetition penalty লাগানো
- T দিয়ে ভাগ করা
- Top-k, তারপর top-p দিয়ে লেজ কাটা
- Softmax করে একটি token তোলা
- Token যোগ করে EOS পরীক্ষা করা
Beam width W আর vocabulary-র আকার V হলে beam search প্রতি ধাপে কতটি প্রার্থীর মধ্যে বাছাই করে, আর কয়টি রাখে?
- VW প্রার্থী, W রাখে
- W × V প্রার্থী, W রাখে
- V প্রার্থী, ১টি রাখে
- W + V প্রার্থী, V রাখে
Probability .5, .3, .15, .05 বণ্টনে top-p, c = 0.7 প্রয়োগ করলে support কত আর সবচেয়ে বড় probability কত হয়?
- Support ১, সর্বোচ্চ ১.০
- Support ২, সর্বোচ্চ .5
- Support ২, সর্বোচ্চ .625
- Support ৩, সর্বোচ্চ .526
Sampling-এ T-এর মান শূন্যের খুব কাছে গেলে আর খুব বড় হলে কী ঘটে?
- ছোট T-এ greedy-র মতো, বড় T-এ সমান বণ্টনের মতো
- ছোট T-এ সমান বণ্টন, বড় T-এ greedy
- ছোট T-এ logit-এর ক্রম উল্টে যায়
- বড় T-এ অর্ধেক token বাদ পড়ে
Repetition penalty r = 2-এ, আগে দেখা একটি token-এর logit −1 হলে নতুন logit কত, আর কেন?
- −0.5, কারণ সব logit ভাগ হয়
- +1, কারণ চিহ্ন উল্টে যায়
- −1, কারণ ঋণাত্মক logit বদলায় না
- −2, কারণ ঋণাত্মক হলে গুণ করে ছোট করতে হয়
Beam search-এ স্কোর = (∑ log P) / Lα. −1.6 (L = 2) আর −3.0 (L = 6)-এর মধ্যে α = 1-এ কোনটি জেতে?
- L = 2-এরটি, স্কোর −0.8
- L = 6-এরটি, স্কোর −0.5
- দুটির স্কোর সমান
- L = 6-এরটি হারে, স্কোর −18
খোলা গল্প লেখার একটি কাজে beam search নিয়ে কোন কথাটি সবচেয়ে সতর্ক ও যুক্তিসঙ্গত?
- Beam সবসময় সবচেয়ে ভালো লেখা দেয়
- W অনেক বড় করলেই পুনরাবৃত্তি চলে যায়
- এটি প্রায়ই একঘেয়ে ও পুনরাবৃত্ত লেখা দেয় বলে দেখা গেছে, তবে নিজের model ও কাজে মেপে দেখা দরকার
- Beam search কোনো কাজেই আর ব্যবহার করা যায় না
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের শব্দ এখানে একসঙ্গে:
মনে রাখুন
- Decoding model বদলায় না; শুধু logit থেকে token বাছার নিয়ম ঠিক করে।
- Beam search প্রতি ধাপে W × V প্রার্থী থেকে W রাখে; সেরার নিশ্চয়তা নেই। স্কোর (∑ log P) / Lα.
- Temperature: z / T, ক্রম একই, support একই। Top-k, top-p, min-p support কাটে, তারপর যোগফল আবার ১.
- Repetition penalty: ধনাত্মক হলে ভাগ, ঋণাত্মক হলে গুণ; token-এর আকার অনুযায়ী প্রভাব বদলায়, আর বেশি হলে লেখা নষ্ট করে।
- বেশি probability মানে ভালো লেখা নয়, কম T মানে সত্য নয়, আর একই seed সব জায়গায় একই ফল নয়। বহু prompt ও seed-এ মাপুন, নথি পড়ুন।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৫১ · Scaling — ডেটা, parameter, compute আর emergent আচরণের দাবিপরবর্তী পর্বModel বড় করলে কী হয়, মাপসহ।
- পর্ব ৩৬ · নিজে Transformer লেখাআগের পর্বএই পর্বের বাংলা model-এর উৎস।
- পর্ব ৩৭ · দক্ষ attentionআগের পর্বKV cache, যা generation-কে দ্রুত করে।
- ডিপ লার্নিং, NLP আর Generative AI · কোর্স হোম৯১টি পর্বপুরো কোর্সের রোডম্যাপ।
- AI-এর ভিত্তি · পর্ব ৭০পূর্বশর্তToken, পরের শব্দের অনুমান আর LLM-এর সীমা।
- মেশিন লার্নিং · পর্ব ২২পাশের ট্র্যাকদুটি পদ্ধতির তুলনা পরিসংখ্যান দিয়ে।