Optimizers, step by step


Optimizer
Landscape
Learning rate
Batch size (SGD)
Move
The loss for every choice of w and b: darker is worse, × is the best line. Each dot is one step. Gray arrow: straight downhill. Colored arrow: the step the optimizer will take next. Click anywhere to start from there.
The 20 data points and the line for the current w and b. Dashed: the best line. With SGD, the ringed points are the batch for the next step.
The loss curve: how far the loss (MSE) is above the best line's MSE, after every step. The scale is logarithmic, so each gridline is 10× smaller than the one above. Dashed: the bottom, 0.01 above the best.

মূল ধারণা।
পাতার model-টি একটি সরলরেখা, y = w·x + b। এতে দুটি সংখ্যা আছে যা আপনি বদলাতে পারেন:
• w হলো slope, রেখাটি কতটা খাড়া।
• b হলো intercept, রেখাটি y অক্ষকে কোথায় ছেদ করে।
w-এর একটি মান আর b-এর একটি মান বেছে নিলে ঠিক একটি রেখা পাবেন। যেকোনো একটি বদলালে অন্য একটি রেখা পাবেন। loss হলো 20টি পয়েন্টের ওপর গড় বর্গ ভুল। training মানে সবচেয়ে নিচু জায়গাটি, অর্থাৎ ×, খুঁজে বের করা।

একটি optimizer পুরো মানচিত্র দেখতে পায় না। সে কেবল জানে সে কোথায় দাঁড়িয়ে আছে, আর gradient: সেখানে কোন দিকটা চড়াই, এবং কতটা খাড়া। এই পাতার প্রতিটি optimizer হলো সেই একটি তথ্যকে একটি ধাপে পরিণত করার একটি নিয়ম।

চারটি নিয়ম।
Gradient descent: ধাপ = −learning rate × gradient, যেখানে gradient হিসাব করা হয় 20টি পয়েন্টের সবগুলো থেকে।
SGD (stochastic gradient descent): একই নিয়ম, কিন্তু প্রতিটি ধাপের gradient আসে পয়েন্টগুলোর একটি ছোট এলোমেলো batch থেকে। এটি সস্তা আর বেশি noisy। বাস্তব ডেটাসেটে লক্ষ লক্ষ পয়েন্ট থাকে, তাই বাস্তবে এটিই ব্যবহার করা হয়।
Momentum: একটি চলমান velocity রাখে, 0.9 × পুরোনো velocity + gradient, আর সেই দিকে ধাপ ফেলে। যে দিকগুলো ধাপের পর ধাপ একমত থাকে সেগুলো গতি সঞ্চয় করে; যে দিকগুলো আগে-পিছে উল্টে যায় সেগুলো একে অপরকে কাটাকাটি করে।
Adam: momentum, সঙ্গে প্রতিটি weight-এর জন্য আলাদা ধাপের মাপ। এটি প্রতিটি weight-এর গড় gradient-কে সেই weight-এর সাম্প্রতিক gradient-গুলোর সাধারণ মাপ দিয়ে ভাগ করে, তাই একটি খাড়া দিক আর একটি অগভীর দিক দুটিই প্রতি ধাপে মোটামুটি এক learning rate করে সরে।
এখানে Momentum ও Adam 20টি পয়েন্টের সবগুলো ব্যবহার করে, তাই আপনি শুধু তাদের নিয়মটিই দেখেন। বাস্তব training-এ তারাও batch ব্যবহার করে।

যা চেষ্টা করে দেখার মতো:
1. Round bowl-এ Gradient descent। default learning rate 0.03-এ তলায় পৌঁছাতে (সেরা loss-এর 0.01-এর মধ্যে) 54 ধাপ লাগে। learning rate টেনে 0.5 করুন, ঠিক এক ধাপেই পৌঁছে যায়। 1-এ এটি তলার ওপর দিয়ে লাফিয়ে উল্টো পাশে চলে যায়, তারপর ফিরে আসে, চিরকাল।

