مواد پر جائیں
6/30باب 6 از 30

اسے train کروانا، اور اسے generalise کروانا

چھ layer network جس کا loss ln 2 سے نہیں ہلتا، ایک measurement کے بعد ایک fix۔ پھر double descent: 40 points پر 5,000 parameters۔

اس صفحے پر

باب 5 والا network کام کرتا ہے۔ اس کے نو parameters ہیں، یہ XOR سیکھتا ہے، اور اس کے gradients سولہ decimal places تک PyTorch سے match کرتے ہیں۔

اسے چھ layers گہرا بنائیں تو یہ مکمل طور پر سیکھنا بند کر دیتا ہے۔ آہستہ نہیں — مکمل طور پر۔ دو spiral classification مسئلے پر ایک چھ layer network یہ ہے، جسے 5000 steps تک train کیا گیا:

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

یہ number arbitrary نہیں۔ ln2=0.693147\ln 2 = 0.693147 ایک ایسے model کی binary cross-entropy ہے جو ہر چیز کے لیے probability 0.50.5 output کرتا ہے، اور balanced dataset پر 50 % coin flip ہے۔ پانچ ہزار steps کے بعد network ایک digit بھی نہیں ہلا۔ کچھ crash نہیں ہوا، کوئی warning نہیں آئی، اور gradients اب بھی بالکل درست ہیں۔

یہ باب اس gap کے بارے میں ہے جو ایک ایسے network کے درمیان ہے جو run کرتا ہے اور ایک ایسے network کے درمیان جو کام کرتا ہے۔ اس کے دو halves ہیں جو مختلف subjects لگتے ہیں مگر اصل میں ایک ہی کام ہیں: loss کو نیچے لانا، اور اسے ایسے data پر نیچے لانا جو model نے کبھی نہیں دیکھا۔

اندازہ لگانے کے بجائے پہلے دیکھیں۔ inputs کا ایک batch آگے push کریں اور ہر layer پر activations کی standard deviation print کریں، پھر weight gradients کی standard deviation:

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}")

تین initialisations، وہی architecture، tanh\tanh کی چھ layers:

initialisationactivation std، layers 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
initialisationgradient std، پہلی layer → آخری
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

پہلی row اوپر والا network ہے، اور یہ آہستہ نہیں سیکھ رہا — اس کے پاس signal بچا ہی نہیں۔ layer four تک activation standard deviation چار decimal places میں zero تک underflow ہو چکی ہے۔ ہر input ایک ہی output پیدا کرتا ہے، output ایک constant ہے، اور constant کا gradient کچھ نہیں ہوتا۔ weights کو "safe" رہنے کے لیے چھوٹا initialise کیا گیا تھا، اور چھوٹا ہونا مہلک نکلا۔

دوسری row الٹی failure ہے اور اسے سمجھنا ضروری ہے کیونکہ یہ counterintuitive ہے۔ activations صحت مند لگتی ہیں — تقریباً 0.96 — مگر یہ tanh\tanh saturated ہے، اپنی حد کے قریب pinned، بالکل وہی regime جسے باب 5 نے gradient میں تقریباً دس ہزار کے factor کی کمی کے طور پر measure کیا تھا۔ اس کے باوجود gradients بہت بڑے ہیں: پہلی layer پر 1940۔ دونوں باتیں ایک ساتھ درست ہیں۔ ہر backward step WW^\top سے multiply کرتا ہے، اور unit variance پر 128 inputs کے ساتھ اس factor کا gain تقریباً 12811\sqrt{128} \approx 11 ہوتا ہے، جو saturated tanh\tanh سے آنے والی shrinkage پر غالب آ جاتا ہے۔ واپسی کے راستے پر gradients geometrically بڑھتے ہیں۔ یہ exploding gradient ہے، اور کسی بھی real training run میں چند steps کے اندر nan کے loss values پیدا کرتا ہے۔

