پرش به محتوا
6/30فصل 6 از 30

وادار کردن شبکه به آموزش، و وادار کردنش به تعمیم

شبکه‌ای شش‌لایه که loss آن از ln 2 تکان نمی‌خورد، مرحله‌به‌مرحله درست می‌شود؛ سپس double descent با 5,000 پارامتر روی 40 نقطه.

در این صفحه

شبکه‌ی فصل 5 کار می‌کند. نه پارامتر دارد، XOR را یاد می‌گیرد، و gradientهایش تا شانزده رقم اعشار با PyTorch یکی است.

آن را شش لایه عمیق کنید و کاملاً از یادگیری می‌ایستد. نه کند — کاملاً. اینجا یک شبکه‌ی شش‌لایه روی مسئله‌ی دسته‌بندی دو مارپیچ است که برای 5000 گام آموزش داده شده:

TEXT
step    1: loss 0.693147
step 5000: loss 0.693147
accuracy: 50.0 %

این عدد تصادفی نیست. ln2=0.693147\ln 2 = 0.693147 همان binary cross-entropy مدلی است که برای همه‌چیز احتمال 0.50.5 خروجی می‌دهد، و 50 % روی یک dataset متوازن یعنی شیر یا خط. بعد از پنج هزار گام، شبکه حتی یک رقم هم جابه‌جا نشده است. چیزی crash نکرده، هشداری نیامده، و gradientها هنوز دقیقاً درست‌اند.

این فصل درباره‌ی فاصله‌ی میان شبکه‌ای است که اجرا می‌شود و شبکه‌ای که کار می‌کند. دو نیمه دارد که شبیه دو موضوع متفاوت‌اند، اما یک کار واحدند: پایین آوردن loss، و پایین آوردنش روی داده‌ای که مدل هرگز ندیده است.

چرا شبکه‌ی شش‌لایه مرده است

لینک به بخش: چرا شبکه‌ی شش‌لایه مرده است

به‌جای حدس زدن، با نگاه کردن شروع کنید. یک batch از ورودی‌ها را عبور دهید و انحراف معیار activationها را در هر لایه چاپ کنید، و بعد انحراف معیار gradientهای وزن‌ها را:

profile.pyPYTHON
def profile(model, x):
    h = x
    for layer in model:
        h = layer(h)
        if isinstance(layer, (nn.Tanh, nn.ReLU)):
            print(f"activation std: {h.std().item():.4f}")
    model(x).sum().backward()
    for p in model.parameters():
        if p.dim() == 2:
            print(f"gradient std: {p.grad.std().item():.2e}")

سه initialisation، یک معماری، شش لایه از tanh\tanh:

initialisationانحراف معیار activation، لایه‌های 1→6
normal، std 0.010.010.0145 · 0.0016 · 0.0002 · 0.0000 · 0.0000 · 0.0000
normal، std 110.6573 · 0.9296 · 0.9585 · 0.9634 · 0.9637 · 0.9625
Xavier0.1579 · 0.1493 · 0.1353 · 0.1333 · 0.1325 · 0.1403
initialisationانحراف معیار gradient، لایه‌ی اول → آخر
normal، std 0.010.013.20e-06 · 4.97e-07 · … · 6.40e-06
normal، std 111.94e+03 · 2.28e+02 · 1.22e+02 · 4.43e+01 · 1.85e+01 · 7.30e+00
Xavier2.31e+00 · 4.50e-01 · 4.26e-01 · 3.89e-01 · 4.39e-01 · 4.73e-01

ردیف اول همان شبکه‌ی بالاست، و این شبکه کند یاد نمی‌گیرد — دیگر هیچ سیگنالی برایش باقی نمانده است. تا لایه‌ی چهارم، انحراف معیار activation در چهار رقم اعشار به صفر underflow کرده است. هر ورودی همان خروجی را تولید می‌کند، خروجی یک ثابت است، و gradient یک ثابت چیزی نیست. وزن‌ها «برای احتیاط» کوچک initialised شده بودند، و کوچک بودن کشنده بود.