2. Stretched bowl-এ Gradient descent। এটি একই ডেটা, শুধু x পাঁচগুণ বড় স্কেলে মাপা, তাই loss b-এর চেয়ে w-এ অনেক বেশি খাড়া। পথটি সরু দিক জুড়ে আঁকাবাঁকা চলে, আর লম্বা দিক ধরে ধীরে এগোয়। খাড়া দিকটিই গতিসীমা ঠিক করে: এখানে 0.04 হলো সবচেয়ে বড় learning rate যা blow up করে না, যেখানে round bowl-এ তা 1।

3. একই stretched bowl-এ Adam। এর প্রথম ধাপ w ও b দুটিতেই ঠিক 0.2 সরে, প্রতিটি যত খাড়াই হোক, তাই এটি সরু দিক জুড়ে আঁকাবাঁকা চলে না। slider-এ যেকোনো learning rate, তিনটি landscape-এর যেকোনোটিতে চেষ্টা করুন: Adam কখনো blow up করে না। শুধু গতির চেয়েও এই ক্ষমাশীলতাই Adam-কে সাধারণত প্রথম পছন্দ করে তোলে।

4. Tilted valley: একই ডেটা, সরিয়ে x = 3-এর আশেপাশে বসানো। এখন w ও b জট পাকিয়ে গেছে, আর উপত্যকাটি তেরছাভাবে চলে গেছে। gradient descent দ্রুত উপত্যকার মেঝেতে নামে, তারপর তার ওপর দিয়ে হামাগুড়ি দেয়: 455 ধাপ। Momentum মেঝে ধরে গতি সঞ্চয় করে আর নেয় 120। Adam নেয় 165: এর প্রতি-weight ধাপের মাপ কেবল অক্ষ বরাবর চলা উপত্যকার সঙ্গেই মেলে, আর এটি তেমন নয়।

5. round bowl-এ SGD, batch size বদলে। বৃত্ত-ঘেরা পয়েন্টগুলো পরের ধাপের batch, আর ধাপের তীরটি সোজা ঢালের দিক থেকে সরে দুলতে থাকে। SGD কখনো ঠিকঠাক থিতু হয় না, তলার চারপাশে কাঁপতে থাকে। 2001 থেকে 3000 ধাপ পর্যন্ত মাপলে, সেরা loss-এর ওপরে সাধারণ দূরত্ব ছিল 1টি পয়েন্টে 0.0050, 4টিতে 0.0013, আর 10টিতে 0.0002। stretched bowl-এ 1-এর batch 433 ধাপ পরে blow up করে: দূরের একটি পয়েন্ট গড়ের চেয়ে অনেক বেশি খাড়া হতে পারে।

6. একই শুরু থেকে Race all four, প্রত্যেকে নিজের learning rate-এ। তলায় পৌঁছাতে ধাপ: round bowl 54, 56, 14, 15 (gradient descent, SGD, momentum, Adam); stretched bowl 32, 35, 44, 45; tilted valley 455, 472, 120, 165। কোনো optimizer সব জায়গায় জেতে না।

7. round bowl-এ race চলার সময় loss curve দেখুন। 500 ধাপ জুড়ে, শুধু যতক্ষণ loss সেরার চেয়ে 0.0001-এর বেশি ওপরে থাকে ততক্ষণ গুনে: gradient descent-এর loss একবারও বাড়ে না। momentum-এর বাড়ে 34 ধাপে আর Adam-এর 32 ধাপে; প্রতিটি উত্থান মানচিত্রে × ছাড়িয়ে যাওয়ার একটি overshoot। SGD-এর বাড়ে 225 ধাপে এবং কখনো থিতু হয় না: 100 ধাপের পর এটি ড্যাশ দেওয়া রেখার ঠিক নিচে লাফাতে থাকে, 0.0087 পর্যন্ত, যখন বাকি তিনটি মেঝেতে বসে থাকে। এটিই batch-এর noise।