تیسری row وہ ہے جو آپ چاہتے ہیں: activations depth کے پار scale میں تقریباً constant، gradients depth کے پار scale میں تقریباً constant۔ کچھ نہیں مرتا، کچھ نہیں پھٹتا۔

اچھی initialisation step zero پر scale fix کرتی ہے۔ یہ اسے fixed نہیں رکھتی: weights move کرتے ہیں، اور step five thousand تک careful variance argument مزید apply نہیں کرتا۔

Normalisation layers scale کو continuously enforce کرتی ہیں۔ activations کا ایک vector لے کر mean subtract کریں، standard deviation سے divide کریں، پھر learned scale γ\gamma اور shift β\beta apply کریں تاکہ اگر layer کو normalisation undo کرنی ہو تو وہ کر سکے:

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

اصل سوال صرف یہ ہے کہ آپ average کس چیز پر لیتے ہیں۔ Batch normalisation3 batch dimension کے across μ\mu اور σ\sigma لیتی ہے، فی feature ایک statistic۔ Layer normalisation4 انہیں features کے across لیتی ہے، فی example ایک statistic۔

یہ choice معمولی لگتی ہے اور downstream تقریباً سب کچھ decide کر دیتی ہے:

BatchNorm ہر example کے output کو اس کے batch میں اتفاقاً موجود دوسرے examples پر depend کرواتا ہے۔ training time پر یہ ایک mild regulariser ہے۔ inference time پر batch نہیں ہوتا، اس لیے اسے training کے دوران collected statistics کا running average رکھنا پڑتا ہے — جس کا مطلب ہے کہ layer training اور evaluation mode میں مختلف behave کرتی ہے، اور modes switch کرنا بھول جانا field کے common bugs میں سے ایک ہے۔ یہ small batches کے ساتھ degrade بھی کرتا ہے، اور variable-length sequences کے ساتھ awkward ہے، کیونکہ "position 40 پر batch کا mean" اتنی ہی sequences سے compute ہوتا ہے جتنی اتفاقاً اتنی لمبی ہوں۔

LayerNorm ہر example کو خود اس پر normalise کرتا ہے۔ کوئی batch dependence نہیں، کوئی running statistics نہیں، training اور inference میں identical behaviour، batch size سے بے نیاز، sequence length سے بے نیاز۔ جب آپ ایک user کے لیے ایک وقت میں ایک token generate کر رہے ہوں — جہاں باب 13 پہنچتا ہے — تو ان میں سے ہر property nicety نہیں بلکہ requirement ہے۔

اسی لیے LayerNorm وہ ہے جو آپ باب 9 میں بغیر بدلے دوبارہ دیکھیں گے: transformer block اسے استعمال کرتا ہے، اور دائیں ہاتھ والے column کی وجوہات کے لیے استعمال کرتا ہے، abstract میں بہتر کام کرنے کی وجہ سے نہیں۔

ایک وقت میں ایک چیز fix کرنا، جو اصل skill ہے

اس حصے کا لنک: ایک وقت میں ایک چیز fix کرنا، جو اصل skill ہے

مردہ network کے لیے چار candidate fixes: Xavier initialisation، LayerNorm، residual connections، اور SGD کے بجائے Adam۔ temptation یہ ہے کہ چاروں apply کریں اور آگے بڑھ جائیں۔ ایسا کریں گے تو آپ کبھی نہیں جانیں گے کہ کون سی چیز mattered، اور اگلی بار جب ایسا ہوگا تو آپ کے پاس method نہیں ہوگی — صرف ritual ہوگا۔

اس لیے انہیں ایک وقت میں ایک apply کریں۔ وہی seed، وہی data، وہی architecture، 800 steps:

کیا add کیا گیاfinal lossaccuracy
کچھ نہیں0.693150.0 %
Xavier initialisation0.569260.4 %
LayerNorm0.623061.5 %
residual connections0.665156.6 %
Adam0.678758.7 %
چاروں0.0000100.0 %

