অধ্যায় 3 · ক্যালকুলাস: মডেল কীভাবে শেখে
exp, log, সিগময়েড, সফটম্যাক্স ও লস ফাংশন
- পৃষ্ঠা 8 / 17
- 3 মিনিট পড়া
মডেল কাঁচা স্কোর দেয়। সেগুলো ব্যবহার করতে আরও দুটো হাতিয়ার লাগে: স্কোরকে সম্ভাবনায় বদলানোর ফাংশন, আর অনুমান কতটা ভুল তা মাপার লস ফাংশন। দুটোই গড়া স্কুলে দেখা দুটো ফাংশন দিয়ে: exp আর log।
exp আর log
import numpy as np
print(np.exp([0, 1, 2]).round(3)) # e⁰, e¹, e²
print(np.log([1, np.e, 100]).round(3)) # log, exp-কে উল্টে দেয়
print(round(np.log(0.9 * 0.8), 4), round(np.log(0.9) + np.log(0.8), 4)) # log গুণকে যোগে বদলায়[1. 2.718 7.389]
[0. 1. 4.605]
-0.3285 -0.3285exp(x)= eˣ, যেখানে e ≈ ২.৭১৮। এটা সবসময় ধনাত্মক আর খুব দ্রুত বাড়ে — যেকোনো স্কোরকে ধনাত্মক সংখ্যায় বদলাতে কাজে লাগে।log(ন্যাচারাল লগ)exp-কে উল্টে দেয়: log(e) = ১, log(১) = ০। এটা গুণকে যোগে বদলায়। অনেকগুলো ছোট সম্ভাবনা গুণ করলে কম্পিউটারের পক্ষে অতি ক্ষুদ্র সংখ্যা আসে, তাই মডেল তার বদলে লগগুলো যোগ করে।
সিগময়েড: স্কোর থেকে সম্ভাবনা
সিগময়েড যেকোনো সংখ্যাকে ০ থেকে ১-এর মধ্যে চেপে আনে, তাই সেটাকে "হ্যাঁ"-এর সম্ভাবনা হিসেবে পড়া যায়। স্কোর ০ মানে ৫০/৫০; বড় ধনাত্মক স্কোর ১-এর কাছে যায়:
sigmoid(z) = 1 / (1 + e⁻ᶻ)সফটম্যাক্স: অনেক শ্রেণির স্কোর
দুইয়ের বেশি পছন্দ থাকলে সফটম্যাক্স স্কোরের একটা তালিকাকে (যাদের বলে লজিট) এমন সম্ভাবনায় বদলায়, যেগুলো সব ধনাত্মক আর যোগফল ১। বড় স্কোর বড় ভাগ পায়। প্রতিটা ক্লাসিফায়ারের শেষ ধাপ এটা — আর পরের শব্দ বাছাই করা প্রতিটা ল্যাঙ্গুয়েজ মডেলেরও (পাতা ১৫)।
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def softmax(z):
e = np.exp(z - np.max(z)) # সর্বোচ্চটা বিয়োগ করলে ওভারফ্লো এড়ানো যায়; ফলাফল একই
return e / e.sum()
print(sigmoid(np.array([-4, -1, 0, 1, 4])).round(3))
scores = np.array([2.0, 1.0, 0.1]) # তিনটা শ্রেণির কাঁচা স্কোর ("লজিট")
probs = softmax(scores)
print(probs.round(3), probs.sum().round(3))[0.018 0.269 0.5 0.731 0.982]
[0.659 0.242 0.099] 1.0লস ফাংশন: মডেল কতটা ভুল?
ট্রেনিংয়ের দরকার একটা সংখ্যা, যা ছোট করতে হবে। সবচেয়ে বেশি দেখবেন এই দুটো:
- সংখ্যা অনুমানের জন্য (দাম, নম্বর) মিন স্কোয়ার্ড এরর (MSE): পার্থক্যের বর্গগুলোর গড়। বর্গ করায় বড় ভুল ছোট ভুলের চেয়ে অনেক বেশি গোনা হয়।
- শ্রেণি অনুমানের জন্য ক্রস-এনট্রপি (একে লগ লস-ও বলে): সঠিক উত্তরে মডেল যে সম্ভাবনা দিয়েছে তার লগের ঋণাত্মক।
import numpy as np
# মিন স্কোয়ার্ড এরর: সংখ্যা অনুমানের জন্য
actual = np.array([3.0, 5.0, 2.0])
predicted = np.array([2.5, 5.5, 4.0])
print("MSE:", np.mean((predicted - actual) ** 2))
# ক্রস-এনট্রপি (লগ লস): সম্ভাবনাসহ একটা শ্রেণি অনুমানের জন্য
# সঠিক উত্তর শ্রেণি 0। প্রতিটা অনুমানে কত লস?
for p_correct in [0.9, 0.6, 0.1, 0.01]:
print(f"model gave the right class p = {p_correct:<4}: loss = {-np.log(p_correct):.2f}")MSE: 1.5
model gave the right class p = 0.9 : loss = 0.11
model gave the right class p = 0.6 : loss = 0.51
model gave the right class p = 0.1 : loss = 2.30
model gave the right class p = 0.01: loss = 4.61দেখুন ক্রস-এনট্রপি কেমন আচরণ করে। আত্মবিশ্বাসী আর সঠিক (০.৯): প্রায় কোনো লস নেই। অনিশ্চিত (০.৬): কিছুটা লস। আত্মবিশ্বাসী আর ভুল — সঠিক শ্রেণিকে মাত্র ০.০১ — খরচ ৪.৬১, সঠিক হওয়ার চল্লিশ গুণ। মডেলকে ঠিক এটাই শেখানো দরকার: আত্মবিশ্বাস নিয়ে ভুল কোরো না। ল্যাঙ্গুয়েজ মডেলও এই লস দিয়েই ট্রেন হয়, আসল পরের টোকেনকে দেওয়া সম্ভাবনার ওপর।
নিজে চেষ্টা করুন
sigmoid(0)কত, আর সেটা কেন যুক্তিসঙ্গত?- সফটম্যাক্সের আগে প্রতিটা স্কোরে ১০ যোগ করুন। সম্ভাবনা কি বদলায়? কেন?
- মডেল সঠিক শ্রেণিকে ১.০ সম্ভাবনা দিলে ক্রস-এনট্রপি লস কত?