ردیف دوم شکستِ برعکس است و ارزش فهمیدن دارد چون خلاف شهود است. activationها سالم به نظر می‌رسند — حوالی 0.96 — اما این همان tanh\tanh اشباع‌شده است، چسبیده نزدیک حد خود، دقیقاً همان ناحیه‌ای که فصل 5 اندازه گرفت و دید gradient تقریباً ده هزار برابر از دست می‌رود. بااین‌حال gradientها عظیم‌اند: 1940 در لایه‌ی اول. هر دو چیز هم‌زمان درست‌اند. هر گام backward در WW^\top ضرب می‌کند، و با 128 ورودی در واریانس واحد، آن عامل gain حدود 12811\sqrt{128} \approx 11 دارد، که کوچک‌شدن ناشی از tanh\tanh اشباع‌شده را غرق می‌کند. gradientها در مسیر برگشت به‌صورت هندسی رشد می‌کنند. این همان exploding gradient است، و در هر اجرای واقعی آموزش، ظرف چند گام lossهای nan تولید می‌کند.

ردیف سوم همان چیزی است که می‌خواهید: activationها در عمق تقریباً مقیاس ثابت دارند، gradientها در عمق تقریباً مقیاس ثابت دارند. چیزی نمی‌میرد، چیزی منفجر نمی‌شود.

Normalisation، و اینکه کدام‌یک دوام آورد

لینک به بخش: Normalisation، و اینکه کدام‌یک دوام آورد

initialisation خوب مقیاس را در گام صفر درست می‌کند. آن را ثابت نگه نمی‌دارد: وزن‌ها حرکت می‌کنند، و تا گام پنج‌هزارم، استدلال دقیق واریانس دیگر برقرار نیست.

لایه‌های normalisation مقیاس را پیوسته اعمال می‌کنند. با داشتن برداری از activationها، یک میانگین را کم کنید، بر یک انحراف معیار تقسیم کنید، سپس یک مقیاسِ آموخته‌شده‌ی γ\gamma و یک جابه‌جاییِ β\beta اعمال کنید تا اگر لایه خواست normalisation را خنثی کند بتواند:

h^=hμσ2+ϵ,y=γh^+β\hat{h} = \frac{h - \mu}{\sqrt{\sigma^2 + \epsilon}}, \qquad y = \gamma\hat{h} + \beta

تنها پرسش واقعی این است که روی چه چیزی میانگین می‌گیرید. Batch normalisation3، μ\mu و σ\sigma را روی بُعد batch می‌گیرد، یک آمار برای هر feature. Layer normalisation4 آن‌ها را روی featureها می‌گیرد، یک آمار برای هر مثال.

این انتخاب کوچک به نظر می‌رسد و تقریباً همه‌چیزِ بعدی را تعیین می‌کند:

BatchNorm باعث می‌شود خروجی هر مثال به مثال‌های دیگری وابسته شود که اتفاقاً در batch آن بوده‌اند. در زمان آموزش، این یک regulariser ملایم است. در زمان inference، batchی وجود ندارد، پس باید میانگین متحرکی از آمارهای جمع‌آوری‌شده در آموزش نگه دارد — یعنی لایه در حالت training و evaluation رفتار متفاوتی دارد، و فراموش کردن تغییر mode یکی از رایج‌ترین bugهای این حوزه است. همچنین با batchهای کوچک افت می‌کند، و با توالی‌های طول متغیر بددست است، چون «میانگین روی batch در موقعیت 40» از هر تعداد توالی‌ای محاسبه می‌شود که اتفاقاً آن‌قدر طولانی بوده‌اند.

LayerNorm هر مثال را مستقل از بقیه normalise می‌کند. وابستگی به batch ندارد، آمار متحرک ندارد، در آموزش و inference رفتار یکسان دارد، به اندازه‌ی batch بی‌اعتناست، به طول توالی بی‌اعتناست. وقتی برای یک کاربر، هر بار یک token تولید می‌کنید — جایی که فصل 13 به آن می‌رسد — تک‌تک این ویژگی‌ها requirement هستند، نه مزیت‌های ظریف.