اس table کو ویسے پڑھیں جیسے آپ رات 2 بجے پڑھتے، اور conclusion یہ نکلتا ہے: اکیلے کچھ کام نہیں کرتا، سب کچھ ساتھ کام کرتا ہے، لہٰذا deep learning alchemy ہے۔ یہ conclusion غلط ہے، اور کیوں غلط ہے یہ جاننا اس باب کی سب سے useful چیز ہے۔

ہر run کو چھ گنا budget دیں — 800 کے بجائے 5000 steps — اور picture مکمل بدل جاتی ہے:

کیا add کیا گیاfinal loss @ 5000accuracy
کچھ نہیں0.693150.0 %
Xavier initialisation0.0007100.0 %
LayerNorm0.0002100.0 %
residual connections0.665356.7 %
Adam0.690853.4 %
Xavier + Adam0.0000100.0 %
Xavier + LayerNorm0.0001100.0 %

اب picture sharp ہے، اور یہ ritual نہیں بلکہ diagnosis ہے۔

Initialisation اکیلی اسے fix کر دیتی ہے۔ Normalisation اکیلی اسے fix کر دیتی ہے۔ دونوں اصل disease کو address کرتی ہیں — forward signal کا zero تک collapse ہونا — اور دونوں میں سے کوئی ایک کافی ہے۔ 800 steps پر وہ بس partial credit جیسی لگیں، کیونکہ انہوں نے problem solve کر دی تھی اور ابھی باہر نکل رہی تھیں۔

Residual connections اور Adam کسی بھی budget پر اسے fix نہیں کرتے۔ اس لیے نہیں کہ وہ bad ہیں، بلکہ اس لیے کہ وہ ایک مختلف disease treat کرتے ہیں۔ residual connection gradient کو blocking layer کے around ایک path دیتا ہے؛ یہ تب بہت قیمتی ہے جب gradient problem ہو، اور تب کچھ نہیں جب forward signal پہلے ہی zero ہو، کیونکہ dead layer کے around shortcut بھی dead value ہی carry کرتا ہے۔ Adam ہر parameter کے step کو اس کی اپنی gradient history سے rescale کرتا ہے؛ یہ تب help کرتا ہے جب gradients کی magnitudes بہت مختلف ہوں، اور ایسے network کو revive نہیں کر سکتا جس کا output اس کے input پر depend ہی نہیں کرتا۔

اور "nothing" پانچ ہزار steps کے بعد بھی exactly 0.6931 ہے۔ 0.6929 نہیں۔ یہ slow نہیں؛ یہ dead ہے، اور اب یہ distinction پہلے سے زیادہ visible ہے، کیونکہ compare کرنے کے لیے آپ کے پاس وہ row ہے جو کہتی ہے کہ fix کام کرتا ہے۔

یہاں سے آگے یہ course PyTorch استعمال کرتا ہے۔ یہ announce کرنے کے بجائے earn ہونا چاہیے، اس لیے یہ بالکل وہی ہے جو یہ کرتا ہے اور جو آپ پہلے ہی کرنا جانتے ہیں۔

optimiser ایک rule ہے جو gradients کو parameter updates میں بدلتا ہے۔ Plain gradient descent gradient استعمال کرتا ہے۔ Momentum اس کا running average استعمال کرتا ہے، جو noise smooth کرتا ہے اور ان directions میں speed build کرتا ہے جو consistent رہتی ہیں:

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

Adam5 دو running averages رکھتا ہے — gradient کا اور gradient squared کا — اور ایک کو دوسرے کے square root سے divide کرتا ہے، تاکہ ہر parameter کو اپنے recent gradient magnitude کے مطابق scaled step ملے:

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)   

دس lines۔ دونوں کو اسی problem پر torch.optim کے against 50 steps تک run کریں:

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 precision تک identical۔ torch.optim.Adam وہ پانچ lines ہیں، plus edge cases پر decades کی care اور ایک C++ kernel۔ یہاں سے آگے آپ یہی trade کر رہے ہیں: سمجھ کے بدلے magic نہیں، بلکہ وہ lines جو آپ پہلے ہی لکھ چکے ہیں ان کے بدلے speed۔

