الـ Gradient Descent
أهم درس في المرحلة دي، وأساس كل الـ Deep Learning.
الجبل والضباب
تخيل إنك فوق جبل والضباب كثيف ومش شايف حاجة، وعايز توصل لأوطى نقطة في الوادي. هتعمل إيه؟ هتحس الأرض تحت رجلك، وتشوف أنهي اتجاه نازل، وتاخد خطوة فيه. وتكرر. ده بالظبط الـ Gradient Descent.
loss رقم بيقيس الموديل غلطان قد إيه. الجبل هو الـ loss، وعايزين نوصل لأقل قيمة.gradient متجه فيه المشتقة بالنسبة لكل weight. بيشاور على اتجاه الطلوع.learning rate حجم الخطوة اللي بتاخدها كل مرة.partial derivative مشتقة بالنسبة لمتغير واحد مع تثبيت الباقي.موديل بيتعلم قدام عينك
عندنا شقق، ومساحتها (بالـ ١٠٠ متر) وسعرها (بالمليون). عايزين الموديل يكتشف لوحده «كل ١٠٠ متر بكام مليون». هنبدأ بتخمين غلط خالص w = 0 ونسيبه يتعلم:
areas = [0.8, 1.0, 1.2, 1.5] # in 100 m2 prices = [1.6, 2.0, 2.4, 3.0] # in millions EGP w = 0.0 # the model's guess: price = w * area lr = 0.1 # learning rate n = len(areas) for step in range(1, 31): # loss = mean squared error errors = [w * x - y for x, y in zip(areas, prices)] loss = sum(e ** 2 for e in errors) / n # gradient of the loss with respect to w grad = sum(2 * e * x for e, x in zip(errors, areas)) / n w = w - lr * grad if step in (1, 5, 10, 20, 30): print(f"step {step:2}: w = {w:.3f}, loss = {loss:.4f}")
الموديل بدأ من صفر، وكل خطوة الـ loss بيقل، لحد ما وصل لـ w = 2 تقريباً، يعني «كل ١٠٠ متر بـ ٢ مليون». محدش قاله الرقم ده، هو اتعلمه من الداتا.
حجم الخطوة بيفرق جداً
lr = 0.01 # after 30 steps: w = 1.111 (target is 2.0)
بطيء جداً. الخطوات صغيرة فالموديل محتاج وقت طويل عشان يوصل.
لما يبقى فيه أكتر من weight
موديل حقيقي فيه ملايين الأوزان. الفكرة هي هي: بنحسب partial derivative للـ loss بالنسبة لكل وزن لوحده، ونحطهم كلهم في متجه واحد هو الـ gradient، ونحرك كل الأوزان مع بعض.
الـ Chain Rule في جملة واحدة
في الشبكة العصبية الداتا بتعدي على طبقات ورا بعض. عشان تعرف وزن في أول طبقة أثّر على الغلط في الآخر قد إيه، بتضرب تأثير كل طبقة في اللي بعدها. زي تروس الساعة: لو الترس الأول بيلف الترس التاني مرتين، والتاني بيلف التالت ٣ مرات، يبقى الأول بيلف التالت ٦ مرات. التطبيق ده على الشبكة كلها اسمه Backpropagation.
loss.backward() ده بيحسب الـ gradient بالـ chain rule، و optimizer.step() بياخد الخطوة. انت كده فاهم قلب الـ Deep Learning.