به همین دلیل است که LayerNorm همان چیزی است که دوباره در فصل 9 بدون تغییر می‌بینید: بلوک transformer از آن استفاده می‌کند، و به دلایل ستون سمت راست از آن استفاده می‌کند، نه چون در انتزاع بهتر کار می‌کند.

هر بار فقط یک چیز را درست کردن؛ همان skill واقعی

لینک به بخش: هر بار فقط یک چیز را درست کردن؛ همان skill واقعی

چهار راه‌حل پیشنهادی برای شبکه‌ی مرده: Xavier initialisation، LayerNorm، residual connectionها، و Adam به‌جای SGD. وسوسه این است که هر چهار تا را اعمال کنید و بروید جلو. این کار را بکنید و هرگز نمی‌فهمید کدام‌یک مهم بوده، و دفعه‌ی بعد که اتفاق بیفتد روش نخواهید داشت — فقط یک آیین.

پس یکی‌یکی اعمالشان کنید. همان seed، همان داده، همان معماری، 800 گام:

چه چیزی اضافه شدloss نهاییaccuracy
هیچ‌چیز0.693150.0 %
Xavier initialisation0.569260.4 %
LayerNorm0.623061.5 %
residual connectionها0.665156.6 %
Adam0.678758.7 %
هر چهار مورد0.0000100.0 %

این جدول را همان‌طور بخوانید که ساعت 2 صبح می‌خوانید، و نتیجه این می‌شود: هیچ‌چیز به‌تنهایی کار نمی‌کند، همه‌چیز با هم کار می‌کند، پس deep learning کیمیاست. این نتیجه غلط است، و فهمیدن چرایش مفیدترین بخش این فصل است.

به هر اجرا شش برابر بودجه بدهید — 5000 گام به‌جای 800 — و تصویر کاملاً عوض می‌شود:

چه چیزی اضافه شدloss نهایی @ 5000accuracy
هیچ‌چیز0.693150.0 %
Xavier initialisation0.0007100.0 %
LayerNorm0.0002100.0 %
residual connectionها0.665356.7 %
Adam0.690853.4 %
Xavier + Adam0.0000100.0 %
Xavier + LayerNorm0.0001100.0 %

حالا تصویر تیز است، و تشخیص است نه آیین.

initialisation به‌تنهایی درستش می‌کند. normalisation به‌تنهایی درستش می‌کند. هرکدام بیماری واقعی را هدف می‌گیرد — collapse شدن سیگنال forward به صفر — و هرکدام کافی است. در 800 گام فقط شبیه امتیاز جزئی به نظر می‌رسیدند، چون مسئله را حل کرده بودند و هنوز داشتند از چاله بیرون می‌آمدند.

residual connectionها و Adam، در هیچ بودجه‌ای درستش نمی‌کنند. نه چون بد هستند، بلکه چون بیماری دیگری را درمان می‌کنند. residual connection مسیری برای gradient دورِ یک لایه‌ی مسدودکننده فراهم می‌کند؛ وقتی مشکل gradient باشد ارزش زیادی دارد، و وقتی سیگنال forward از قبل صفر است هیچ ارزشی ندارد، چون میان‌بُرِ دور یک لایه‌ی مرده هنوز مقدار مرده حمل می‌کند. Adam اندازه‌ی گام هر پارامتر را با تاریخچه‌ی gradient خودش بازتنظیم می‌کند؛ وقتی gradientها اندازه‌های بسیار متفاوت دارند کمک می‌کند، و نمی‌تواند شبکه‌ای را زنده کند که خروجی‌اش به ورودی‌اش وابسته نیست.

و «هیچ‌چیز» هنوز بعد از پنج هزار گام دقیقاً 0.6931 است. نه 0.6929. کند نیست؛ مرده است، و این تمایز حالا به شکلی دیده می‌شود که قبلاً دیده نمی‌شد، چون ردیفی دارید که می‌گوید یک اصلاح کار می‌کند و می‌توانید با آن مقایسه کنید.