Adam کی usual explanation "adaptive per-parameter learning rates" ہے، جو reason کے بجائے description ہے۔ reason geometry ہے، اور اسے measure کیا جا سکتا ہے۔

ایک ایسا loss لیں جس کی curvature directions کے درمیان مختلف ہو: ایک میں steep، دوسری میں shallow۔ SGD کے پاس ایک global learning rate ہوتا ہے، اس لیے اسے ایک ایسی value pick کرنی پڑتی ہے جو steepest direction میں stable رہنے کے لیے کافی small ہو — اور وہی value shallow direction کے لیے بہت ہی small ہو جاتی ہے، جہاں progress crawl کرتی ہے۔ یہی gradient descent کی narrow valley میں zig-zag کرتی classic تصویر کی وجہ ہے۔

دو curvature ratios، تین optimisers، 300 steps، اور ہر optimiser کو sweep سے best learning rate دیا گیا تاکہ کوئی handicapped نہ ہو:

curvature ratioSGDSGD + 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

دس کے ratio پر سب کچھ کام کرتا ہے اور discuss کرنے کو کچھ نہیں۔ ہزار پر، plain SGD آزمائے گئے کسی بھی learning rate پر answer تک نہیں پہنچ سکتا — اس کا best result بھی error 1.93 ہے — اور یہ آدھی rates پر outright diverge کرتا ہے۔ Adam target پر exactly land کرتا ہے اور کسی پر بھی diverge نہیں کرتا۔

آخری column Adam کے default ہونے کی practical وجہ ہے۔ ایسا نہیں کہ Adam بہتر solutions find کرتا ہے؛ well-conditioned problems پر tuned SGD اکثر اسے match یا beat کر دیتا ہے۔ وجہ یہ ہے کہ Adam آپ کے picked learning rate کے لیے کہیں کم sensitive ہے، اور real networks میں اپنے millions of parameters کے across curvature ratios ہزار سے کہیں بدتر ہوتے ہیں۔

دو مزید pieces یہاں belong کرتے ہیں اور دونوں ایک line ہیں۔ Gradient clipping جب بھی gradient vector کا norm threshold سے exceed کرے اسے rescale کر دیتی ہے، جس سے diagnostic table کی "loss suddenly jumps to a huge value" والی row non-event بن جاتی ہے۔ اور learning rate schedules: پہلے چند hundred steps میں near-zero سے ایک short warmup، کیونکہ Adam کے variance estimates garbage ہوتے ہیں جب تک انہوں نے کچھ gradients نہ دیکھے ہوں اور garbage پر لیا گیا full-size step initialisation کو wreck کر سکتا ہے؛ پھر zero کی طرف cosine decay، کیونکہ run کو اسی step size پر end کرنا جس پر start کیا تھا minimum کے around jitter کرنے کے برابر ہے، settle ہونے کے نہیں۔

دوسرا half: وہ model جو perfectly fit ہوتا ہے اور کچھ predict نہیں کرتا

اس حصے کا لنک: دوسرا half: وہ model جو perfectly fit ہوتا ہے اور کچھ predict نہیں کرتا

اب تک سب کچھ loss down کرنے کے بارے میں تھا۔ اب زیادہ hard half، کیونکہ loss down ہونا goal نہیں — یہ goal کا proxy ہے، اور proxy ایک specific اور famous طریقے سے fail کرتا ہے۔

smooth function سے بارہ points جن میں تھوڑا noise ہے۔ increasing degree کے polynomials fit کریں:

degreetrain RMSEtest RMSE
10.7644990.6985
30.2526050.3031
50.1644370.1568
90.0889600.2347
110.0000001.2094

