إلى أسفل الوادي: Gradient Descent والخطوتان اللتان يتخطاهما الجميع
احسب الحدّ الأعلى الدقيق لمعدل التعلّم، ثم شاهد بحثًا قسريًا عبر 3,600 اتجاه يعيد اكتشاف gradient دون أن يُخبر به.
في هذه الصفحة
انتهى الفصل السابق عند وادٍ.
ليس واديًا مجازيًا: بل منحنى فعلي، loss مرسوم مقابل معامل واحد، يهبط ثم يعود إلى الصعود. ولم تُختر loss تحته لأنها مرتّبة — بل اشتُقت من عبارة عن الضجيج في القياسات، وخرج الخطأ التربيعي من الطرف الآخر نتيجةً لا اصطلاحًا.
إذًا لدينا تضاريس لها قاع، ولدينا سبب للاعتقاد بأن القاع هو المكان الصحيح. ما لا نملكه هو طريقة للوصول إليه.
يبني هذا الفصل تلك الطريقة، وهي الخوارزمية التي تدرّب كل نموذج في بقية هذه الدورة — كل واحد، بلا استثناء، وصولًا إلى النماذج ذات مئات المليارات من المعاملات. تتسع في نحو عشرين سطرًا. الجزآن الصعبان ليسا في تلك الأسطر العشرين، وهما الشيئان اللذان تتخطاهما تقريبًا كل الشروحات:
- لماذا علامة الطرح. التحديث يطرح gradient. كل درس يكتبها؛ وقليل جدًا يشرح لماذا يكون gradient هو الاتجاه الذي يصعد إلى أعلى، وهي الحقيقة الوحيدة التي تجعل علامة الطرح أكثر من فعل إيمان.
- ما حجم الخطوة. «الكبيرة جدًا تتباعد، والصغيرة جدًا بطيئة» عبارة صحيحة وعديمة الفائدة. هناك رقم دقيق، يمكن حسابه من loss، وهذا الفصل يحسبه مرتين — مرة لقطع مكافئ بسيط ومرة للبيانات الفعلية.
الإعداد، ولماذا لا يمكنك البحث فقط
رابط إلى القسم: الإعداد، ولماذا لا يمكنك البحث فقطإعادةً للصياغة حتى يقف هذا الفصل وحده: الأجزاء الثمانية من حزام النقل في الفصل 1، لكن مع سؤال مختلف. ليس اقبل أو ارفض — سيعود ذلك لاحقًا — بل تنبأ بوزن قطعة من عرضها.
import numpy as np
WIDTH = np.array([18.0, 19.5, 20.2, 21.0, 24.0, 25.5, 23.0, 26.0])
WEIGHT = np.array([47.0, 52.0, 49.0, 55.0, 61.0, 66.0, 70.0, 58.0])
x = WIDTH - WIDTH.mean() # 22.15 mm
y = WEIGHT - WEIGHT.mean() # 57.25 gالقياسات متمركزة، تمامًا كما في الفصل 1 ولسبب سيعود بعائد كبير قبل نهاية هذا الفصل. النموذج خط، ، وloss هي متوسط الخطأ التربيعي الذي اشتقه الفصل السابق:
معاملان. لماذا لا نجرب قيمًا كثيرة فقط؟ لنفعل ذلك فعلًا — شبكة من إلى ومن إلى ، بخطوات قدرها :
grid 501 x 1001 = 501,501 evaluations in 3.67 s
best found: a = 2.1000, b = -0.0000, L = 24.592450نصف مليون تقييم لتثبيت رقمين حتى منزلتين عشريتين — وتلك الثانية هي زمن حائط على جهاز واحد، لذلك قد تقع إعادة التشغيل في أي مكان بين ثلاث وست؛ عدد التقييمات والحد الأدنى هما الجزء القابل لإعادة الإنتاج. Gradient descent، في نهاية هذا الفصل، يحصل على أربع منازل عشرية في ثماني خطوات وعلى إجابة float64 كاملة في ست وثلاثين.
لكن السرعة ليست الحجة، وهذه هي النقطة التي تحسم الدورة كلها. يكلف بحث الشبكة تقييمًا من أجل معاملات عند قيم لكل منها. ومع ألف قيمة لكل محور:
| النموذج | المعاملات | تقييمات الشبكة |
|---|---|---|
| هذا الخط | 2 | |
| شبكة XOR في الفصل 5 | 9 | |
| شبكة صغيرة متعددة الطبقات | 20,000 |
الصف الثالث ليس رقمًا كبيرًا، بل رقم بلا معنى — هناك تقريبًا ذرة في الكون المرصود. البحث لا يصبح أبطأ مع نمو النماذج؛ بل يتوقف عن الوجود. كل ما يلي موجود بسبب ذلك الجدول.
المشتقة قياس يمكنك أخذه
رابط إلى القسم: المشتقة قياس يمكنك أخذهثبّت للحظة حتى يكون هناك معامل واحد ومنحنى واحد، وهي الصورة التي تركك معها الفصل السابق. خذ نقطة عليه، ، واسأل: إذا أزحت مقدارًا صغيرًا ، فكم تتحرك loss لكل وحدة إزاحة؟
هذه النسبة هي ارتفاع على امتداد — ميل الخط المستقيم المار بنقطتين على المنحنى. كلما صغر ، انزلقت النقطتان معًا وصار الخط مماسًا. ميله هو المشتقة : معدل تغيّر loss لكل وحدة تغيّر في . ليست تقريبًا لشيء، وليست كمية متناهية الصغر. إنها حد لنسب عادية.
يستحق الأمر تشغيله، لأن الأرقام تقول شيئًا لا يقوله التعريف:
def loss1(a):
return np.mean((a * x - y) ** 2)
for h in [1.0, 1e-2, 1e-4, 1e-6, 1e-8, 1e-10, 1e-12, 1e-14]:
q = (loss1(1.0 + h) - loss1(1.0)) / h
print(f"h = {h:<8.0e} slope estimate = {q:.10f} error = {abs(q + 16.385):.3e}")h = 1e+00 slope estimate = -8.9400000000 error = 7.445e+00
h = 1e-02 slope estimate = -16.3105500000 error = 7.445e-02
h = 1e-04 slope estimate = -16.3842555001 error = 7.445e-04
h = 1e-06 slope estimate = -16.3849925556 error = 7.444e-06
h = 1e-08 slope estimate = -16.3850003787 error = 3.787e-07
h = 1e-10 slope estimate = -16.3850444324 error = 4.443e-05
h = 1e-12 slope estimate = -16.3851154866 error = 1.155e-04
h = 1e-14 slope estimate = -17.0530256582 error = 6.680e-01يحدث شيئان هنا، وكلاهما أساسي.
الخطأ ليس متناسبًا بشكل مبهم مع — بل هو بالضبط . اقسم على مئة، فينقسم الخطأ على مئة، إلى أربع خانات معنوية في كل مرة. ذلك الثابت ليس زينة: إنه نصف المشتقة الثانية لـ loss، وهو أول ظهور لفكرة بعد قسمين من الآن — أن المنحنى قرب نقطة يبدو كخط زائد تصحيح متناسب مع .
ثم ينكسر النمط. تحت يصبح التقدير أسوأ، وعند يكون خاطئًا في الرقم الثاني. لم يحدث شيء رياضي؛ بل حدث صندوق الفاصلة العائمة من الفصل السابق. و يتفقان في أول عشرة أرقام، وطرحهما يدمّر تلك الأرقام، ثم القسمة على عدد صغير تضخم ما تبقى. هناك أفضل — هنا حول ، تقريبًا الجذر التربيعي لـ machine epsilon — والذهاب إلى أصغر من ذلك ليس أكثر حذرًا، بل أقل. تذكّر ذلك؛ فدالة في نهاية هذا الفصل تعتمد عليه.
الميل الدقيق، من التفاضل لا من القياس، هو . لذا يمكننا التوقف عن القياس والبدء في الاشتقاق.
التركيب، وقاعدة السلسلة
رابط إلى القسم: التركيب، وقاعدة السلسلةهذه هي الفكرة التي تُبنى عليها بقية الدورة، تُقال مرة واحدة بوضوح.
أن تركّب دالتين يعني أن تُدخل إحداهما في الأخرى: . لا أكثر.
الشبكة العميقة ليست مثل تركيب. إنها تركيب. الطبقة دالة؛ وتكديس الطبقات هو تركيبها؛ و«العمق» هو عدد الدوال في السلسلة. عندما يبني الفصل 5 شبكة، فهو يبني ولا شيء آخر. وهذا يعني أن أهم قاعدة تفاضل، لأغراضنا، هي التي تشتق تركيبًا:
المعدلات تتضاعف. إذا كان يتغير أسرع بثلاث مرات من ، وكان يتغير أسرع بمرتين من ، فإن يتغير أسرع بست مرات من . هذا هو المحتوى كله، ولهذا فإن إشارة تمر عائدة عبر عشر طبقات تُضرب في عشرة أرقام — ولهذا يقضي الفصل 6 قسمًا في ما يحدث عندما تكون تلك الأرقام كلها أقل قليلًا من واحد.
استخدمها على loss لدينا. اكتب الباقي ، بحيث . كل يعتمد على عبر الدالة الداخلية ، ومشتقتها . قاعدة السلسلة، حدًا بحد:
رموز المتعرجة تلك تشير إلى مشتقة جزئية: اشتق بالنسبة إلى متغير واحد وتعامل مع كل ما عداه كثابت. لا يحدث شيء جديد — إنه الحد نفسه كما من قبل، مأخوذًا على محور واحد. اجمع المشتقات الجزئية في متجه فتحصل على gradient:
عند النقطة يكون ذلك المتجه . رقمان. السؤال هو ماذا يعنيان، وهذه أول خطوة يتخطاها الجميع.
لماذا يشير gradient إلى أعلى
رابط إلى القسم: لماذا يشير gradient إلى أعلىGradient متجه من الميول على طول المحاور. هذا كل ما أثبتناه. ليس بديهيًا — ولا ينبغي أن يكون بديهيًا — أن تجميعها في متجه ينتج شيئًا يشير إلى مكان محدد.
لذا عرّف الشيء الذي نريده فعلًا. اختر متجه وحدة ، أي اتجاهًا. المشتقة الاتجاهية هي معدل تغير loss وأنت تمشي في ذلك الاتجاه:
تحوّل قاعدة السلسلة هذا إلى شيء قابل للحساب. المشي على طول يغيّر بمعدل و بمعدل ، وتُجمع المساهمات:
معدل التغير في أي اتجاه هو حاصل الضرب النقطي بين gradient وذلك الاتجاه. والآن الخلاصة، وهي سطر واحد من الهندسة. بكتابة الضرب النقطي مع الزاوية بين المتجهين،
لأن طوله 1. الشيء الوحيد الذي تتحكم فيه هو ، وهو أكبر ما يكون عند وأصغر ما يكون عند نصف دورة، درجة. إذًا:
- أشد صعود يكون على طول نفسه، والميل هناك يساوي بالضبط .
- أشد نزول يكون على طول ، والميل هناك .
- عموديًا على gradient، لا تتغير loss إطلاقًا. ولهذا تقطع خطوط خريطة الكنتور gradient بزوايا قائمة.
هذه هي علامة الطرح. ليست اصطلاحًا، ولا قلب إشارة اختاره أحدهم: اتجاه أسرع نقصان هو gradient السالب لأن يصغر عند نصف دورة، ولا سبب آخر.
وبما أن هذا ادعاء عن كل الاتجاهات، اختبره على كل الاتجاهات. خذ عينة من 3,600 اتجاه، واحد لكل عُشر درجة، وقِس كل واحد بإزاحة صغيرة:
theta = np.array([1.0, 4.0])
g = grad(theta)
print("gradient ", g)
print("its length ", np.linalg.norm(g))
print("its angle ", np.degrees(np.arctan2(g[1], g[0])) % 360, "degrees")
best = max(
((loss(theta + 1e-6 * u) - loss(theta - 1e-6 * u)) / 2e-6, np.degrees(ang))
for ang, u in (
(a, np.array([np.cos(a), np.sin(a)])) for a in np.arange(3600) * 2 * np.pi / 3600
)
)
print("steepest slope", best[0], "at", best[1], "degrees")gradient [-16.385 8. ]
its length 18.23371122399386
its angle 153.97598928042032 degrees
steepest slope 18.233709624837502 at 154.0 degreesبحث لا يعرف شيئًا عن gradients، عبر 3,600 اتجاه، يجد أشد صعود له عند 154.0 درجة — اتجاه gradient نفسه، ضمن دقة البحث البالغة 0.1 درجة. والميل الذي يجده هناك، 18.2337، هو طول gradient إلى ست خانات. النظرية ليست قصة عن معنى gradients؛ إنها حقيقة قابلة للقياس، وهذا هو القياس.
لماذا تساعد خطوة صغيرة إلى أسفل فعلًا
رابط إلى القسم: لماذا تساعد خطوة صغيرة إلى أسفل فعلًاالآن الخطوة الثانية التي يتخطونها. نعرف أي طريق هو الأسفل. لا يلزم من ذلك أن المشي في ذلك الطريق يخفض loss، لأن «الأسفل» عبارة عن إزاحة متناهية الصغر، والخطوة ليست متناهية الصغر.
الجسر هو الخطية المحلية. قرب نقطة، تكون الدالة الملساء مماسها زائد تصحيح:
هذا هو توسع تايلور من الرتبة الأولى. الجزء المهمل هو التقوس — المصطلح نفسه الذي جعل تقدير جدول الميل يخطئ بالضبط بمقدار . ضع فيه الخطوة التي ننوي أخذها، :
تنخفض loss بمقدار . كل جزء من ذلك غير سالب، لذا الوعد حقيقي — من أجل صغير بما يكفي، لأن الحد المهمل ينمو مثل وسيبتلعه في النهاية. هذه هي النظرية كلها. إليك الوعد يتحقق، ثم ينكسر:
eta = 0.2 promised 66.49364500 delivered -16.01619240 ratio -0.240868
eta = 0.1 promised 33.24682250 delivered 12.61936315 ratio 0.379566
eta = 0.01 promised 3.32468225 delivered 3.11840766 ratio 0.937957
eta = 0.001 promised 0.33246822 delivered 0.33040548 ratio 0.993796
eta = 0.0001 promised 0.03324682 delivered 0.03322620 ratio 0.999380
eta = 1e-05 promised 0.00332468 delivered 0.00332448 ratio 0.999938اقرأه من الأسفل. كلما صغر ، اقترب الهبوط المنجز من الموعود — النسبة 0.99938، ثم 0.99994 — وهذا هو صحة مبرهنة تايلور. اقرأه من الأعلى، وعند يكون «الهبوط» المنجز سالب ستة عشر. الخطوة ذهبت إلى أسفل وloss صعدت.
إذًا قاعدة التحديث هي
وتأتي معها شرط لا يذكره أحد، وهو أن صغير بما يكفي. صغير بما يكفي مقارنةً بـ ماذا بالضبط؟ هذا هو القسم التالي.
لمعدل التعلّم سقف، ويمكن حسابه
رابط إلى القسم: لمعدل التعلّم سقف، ويمكن حسابهابدأ بأبسط وادٍ موجود، ، حيث . خطوة واحدة من gradient descent هي
يُضرب الموضع في في كل خطوة. هذا متتالية هندسية، وللمتتاليات الهندسية قاعدة واحدة بالضبط: تنكمش عندما يكون المضاعِف أصغر من 1 بالقيمة المطلقة، وتنمو خلاف ذلك. لذا ، أي .
الحد يقع عند بالضبط. ليس «حوالي 1»، ولا «1 غالبًا كبير جدًا». عند يكون المضاعِف وتظل النقطة ترتد بين و إلى الأبد، لا تقترب ولا تهرب. تحته، تقارب؛ فوقه، تباعد. وينقسم المجال مرة أخرى عند ، حيث يغير المضاعِف إشارته: دونه يكون الاقتراب رتيبًا، وفوقه تتجاوز النقطة القاع وتتبادل الجانبين، وعند بالضبط يكون المضاعِف 0 وخطوة واحدة تهبط على الحد الأدنى.
أربعة أنظمة من أربعة أسطر جبر. اذهب واعبر الحدود بنفسك:
والآن الحالة المثيرة:
والآن القاعدة العامة، التي تخرج من الحجة نفسها. كان المضاعِف في الحقيقة ، وقرب حد أدنى تكون لـ loss متعددة المعاملات قيمة كهذه في كل اتجاه — القيم الذاتية لمصفوفة المشتقات الثانية. يجب أن يكون كل اتجاه مستقرًا في وقت واحد، لذلك يحدَّد السقف بالأكبر:
بالنسبة إلى ، ، السقف 1، وهذا ما اشتققناه للتو. وبالنسبة إلى الحزام لدينا، مصفوفة المشتقات الثانية هي حيث مصفوفة المدخلات ذات العمودين، وقيمها الذاتية 2 و14.89، لذا السقف هو . هذا تنبؤ بخمس خانات معنوية. اختبره:
lr=0.1343 -> L = 24.5924
lr=0.13431 -> L = 24.5924
lr=0.13432 -> L = 4707.8 BLEW UP
lr=0.13433 -> L = 4.00452e+16 BLEW UP
lr=0.1344 -> L = 1.18229e+107 BLEW UPخمس منازل عشرية من الاتفاق بين سطر من الجبر الخطي ومئة ألف تكرار من حلقة for.
وهنا يعود الفصل 1. كل ما سبق استخدم القياسات المتمركزة. شغّل الكود نفسه على المليمترات والغرامات الخام، فتكون القيم الذاتية 0.0298 و998.1 بدل 2 و14.89. ينهار السقف من 0.134 إلى 0.002004 — بالدقة نفسها، متقاربًا عند lr=0.002003 ومنفجرًا عند lr=0.002004.
أسوأ من السقف هو النسبة بين القيم الذاتية. يقيس عدد الشرط مدى ابتعاد الوادي عن الاستدارة: خندق طويل رفيع يفرض معدلًا صغيرًا بما يكفي للجدران الحادة، ثم يُمشى على أرض الخندق بذلك الزحف نفسه. ينتقل لدينا من 7.44 متمركزًا إلى 33,452 خامًا. ومع أفضل معدل تستطيع كل نسخة أخذه:
| الميزات | عدد الشرط | أفضل معدل | الخطوات للوصول إلى ضمن 1% من optimum |
|---|---|---|---|
| متمركزة | 7.44 | 0.1184 | 10 |
| مليمترات وغرامات خام | 33,452 | 0.0020037 | 79,513 |
البيانات نفسها، والكود نفسه، والإجابة نفسها في النهاية — وثمانية آلاف ضعف من العمل، لأن أحدًا لم يطرح المتوسط. في الفصل 1 كلف الإغفال نفسه perceptron عاملًا قدره ستة آلاف في epochs، وكان التشخيص هناك هندسيًا: البيانات عائمة بعيدًا عن الأصل. إنها الهندسة نفسها هنا بزي optimization، ولهذا فإن تطبيع المدخلات ليس نصيحة نظافة بل حساب.1
عشرون سطرًا
رابط إلى القسم: عشرون سطرًالم يحتج أي شيء أعلاه إلى مكتبة. هذا هو optimizer كاملًا.
def loss(theta):
a, b = theta
return np.mean((a * x + b - y) ** 2)
def grad(theta):
a, b = theta
residual = a * x + b - y
return np.array([np.mean(2 * residual * x), np.mean(2 * residual)])
def descend(theta, lr, steps):
theta = np.array(theta, dtype=float)
for _ in range(steps):
theta = theta - lr * grad(theta)
return theta
theta = descend([0.0, 0.0], lr=0.05, steps=60)
print(theta, loss(theta))[ 2.10040296e+00 -2.76445533e-15] 24.592448791134984إجابة least-squares المغلقة لهذه النقاط الثماني هي ، ، مع loss قدرها . وجدت الحلقة ذلك إلى ثماني خانات معنوية من دون أن تعرف أن صيغة مغلقة موجودة — وهذا مهم، لأنه من الفصل 5 فصاعدًا لن توجد واحدة.
المسار، لأن مشاهدته هي المقصود:
0 a=0.000000 b=0.000000 L=57.437500
1 a=1.563750 b=0.000000 L=26.736582
2 a=1.963288 b=-0.000000 L=24.732418
5 a=2.098116 b=-0.000000 L=24.592488
10 a=2.100400 b=-0.000000 L=24.592449
60 a=2.100403 b=-0.000000 L=24.592449تُقطع معظم المسافة في أول خطوتين، لأن gradient يكون أكبر عندما تكون أبعد ما تكون عن القاع، ثم يصغر مع الاقتراب. Gradient descent يبطئ تلقائيًا قرب حد أدنى. هذه ميزة، وهي أيضًا، في الفصل 6، مشكلة.
أين يكون الميل صفرًا أيضًا
رابط إلى القسم: أين يكون الميل صفرًا أيضًافي الحجة حتى الآن ثغرة. تتوقف الخطوة عندما ، وكنا نسمي ذلك «الحد الأدنى». النقطة ذات gradient صفر هي نقطة حرجة، وكونها حدًا أدنى ليس إلا إحدى طرق أن تكون كذلك:
- حد أدنى محلي: صعود في كل اتجاه، لكن ربما ليس أدنى نقطة من هذا النوع في أي مكان؛
- حد أقصى محلي: نزول في كل اتجاه؛
- نقطة سرج: صعود في بعض الاتجاهات ونزول في أخرى. السطح له ، وهو صفر عند الأصل، حيث تكون الدالة حدًا أدنى على محور وحدًا أقصى على محور في الوقت نفسه.
لا يستطيع gradient descent التمييز بينها، لأنه لا ينظر إلا إلى gradient، وgradient يساوي صفرًا عند الثلاثة.
للخط لدينا نقطة حرجة واحدة وهي الإجابة — loss خطأ تربيعي على نموذج خطي هي convex، وعاء واحد، وdescent عليها لا يمكن أن يفشل في إيجاد الحد الأدنى العالمي. هذه الخاصية لا تصمد عند الاصطدام بهذه الدورة. Loss الشبكة العصبية ليست convex، ومن الفصل 5 فصاعدًا لا يوجد شيء اسمه «الحد الأدنى»: هناك كثير منها، بأعماق مختلفة، وأي واحد تحصل عليه يعتمد على أين بدأت. هذه جملة واحدة وستبقى جملة واحدة، لأن النظرية كبيرة والنتيجة العملية صغيرة.
يمكنك رؤية النتيجة كلها على منحنى واحد. خذ ، وله واديان بعمقين مختلفين:
x = -1.046681 f(x) = -0.352386 minimum
x = 0.101031 f(x) = 0.005026 maximum
x = 0.945649 f(x) = -0.152639 minimumالهبوط في الوادي الضحل أسوأ في loss بنسبة 56.7%، ولا تملك الخوارزمية طريقة لمعرفة ذلك، لأن كل اتجاه من داخل وادٍ هو صعود. لا إصلاح لهذا في gradient descent، ولن يأتي إصلاح. الموجود عمليًا هو أن الأمر أقل أهمية بكثير مما توحي به هذه الصورة — في الأبعاد العالية جدًا لشبكة حقيقية يتضح أن معظم النقاط الحرجة سروج لا مصائد،2 والفصل 5 يقيس كم مرة تعلق شبكة صغيرة فعلًا.
خطوات أرخص: عشوائي، minibatch، momentum
رابط إلى القسم: خطوات أرخص: عشوائي، minibatch، momentumينبغي أن يزعجك شيء واحد في grad أعلاه: إنه يجمع على مجموعة البيانات كلها في كل خطوة. ثمانية أجزاء لا شيء. مليون يعني مليون حساب gradient لتحريك المعاملات مرة واحدة.
المخرج هو أن gradient متوسط، ويمكن تقدير المتوسط من عينة. احسبه على حفنة عشوائية — minibatch — وخذ خطوة عليها. التقدير صاخب؛ لكنه أيضًا غير متحيز، ومئات الخطوات الصاخبة الرخيصة تتفوق على خطوة دقيقة واحدة مكلفة. على مئة ألف قطعة اصطناعية، مع عدّ gradients لكل مثال بدل الخطوات:
| الطريقة | الخطوات للوصول إلى ضمن 0.1% من optimum | gradients لكل مثال |
|---|---|---|
| full batch | 7 | 700,000 |
| minibatch بحجم 32 | 100 | 3,200 |
| مثال واحد في كل مرة | 17,580 | 17,580 |
حساب أقل بمئتين وتسعة عشر مرة للوصول إلى المكان نفسه. والطرف الأقصى — مثال واحد في كل مرة، وهو التقريب العشوائي الأصلي لروبنز ومونرو3 — ليس الفائز: إنه أسوأ بخمس مرات من دفعات 32، لأن 32 مثالًا لا تكلف أكثر تقريبًا من مثال واحد على عتاد يضرب المصفوفات، بينما ينخفض الضجيج مع الجذر التربيعي لحجم الدفعة. هذه المفاضلة هي سبب وجود batch_size في كل سكربت تدريب ستقرأه.
Momentum هو الإصلاح الرخيص الآخر، وهو مصوّب مباشرة إلى الخندق. في وادٍ سيئ التكييف تتعرج الخطوات عبر الاتجاه الضيق بينما تزحف على الاتجاه الطويل. يحتفظ Momentum بمتوسط جارٍ لـ gradients الماضية، فتتلاشى المكونات المتذبذبة ويتراكم المكون المتسق:4
سطران إضافيان. على الحزام الخام غير المتمركز — عدد شرط 33,452، أسوأ حالة لدينا — عند أفضل معدل يمكن لـ descent العادي أخذه:
momentum beta=0.0 -> 79,513 steps to 1%
momentum beta=0.9 -> 1,609 steps to 1%
momentum beta=0.99 -> 461 steps to 1%عامل 172 مقابل سطرين من الكود. يحوّل الفصل 6 هذا إلى Adam؛ الآلية موجودة هنا بالفعل.
الفحص الذي ستحتاجه في الفصل 5
رابط إلى القسم: الفحص الذي ستحتاجه في الفصل 5كل gradient في هذا الفصل اشتُق يدويًا، وبالتالي قد يكون خاطئًا. الإصلاح هو جدول الميل من البداية: قِس المشتقة عدديًا وقارن. استخدم الفرق المركزي، ، لأنه يلغي حد الخطأ الرائد ويكون أدق بكثير عند نفسه.
def numeric_grad(f, theta, h=1e-5):
theta = np.asarray(theta, dtype=float)
out = np.zeros_like(theta)
for i in range(theta.size):
bump = np.zeros_like(theta)
bump[i] = h
out[i] = (f(theta + bump) - f(theta - bump)) / (2 * h)
return out
def gradcheck(f, df, theta, h=1e-5):
analytic = np.asarray(df(theta), dtype=float)
numeric = numeric_grad(f, theta, h)
return np.max(np.abs(analytic - numeric) / np.maximum(1e-8, np.abs(analytic) + np.abs(numeric)))الصيغة النسبية للمقارنة مهمة: فرق مطلق قدره كارثة على gradient حجمه ، ولا يهم على واحد حجمه .
relative error: 1.8929136036763527e-11
with 2 dropped: 0.33333333331650744السطر الأول هو gradient المشتق يدويًا أعلاه. الثاني هو الدالة نفسها مع ترك عامل 2 خارج مكون واحد — خطأ مطبعي من حرف واحد — ويمسكه الفحص فورًا. أي شيء تحت نحو هو اتفاق؛ وأي شيء فوق هو علة. احتفظ بهذه الدالة: يستخدمها الفصل 5 لتصحيح محرك automatic differentiation، وهي السبب الوحيد الذي يجعل العثور على gradient خاطئ ممكنًا أصلًا.
إلى أين يذهب هذا بعد ذلك
رابط إلى القسم: إلى أين يذهب هذا بعد ذلككل شيء في هذا الفصل استند إلى افتراض لم يُذكر قط: أنك تستطيع كتابة .
بالنسبة إلى خط ذي معاملين، كان ذلك سطر جبر. ويتوقف عن كونه كذلك تقريبًا فورًا. اطلب من نظام جبر رمزي مشتقة loss شبكة بالنسبة إلى وزن واحد في الطبقة الأولى، من أجل مثال واحد، وعدّ العمليات الحسابية في الإجابة:
| الشبكة | العمليات في مشتقة جزئية واحدة |
|---|---|
| أربع وحدات مخفية، طبقة واحدة | 40 |
| أربع وحدات مخفية، طبقتان | 301 |
| أربع وحدات مخفية، ثلاث طبقات | 1,717 |
الصف الثالث شبكة ذات 57 معاملًا — شبكة صغيرة جدًا لدرجة أنها ستكون حاشية في الفصل 6 — وكتابة gradient لها يدويًا تعني نحو 97,869 عملية لمثال تدريب واحد. لا توجد صياغة رمزية تنقذ هذا. ما ينقذه هو ملاحظة أن قاعدة السلسلة المطبقة على تركيب تملك بنية هائلة، وأن الكميات الوسيطة نفسها تظهر مرارًا، وأن حسابها بالترتيب الصحيح يعطي كل المشتقات تقريبًا بثمن تمريرة أمامية واحدة. هذا هو الفصل 5.
لكن هناك مشكلة أصغر أولًا، وهي تنتظر فورًا.
لدينا الآن آلة ستتدحرج إلى أسفل على أي loss قابلة للاشتقاق. وجّهها إلى سؤال الحزام الأصلي — اقبل أو ارفض، هدفه 1 أو 0 — وضع sigmoid على الخرج حتى يتنبأ باحتمال، وقلّل الخطأ التربيعي. ستعمل. لكنها بالكاد ستتحرك عندما تكون أكثر خطأً، وgradient يشرح السبب:
| الخرج | التنبؤ | الحقيقة | gradient مع الخطأ التربيعي | gradient مع cross-entropy |
|---|---|---|---|---|
| 0.5000 | 1 | |||
| 0.1192 | 1 | |||
| 0.0025 | 1 | |||
| 1 |
نموذج مخطئ بثقة وبشكل كارثي — يتنبأ بـ 0.0000454 عندما تكون الإجابة 1 — ينتج gradient للخطأ التربيعي قدره . لا فكرة لديه أنه في ورطة. العمود الآخر، من loss لم نشتقها بعد، يبلغ 1.0: أقصى إلحاح، بالضبط حيث يستحق.
وهذا يطرح السؤال الذي يبدأ به الفصل التالي. قال الفصل السابق إن loss افتراض عن الضجيج، وإن الخطأ التربيعي يفترض ضجيجًا Gaussian. ما نموذج الضجيج لإجابة نعم أو لا — وما loss التي تخرج عندما تُجري الاشتقاق نفسه عليها؟
المصادر والمنهج
رابط إلى القسم: المصادر والمنهجالطريقة أقدم من كل هذه: وصفها Cauchy في مذكرة إلى Académie des Sciences عام 1847، كطريقة لحل أنظمة المعادلات بالمشي إلى أسفل على مجموع مربعات بواقيها. ومن المفيد أيضًا القراءة إلى جانب هذا الفصل: مقال Sebastian Ruder بعنوان An overview of gradient descent optimization algorithms (arXiv:1609.04747)، الذي يغطي momentum وصولًا إلى Adam في أربع عشرة صفحة سهلة القراءة؛ والفصل 3 من كتاب Nocedal وWright Numerical Optimization (الطبعة الثانية، Springer، 2006)، حيث تعطي المبرهنة 3.3 معدل تقارب steepest descent على دالة تربيعية بدلالة عدد الشرط — إنها النظرية وراء سبب أن التكييف يحدد عدد الخطوات، رغم أنها تعالج line search بدل سقف ذي الخطوة الثابتة المقاس أعلاه، أو §5.8 و§7.1 من كتاب Deisenroth وFaisal وOng Mathematics for Machine Learning للمجال نفسه بأدوات أقل؛ و§6.1 من كتاب Prince Understanding Deep Learning و§4.3 من كتاب Goodfellow وBengio وCourville Deep Learning؛ وDive into Deep Learning §12.1–12.3، الذي يقدم تحليل minibatch بقياسات أكثر مما تتسع له المساحة هنا؛ والفصل 4 من كتاب Géron Hands-On Machine Learning (الطبعة الثالثة)، وهو المعالجة الأكثر عملية لمعدل التعلّم باعتباره شيئًا تضبطه بدل أن تشتقه. تضع ملاحظات MIT 6.390 gradient descent قبل التصنيف، كما تفعل هذه الدورة، وللسبب نفسه.
المراجع
رابط إلى القسم: المراجع-
LeCun, Y., Bottou, L., Orr, G. B. and Müller, K.-R. Efficient BackProp, in Neural Networks: Tricks of the Trade (Springer, 1998), pp. 9–50. يقدّم القسم 4.3 التوصية، ويقدّم القسم 5.1 الحجة المستخدمة في صندوق التفاصيل أعلاه: تمركز المدخلات وتحجيمها يغيران القيم الذاتية لمصفوفة المشتقات الثانية، وبالتالي عدد الخطوات، لا مجرد الراحة العددية. ↩
-
Dauphin, Y. N., Pascanu, R., Gulcehre, C., Cho, K., Ganguli, S. and Bengio, Y. Identifying and attacking the saddle point problem in high-dimensional non-convex optimization, arXiv:1406.2572 (2014). الحجة أن النقاط الحرجة في الأبعاد العالية تكون بأغلبية ساحقة سروجًا لا حدودًا دنيا محلية، لأن الحد الأدنى يتطلب أن ينحني كل واحد من آلاف الاتجاهات إلى أعلى في الوقت نفسه. ↩
-
Robbins, H. and Monro, S. A Stochastic Approximation Method. Annals of Mathematical Statistics 22(3), pp. 400–407 (1951). الورقة التي أثبتت أن تقديرًا صاخبًا لـ gradient يكفي، إذا كان حجم الخطوة ينكمش بالطريقة الصحيحة. ↩
-
Polyak, B. T. Some methods of speeding up the convergence of iteration methods. USSR Computational Mathematics and Mathematical Physics 4(5), pp. 1–17 (1964). طريقة الكرة الثقيلة، وهي تحديث momentum أعلاه، قبل اثنين وعشرين عامًا من وصول backpropagation إلى هذا المجال. ↩