از اینجا به بعد، این دوره از PyTorch استفاده می‌کند. این باید به‌دست بیاید، نه اینکه فقط اعلام شود؛ پس دقیقاً اینجاست که PyTorch همان کاری را انجام می‌دهد که شما از قبل بلد هستید.

optimiser قاعده‌ای است برای تبدیل gradientها به به‌روزرسانی پارامترها. gradient descent ساده از gradient استفاده می‌کند. Momentum از میانگین متحرک آن استفاده می‌کند، که نویز را هموار می‌کند و در جهت‌هایی که سازگار می‌مانند سرعت می‌سازد:

optim_by_hand.pyPYTHON
v = beta * v + p.grad          
p -= lr * v                    

Adam5 دو میانگین متحرک نگه می‌دارد — یکی از gradient و یکی از مربع gradient — و یکی را بر ریشه‌ی دوم دیگری تقسیم می‌کند، تا هر پارامتر گامی متناسب با اندازه‌ی gradient اخیر خودش بگیرد:

optim_by_hand.pyPYTHON
m = b1 * m + (1 - b1) * g          # mean of the gradient          
v = b2 * v + (1 - b2) * g * g      # mean of the squared gradient  
m_hat = m / (1 - b1 ** t)          # bias correction: both averages start at zero
v_hat = v / (1 - b2 ** t)
p -= lr * m_hat / (v_hat.sqrt() + eps)   

ده خط. هر دو را در برابر torch.optim روی همان مسئله برای 50 گام اجرا کنید:

TEXT
SGD+momentum   by hand [2.7781870365142822, -1.0304985046386719]
               torch   [2.7781870365142822, -1.0304983854293823]   max |diff| = 1.19e-07
Adam           by hand [0.4893140196800232, -0.46317872405052185]
               torch   [0.48931416869163513, -0.46317875385284424]   max |diff| = 1.49e-07

تا دقت float32 یکسان‌اند. torch.optim.Adam همان پنج خط است، به‌علاوه‌ی دهه‌ها مراقبت درباره‌ی edge caseها و یک kernel در C++. معامله‌ای که از اینجا به بعد می‌کنید همین است: نه جادو به‌جای فهم، بلکه سرعت به‌جای خط‌هایی که از قبل نوشته‌اید.

توضیح معمول Adam این است: «learning rateهای adaptive برای هر پارامتر»، که توصیف است نه دلیل. دلیل هندسه است، و می‌توان آن را اندازه گرفت.

lossی را در نظر بگیرید که انحنایش میان جهت‌ها فرق دارد: در یکی تند، در دیگری کم‌شیب. SGD یک learning rate سراسری دارد، پس باید مقداری را انتخاب کند که در تندترین جهت پایدار باشد — و همان مقدار برای جهت کم‌شیب بسیار کوچک است، جایی که پیشرفت می‌خزد. این همان چیزی است که تصویر کلاسیکِ زیگزاگ زدن gradient descent در یک دره‌ی باریک را می‌سازد.

دو نسبت انحنا، سه optimiser، 300 گام، و برای هر optimiser بهترین learning rate از یک sweep داده شده تا کسی handicapped نباشد:

نسبت انحناSGDSGD + momentumAdam
10 : 1error 0.000002error 0.000000error 0.000000
1000 : 1error 1.925485error 0.001432error 0.000000
diverged at (1000:1)4 of 8 rates4 of 8 rates0 of 6 rates

در نسبت ده، همه‌چیز کار می‌کند و چیزی برای بحث نیست. در هزار، SGD ساده در هیچ‌یک از learning rateهای امتحان‌شده به جواب نمی‌رسد — بهترین نتیجه‌اش هنوز error برابر 1.93 است — و در نیمی از rateها صریحاً diverge می‌کند. Adam دقیقاً روی target فرود می‌آید و در هیچ‌کدام diverge نمی‌کند.