Degree 11 بارہ points کے through ہر ایک سے exactly گزرتا ہے — train error چھ decimal places تک zero — اور unseen data پر degree 5 سے آٹھ گنا بدتر ہے۔ Degree 3 اور degree 11 سے x=3.25x = 3.25 پر predict کرنے کو کہیں، training range سے ذرا باہر:

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

اکسٹھ، جبکہ answer تقریباً zero ہے۔ model نے function نہیں سیکھا؛ اس نے بارہ points سیکھے، اور ان کے درمیان وہی کرتا ہے جو arithmetic demand کرتی ہے۔

یہ overfitting ہے، اور اس کا opposite — degree 1، جو curve کو بالکل represent نہیں کر سکتا اور ہر جگہ bad ہے — underfitting ہے۔ classical account کسی model کے expected error کو تین parts میں split کرتا ہے: bias، وہ error جو model کے truth represent کرنے کے لیے بہت rigid ہونے سے آتا ہے؛ variance، وہ error جو model کے اتنا flexible ہونے سے آتا ہے کہ وہ اس particular sample کے noise کا پیچھا کرتا ہے؛ اور irreducible noise، جسے کچھ fix نہیں کرتا۔ Simple models biased ہوتے ہیں، flexible models high-variance، اور classical prescription یہ ہے کہ بیچ کا sweet spot find کیا جائے — اوپر table میں degree 5۔

standard tools سب variance term پر attack کرتے ہیں:

  • L2 regularisation (weight decay) loss میں λw2\lambda \lVert w \rVert^2 add کرتی ہے، weights کو zero کی طرف pull کرتی ہے اور function کو smoother بناتی ہے۔ اوپر table میں degree 11 کا largest coefficient damage کرتا ہے؛ size کو penalise کرنا اسے defuse کرتا ہے۔
  • L1 اس کے بجائے λwi\lambda \sum |w_i| add کرتی ہے۔ فرق cosmetic نہیں: L2 کا gradient weight کے proportional ہوتا ہے، اس لیے weight کے ساتھ shrink ہوتا ہے، zero کے قریب پہنچتا ہے مگر پہنچتا نہیں، جبکہ L1 کا gradient ایک constant ±λ\pm\lambda ہے جو آخر تک push کرتا رہتا ہے۔ اس لیے L1 ایسے weights پیدا کرتی ہے جو exactly zero ہوتے ہیں — یہ features select کرتی ہے۔ L2 small weights پیدا کرتی ہے۔ smoothness چاہیے تو L2 استعمال کریں، sparsity چاہیے تو L1۔
  • Dropout7 ہر training step پر activations کے random subset کو zero کرتا ہے، تاکہ کوئی unit کسی particular دوسرے unit کی موجودگی پر rely نہ کر سکے۔
  • Early stopping validation loss دیکھتا ہے اور جب وہ اوپر مڑتا ہے تو stop کر دیتا ہے۔
  • Data augmentation آپ کے موجود examples سے مزید training examples بناتا ہے، یعنی problem کو اس کے source پر attack کرتا ہے: overfitting اتنا ہی data کی shortage ہے جتنا parameters کی excess۔
  • Cross-validation data کو kk ways میں split کرتا ہے اور kk times train کرتا ہے، جو test error کا reliable estimate خریدتا ہے جب آپ کے پاس held-out set spare کرنے کے لیے data بہت کم ہو۔

Double descent، یا previous section پوری story کیوں نہیں

اس حصے کا لنک: Double descent، یا previous section پوری story کیوں نہیں

اب وہ fact جو picture کو توڑتا ہے۔

bias-variance story کہتی ہے کہ sweet spot کے بعد زیادہ parameters کا مطلب بدتر generalisation ہے۔ Modern language models کے پاس classical rules کی data کے حساب سے اجازت سے کہیں زیادہ parameters ہیں، اور وہ superbly generalise کرتے ہیں۔ دونوں statements درست ہیں، اور انہیں reconcile کرنا اس chapter کی سب سے useful چیز ہے۔

