এই পর্বে যা শিখবেন
- Log-log ছবিতে power law-এর ঢাল পড়া আর হাতে হিসাব করা
- Kaplan আর Chinchilla কী মেপেছেন, কী মাপেননি, আর দুটি কেন আলাদা বলে
- নিজের run-এ fit, bootstrap interval, আর কোথায় fit ভাঙে তা ধরা
- FLOP আর মেমরি হাতে হিসাব করা, Chinchilla-র অনুপাত সহ
- একটি emergent দাবিকে মেট্রিকের ফল থেকে আলাদা করে পরীক্ষা করা
১ · বড় করলে ভালো হয় কেন, আর কতটা?
কয়েক বছরে language model-এর আকার বহু গুণ বেড়েছে; ২০২২ সালের মধ্যে বড় dense model ৫০০ বিলিয়ন parameter ছাড়িয়েছিল। ফলও ভালো হয়েছে। প্রশ্ন হলো, এই উন্নতি কি হিসাবের মধ্যে আনা যায়? ঠিক এই প্রশ্নের উত্তর খোঁজে scaling law: parameter, ডেটা বা compute কত গুণ বাড়ালে loss কতটা কমে।
বোর্ড পরীক্ষার প্রস্তুতির কথা ভাবুন। তিনটি জিনিস লাগে: মাথায় কতটা ধরে (খাতার পৃষ্ঠা, N), কত বই পড়লেন (D), আর কত ঘণ্টা দিলেন (C). পৃষ্ঠা অনেক থাকলেও বই একটি হলে, বাড়তি পৃষ্ঠায় ওই বইটিই মুখস্থ হবে। বই অনেক, কিন্তু খাতা পাতলা হলে কিছু ধরবে না। আর সময় সীমিত হলে বই আর খাতার মধ্যে ভাগ করতেই হবে। এই পর্বের পুরোটাই এই ভাগের অঙ্ক।
এই পর্বে loss মানে সব সময় পরের token-এর cross-entropy, nat এককে (পর্ব ১৩)। এটিকে e-র ঘাতে তুললে পাওয়া যায় perplexity (পর্ব ৩৬)। Tokenizer একই না হলে দুটি সংখ্যা তুলনা করা যায় না, যা পর্ব ৪৬ · Language modeling-এও বলা হয়েছে। LLM-এর মূল ধারণা AI-এর ভিত্তি কোর্সের পর্ব ৭০-এ আছে; এখানে সরাসরি মাপে যাচ্ছি।
Scaling law শব্দে “law” আছে, কিন্তু এটি নিউটনের সূত্রের মতো কিছু নয়। এটি পরিমাপের একটি সারাংশ, নির্দিষ্ট ডেটা, tokenizer আর আকারের সীমায়। Loss কমা মানেই model সত্য বলছে বা “বুঝছে”, এমনও নয়।
২ · Power law পড়া: ঢাল একটি সংখ্যা
Power law মানে L = c · N−α. এখানে L হলো loss, N আকার, c একটি ধ্রুবক, আর α বলে N বাড়লে L কত দ্রুত কমে। দুই পাশে log নিলে log L = log c − α · log N. এটি একটি সরল রেখার সমীকরণ। তাই log-log ছবিতে power law সোজা রেখা, আর ঢাল −α. রিকশা ভাড়ার মতো যোগ নয়, এখানে হিসাব গুণের: প্রতিবার ২ গুণ করলে L একই অনুপাতে কমে, যত বড়ই হোক N.
আমাদের মাপা loss, log-log ছবিতে
Test loss vs non-embedding parameters; one local experiment on Bangla text
| কাজ | |
| N | |
| L | |
| ফল |
- দুটি বিন্দু। N = ২,৫৩৬-এ L = ২.৪২৩, আর N = ৩৭,৭৯২-এ L = ১.৭১৯. প্রায় ১৫ গুণ বড় model-এ loss ২৯% কম।
- Log নেওয়া। ln N আর ln L বের করি। যেকোনো base-এর log নিলেও ঢাল একই থাকে।
- ঢাল। Δln L ÷ Δln N = −০.৩৪৩ ÷ ২.৭০২ = −০.১২৭. অর্থাৎ α ≈ ০.১২৭.
- অর্থ। ২ গুণে 2−0.127 = ০.৯১৬, অর্থাৎ ৮.৪% কম। ১০ গুণে 10−0.127 = ০.৭৪৬. N কত হোক, অনুপাত একই।
- পরীক্ষা। একই রেখা দিয়ে N = ১,৪৯,৩১২-এর অনুমান: ১.৭১৯ × ৩.৯৫−0.127 = ১.৪৪৪. মাপা ১.৬৬৭. ভুল ১৩%. রেখা এখানে আর খাটছে না।
- সীমা। Kaplan-এর αN ≈ ০.০৭৬. আমাদের সংখ্যার সঙ্গে সরাসরি মেলানো ঠিক নয়: তাঁদের BPE আর ইংরেজি, আমাদের অক্ষর আর বাংলা; তাঁদের N-এর পরিসর ১০³ থেকে ১০⁹, আর ডেটা প্রচুর; আমাদের দুটিই অনেক ছোট।
৩ · Kaplan ২০২০: কী মাপা হয়েছিল, কী হয়নি
Jared Kaplan, Sam McCandlish আর সহলেখকেরা জানুয়ারি ২০২০ সালের “Scaling Laws for Neural Language Models” paper-এ decoder-only Transformer শেখান, WebText2 নামের ইংরেজি ওয়েব-লেখায়, প্রায় ৫০ হাজার token-এর BPE দিয়ে। মাপা হয় test ভাগের cross-entropy. তাঁদের N-এ embedding নেই, কারণ তাতে রেখা পরিষ্কার হয়েছে। তাঁদের মূল ফল:
| যা বাড়ানো হলো | শর্ত | সূচক | ২ গুণে loss |
|---|---|---|---|
| Parameter N | প্রচুর ডেটা, শেষ পর্যন্ত training | αN ≈ 0.076 | × 0.95 |
| ডেটা D | বড় model, early stopping | αD ≈ 0.095 | × 0.94 |
| Compute Cmin | সবচেয়ে ভালো আকার, ছোট batch | αC ≈ 0.050 | × 0.97 |
তাঁরা আরও জানান, depth আর width-এর ভাগ বিস্তৃত সীমায় প্রায় গুরুত্বহীন; একসঙ্গে N আর D-এর সূত্র হলো L(N, D) = [(Nc/N)αN/αD + Dc/D]αD, যেখান থেকে আসে D ∝ N0.74, অর্থাৎ model ৮ গুণ করলে ডেটা প্রায় ৫ গুণ। Compute-এর ভালো ভাগে তাঁদের ফল: খুব বড় model, তুলনায় অল্প ডেটা, আর convergence-এর অনেক আগে থামা।
কী মাপেননি: Appendix C-তে লেখকেরা নিজেরাই বলেন, এই সম্পর্কগুলোর পাকা তত্ত্ব তাঁদের হাতে নেই। Regularization আর data augmentation নিয়ে পরীক্ষা হয়নি। ছোট ডেটায় fit দুর্বল ছিল। মেট্রিক শুধু loss: দরকারি কাজে ফল, সত্যবাদিতা বা নিরাপত্তা এতে মাপা হয়নি। আর Nc, Dc-এর মান tokenizer আর vocabulary-র ওপর নির্ভর করে, তাই লেখকদের ভাষায় এগুলোর মৌলিক অর্থ নেই। ফলগুলো মূলত ইংরেজি লেখায়।
৪ · Chinchilla ২০২২: একই বাজেটে ছোট model, বেশি ডেটা
দুই বছর পরে Jordan Hoffmann, Sebastian Borgeaud, Arthur Mensch আর সহলেখকেরা “Training Compute-Optimal Large Language Models”-এ প্রশ্নটি ধরলেন বাজেট দিয়ে: compute বাজেট নির্দিষ্ট হলে N আর D কীভাবে ভাগ করবেন? ৪০০-এর বেশি model শিখিয়ে, প্রায় ৭ কোটি থেকে ১,৬০০ কোটি parameter পর্যন্ত, তাঁরা তিনভাবে হিসাব করেন। তৃতীয়টি একটি সূত্র:
L(N, D) = E + A / Nα + B / Dβ
এখানে E হলো লেখার নিজের অনিশ্চয়তা। A/Nα হলো ছোট model-এর দোষ, আর B/Dβ হলো অল্প দেখার দোষ। তিনটি অংশ যোগ করা বলে, N একা বাড়ালে একসময় বাকি দুটি অংশই থেকে যায়। চায়ের দোকানের হিসাবে ধরুন: চুলা বড় করলেন (N), কিন্তু চা-পাতা কম (D); বড় চুলার লাভ পাতা ফুরালে থেমে যাবে। আর পানির স্বাদের সীমা (E) কোনো চুলা বদলাতে পারবে না।
নিচের ধাপে হিসাবটি হাতে করুন। প্রতিটি সংখ্যা paper-এর, শুধু ভাগগুলো আমাদের করা।
| ধরা হলো | |
| হিসাব | |
| ফল | |
| D/N |
- সূচক থেকে ভাগ। Paper-এর fit-এ α ≈ 0.34, β ≈ 0.28. C ≈ 6ND শর্তে L কমালে Nopt ∝ Ca আর Dopt ∝ Cb আসে। a ≈ 0.45, b ≈ 0.55; paper-এর Table 2-এ 0.46 আর 0.54, পার্থক্যটি গোল করার কারণে। প্রায় সমান ভাগ।
- Chinchilla নিজে। ৭০ বিলিয়ন parameter, ১.৪ ট্রিলিয়ন token. 6ND দেয় 5.88×1023 FLOP. প্রতি parameter-এ ২০ token.
- বাজেট থেকে উল্টো হিসাব। Gopher-এর বাজেট paper-এ 5.76×1023. ৭০ বিলিয়ন N হলে D ≈ 1.37 ট্রিলিয়ন, অনুপাত প্রায় ২০।
- একই বাজেট, Gopher. ২৮০ বিলিয়ন N মানে ৪ গুণ বড় model. D ৪ গুণ কমে প্রায় ৩৪০ বিলিয়নে (Gopher আসলে পেয়েছিল ৩০০ বিলিয়ন)। অনুপাত মাত্র ১.২। Paper-এর দাবি, এই ভাগে model পর্যাপ্ত শেখেনি।
- Table 3-এর সারি। ১ বিলিয়ন → ২০.২ বিলিয়ন, ১০ → ২০৫.১, ৬৭ → ১,৫০০, ১,০০০ → ২১,২০০. অনুপাত ২০–২২. “২০ token” কথাটি এই সারিগুলো থেকে আসা সহজ রূপ।
- আমাদের model. d = 128 model-এ মোট ৬ লাখ ১২ হাজার parameter. ২০ গুণ মানে ১.২ কোটি দেখা token, অথচ আমাদের আলাদা অক্ষর ১.৯২ লাখ। অর্থাৎ প্রায় ৬৪ পাস। এই অবস্থা Chinchilla-র পরীক্ষায় ছিল না, তাই অনুপাতটি এখানে পরীক্ষিত নয়।
এই ভবিষ্যদ্বাণী পরীক্ষা করতে তাঁরা Chinchilla (৭০ বিলিয়ন) শেখান, Gopher-এর (২৮০ বিলিয়ন) সমান বাজেটে; paper-এর ভাষ্যে এটি প্রায় সব downstream কাজে এগিয়ে যায়। সতর্কতা হলো, সূত্রের ফল Kaplan থেকে বেশ আলাদা (DQ ০১ দেখুন), আর দুটি model-এর মধ্যে optimizer-সহ ছোট কিছু পার্থক্যও ছিল, যা লেখকেরা Appendix G-তে জানান।
আরও গভীরে: লেখকদের নিজের সীমাবদ্ধতার তালিকা: বড় আকারে মাত্র দুটি তুলনীয় run; বড় বাজেটে সামান্য বক্রতা, যাতে ভালো আকার বাড়িয়ে ধরা হতে পারে; আর সব run এক epoch-এর কম। পরে Muennighoff আর সহলেখকেরা ডেটা-সংকটের দিক থেকে প্রশ্নটি আবার ধরেন; নির্দিষ্ট compute-এ প্রায় ৪ epoch পর্যন্ত পুনরায় দেখা প্রায় নতুন ডেটার মতো পেয়েছেন। Sardana আর সহলেখকেরা inference-এর খরচ যোগ করে দেখান, প্রচুর চাহিদায় আরও ছোট model আর আরও বেশি ডেটা লাভজনক হতে পারে।
৫ · নিজের হাতে মাপা: একই বাংলা লেখায় ৬০-এর বেশি run
এবার নিজে পরীক্ষা করি। পর্ব ৩৬-এর MiniGPT-ই, শুধু কয়েকটি মাপ বদলানো। ডেটা উপেন্দ্রকিশোর রায়চৌধুরীর গল্প (bn.wikisource থেকে নেওয়া, PD-India), অক্ষর-স্তরের tokenizer, পুরো গল্প ধরে ভাগ করা: train ১,৯২,০১৪ অক্ষর, validation ২০,৩৩৪, test ২৫,৭৯০. Checkpoint বাছা হয় validation-এ, আর সংখ্যা জানানো হয় test-এ। ছোট ডেটা হলো গল্প এলোমেলো করে প্রথম D অক্ষর।
নিচের কোডটি আসল scale.py-এর সংক্ষিপ্ত রূপ (সেভ, মাপা আর সারির অংশ বাদ)। PyTorch 2.15.0, Python 3.14.4, লেখার সময়ে।
model = MiniGPT(len(CHARS), T=64, d=d, heads=4, layers=L, p=p).to(DEV)
total = sum(q.numel() for q in model.parameters())
N = total - model.tok.weight.numel() - model.pos.weight.numel() # Kaplan-এর N
opt = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)
for step in range(1, S + 1): # warmup + cosine, S পর্যন্ত
ix = torch.randint(0, len(tr) - T - 1, (64,), device=DEV)
chunk = tr[ix[:, None] + OFFS] # batch 64, context 64
with torch.autocast(DEV, dtype=torch.float16, enabled=AMP):
_, loss = model(chunk[:, :-1], chunk[:, 1:])
# ... backward, clip 1.0, step ...
if step % every == 0: # validation আর early stopping
...সত্যিকারের run, একটি কম্পিউটারে। প্রতিটি আকারে ১–২টি seed; S = ৬,০০০ step, early stopping-সহ। GPU তখন অন্য কাজে ব্যস্ত ছিল, তাই কিছু run GPU-তে (float16 AMP), বাকি CPU-তে (float32); এতে loss-এর ফল বড়ভাবে বদলানোর কথা নয়, তবে সময় তুলনা করা যায় না, তাই সময় দেখাচ্ছি না। শুরুতে ৩টি seed-এর পরিকল্পনা ছিল, সময়ের কারণে কমিয়েছি। আর সব run-এ learning rate একই, যেখানে Kaplan-এর দল তা tune করেছিল।
$ uv run python report.py # সত্যিকারের আউটপুট, এক অংশ
# ডেটা পূর্ণ (D = 192014), 3 layer, dropout 0
d N run train test top-1
8 2536 2 2.440 2.423 0.329
12 5532 1 2.192 2.228 0.380
16 9680 2 2.046 2.056 0.430
32 37792 2 1.567 1.719 0.513
64 149312 2 1.404 1.667 0.523
96 334560 2 1.421 1.686 0.518
128 593536 2 1.358 1.666 0.523
192 1332672 1 1.423 1.677 0.520
256 2366720 2 1.324 1.676 0.525
384 5319552 1 1.372 1.680 0.526
# একই model, ডেটা বদলানো: test loss (run সংখ্যা)
D d=32 d=96 d=256
6000 2.600 (2) 2.579 (1) 3.758 (1)
12000 2.428 (2) 2.506 (1) 2.925 (1)
24001 2.213 (2) 2.219 (2) 2.256 (1)
48003 2.010 (2) 1.980 (1) 2.061 (2)
96007 1.835 (2) 1.833 (1) 1.951 (1)
192014 1.719 (2) 1.686 (2) 1.676 (2)
দুটি জিনিস পড়ুন। প্রথম ছক: N ১৫ গুণ হতে (২,৫৩৬ → ৩৭,৭৯২) loss ২৯% কমে। পরের ১৪০ গুণে প্রায় কিছুই কমে না, যদিও train loss নিচে নামে। মাঝের ফাঁকই overfitting: এটিই আমাদের ডেটার বাধা। দ্বিতীয় ছক: ছোট ডেটায় আকার বাড়িয়ে লাভ নেই; D = ২৪,০০১-এ তিন আকারই প্রায় ২.২. D ৮ গুণে তিনটিই ১.৭-এর কাছে। অর্থাৎ এখানে ডেটা বেশি কাজের।
d = 256-এর ওপরের দুটি ঘর (৩.৭৫৮, ২.৯২৫) বিশ্বাস করবেন না। এই আকারে validation মাপা হয় প্রতি ২০০ step-এ, আর এত ছোট ডেটায় model তার আগেই মুখস্থ করে ফেলে; তাই সেরা বিন্দু ধরা পড়ে না। এটি পরিমাপের দোষ, আইনের নয়, তাই fit থেকে বাদ রেখেছি।
৬ · Fit, interval আর যেখানে সূত্র ভাঙে
নিচের কোড ওপরের সত্যিকারের সংখ্যাই পড়ে (পাতায় ফাইল হিসেবে রাখা)। ঢালের অনিশ্চয়তার জন্য bootstrap নেওয়া হয়, যা মেশিন লার্নিং কোর্সের পর্ব ২১-এ বিস্তারে আছে: run-গুলো ফেরত রেখে টেনে বারবার fit. প্রথমবার চালালে NumPy আর matplotlib আসতে কয়েক সেকেন্ড লাগতে পারে।
import numpy as np
import matplotlib.pyplot as plt
d = np.loadtxt("runs_n.csv", delimiter=",", skiprows=1)
N, L = d[:, 0], d[:, 2]
rng = np.random.default_rng(42)
def fit(x, y, B=4000):
lx, ly = np.log(x), np.log(y)
slope, icpt = np.polyfit(lx, ly, 1)
i = rng.integers(0, len(x), (B, len(x))) # run-গুলো ফেরত রেখে টানা
X, Y = lx[i], ly[i]
X = X - X.mean(1, keepdims=True)
Y = Y - Y.mean(1, keepdims=True)
s = (X * Y).sum(1) / (X * X).sum(1) # প্রতিটি নমুনার ঢাল
lo, hi = np.nanpercentile(s, [2.5, 97.5])
return slope, icpt, lo, hi
parts = {"all runs": N > 0, "N <= 40k": N <= 4e4, "N >= 100k": N >= 1e5}
fig, ax = plt.subplots(figsize=(5.2, 3))
ax.loglog(N, L, "o", ms=4, label="runs")
print("যে অংশ run ঢাল 95% interval")
for name, m in parts.items():
s, b, lo, hi = fit(N[m], L[m])
print(f"{name:12s} {m.sum():3d} {s:6.3f} [{lo:6.3f}, {hi:6.3f}]")
x = np.array([N[m].min(), N[m].max()])
ax.loglog(x, np.exp(b) * x ** s, label=f"{name}: {s:.3f}")
D = np.loadtxt("runs_d.csv", delimiter=",", skiprows=1)
s, b, lo, hi = fit(D[:, 0], D[:, 2])
print(f"\ndata, d=32 {len(D):3d} {s:6.3f} [{lo:6.3f}, {hi:6.3f}]")
print(f"D ২ গুণে loss × {2 ** s:.3f}")
ax.set(xlabel="non-embedding parameters N", ylabel="test loss (nats/char)")
ax.legend(fontsize=7)আউটপুটের প্রথম তিন সারি: সব run মিলিয়ে ঢাল -0.048, interval [-0.064, -0.027]. Interval ছোট হলেও সংখ্যাটি অর্থহীন, কারণ দুটি ভিন্ন আচরণের গড়। ভাগ করলে N <= 40k-এ -0.128 [-0.137, -0.116], আর N >= 100k-এ 0.001 [-0.004, 0.005], অর্থাৎ শূন্যের সঙ্গে মেলে। ডেটার সারিতে d = 32-এর ঢাল -0.124 [-0.132, -0.119]; D ২ গুণে loss × 0.918.
Interval কী বলে আর কী বলে না, সেটি জানা দরকার। এটি শুধু এই ক'টি run-এর seed আর আকারের নড়াচড়ার হিসাব। সংখ্যায় মাত্র ৭ আর ১০টি run, তাই একে মোটামুটি ধরুন। আর বাঁকটি কোথায়, সেই ভাগ আমরাই ছবি দেখে বেছেছি, যা একধরনের উঁকি দেওয়া। সূত্রটি সঠিক কি না, এই interval তা বলে না।
এবার সবচেয়ে বিপজ্জনক কাজটি: extrapolation. ধরুন শুধু ছোট তিনটি আকার (N ≤ ১০,০০০) দেখে রেখা টানলেন। পাশের ঘরে অনুমান কেমন, আর দূরে কেমন? সঙ্গে Chinchilla-র ধাঁচে সীমাসহ একটি রূপও fit করি: L = E + A/Na.
import numpy as np
import matplotlib.pyplot as plt
d = np.loadtxt("runs_n.csv", delimiter=",", skiprows=1)
Ns = np.unique(d[:, 0])
L = np.array([d[d[:, 0] == n, 2].mean() for n in Ns])
small = Ns <= 1e4 # শুধু ছোট তিনটি আকার দেখে fit
s, b = np.polyfit(np.log(Ns[small]), np.log(L[small]), 1)
pure = lambda n: np.exp(b) * n ** s
print(f"ছোট model থেকে ঢাল {s:.3f}")
print(" N মাপা অনুমান ভুল%")
for n, l in zip(Ns, L):
print(f"{n:9.0f} {l:.3f} {pure(n):.3f} {100 * (pure(n) - l) / l:5.1f}")
# সীমাসহ রূপ: L = E + A / N^a; E-র প্রতিটি মানে সরল রেখা fit
best = (np.inf,)
for E in np.arange(0.0, L.min() - 0.001, 0.002):
a, c = np.polyfit(np.log(Ns), np.log(L - E), 1)
sse = ((E + np.exp(c) * Ns ** a - L) ** 2).sum()
if sse < best[0]:
best = (sse, E, a, c)
_, E, a, c = best
floor = lambda n: E + np.exp(c) * n ** a
print(f"\nসীমাসহ fit: E = {E:.3f}, ঢাল = {a:.3f}")
for n in (7e10, 7e13):
print(f"N = {n:.0e}: সোজা রেখা {pure(n):.3f}, সীমাসহ {floor(n):.3f}")
x = np.logspace(3, 11, 50)
fig, ax = plt.subplots(figsize=(5.2, 2.8))
ax.loglog(Ns, L, "ko", ms=4, label="measured")
ax.loglog(x, pure(x), label="line fit on N <= 10k")
ax.loglog(x, floor(x), "--", label="E + A/N^a on all")
ax.set(xlabel="parameters N", ylabel="loss (log)", ylim=(0.2, 3))
ax.legend(fontsize=7)ছোট তিনটি আকার থেকে ঢাল -0.122. পাশের ঘরে N = ৩৭,৭৯২-এ অনুমান 1.750, মাপা 1.719: ভুল মাত্র ১.৮%. তারপর ভুল বাড়ে: −১১%, −২০%, আর N = ৫৩ লাখে অনুমান 0.958, মাপা 1.680, অর্থাৎ −৪৩%. কাছে ভালো, দূরে ভুল: এটিই extrapolation-এর ফাঁদ।
দূরে দুটি সূত্রের অমিল আরও স্পষ্ট। N = ৭×১০১০-এ সোজা রেখা 0.302 বলে, সীমাসহ fit 1.539 বলে; ৫ গুণ পার্থক্য, অথচ মাপা সীমায় দুটিই চলনসই। সীমাসহ fit-এর E = 1.530-কে বাংলার entropy ভাববেন না। এটি এই ডেটা আর এই training-এর সীমার একটি fit, Chinchilla-র E-এর মতো কিছু দাবি করে না। পরের পরীক্ষাই তা দেখাবে।
এই সমতলের কারণ কি শুধু ডেটা? একটি সহজ পরীক্ষা: একই d = 256 model-কে একই ডেটায় একটু অন্যভাবে শেখানো।
# সত্যিকারের আউটপুট, seed 1. dropout 0-এর একই seed-এ test = 1.656
drop d=32 N=37792 test=1.998 train=1.943 best_step=5800
drop d=64 N=149312 test=1.701 train=1.550 best_step=5800
drop d=128 N=593536 test=1.571 train=1.220 best_step=5000
drop d=256 N=2366720 test=1.587 train=1.135 best_step=2000
drop d=384 N=5319552 test=1.608 train=1.162 best_step=1400
lr d=256 N=2366720 test=1.668 train=1.184 best_step=1000
এক seed-এর ফল, তাই সতর্কভাবে পড়ুন। Dropout ০.২ দিয়ে d = 256 নামল ১.৬৫৬ থেকে ১.৫৮৭-এ, d = 128 নামল ১.৬৬১ থেকে ১.৫৭১-এ, d = 384 নামল ১.৬৮০ থেকে ১.৬০৮-এ। কিন্তু d = 64 উঠল ১.৬৬১ থেকে ১.৭০১-এ, আর d = 32 উঠল ১.৭২১ থেকে ১.৯৯৮-এ, কারণ ছোট model-এ জায়গা কম (পর্ব ১৬)। কম learning rate (৩×১০−৪) তেমন কিছু বদলায়নি। অর্থাৎ §৫-এর সমতল শুধু “ডেটা শেষ” নয়, “এই training রেসিপিতে ডেটা শেষ”। Kaplan-এর দল Appendix C-তে ঠিক এই সতর্কতা দিয়েছিল: regularization নিয়ে তারা পরীক্ষা করেনি, আর তা ফল বদলাতে পারে। একটি fit-এর সবচেয়ে কঠিন অংশ হলো, কোন জিনিস স্থির রাখা হয়েছিল তা মনে রাখা।
৭ · Compute-এর হিসাব: FLOP, মেমরি আর সমান বাজেট
Kaplan-এর হিসাবে N non-embedding parameter-এর জন্য forward pass-এ প্রতি token-এ প্রায় 2N FLOP, কারণ একটি গুণ-যোগ জোড়া দুটি FLOP. Backward pass প্রায় তার দ্বিগুণ। তাই training-এ প্রতি token প্রায় 6N, আর মোট C ≈ 6·N·D. D এখানে দেখা token, আলাদা token নয়। Hoffmann-এর দলের Table A4-এ এই সংক্ষিপ্ত হিসাব পুরো হিসাবের ০.৯৯ থেকে ১.১০ গুণের মধ্যে।
def counts(V, T, d, L):
"""নিজের MiniGPT-এর হুবহু parameter আর FLOP হিসাব।"""
N = L * (12 * d * d + 9 * d) + 2 * d # block + শেষ LayerNorm
emb = (V + T) * d # token + position
fwd = 2 * N + 2 * L * T * d + 2 * d * V # প্রতি token, forward
return N, emb, fwd, 6 * N
print("d N(non-emb) total fwd/token train(6N)/token MB(16B/param)")
for d in (64, 128, 256):
N, emb, fwd, train = counts(83, 64, d, 3)
tot = N + emb
print(f"{d:<4d} {N:<11,d} {tot:<9,d} {fwd:<10,d} {train:<16,d} {tot * 16 / 2**20:.1f}")
# একটি training-এর মোট খরচ: d=128, 1500 step
N, emb, fwd, train = counts(83, 64, 128, 3)
tokens = 1500 * 64 * 64
print(f"\nd=128: {tokens:,} দেখা token, 6ND = {6 * (N + emb) * tokens:.2e} FLOP")
# Chinchilla: একই সূত্র, paper-এর N আর D
N, D = 70e9, 1.4e12
C = 6 * N * D
print(f"Chinchilla: 6ND = {C:.2e} FLOP = {C / 8.64e19:,.0f} PF-day")
print(f"1 পেটা-FLOP/s যন্ত্রে সময় = {C / 1e15 / 86400 / 365:.1f} বছর")
for name, b in [("float32", 4), ("float16", 2)]:
print(f"শুধু weight, {name}: {N * b / 1e9:,.0f} GB")
print(f"weight+grad+Adam-এর ২ buffer (float32): {N * 16 / 1e12:.2f} TB")d = 128-এ মোট 612,352 parameter, যা পরের সত্যিকারের গণনার সঙ্গে মেলে। ১৬ বাইট প্রতি parameter মানে weight, gradient আর Adam-এর দুটি buffer, প্রতিটি float32; তাতে 9.3 MB. ১,৫০০ step, batch ৬৪, context ৬৪ মানে 6,144,000 দেখা token আর 2.26e+13 FLOP.
Chinchilla-তে একই সূত্র দেয় 5.88e+23 FLOP, যা paper-এর 5.76×1023-এর কাছে; তাঁদের পুরো হিসাবে 6.3×1023. 6,806 PF-day মানে ১ পেটা-FLOP প্রতি সেকেন্ডের একটি যন্ত্রে প্রায় 18.6 বছর; এটি শুধু পাটিগণিত, কীভাবে শেখানো হয়েছিল তার বিবরণ নয়। weight-এর জন্যই float16-এ 140 GB. এই সংখ্যায় ঠিক কোথায় কত খরচ হয়েছিল, তা আমরা জানি না, তাই কোনো মূল্য দিচ্ছি না।
এই হাতের হিসাব কি ঠিক? PyTorch-এর FlopCounterMode দিয়ে আসল forward pass গুনে দেখা যাক (এটি গুণ-যোগ জোড়াকে ২ ধরে); মেমরিও মেপেছি:
$ uv run python flops.py # সত্যিকারের আউটপুট, GPU-তে শেষ লাইন
d N_nonembed total counted_fwd 2N+2LTd+2dV 6N(train)
64 149312 158720 354688 333824 895872
128 593536 612352 1299200 1257472 3561216
256 2366720 2404352 4957696 4874240 14200320
param MB 2.34 before-train MB 2.38 peak in training MB 102.5
গণনা আর সূত্রের পার্থক্য ৬%-এর কম। মেমরিতে দেখুন: weight মাত্র ২.৩ MB, অথচ training-এর সর্বোচ্চ ১০২.৫ MB, কারণ gradient, Adam-এর buffer আর forward-এর মাঝের ফল সবই রাখতে হয় (পর্ব ১২)। ১৬ বাইট প্রতি parameter তাই শুধু নিচের সীমা।
এবার Chinchilla-র মূল প্রশ্ন ছোট আকারে: সমান FLOP খরচে কোন আকার ভালো? বড় model কম step পায়, ছোট model বেশি। বাজেট C1 হলো ২.২৬×১০১৩ (d = 128-এর ১,৫০০ step), আর C4 তার এক-চতুর্থাংশ:
# সত্যিকারের আউটপুট; বেশিরভাগ সারি এক seed
বাজেট d N step দেখা token token/param test
C4 32 37792 5946 24354816 573 1.719
C4 48 84336 2653 10866688 119 1.732
C4 64 149312 1495 6123520 39 1.772
C4 96 334560 666 2727936 8 1.958
C4 128 593536 375 1536000 3 2.113
C4 192 1332672 167 684032 1 2.311
C1 64 149312 5982 24502272 154 1.665
C1 96 334560 2664 10911744 31 1.660
C1 128 593536 1500 6144000 10 1.641
C1 192 1332672 667 2732032 2 1.661
C1 256 2366720 376 1540096 1 1.739
C1 384 5319552 167 684032 0 2.107
তিনটি পর্যবেক্ষণ, একটি পরীক্ষার, সতর্কভাবে। এক: সবচেয়ে ভালো আকার বাজেটের সঙ্গে সরে: C4-এ d = 32, C1-এ d = 128. দুই: token/param সেরা বিন্দুতে ৫৭৩ আর ১০; ২০-এর সঙ্গে মেলে না। অবাক হওয়ার কিছু নেই: আমাদের লেখা ১.৯২ লাখ অক্ষর, তাই এখানে একই অক্ষর ৩২–১২৭ বার দেখা হয়েছে, আর Chinchilla-র অনুপাত এক epoch-এর কমে মাপা। তিন: d = 128-এ S = ১,৫০০ দিয়েছে ১.৬৪১, অথচ S = ৬,০০০-এ দুই seed-এ ১.৬৬১ আর ১.৬৭১ (seed আলাদা, তাই সতর্ক থাকুন)। এটি Hoffmann-এর একটি কথার সঙ্গে মেলে: schedule-এর দৈর্ঘ্য training-এর সঙ্গে মিলতে হয়। আকৃতি নিয়েও ছোট একটি পরীক্ষা: N প্রায় ৬ লাখ রেখে L = 2, 3, 6, 12-তে test ছিল ১.৬৬২, ১.৬৭১, ১.৬৮৫, ১.৬৮৪; Kaplan-এর কথা (আকৃতি প্রায় গুরুত্বহীন) এখানে মোটামুটি খাটে, যদিও এটি এক seed-এর ফল।
পরীক্ষা ও ইন্টারভিউতে: (১) ঢাল −α হলে N ২ গুণে loss কত গুণ? 2−α. (২) C ≈ 6ND কেন? Forward 2N, backward তার দ্বিগুণ, D দেখা token. (৩) Kaplan আর Chinchilla-র পার্থক্য? Nopt ∝ C০.৭৩ বনাম প্রায় C০.৫. (৪) Chinchilla-র E কী? লেখার নিজের অনিশ্চয়তা, যা কোনো model কমায় না। (৫) Emergent দাবির একটি পরীক্ষা? ধারাবাহিক মেট্রিকে আবার মাপা আর test বড় করা।
৮ · Emergent দাবি, আর মেট্রিকের মরীচিকা
Scaling law বলে উন্নতি মসৃণ। তাহলে অনেক কাজে ছবিতে হঠাৎ লাফ দেখা যায় কেন? Jason Wei আর সহলেখকেরা ২০২২ সালে “Emergent Abilities of Large Language Models”-এ emergent ability-র এই সংজ্ঞা দেন: ছোট model-এ নেই, বড় model-এ আছে, আর ছোট model-এর উন্নতি টেনে অনুমান করা যায় না। ছবিতে এটি phase transition-এর মতো: এক সীমা পর্যন্ত প্রায় random, তারপর ওপরে। তাঁদের এক উদাহরণ: ৩ অঙ্কের যোগ-বিয়োগ আর ২ অঙ্কের গুণের একটি benchmark, যেখানে GPT-3-এ প্রায় 2×1022 training FLOP (১,৩০০ কোটি parameter)-এ আর LaMDA-তে প্রায় 1023 FLOP-এ ফল র্যান্ডমের অনেক ওপরে ওঠে। তাঁরা নিজেরাই বলেন, এই সীমা স্থির কিছু নয়; ডেটার মান আর অন্য বিষয়ে বদলায়।
Rylan Schaeffer, Brando Miranda, Sanmi Koyejo ২০২৩ সালে “Are Emergent Abilities of Large Language Models a Mirage?”-এ অন্য ব্যাখ্যা দেন: মরীচিকা. এক token-এর সঠিকতা p যদি মসৃণ বাড়ে, আর পুরো উত্তরে L-টি token হুবহু মিলতে হয়, তাহলে স্বাধীন ধরলে ফল pL, যা log অক্ষে হঠাৎ লাফের মতো দেখায়। ৫০টি প্রশ্নে ১/৫০-এর নিচের হার তো ০-ই দেখাবে। Multiple Choice Grade তো সরাসরি ধাপ-ফাংশন। তাঁদের হিসাবে BIG-Bench-এ হাতে চিহ্নিত emergent কাজের ৯২%-এর বেশি এই দুই ধরনের মেট্রিকে। Token edit distance বা Brier score-এর মতো ধারাবাহিক মেট্রিকে তাঁরা মসৃণ ছবি পেয়েছেন। কিন্তু তাঁরা স্পষ্ট বলেন, বড় model emergent ক্ষমতা দেখাতেই পারে না, এমন দাবি তাঁরা করছেন না। Wei-এর দলও লিখেছিল, exact match ধাপে ধাপে উন্নতি লুকাতে পারে, তবে একে অসম্পূর্ণ ব্যাখ্যা বলে।
আগে একটি খেলনা দেখুন। নিচের সব সংখ্যা বানানো, শুধু পদ্ধতি দেখানোর জন্য।
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(42)
N = np.logspace(5, 11, 13)
ce = (3e8 / N) ** 0.35 # কাল্পনিক, মসৃণ per-token loss
p = np.exp(-ce) # এক token ঠিক হওয়ার সম্ভাবনা
L = 10 # উত্তরে ১০ token
exact = p ** L # হুবহু মেলা (স্বাধীন ধরে)
edit = L * (1 - p) # গড়ে কতটি token ভুল
hits = rng.binomial(50, exact) # ৫০ প্রশ্নের test-এ যা দেখা যাবে
print(" N ce p exact edit hits/50")
for i in range(0, 13, 2):
print(f"{N[i]:.0e} {ce[i]:5.2f} {p[i]:5.3f} {exact[i]:6.4f}"
f" {edit[i]:5.2f} {hits[i]:4d}")
j = np.argmax(hits > 0)
print(f"\n৫০ প্রশ্নে প্রথম মিল N = {N[j]:.0e}; তার আগে দেখায় শূন্য")
print(f"সেখানে আসল exact = {exact[j]:.4f}; এক ধাপ আগে = {exact[j-1]:.6f}")
fig, ax = plt.subplots(1, 2, figsize=(6.4, 2.6))
ax[0].semilogx(N, edit, "o-")
ax[0].set(xlabel="parameters N", ylabel="wrong tokens (of 10)",
title="continuous metric: smooth")
ax[1].semilogx(N, hits / 50, "s-", color="C3", label="seen, 50 questions")
ax[1].semilogx(N, exact, ":", color="k", label="true exact match")
ax[1].set(xlabel="parameters N", ylabel="exact match",
title="thresholded metric: a 'jump'")
ax[1].legend(fontsize=7)
fig.subplots_adjust(wspace=0.35, bottom=0.2)একই কাল্পনিক model পরিবার। ধারাবাহিক edit-এ ভুল token 9.63 → 7.70 → 4.81 → 2.54 → 1.23: মসৃণ। কিন্তু hits/50-এ 0, 0, 0, 0, 0, 2, 15, যেন N = ১০১০-এর কাছে কিছু একটা “জন্ম নিল”। আসলে N = ১০৯-এ exact হার 0.0014, মানে ৫০ প্রশ্নে গড়ে ০.০৭টি মিল; দেখা না যাওয়াই স্বাভাবিক। ছবির বাঁ দিক আর ডান দিক একই model, শুধু মাপা ভিন্ন। মনে রাখবেন, এখানে আমরা ইচ্ছে করে মসৃণ model বানিয়েছি। এটি দেখায় মরীচিকা সম্ভব, আসল model-এ এটিই ঘটেছে, তা প্রমাণ করে না।
এবার আমাদের সত্যিকারের model-গুলোতে একই পরীক্ষা। প্রতিটি শেখা model-কে test লেখার ২,০০০ জায়গায় ৬৪ অক্ষর দেখিয়ে greedy-তে পরের অক্ষর চাওয়া হলো। ex8 মানে টানা ৮টি অক্ষর হুবহু মিলল, আর exact-match হিসেবে এটি হ্যাঁ/না ধরনের। top-1 হলো এক অক্ষরের সঠিকতা, আর ex1 একই জিনিস এই ২,০০০ জায়গায়।
# সত্যিকারের আউটপুট, run-এর গড়; প্রতি run-এ 2000 জায়গা
d N loss top-1 ex1 ex4 ex8 ex16
8 2536 2.423 0.329 0.314 0.006 0.0000 0.00000
12 5532 2.228 0.380 0.381 0.018 0.0020 0.00000
16 9680 2.056 0.430 0.434 0.036 0.0037 0.00000
32 37792 1.719 0.513 0.530 0.069 0.0077 0.00000
64 149312 1.667 0.523 0.534 0.083 0.0090 0.00000
96 334560 1.686 0.518 0.536 0.089 0.0128 0.00000
128 593536 1.666 0.523 0.542 0.087 0.0120 0.00025
192 1332672 1.677 0.520 0.527 0.086 0.0120 0.00050
256 2366720 1.676 0.525 0.541 0.099 0.0143 0.00000
384 5319552 1.680 0.526 0.535 0.083 0.0135 0.00000
| প্রশ্ন | |
| d = 8 | |
| d = 12 | |
| d = 128/192 |
- দাবি। কেউ বলল: “ছোট model টানা ৮ অক্ষর পারে না, N একটু বাড়তেই পারে। এটি emergent ক্ষমতা।” ছকে সত্যিই d = 8-এ ০, d = 12-এ ০.০০২.
- মেট্রিক দেখুন। ৮টির সবকটি মিললে ১, নাহলে ০. আংশিক নম্বর নেই। Schaeffer যে ধরনের মেট্রিক নিয়ে সতর্ক করেন, এটি সেই ধরন।
- ধারাবাহিক মাপ। একই model-এ loss ২.৪২৩ → ২.২২৮, top-1 ০.৩২৯ → ০.৩৮০. কোনো লাফ নেই, সাধারণ উন্নতি।
- pL মেলান। প্রথম অক্ষর ঠিক হওয়ার হার দিয়ে স্বাধীন ধরে ০.৩১৪৮ ≈ ০.০০০০৯, ০.৩৮১৮ ≈ ০.০০০৪৪. মাপা হার বেশি, কারণ অক্ষর স্বাধীন নয়; শব্দের ভেতরে একটি ঠিক হলে পরেরটিও সহজ। Schaeffer-ও এই অনুমানকে “সত্য নয়” বলেছেন।
- সূক্ষ্মতা। d = 8-এ ৪,০০০ চেষ্টায় ০ মিল। ০.০০০০৯ হার হলে গড়ে আশা ০.৩৮টি মিল। অর্থাৎ ০ দেখা “ক্ষমতা নেই”-এর প্রমাণ নয়।
- আরেকটি লাফ। ex16 সবখানে ০, শুধু N = ৫.৯ লাখ আর ১৩ লাখে ধনাত্মক; দুটিই মাত্র একটি করে মিল। আবার N = ২৪ লাখ আর ৫৩ লাখে ০. ছবিতে “সীমা” আঁকা যেত, কিন্তু এটি নিছক শব্দ।
- রায়। এই ক্ষেত্রে মরীচিকার ব্যাখ্যাই যথেষ্ট। কিন্তু এটি এক ছোট model আর এক ধরনের কাজ; অন্য কাজে, যেমন Wei-এর classification কাজে, এই পরীক্ষা নিজে থেকে কিছু প্রমাণ করে না। ধারাটি পুনরায় চালিয়ে দেখতে হয়।
৯ · লাভ কি কমছে? ডেটা, শক্তি আর খোলা প্রশ্ন
Scaling নিয়ে আলোচনার বড় অংশ একটি প্রশ্নে এসে দাঁড়ায়: এই পথে আর কতদূর? আমরা কোনো উত্তর দাবি করছি না; নিচে শুধু যা প্রকাশিত, তার সারাংশ। প্রতিটি পক্ষের বিস্তার ভাবনার প্রশ্ন ০৫-এ আছে।
| বিষয় | উৎস আর দাবি | সীমা |
|---|---|---|
| ডেটার মজুত | Villalobos আর সহলেখকেরা: ধারা না বদলালে ২০২৬–২০৩২-এর মধ্যে ডেটাসেট খোলা মানবলেখার মজুতের সমান হতে পারে | ধারার অনুমান; তাঁরা নিজেরাই বিকল্প পথ বলেন |
| ডেটার পুনর্ব্যবহার | Muennighoff-এর দল: ~৪ epoch পর্যন্ত loss প্রায় একই | বড় model আর মূলত ইংরেজি |
| বড় মানেই ভালো নয় | McKenzie আর সহলেখকেরা: ১১টি ডেটাসেটে inverse scaling, যেখানে model বড় হলে ফল খারাপ হয় | নির্দিষ্ট কাজে; কিছু ক্ষেত্রে U-আকৃতিও দেখা গেছে |
| শক্তি | Patterson আর সহলেখকেরা (২০২১): GPT-3-এর training-এ অনুমান প্রায় ১,২৮৭ MWh | অনুমান, প্রকাশিত তথ্য থেকে; যন্ত্র আর স্থানে বড় পার্থক্য; inference ধরা নেই |
| বন্ধ model | GPT-4 report-এ model-এর আকার, hardware, compute আর ডেটার বিস্তারিত নেই বলে লেখা (২০২৬ সালের নভেম্বরে নথিতে যেমন দেখা গেছে) | বাইরে থেকে N, D, C বসিয়ে সূত্র পরীক্ষা করা যায় না |
বাস্তব কাজের পরামর্শ সহজ। বড় training-এর সিদ্ধান্ত আপনার সামনে সম্ভবত আসবে না; আপনার সিদ্ধান্ত হলো: কোন আকারের model নেবেন, কতটা fine-tune করবেন, কত ডেটা জোগাড় করবেন। সেখানে ছোট learning curve আর iso-FLOP তুলনা খুব কাজের। Model ছোট করার পদ্ধতি (quantization, distillation, pruning) পর্ব ৫৯-এ আসবে। আর একটি কথা: বাংলাদেশে এই কাজে সীমিত GPU একটি সাধারণ বাস্তবতা হতে পারে, তাই খরচ আগে হিসাব করার অভ্যাসটি এখানে আরও কাজের।
১০ · AI-এর যুগে scaling-এর দাবি পরীক্ষা করা
AI সহায়ক এই বিষয়ে দ্রুত সূত্র আর সংখ্যা দিতে পারে। সমস্যা হলো, এই বিষয়ের ভুলগুলো দেখতে ঠিক সঠিক উত্তরের মতোই। নিচের ভুলগুলো সাধারণত ঘটে:
| AI যা করতে পারে | কীভাবে ধরবেন |
|---|---|
| “Chinchilla প্রমাণ করেছে সবসময় ২০:১” | মূল paper-এর Table 3 আর limitation অংশ পড়ুন: নির্দিষ্ট পরীক্ষা, এক epoch-এর কম |
| ভুল সূচক বা বানানো citation | arXiv-এ গিয়ে সংখ্যাটি নিজের চোখে দেখুন |
| এক seed-এর fit থেকে নিশ্চিত সিদ্ধান্ত | একাধিক seed, bootstrap interval, আলাদা রাখা বিন্দু |
| Test ভাগ দেখে checkpoint বাছাই | Checkpoint বাছাই শুধু validation-এ |
পুরোনো API, যেমন torch.cuda.amp.autocast | আপনার torch version-এর নথি দেখে ছোট batch-এ চালান |
| “Model হঠাৎ বুঝতে শিখেছে” | আগে মেট্রিক আলাদা করুন; “বোঝে” কথাটি পরিমাপ নয় |
একটি scaling দাবি যাচাইয়ে সহায়ককে এভাবে কাজে লাগাতে পারেন। শেষের শর্ত দুটিই আসল: সূত্র ছাড়া উত্তর নয়, আর অজানা হলে “জানা নেই”।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১Kaplan বললেন compute বাড়লে প্রায় সবটা model-এ দিন, Chinchilla বলল N আর D সমান বাড়ান। দুই দলই পরিমাপ করেছে; তাহলে এত পার্থক্য কেন?
দুটি সূচকের জোড়া দেখুন। Kaplan-এর ফল Nopt ∝ C০.৭৩ আর Dopt ∝ C০.২৭. Chinchilla-র ফল প্রায় C০.৫০ আর C০.৫০. Compute ১০ গুণ বাড়লে প্রথম হিসাবে model প্রায় ৫.৪ গুণ, ডেটা ১.৮ গুণ; দ্বিতীয় হিসাবে দুটিই প্রায় ৩.২ গুণ। ২০২০–২০২২ সালে অনেক বড় model প্রায় ৩০০ বিলিয়ন token-এ শেখানো হতো, যা প্রথম হিসাবের সঙ্গে মানানসই।
Hoffmann আর সহলেখকেরা পার্থক্যের একটি কারণ নিজেরাই বলেন। Kaplan-এর দল সব run-এ একই সংখ্যক step আর একই learning-rate schedule রেখেছিল। তাই মাঝপথের loss দেখে “কম token-এ এই loss” ধরলে হিসাব পক্ষপাতী হয়, কারণ schedule তখনো শেষ হয়নি। Chinchilla দল দেখল, schedule-এর দৈর্ঘ্য token-এর সংখ্যার সঙ্গে মেলালে ফল ভালো হয়। তাঁরা বড় model-ও বেশি নিয়েছিলেন, যেখানে Kaplan-এর অনেক run ১০ কোটি parameter-এর নিচে ছিল।
আরেকটি সূক্ষ্ম পার্থক্য সংজ্ঞায়। Kaplan N থেকে embedding বাদ দেন, Chinchilla রাখেন। Kaplan-এর loss test set-এ, Chinchilla-র হিসাব মসৃণ training loss-এ, কারণ তাঁদের ডেটা এক পাসেও ফুরায় না। এই দাবিগুলো তাই হুবহু এক জিনিস মাপছে না।
পরে Sardana আর সহলেখকেরা দেখান, প্রচুর inference হলে বরং আরও ছোট model আর আরও বেশি ডেটা লাভজনক হতে পারে। অর্থাৎ “ভালো” নির্ভর করে আপনি কোন খরচ ধরছেন, তার ওপর।
মূল উপলব্ধি: পরিমাপের নকশা সিদ্ধান্তে ঢুকে পড়ে। একটি scaling সংখ্যা উদ্ধৃত করার আগে জিজ্ঞেস করুন: কী ধরে রাখা হয়েছিল, কোন loss, কোন খরচ, কোন আকারের সীমা।
প্র ০২Log-log ছবিতে রেখাটি সুন্দর সোজা। এটি কি প্রকৃতির নিয়ম, যা দিয়ে নিরাপদে ভবিষ্যৎ বলা যায়?
না। প্রথমত, Kaplan-এর Appendix C-তে লেখকেরা নিজেরাই বলেন, এই সম্পর্কগুলোর পাকা তাত্ত্বিক বোঝাপড়া তাঁদের নেই, আর সংশোধনগুলো না বুঝলে কোন অবস্থায় বিশ্বাস করা যাবে, তা ঠিক করা কঠিন। মূল অংশেই তাঁরা বলেন, শূন্য loss-এর আগে একসময় রেখা সমতল হতে বাধ্য।
দ্বিতীয়ত, log অক্ষ অনেক কিছু লুকায়। এক ঘর মানে ১০ গুণ, তাই একটি বিন্দু রেখা থেকে অল্প দূরে দেখালেও আসল পার্থক্য বড় হতে পারে। পরিসংখ্যানে এই সতর্কতা পুরোনো। Clauset, Shalizi আর Newman ২০০৭–২০০৯ সালের কাজে ২৪টি ডেটাসেট পরীক্ষা করেন, যেগুলোকে power law ভাবা হতো; কিছুতে ডেটা মিলেছে, কিছুতে বাদ পড়েছে। তাঁদের কাজ বণ্টন নিয়ে, ঠিক এই regression নিয়ে নয়, কিন্তু একটি কথা এখানেও খাটে: power law যে সীমায় খাটে, সেই সীমা বের করাই কঠিন।
তৃতীয়ত, রেখার ধরন ভাঙতে পারে। Caballero আর সহলেখকেরা ২০২২ সালে broken power law নামের একটি রূপ প্রস্তাব করেন, যা bend আর double descent-এর মতো আচরণ ধরতে পারে। Chinchilla-র লেখকেরা বড় বাজেটে সামান্য বক্রতা দেখেছেন। আমাদের ছোট পরীক্ষায় তো রেখা ডেটার সীমায় স্পষ্টই ভেঙেছে, যদিও এই পরীক্ষার আকার তাঁদের কাছে কিছুই নয়।
তবে fit অকেজো নয়। মাপা সীমার ভেতরে বাজেট ভাগ করা, পরের একটি ধাপ অনুমান করা, দুটি পদ্ধতি তুলনা করায় এটি কাজের। আবহাওয়ার পূর্বাভাসের মতো: কাছের সময়ে দরকারি, দূরে দুর্বল।
মূল উপলব্ধি: Fit হলো পরিমাপের সারসংক্ষেপ, নিয়ম নয়। যত দূরে টানবেন, তত বেশি অনুমান আপনি যোগ করছেন, আর সেই অনুমানের দায়ও আপনার।
প্র ০৩Emergent ক্ষমতা কি সত্যি, না কি মরীচিকা? দুই পক্ষের মধ্যে আসলে দ্বিমত কোথায়?
দুই পক্ষ অনেকটাই মিলে যায়। Wei-এর দল নিজেই লেখে, exact string match লম্বা উত্তরে ধাপে ধাপে উন্নতিকে emergence-এর মতো দেখাতে পারে। তাঁদের appendix-এ ছয়টি BIG-Bench কাজে দেখা যায়, downstream মেট্রিক যখন প্রায় random, cross-entropy তখনও কমছে। Schaeffer-এর দল এই পর্যবেক্ষণকে নিয়ে একটি পরীক্ষাযোগ্য অনুমানে নিয়ে যায়।
দ্বিমত তিন জায়গায়। এক, ব্যাখ্যা কতটা পূর্ণ। Wei-এর দলের মতে partial credit-হীন মেট্রিক বড়জোর অসম্পূর্ণ ব্যাখ্যা, কারণ অনেক classification কাজেও লাফ দেখা গেছে, আর মাঝের ধাপ হঠাৎ ঠিক হওয়ার কারণও এতে ব্যাখ্যা হয় না। Schaeffer-এর দলের উত্তর: Multiple Choice Grade নিজেই একটি ধাপ-ফাংশন, আর BIG-Bench-এর হাতে-চিহ্নিত emergent কাজের ৯২%-এর বেশি এই দুই ধরনের মেট্রিকে। দুই, পরিমাপের সূক্ষ্মতা: বেশি test প্রশ্নে তাঁরা GPT-3 পরিবারের ছোট model-এও শূন্যের ওপরে accuracy পেয়েছেন। তিন, অনুমানযোগ্যতা: Wei-এর দল বলে, cross-entropy দেখেও আগে থেকে সীমা বলা যায় না।
Schaeffer-এর দলও “কখনোই হতে পারে না” বলে না; তাঁরা স্পষ্ট লেখেন, বড় model emergent ক্ষমতা দেখাতে পারবে না, এমন দাবি তাঁরা করছেন না। তাঁদের সরাসরি পরীক্ষা মূলত পাটিগণিতে আর OpenAI API-র কয়েকটি model-এ (সঙ্গে BIG-Bench-এর পুনর্বিশ্লেষণ আর vision-এর উদাহরণ), আর স্বাধীনতার অনুমানটিও তাঁরা নিজেরাই “সত্য নয়” বলেছেন। এই পরীক্ষার আকার সব কাজের উত্তর দেয় না।
ব্যবহারিক দিক: এক মেট্রিকে লাফ দেখলে দাবি মানার আগে ধারাবাহিক মেট্রিক আর বড় test set চান। কিন্তু বাস্তব পণ্যে হুবহু মেলাই কখনো কখনো একমাত্র দরকারি ফল, যেমন মোবাইল ব্যাংকিংয়ের নম্বর: ১১ অঙ্কের ১০টি ঠিক হলেও টাকা ভুল জায়গায় যায়। সেখানে লাফটি মরীচিকা হলেও ব্যবহারকারীর অভিজ্ঞতা সত্যি।
মূল উপলব্ধি: প্রশ্নটি খোলা। ক্ষমতা আর তাকে মাপার পদ্ধতি আলাদা জিনিস; দুটি একসঙ্গে পরীক্ষা না করলে দাবি অর্ধেক থাকে।
প্র ০৪বাংলা language model-এর জন্য Chinchilla-র ২০ token প্রতি parameter কতটা কাজের? বাংলায় ডেটা কম হলে কী করা উচিত?
হিসাবটি সরাসরি বসালে একটি কঠিন সংখ্যা আসে। ৭০০ কোটি parameter-এর model-এর জন্য লাগে ১৪,০০০ কোটি আলাদা token. বাংলায় ঠিক কত ভালো মানের লেখা খোলা আছে, তার কোনো নির্ভরযোগ্য সংখ্যা আমাদের হাতে নেই, তাই আন্দাজ করব না। তবে মূল শর্তটি মনে রাখুন: Chinchilla-র সব run এক epoch-এর কম, অর্থাৎ ডেটা কখনো ফুরায়নি। ডেটা-সংকটে এই সংখ্যা খাটার কথা নয়।
এই অবস্থা নিয়েই Muennighoff আর সহলেখকদের ২০২৩ সালের কাজ, প্রায় ৪০০ run-এ। নির্দিষ্ট compute-এ প্রায় ৪ epoch পর্যন্ত একই ডেটা বারবার দেখালে loss প্রায় নতুন ডেটার মতোই থাকে, তারপর লাভ কমে, আর একসময় বাড়তি compute-এর লাভ প্রায় থাকে না। তবে তাঁদের model অনেক বড়, ডেটা ইংরেজি-প্রধান। আমাদের পরীক্ষায় অক্ষর-ভিত্তিক ছোট model অনেক বেশি পাস নিয়েছে, আর সেরা loss আসার পর মুখস্থ বেড়েছে; দুটি একই পরিস্থিতি নয়।
বিকল্পগুলোর আলাদা খরচ আছে। বহুভাষিক pretrained model ব্যবহার (পর্ব ৪৮ আর ৫৪-এর বিষয়), যেখানে অন্য ভাষার ডেটা ভাগের জ্ঞান দেয়। ছোট model আর regularization, যা আমাদের dropout run-এও দেখেছেন। Tokenizer বদল: অক্ষর আর BPE-তে একই লেখায় token সংখ্যা ভিন্ন, তাই “২০ token”-এর অর্থও বদলায় (পর্ব ৪০)। আর ডেটা সংগ্রহ: Hoffmann-এর দলও অনুমান করে যে ডেটা বাড়ানো লাভজনক শুধু মান ভালো হলে; অনুমতি আর ব্যক্তিগত তথ্যের প্রশ্নও আছে।
মূল উপলব্ধি: অন্যের অনুপাত নকল করবেন না। আপনার ভাষা আর tokenizer-এ আপনার মাপা learning curve-ই আপনার সিদ্ধান্তের ভিত্তি।
প্র ০৫Scaling কি শেষের দিকে? “Diminishing returns” বিতর্কে কোন প্রমাণ কোন দিকে যায়, আর কী জানা যায় না?
প্রথমে শব্দটি পরিষ্কার করি। Power law-এর গণিতেই diminishing return আছে: প্রতিবার ২ গুণ করলে loss একই অনুপাতে কমে, কিন্তু খরচ ২ গুণ বাড়ে। অতএব “লাভ কমছে” কথাটি নতুন খবর নয়। আসল প্রশ্ন, এই কমতে থাকা লাভ কাজের ফলে কতটা, আর কোন সীমায় ভাঙে।
চাপের দিকের যুক্তি: Villalobos আর সহলেখকেরা (সর্বশেষ সংস্করণ ২০২৪) ধারাগুলো একই থাকলে অনুমান করেন, ২০২৬ থেকে ২০৩২-এর মধ্যে প্রশিক্ষণের ডেটা খোলা মানবলেখার মোট মজুতের সমান হতে পারে। NeurIPS ২০২৪-এর বক্তৃতায় Ilya Sutskever pre-training-এর এই ধারা শেষ হবে বলে মত দেন বলে সংবাদে এসেছে; আমরা উদ্ধৃতিগুলো গৌণ সূত্র থেকেই দেখেছি, মূল বক্তৃতা নয়। শক্তির খরচও সামনে: Patterson আর সহলেখকেরা ২০২১ সালে GPT-3-এর training-এ প্রায় ১,২৮৭ MWh অনুমান করেন, যেখানে তাঁরা নিজেরাই বলেন, বিস্তারিত তথ্য ছাড়া এমন পেছন-ফেরা হিসাব কঠিন।
অন্য দিকের যুক্তি: Villalobos-এর দলই synthetic ডেটা, data-efficiency আর অন্য ক্ষেত্র থেকে transfer-এর সম্ভাবনার কথা বলে। Muennighoff-এর ফল বলে, ডেটা পুনরায় ব্যবহারে সীমা আছে, কিন্তু প্রথম কয়েক পাস প্রায় বিনামূল্যে। MoE আর retrieval-এর মতো নকশা কেবল N বাড়ানো ছাড়াও পথ দেয়।
কী জানা যায় না: GPT-4-এর technical report জানায়, এতে model-এর আকার, hardware, training compute, ডেটা আর পদ্ধতি নিয়ে বিস্তারিত নেই (২০২৬ সালের নভেম্বরে নথিতে যেমন দেখা গেছে)। ChatGPT, Gemini বা Claude-এর মতো বন্ধ পণ্যে বাইরে থেকে N, D, C বসিয়ে সূত্র পরীক্ষা করা তাই সম্ভব নয়। এই পরিস্থিতিতে “দেয়ালে ঠেকেছে” বা “কোনো সীমাই নেই”, দুই ধরনের জোর দাবিই বাইরের প্রমাণে দাঁড়ায় না। আমরা কোনো পূর্বাভাস দিচ্ছি না।
মূল উপলব্ধি: প্রতিটি দাবিতে জিজ্ঞেস করুন: কোন মেট্রিক, কোন N, D, C, কে মেপেছে, আর মূল তথ্য কি প্রকাশিত? উত্তর না থাকলে দাবিটি অনুমান।
অনুশীলন
আগে নিজে করুন, তারপর উত্তর মেলান।
-
ঢাল হাতে (সংখ্যার কাজ): N = ৯,৬৮০-এ L = ২.০৫৬, আর N = ৩৭,৭৯২-এ L = ১.৭১৯. α কত? N ২ গুণে loss কত গুণ? একই রেখায় N = ৫,৯৩,৫৩৬-এ অনুমান কত, আর মাপা ১.৬৬৬-এর সঙ্গে কী দেখেন?
ln(১.৭১৯/২.০৫৬) = −০.১৭৯, ln(৩৭,৭৯২/৯,৬৮০) = ১.৩৬২. তাই ঢাল −০.১৩১, α ≈ ০.১৩১. ২ গুণে 2−0.131 ≈ ০.৯১৩. অনুমান: ১.৭১৯ × (১৫.৭)−0.131 ≈ ১.৭১৯ × ০.৬৯৭ ≈ ১.২০. মাপা ১.৬৬৬, অর্থাৎ ভুল প্রায় ২৮%. কারণ এই সীমায় বাধা model-এর নয়, ডেটার।
-
আউটপুট অনুমান: কোড না চালিয়ে বলুন, নিচের দুই লাইন কী ছাপবে?
s = np.polyfit(np.log([10,100,1000]), np.log([4,2,1]), 1)[0] print(round(s, 3), round(2 ** s, 3))প্রতি ১০ গুণে y অর্ধেক। ঢাল = ln(১/২)/ln ১০ = −০.৩০১. আর 2−0.301 ≈ ০.৮১২. তাই ছাপা হবে
-0.301 0.812. অর্থাৎ x ২ গুণে y প্রায় ১৯% কমে। -
সমালোচনা করুন (নকশা): একটি ব্লগ লিখেছে: “আমরা ১০ লাখ parameter থেকে ১ কোটিতে গেলাম, accuracy ৪০% থেকে ৭০%. তাই ১০ কোটিতে গেলে ১০০% হবে। ৩০ প্রশ্নের test-এ model ২-তে ০ পেয়েছিল, মডেল ৩-এ হঠাৎ ৯০%: এটি emergent!” কোন প্রশ্ন করবেন?
- Accuracy সীমাবদ্ধ, রেখা টানা চলে না; সীমাসহ fit বা log-odds দেখা দরকার।
- N একা বেড়েছে, না D আর compute-ও? একবারের run, না একাধিক seed? Interval কই?
- ৩০ প্রশ্নের সূক্ষ্মতা ১/৩০, মানে ৩%. এই ০ থেকে ক্ষমতার অভাব প্রমাণ হয় না।
- Metric কী? ধারাবাহিক মাপে (loss, Brier) কী দেখা যায়? কতগুলো কাজের মধ্যে এটি বেছে নেওয়া (একাধিক তুলনা)?
- Train-test ভাগ পরিষ্কার? Model ৩ কি test-এর প্রশ্ন আগে দেখেছিল?
-
কোড:
runs_d.csvথেকে d = 32-এর D ≤ ৯৬,০০৭-এর run নিয়ে log-log fit করে পূর্ণ ডেটা D = ১,৯২,০১৪-এর loss অনুমান করুন, আর মাপা গড় ১.৭১৯-এর সঙ্গে মেলান।d = np.loadtxt("runs_d.csv", delimiter=",", skiprows=1) m = d[:, 0] <= 96007 s, b = np.polyfit(np.log(d[m, 0]), np.log(d[m, 2]), 1) print(round(s, 3), round(np.exp(b) * 192014 ** s, 3))এই পাতার সংখ্যায় আমরা পেয়েছি ঢাল −০.১২৮, অনুমান ১.৬৮৭, মাপা ১.৭১৯: ২% ভুল, এক ধাপের ভেতরে যথেষ্ট ভালো। Extrapolation এক ধাপে কাজ করে; ১০ ধাপে আলাদা কথা। আর d = 32-এ পূর্ণ ডেটায়ও model সীমায় পৌঁছেছে, তাই অনুমান কিছুটা আশাবাদী হওয়া স্বাভাবিক।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমনিজের ডেটায় একটি scaling সূত্র বের করার ধাপগুলো সাজান (▲▼ চেপে সরান)
- একই লেখা, একই tokenizer আর একই test ভাগ ঠিক করা
- একটি জিনিস (N বা D) বদলে কয়েকটি seed-এ model শেখানো
- log L বনাম log N-এর ওপর সরল রেখা fit করা
- Bootstrap দিয়ে ঢালের interval বের করা
- মাপা সীমার বাইরের একটি বিন্দু আলাদা রেখে অনুমান যাচাই করা
L = c·N−0.1 হলে parameter ১০ গুণ বাড়ালে loss প্রায় কত গুণ হয়?
- ০.১ গুণ
- প্রায় ০.৭৯ গুণ
- ০.৯০ গুণ
- প্রায় ১.২৬ গুণ
Chinchilla-র সূত্রে L = E + A/Nα + B/Dβ. এখানে E-এর কাজ কী?
- Model ছোট হওয়ার কারণে বাড়তি loss
- কম ডেটা দেখার কারণে বাড়তি loss
- লেখার নিজের অনিশ্চয়তা, যা কোনো model কমাতে পারে না
- Training-এর FLOP খরচ
৭ কোটি parameter-এর একটি model-কে ১৪০ কোটি token দেখিয়ে শেখালে C ≈ 6ND হিসাবে training-এর খরচ প্রায় কত?
- প্রায় 5.9×1017 FLOP
- প্রায় 9.8×1016 FLOP
- প্রায় 1.5×109 FLOP
- প্রায় 5.9×1023 FLOP
একটি model প্রতিটি token ০.৯ probability-তে ঠিক বলে। প্রতিটি অনুমান স্বাধীন ধরলে ১০ token-এর উত্তর হুবহু মেলার সম্ভাবনা কত?
- ০.৯০
- প্রায় ০.৮১
- ০
- প্রায় ০.৩৫
Wei আর সহলেখকদের ২০২২ সালের সংজ্ঞায় একটি ক্ষমতা কখন emergent?
- যখন model সেটি training-এ একবারও দেখেনি
- যখন সেটি ছোট model-এ নেই কিন্তু বড় model-এ আছে
- যখন model কাজটি সচেতনভাবে বোঝে
- যখন cross-entropy loss কমে
৫০ টেস্ট প্রশ্নে একটি ছোট model-এর exact-match ০%. এটি থেকে সবচেয়ে সতর্ক সিদ্ধান্ত কোনটি?
- Model-এ ক্ষমতাটি একেবারেই নেই
- Model আসলে কাজটি পারে, শুধু মেট্রিক ভুল
- আসল হার খুব ছোট হতে পারে; বেশি প্রশ্নে আর ধারাবাহিক মেট্রিকে মাপা দরকার
- শুধু seed বদলালেই উত্তর পাওয়া যাবে
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Power law log-log-এ সোজা রেখা; ঢাল −α মানে x ২ গুণে y × 2−α. ঢাল পড়ুন, রঙিন ভাষা নয়।
- Kaplan: বড় model, অল্প ডেটা। Chinchilla: N আর D প্রায় সমান হারে, প্রায় ২০ token প্রতি parameter, এক epoch-এর কম।
- Fit মাপা সীমার ভেতরে কাজের। বাইরে টানা আপনার অনুমান; সব সময় interval আর আলাদা রাখা বিন্দু দেখুন।
- Training-এর খরচ প্রায় 6·N·D FLOP, আর মেমরি প্রতি parameter-এ প্রায় ১৬ বাইট, activation আলাদা।
- Emergent দাবি মানে আগে মেট্রিক, test আকার আর ধারাবাহিক মাপ দেখা। প্রশ্নটি এখনো খোলা।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৫২ · LLM-এর ভেতরেপরবর্তী পর্বএকটি prompt-এর পুরো পথ।
- ডিপ লার্নিং, NLP আর Generative AI · কোর্স হোম৯১টি পর্বপুরো কোর্সের পথ।
- পর্ব ৩৬ · নিজে Transformer লেখাফিরে দেখুনএই পর্বের পরীক্ষায় ব্যবহৃত model.
- মেশিন লার্নিং · পর্ব ২১: Bootstrapপাশের কোর্সInterval কীভাবে কাজ করে, আর কোথায় ভুল করে।
- Computer Architecture & Digital Logicপাশের কোর্সFLOP, মেমরি আর hardware-এর সীমা।