آن ستون آخر دلیل عملی default بودن Adam است. مسئله این نیست که Adam راه‌حل‌های بهتری پیدا می‌کند؛ در مسائل well-conditioned، SGD تنظیم‌شده اغلب با آن برابری می‌کند یا شکستش می‌دهد. مسئله این است که Adam نسبت به learning rateی که انتخاب کرده‌اید بسیار کم‌حساس‌تر است، و شبکه‌های واقعی در میلیون‌ها پارامترشان نسبت‌های انحنایی بسیار بدتر از هزار دارند.

دو قطعه‌ی دیگر هم اینجا جای دارند و هر دو یک خط‌اند. Gradient clipping هرگاه norm بردار gradient از آستانه‌ای بگذرد، آن را rescale می‌کند، و ردیف «loss ناگهان به مقدار عظیمی می‌پرد» در جدول تشخیص را به یک اتفاق بی‌اهمیت تبدیل می‌کند. و learning rate scheduleها: یک warmup کوتاه از نزدیک صفر طی چند صد گام اول، چون برآوردهای واریانس Adam تا وقتی چند gradient ندیده‌اند آشغال‌اند و یک گام کامل روی آشغال می‌تواند initialisation را خراب کند؛ سپس cosine decay به سمت صفر، چون تمام کردن یک اجرا با همان اندازه‌گامی که شروع کرده‌اید یعنی لرزیدن دور minimum به‌جای نشستن در آن.

نیمه‌ی دوم: مدلی که کاملاً fit می‌شود و هیچ‌چیز پیش‌بینی نمی‌کند

لینک به بخش: نیمه‌ی دوم: مدلی که کاملاً fit می‌شود و هیچ‌چیز پیش‌بینی نمی‌کند

تا اینجا همه‌چیز درباره‌ی پایین آوردن loss بود. حالا نیمه‌ی سخت‌تر، چون پایین آمدن loss هدف نیست — proxy هدف است، و این proxy به شکلی مشخص و مشهور شکست می‌خورد.

دوازده نقطه از تابعی smooth با کمی نویز. polynomialهایی با درجه‌های فزاینده fit کنید:

درجهtrain RMSEtest RMSE
10.7644990.6985
30.2526050.3031
50.1644370.1568
90.0889600.2347
110.0000001.2094

درجه‌ی 11 از میان 12 نقطه تک‌تک آن‌ها را دقیقاً عبور می‌دهد — train error تا شش رقم اعشار صفر — و روی داده‌ای که ندیده، هشت برابر بدتر از درجه‌ی 5 است. از درجه‌ی 3 و درجه‌ی 11 بخواهید در x=3.25x = 3.25، کمی بیرون از بازه‌ی training، پیش‌بینی کنند:

TEXT
degree  3: predicts   -1.053   (truth -0.012)
degree 11: predicts  +61.224   (truth -0.012)

شصت‌ویک، درحالی‌که جواب تقریباً صفر است. مدل تابع را یاد نگرفت؛ دوازده نقطه را یاد گرفت، و بین آن‌ها هر کاری را می‌کند که حساب‌وکتاب اقتضا کند.

این overfitting است، و نقطه‌ی مقابلش — درجه‌ی 1، که اصلاً نمی‌تواند منحنی را نمایش دهد و همه‌جا بد است — underfitting است. روایت کلاسیک، خطای مورد انتظار مدل را به سه بخش تقسیم می‌کند: bias، خطایی که از بیش از حد صلب بودن مدل برای نمایش حقیقت می‌آید؛ variance، خطایی که از آن می‌آید که مدل آن‌قدر انعطاف‌پذیر است که نویز همین نمونه‌ی خاص را دنبال می‌کند؛ و نویز کاهش‌ناپذیر، که هیچ‌چیز درستش نمی‌کند. مدل‌های ساده biased هستند، مدل‌های انعطاف‌پذیر high-variance هستند، و نسخه‌ی کلاسیک این است که نقطه‌ی شیرین وسط را پیدا کنید — درجه‌ی 5 در جدول بالا.