چالیس training points، بیس-dimensional inputs، random ReLU features، اور features کی تعداد PP کو 2 سے 5000 تک sweep کیا گیا — اور جب fit کرنے والے many solutions ہوں تو minimum-norm solution chosen کیا گیا:

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

اسے تین parts میں پڑھیں۔ P/n=0.5P/n = 0.5 تک classical story exactly hold کرتی ہے: error گرتا ہے، پھر rising start کرتا ہے۔ P=n=40P = n = 40 پر — interpolation threshold، جہاں model کے پاس ہر training point سے گزرنے کے لیے exactly کافی parameters ہوتے ہیں — test error peak کرتا ہے، 5.81 پر، small model سے پانچ گنا بدتر۔ یہ peak classical warning ہے، اور یہ real ہے۔

پھر یہ دوبارہ descend کرتا ہے۔ اور descend کرتا رہتا ہے، P=5nP = 5n سے آگے، P=37nP = 37n سے آگے، P=125nP = 125n تک، جہاں 0.5664 کا test error best under-parameterised model کی achieved value سے بھی بہتر ہے۔ 40 points پر fit کیا گیا 5000 parameters والا model table کا best model ہے۔

یہ double descent ہے،89 اور mechanism last column میں visible ہے۔ جب P>nP > n ہو تو infinitely many parameter settings training data کو exactly fit کرتی ہیں، اور آپ کو کون سی ملتی ہے یہ آپ کے choose کرنے کے طریقے پر depend کرتا ہے۔ minimum-norm solution smallest کو pick کرتا ہے، اور w\lVert w \rVert دکھاتا ہے کہ اس کا مطلب کیا ہے: یہ threshold پر exactly 14.83 تک peak کرتا ہے — جہاں exactly ایک interpolating solution ہے اور آپ اسی کے ساتھ stuck ہیں، چاہے وہ کتنا extreme ہو — اور پھر PP بڑھنے کے ساتھ monotonically fall کرتا ہے، کیونکہ زیادہ parameters کا مطلب choose کرنے کے لیے زیادہ interpolating solutions ہے، یعنی available smallest solution چھوٹا ہو جاتا ہے۔ P=5000P = 5000 پر norm 0.18 ہے، threshold سے اسی گنا چھوٹا۔

لہٰذا extra parameters complexity add نہیں کر رہے۔ وہ choice add کر رہے ہیں، اور selection rule اس choice کو simplicity پر spend کرتا ہے۔ regularisation loss function میں نہیں؛ algorithm میں ہے۔ small initialisation سے gradient descent کا small-norm solutions کی طرف documented bias ہے، اسی لیے یہ behaviour ordinary way میں train کیے گئے real networks میں بھی نظر آتا ہے، صرف اوپر والی linear algebra میں نہیں۔

practical consequence، جس پر باب 10 depend کرتا ہے: "model کے پاس data سے زیادہ parameters ہیں، اس لیے یہ overfit کرے گا" valid argument نہیں۔ یہ تب اچھی rule تھی جب models threshold کے left پر رہتے تھے۔ اب ہر interesting چیز threshold کے بہت right پر رہتی ہے، جہاں rule reverse ہو جاتی ہے۔

اس باب کے tools اتنے ہیں کہ آپ ایسا network train کر سکیں جو table میں رکھی جانے والی data پر کام کرے: numbers کی rows، labels کا ایک column۔

Language ایسی نہیں۔ model اگلا word predict کرنے سے پہلے، کسی چیز کو decide کرنا پڑتا ہے کہ "word" آخر ہے کیا — اور answer letters بھی نہیں اور words بھی نہیں، بلکہ ایک vocabulary ہے جو model training data کے raw bytes سے سیکھتا ہے۔ یہ decision، جو training شروع ہونے سے پہلے ایک بار لیا جاتا ہے، determine کرتا ہے کہ model کتنی چیزیں کہہ سکتا ہے، ایک request کی cost کتنی ہے، اور کیوں وہ models جو law exam pass کر سکتے ہیں strawberry کے letters reliably count نہیں کر سکتے۔