ابزارهای استاندارد همگی به جمله‌ی variance حمله می‌کنند:

  • L2 regularisation (weight decay) عبارت λw2\lambda \lVert w \rVert^2 را به loss اضافه می‌کند، وزن‌ها را به سمت صفر می‌کشد و تابع را smoothتر می‌کند. در جدول بالا، بزرگ‌ترین ضریب درجه‌ی 11 خسارت را می‌زند؛ جریمه کردن اندازه آن را خنثی می‌کند.
  • L1 به‌جای آن λwi\lambda \sum |w_i| را اضافه می‌کند. تفاوت cosmetic نیست: gradient در L2 متناسب با وزن است و بنابراین با کوچک شدن وزن کوچک می‌شود، به صفر نزدیک می‌شود بی‌آنکه برسد، درحالی‌که gradient در L1 یک ثابتِ ±λ\pm\lambda است که تا آخر به هل دادن ادامه می‌دهد. بنابراین L1 وزن‌هایی تولید می‌کند که دقیقاً صفرند — feature انتخاب می‌کند. L2 وزن‌های کوچک تولید می‌کند. وقتی smoothness می‌خواهید از L2 استفاده کنید، وقتی sparsity می‌خواهید از L1.
  • Dropout7 در هر گام آموزش، یک زیرمجموعه‌ی تصادفی از activationها را صفر می‌کند، تا هیچ واحدی نتواند روی حضور یک واحد خاص دیگر حساب کند.
  • Early stopping، validation loss را تماشا می‌کند و وقتی رو به بالا برگردد متوقف می‌شود.
  • Data augmentation از مثال‌هایی که دارید مثال‌های training بیشتری می‌سازد، و مسئله را از سرچشمه هدف می‌گیرد: overfitting به همان اندازه که زیادیِ پارامتر است، کمبود داده هم هست.
  • Cross-validation داده را به kk بخش تقسیم می‌کند و kk بار آموزش می‌دهد، که وقتی داده‌تان آن‌قدر کم است که نمی‌توانید یک held-out set کنار بگذارید، برآورد قابل اتکایی از test error می‌خرد.

Double descent، یا چرا بخش قبل کل داستان نیست

لینک به بخش: Double descent، یا چرا بخش قبل کل داستان نیست

حالا واقعیتی که تصویر را می‌شکند.

داستان bias-variance می‌گوید بعد از نقطه‌ی شیرین، پارامترهای بیشتر یعنی generalisation بدتر. مدل‌های زبانی مدرن نسبت به قواعد کلاسیک، برای داده‌ای که می‌بینند پارامترهای بسیار بیشتری دارند، و عالی generalise می‌کنند. هر دو گزاره درست‌اند، و آشتی دادنشان مفیدترین چیز این فصل است.

چهل نقطه‌ی training، ورودی‌های بیست‌بعدی، featureهای تصادفی ReLU، و تعداد featureهای PP که از 2 تا 5000 sweep شده — با انتخاب راه‌حل minimum-norm هرجا راه‌حل‌های زیادی برای fit وجود دارد:

PPP/nP/ntrain RMSEtest RMSEw\lVert w \rVert
100.250.88221.25201.89
200.500.59621.16342.59
300.750.38961.53234.15
380.950.17693.716310.25
401.000.00005.814014.83
421.050.00003.16239.35
601.500.00001.10582.78
2005.000.00000.66380.98
150037.500.00000.58590.33
5000125.000.00000.56640.18

آن را در سه بخش بخوانید. تا P/n=0.5P/n = 0.5 داستان کلاسیک دقیقاً برقرار است: error پایین می‌آید، بعد شروع به بالا رفتن می‌کند. در P=n=40P = n = 40interpolation threshold، جایی که مدل دقیقاً به اندازه‌ی کافی پارامتر دارد تا از هر نقطه‌ی training عبور کند — test error به قله می‌رسد، 5.81، پنج برابر بدتر از مدل کوچک. آن قله همان هشدار کلاسیک است، و واقعی است.

بعد دوباره پایین می‌آید. و همچنان پایین می‌آید، از P=5nP = 5n می‌گذرد، از P=37nP = 37n می‌گذرد، تا P=125nP = 125n، جایی که test error برابر 0.5664 بهتر از بهترین مدلی است که در حالت under-parameterised به دست آمد. مدلی با 5000 پارامتر که روی 40 نقطه fit شده، بهترین مدل جدول است.

این double descent است،89 و سازوکارش در ستون آخر دیده می‌شود. وقتی P>nP > n، بی‌نهایت تنظیم پارامتر وجود دارد که داده‌ی training را دقیقاً fit می‌کند، و اینکه کدام‌یک را می‌گیرید به نحوه‌ی انتخاب شما بستگی دارد. راه‌حل minimum-norm کوچک‌ترین را انتخاب می‌کند، و w\lVert w \rVert نشان می‌دهد این یعنی چه: درست در threshold به 14.83 می‌رسد — جایی که دقیقاً یک راه‌حل interpolating وجود دارد و هرقدر هم extreme باشد با همان گیر می‌افتید — و بعد با رشد PP به‌صورت یکنواخت پایین می‌آید، چون پارامترهای بیشتر یعنی راه‌حل‌های interpolating بیشتری برای انتخاب، یعنی کوچک‌ترین گزینه‌ی موجود کوچک‌تر می‌شود. در P=5000P = 5000، norm برابر 0.18 است، هشتاد برابر کوچک‌تر از threshold.

پس پارامترهای اضافه complexity اضافه نمی‌کنند. آن‌ها انتخاب اضافه می‌کنند، و قاعده‌ی انتخاب این انتخاب را صرف سادگی می‌کند. regularisation در تابع loss نیست؛ در الگوریتم است. gradient descent از یک initialisation کوچک، bias مستندی به سمت راه‌حل‌های small-norm دارد، و به همین دلیل این رفتار در شبکه‌های واقعی که به روش معمول آموزش می‌بینند هم ظاهر می‌شود، نه فقط در جبر خطی بالا.

پیامد عملی، که فصل 10 به آن وابسته است: «مدل از داده پارامترهای بیشتری دارد، پس overfit می‌کند» استدلال معتبری نیست. وقتی مدل‌ها سمت چپ threshold زندگی می‌کردند، قاعده‌ی خوبی بود. حالا همه‌چیز جالب بسیار سمت راست آن زندگی می‌کند، جایی که قاعده برعکس می‌شود.

ابزارهای این فصل برای آموزش شبکه‌ای که روی داده‌ی جدولی کار کند کافی‌اند: ردیف‌هایی از عددها، ستونی از برچسب‌ها.

زبان این نیست. پیش از آنکه مدل بتواند واژه‌ی بعدی را پیش‌بینی کند، چیزی باید تصمیم بگیرد اصلاً «واژه» چیست — و جواب نه حرف‌هاست نه واژه‌ها، بلکه واژگانی است که مدل از byteهای خام داده‌ی training یاد می‌گیرد. این تصمیم، که یک بار پیش از شروع آموزش گرفته می‌شود، تعیین می‌کند مدل چند چیز می‌تواند بگوید، هزینه‌ی یک درخواست چقدر است، و چرا مدل‌هایی که می‌توانند در آزمون حقوق قبول شوند نمی‌توانند حروف strawberry را قابل‌اعتماد بشمارند.

فصل 7 یک tokenizer می‌سازد.