باب 7 ایک tokenizer بناتا ہے۔


اوپر استعمال کی گئی residual connections کے لیے، He et al., Deep Residual Learning for Image Recognition (arXiv:1512.03385)۔ Andrej Karpathy کا Building makemore Part 3: Activations & Gradients, BatchNorm ایک real model پر activation-histogram diagnostic walkthrough کرتا ہے اور اس chapter کے first half کا بہترین hands-on treatment ہے۔ Yaser Abu-Mostafa کی Learning From Data lectures 8 اور 11–13 classical generalisation theory proper دیتی ہیں، ان parts سمیت جنہیں اس chapter نے ایک paragraph میں compress کیا۔

  1. Glorot, X. and Bengio, Y. Understanding the difficulty of training deep feedforward neural networks. AISTATS (2010). اوپر box میں variance-preservation argument reproduced ہے۔

  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). نوٹ کریں کہ title میں "internal covariate shift" explanation بعد میں کافی disputed ہو چکی ہے؛ layer کام کرتی ہے، مگر کیوں کرتی ہے اس کا original account contested ہے۔

  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). وہ paper جس نے phenomenon کو name دیا۔

  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). effect کو real deep networks میں دکھاتا ہے، اور model size axis کے ساتھ ساتھ training time axis پر بھی۔


تیار کردہ

David Vicente Campos

NeuraLIA Labs کے بانی اور MyRealFood کے شریک بانی

میں یونیورسٹی آف لیون سے کمپیوٹر انجینئر ہوں۔ میں نے MyRealFood کی مشترکہ بنیاد رکھی، جہاں بطور CTO میں نے وہ ایپ بنائی جسے لاکھوں لوگ بہتر غذا کے لیے استعمال کر چکے ہیں، اور میں نے NeuraLIA Labs قائم کیا، جہاں میں AI مصنوعات بناتا ہوں۔ یہاں میں ان باتوں کے بارے میں لکھتا ہوں جو اس سفر میں مجھے سمجھنی پڑیں، اس طرح جس طرح کاش کسی نے مجھے سمجھائی ہوتیں۔

مصنف کے بارے میں مزید

NeuraLIA Labs کی جانب سے شائع کردہ۔

نئی پوسٹس اپنے ان باکس میں پائیں

AI کی خبریں، گائیڈز اور پروڈکٹ اپ ڈیٹس — جب ہم آپ کے وقت کے قابل کچھ شائع کریں تو ایک مختصر ای میل۔

کورس انڈیکس

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev14 منٹ مطالعہ

Jev AI ماڈل فیصلوں کے لیے بنایا گیا ہے، نثر کے لیے نہیں

TypeSafe AI کا Jev اس لیے توجہ کھینچ رہا ہے کہ یہ software intelligence کو احتمال کے مسئلے کے طور پر دیکھتا ہے: درست branch چنیں، confidence منسلک کریں، اور جب code کو فیصلہ چاہیے ہو تو text لکھوانے کے لیے LLM کو ادائیگی سے بچیں۔

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering14 منٹ مطالعہ

طویل مدتی AI ایجنٹس کے لیے کانٹیکسٹ انجینئرنگ

طویل عرصے تک چلنے والے ایجنٹس صرف اس لیے ناکام نہیں ہوتے کہ ونڈو چھوٹی ہے۔ وہ اس وقت ناکام ہوتے ہیں جب فائلیں، ٹول آؤٹ پٹس اور پرانی ہسٹری اس کام کو باہر دھکیل دیتی ہیں جسے ایجنٹ نے مکمل کرنا تھا۔

ماڈل چننے کا کام LIA کے سپرد کرنے کے لیے تیار ہیں؟

ہر AI ماڈل ایک ہی جگہ — آج ہی مفت شروع کریں۔