برای residual connectionهای استفاده‌شده در بالا، He و همکاران، Deep Residual Learning for Image Recognition (arXiv:1512.03385). اثر Andrej Karpathy با عنوان Building makemore Part 3: Activations & Gradients, BatchNorm تشخیص histogram activation را روی یک مدل واقعی قدم‌به‌قدم نشان می‌دهد و بهترین درمان عملی نیمه‌ی اول این فصل است. درس‌های 8 و 11–13 از Learning From Data اثر Yaser Abu-Mostafa نظریه‌ی کلاسیک generalisation را درست ارائه می‌کنند، از جمله بخش‌هایی که این فصل در یک پاراگراف فشرده کرد.

  1. Glorot, X. and Bengio, Y. Understanding the difficulty of training deep feedforward neural networks. AISTATS (2010). استدلال حفظ واریانس که در کادر بالا بازتولید شد.

  2. He, K., Zhang, X., Ren, S. and Sun, J. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. arXiv:1502.01852 (2015).

  3. Ioffe, S. and Szegedy, C. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. arXiv:1502.03167 (2015). توجه کنید که توضیح «internal covariate shift» در عنوان، بعدها به‌طور جدی محل مناقشه شد؛ لایه کار می‌کند، روایت اولیه درباره‌ی چرایش محل اختلاف است.

  4. Ba, J. L., Kiros, J. R. and Hinton, G. E. Layer Normalization. arXiv:1607.06450 (2016).

  5. Kingma, D. P. and Ba, J. Adam: A Method for Stochastic Optimization. arXiv:1412.6980 (2014).

  6. Loshchilov, I. and Hutter, F. Decoupled Weight Decay Regularization. arXiv:1711.05101 (2017).

  7. Srivastava, N., Hinton, G., Krizhevsky, A., Sutskever, I. and Salakhutdinov, R. Dropout: A Simple Way to Prevent Neural Networks from Overfitting. JMLR 15, pp. 1929–1958 (2014).

  8. Belkin, M., Hsu, D., Ma, S. and Mandal, S. Reconciling modern machine-learning practice and the classical bias–variance trade-off. PNAS 116(32), pp. 15849–15854 (2019). مقاله‌ای که نام این پدیده را گذاشت.

  9. Nakkiran, P., Kaplun, G., Bansal, Y., Yang, T., Barak, B. and Sutskever, I. Deep Double Descent: Where Bigger Models and More Data Hurt. arXiv:1912.02292 (2019). این اثر را در شبکه‌های عمیق واقعی نشان می‌دهد، و هم روی محور زمان آموزش و هم محور اندازه‌ی مدل.


تهیه‌شده توسط

David Vicente Campos

بنیان‌گذار NeuraLIA Labs و هم‌بنیان‌گذار MyRealFood

من مهندس کامپیوتر و فارغ‌التحصیل دانشگاه لئون هستم. هم‌بنیان‌گذار MyRealFood بودم، جایی که به‌عنوان مدیر ارشد فناوری اپلیکیشنی را ساختم که میلیون‌ها نفر برای سالم‌تر غذا خوردن از آن استفاده کرده‌اند، و NeuraLIA Labs را بنیان‌گذاری کردم؛ جایی که محصولات هوش مصنوعی می‌سازم. اینجا از چیزهایی می‌نویسم که در طول مسیر باید می‌فهمیدم، همان‌طور که دوست داشتم کسی برایم توضیح می‌داد.

بیشتر درباره نویسنده

منتشرشده توسط NeuraLIA Labs.

پست‌های جدید را در ایمیل خود دریافت کنید

اخبار AI، راهنماها و به‌روزرسانی‌های محصول — هر وقت چیزی ارزشمند منتشر کنیم، یک ایمیل کوتاه می‌فرستیم.

فهرست دوره

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev12 دقیقه مطالعه

مدل هوش مصنوعی Jev برای تصمیم ساخته شده، نه نثر

Jev از TypeSafe AI توجه‌ها را جلب کرده چون هوشمندی نرم‌افزار را مسئله‌ای احتمالاتی می‌بیند: شاخه درست را انتخاب کنید، میزان اطمینان را کنار آن بگذارید، و وقتی کد به یک تصمیم نیاز دارد برای نوشتن متن به یک LLM پول ندهید.

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering13 دقیقه مطالعه

مهندسی کانتکست برای عامل‌های AI بلندافق

عامل‌های طولانی‌اجرا فقط به‌خاطر کوچک بودن پنجره شکست نمی‌خورند. وقتی فایل‌ها، خروجی ابزارها و تاریخچهٔ کهنه وظیفه‌ای را که عامل قرار بود تمام کند کنار می‌زنند، شکست رخ می‌دهد.

آماده‌اید انتخاب مدل را به LIA بسپارید؟

با همه مدل‌های هوش مصنوعی در یک جا بسازید — همین امروز رایگان شروع کنید.