सामग्री पर जाएँ
6/30अध्याय 6 / 30

Train कराना, और Generalise कराना

छह-layer network जिसकी loss ln 2 से नहीं हिलती—एक-एक माप से ठीक की गई। फिर double descent: 40 points पर 5,000 parameters।

इस पेज पर

Chapter 5 वाला network काम करता है। उसमें नौ parameters हैं, वह XOR सीखता है, और उसके gradients PyTorch से सोलह decimal places तक मेल खाते हैं.

इसे छह layers गहरा बनाइए और यह पूरी तरह सीखना बंद कर देता है। धीरे-धीरे नहीं — पूरी तरह। यहाँ two-spiral classification problem पर एक six-layer network है, जिसे 5000 steps तक train किया गया:

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

यह संख्या मनमानी नहीं है। 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 अब भी बिल्कुल सही हैं।

यह chapter उस gap के बारे में है जो चलने वाले network और काम करने वाले network के बीच होता है। इसके दो हिस्से हैं जो अलग subjects जैसे दिखते हैं, पर काम वही है: loss को नीचे ले जाना, और उसे उस data पर नीचे ले जाना जिसे model ने पहले कभी नहीं देखा।

अनुमान लगाने के बजाय देखना शुरू कीजिए। inputs का एक batch आगे pass कीजिए और हर 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 को "सुरक्षित रहने" के लिए छोटा initialise किया गया था, और छोटा होना fatal निकला।

दूसरी row उलटी failure है और इसे समझना ज़रूरी है क्योंकि यह counterintuitive है। activations स्वस्थ दिखते हैं — लगभग 0.96 — लेकिन यह tanh\tanh saturated है, अपनी limit के पास अटका हुआ, ठीक वही regime जिसे Chapter 5 ने gradient में लगभग दस हज़ार गुना कमी के रूप में measure किया था। फिर भी gradients बहुत बड़े हैं: पहली layer पर 1940। दोनों बातें एक साथ सच हैं। हर backward step WW^\top से multiply करता है, और unit variance वाले 128 inputs के साथ उस factor का gain लगभग 12811\sqrt{128} \approx 11 होता है, जो saturated tanh\tanh से आने वाली shrinkage को overwhelm कर देता है। gradients वापस आते हुए geometrically बढ़ते हैं। यही exploding gradient है, और किसी भी वास्तविक training run में कुछ ही steps में nan जैसी loss values देता है।

तीसरी row वही है जो आप चाहते हैं: activations depth के पार लगभग constant scale में, gradients depth के पार लगभग constant scale में। कुछ मरता नहीं, कुछ explode नहीं करता।

अच्छी initialisation step zero पर scale ठीक करती है। यह उसे fixed नहीं रखती: weights move करते हैं, और step five thousand तक careful variance argument लागू नहीं रहता।

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 लगभग सब कुछ तय कर देती है:

BatchNorm हर example के output को उन दूसरे examples पर depend कराता है जो संयोग से उसके batch में थे। training time पर यह mild regulariser है। inference time पर batch नहीं होता, इसलिए उसे training के दौरान collect की गई statistics का running average रखना पड़ता है — जिसका मतलब है कि layer training और evaluation mode में अलग behave करती है, और modes switch करना भूलना field में सबसे common bugs में से एक है। यह छोटे 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 से indifferent, sequence length से indifferent। जब आप एक user के लिए एक समय में एक token generate कर रहे होते हैं — जहाँ Chapter 13 पहुँचता है — तो इनमें से हर property nicety नहीं, requirement बन जाती है।

इसीलिए LayerNorm वही है जिसे आप Chapter 9 में बिना बदले फिर देखेंगे: transformer block इसे use करता है, और right-hand column में दिए गए कारणों से use करता है, इसलिए नहीं कि abstract में यह बेहतर काम करता है।

एक-एक चीज़ ठीक करना, जो असली skill है

सेक्शन का लिंक: एक-एक चीज़ ठीक करना, जो असली skill है

dead network के लिए चार candidate fixes: Xavier initialisation, LayerNorm, residual connections, और SGD के बजाय Adam। temptation है कि चारों apply कर दें और आगे बढ़ जाएँ। ऐसा करेंगे तो कभी नहीं जानेंगे कि कौन-सी चीज़ मायने रखती थी, और अगली बार ऐसा होने पर आपके पास method नहीं होगा — केवल ritual होगा।

इसलिए उन्हें एक-एक करके apply करें। वही seed, वही data, वही architecture, 800 steps:

क्या जोड़ा गयाfinal lossaccuracy
कुछ नहीं0.693150.0 %
Xavier initialisation0.569260.4 %
LayerNorm0.623061.5 %
residual connections0.665156.6 %
Adam0.678758.7 %
चारों0.0000100.0 %

उस table को वैसे पढ़िए जैसे आप उसे रात 2 बजे पढ़ते: निष्कर्ष होगा कि कुछ भी अकेले काम नहीं करता, सब साथ काम करते हैं, इसलिए deep learning alchemy है। यह निष्कर्ष गलत है, और क्यों गलत है यह पता लगाना इस chapter की सबसे उपयोगी चीज़ है।

हर run को छह गुना budget दें — 800 के बजाय 5000 steps — और तस्वीर पूरी तरह बदल जाती है:

क्या जोड़ा गया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 %

अब तस्वीर sharp है, और यह ritual नहीं बल्कि diagnosis है।

Initialisation अकेले इसे ठीक करती है। Normalisation अकेले इसे ठीक करती है। दोनों वास्तविक बीमारी को address करती हैं — forward signal का zero पर collapse होना — और कोई भी एक sufficient है। 800 steps पर वे केवल partial credit जैसी दिखीं, क्योंकि उन्होंने problem solve कर दी थी और अभी बाहर निकल रही थीं।

Residual connections और Adam इसे किसी भी budget पर ठीक नहीं करते। इसलिए नहीं कि वे खराब हैं, बल्कि इसलिए कि वे अलग बीमारी का इलाज करते हैं। residual connection gradient को blocking layer के around एक path देता है; जब problem gradient हो तो यह बहुत कीमती है, और जब forward signal पहले से zero हो तो बेकार, क्योंकि dead layer के around shortcut भी dead value ही carry करता है। Adam हर parameter के step को उसके अपने gradient history से rescale करता है; यह तब मदद करता है जब gradients के magnitudes बहुत अलग हों, और ऐसे network को resurrect नहीं कर सकता जिसका output अपने input पर depend नहीं करता।

और "nothing" पाँच हज़ार steps के बाद भी बिल्कुल 0.6931 है। 0.6929 नहीं। यह slow नहीं है; यह dead है, और वह distinction अब ऐसे visible है जैसे पहले नहीं था, क्योंकि compare करने के लिए आपके पास वह row है जो कहती है कि fix काम करता है।

यहाँ से यह course PyTorch use करता है। इसे announce करने के बजाय earn करना चाहिए, इसलिए यहाँ ठीक-ठीक वह है जो यह करता है और जिसे करना आप पहले से जानते हैं।

Optimiser gradients को parameter updates में बदलने का rule है। Plain gradient descent gradient use करता है। Momentum उसका running average use करता है, जो 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 पर 50 steps के लिए torch.optim के against 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 हैं, साथ में edge cases पर दशकों की care और एक C++ kernel। यहाँ से आप यही trade कर रहे हैं: understanding के बदले 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 चुनना पड़ता है कि steepest direction में stable रहे — और वही value shallow direction के लिए बहुत छोटा हो जाता है, जहाँ progress रेंगती है। यही gradient descent के narrow valley में zig-zag करते हुए नीचे उतरने वाली classic picture का कारण है।

दो 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 पर सब काम करता है और चर्चा की कोई बात नहीं। एक हज़ार पर, plain SGD try किए गए किसी भी learning rate पर answer तक नहीं पहुँच सकता — उसका best result अब भी 1.93 error है — और आधे rates पर सीधे diverge करता है। Adam target पर बिल्कुल land करता है और उनमें से किसी पर diverge नहीं करता।

वह आख़िरी column व्यावहारिक वजह है कि Adam default है। ऐसा नहीं है कि Adam बेहतर solutions ढूँढता है; well-conditioned problems पर tuned SGD अक्सर उससे match करता है या beat करता है। बात यह है कि Adam आपके चुने हुए learning rate के प्रति बहुत कम sensitive है, और real networks में उनके millions of parameters के across curvature ratios एक हज़ार से कहीं worse होते हैं।

दो और pieces यहाँ belong करते हैं और दोनों one line हैं। Gradient clipping gradient vector को rescale करता है जब भी उसका norm threshold से ऊपर जाता है, जिससे diagnostic table की "loss अचानक huge value पर jump करती है" 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 करना जिससे आपने शुरू किया था, minimum में settle होने के बजाय उसके around jitter करना है।

दूसरा half: model जो perfectly fit करता है और कुछ predict नहीं करता

सेक्शन का लिंक: दूसरा half: model जो perfectly fit करता है और कुछ predict नहीं करता

अब तक सब कुछ loss नीचे लाने के बारे में था। अब कठिन half, क्योंकि loss का नीचे जाना goal नहीं है — वह goal का proxy है, और proxy एक specific और famous तरीके से fail करता है।

थोड़े noise वाली smooth function से बारह points। increasing degree के polynomials fit करें:

degreetrain RMSEtest RMSE
10.7644990.6985
30.2526050.3031
50.1644370.1568
90.0889600.2347
110.0000001.2094

12 points के through degree 11 हर single point से exactly गुजरता है — train error six decimal places तक zero — और unseen data पर degree 5 से आठ गुना worse है। 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 खोजना है — ऊपर की table में degree 5।

Standard tools सभी variance term पर attack करते हैं:

  • L2 regularisation (weight decay) loss में λw2\lambda \lVert w \rVert^2 जोड़ता है, weights को zero की ओर खींचता है और function को smoother बनाता है। ऊपर की table में degree 11 का largest coefficient damage करता है; size को penalise करना उसे defuse करता है।
  • L1 इसके बजाय λwi\lambda \sum |w_i| जोड़ता है। फर्क cosmetic नहीं है: L2 का gradient weight के proportional होता है और इसलिए weight के घटने पर shrink होता है, बिना पहुँचे zero के पास जाता है, जबकि L1 का gradient constant ±λ\pm\lambda होता है जो पूरा रास्ता push करता रहता है। इसलिए L1 ऐसे weights produce करता है जो exactly zero होते हैं — यह features select करता है। L2 small weights produce करता है। smoothness चाहिए तो L2 use करें, sparsity चाहिए तो L1।
  • Dropout7 हर training step पर activations के random subset को zero करता है, ताकि कोई unit किसी particular दूसरे unit के present होने पर rely न कर सके।
  • Early stopping validation loss देखता है और जब वह ऊपर मुड़ती है तो stop कर देता है।
  • Data augmentation आपके पास मौजूद examples से और training examples बनाता है, जो problem के source पर attack करता है: overfitting उतना ही data की कमी है जितना parameters की excess।
  • Cross-validation data को kk ways में split करता है और kk बार train करता है, जिससे test error का reliable estimate मिलता है जब आपके पास held-out set अलग रखने के लिए बहुत कम data हो।

Double descent, या पिछला section पूरी कहानी क्यों नहीं है

सेक्शन का लिंक: Double descent, या पिछला section पूरी कहानी क्यों नहीं है

अब वह fact जो picture तोड़ता है।

bias-variance story कहती है कि sweet spot के बाद, अधिक parameters का मतलब worse generalisation है। Modern language models के पास उनके देखे data के लिए classical rules से कहीं अधिक parameters होते हैं, और वे superbly generalise करते हैं। ये दोनों statements सच हैं, और उन्हें reconcile करना इस chapter की सबसे उपयोगी चीज़ है।

चालीस training points, twenty-dimensional inputs, random ReLU features, और features की संख्या PP को 2 से 5000 तक sweep किया गया — जब भी fit करने वाली कई solutions हों, minimum-norm solution चुना गया:

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 बिल्कुल hold करती है: error गिरता है, फिर rise करना शुरू करता है। P=n=40P = n = 40 पर — interpolation threshold, जहाँ model के पास हर training point से गुजरने के लिए exactly enough parameters होते हैं — test error peak करता है, 5.81 पर, small model से पाँच गुना worse। वह peak classical warning है, और real है।

फिर यह फिर descends करता है। और descending जारी रखता है, P=5nP = 5n से past, P=37nP = 37n से past, पूरी तरह P=125nP = 125n तक, जहाँ 0.5664 का test error best under-parameterised model द्वारा कभी हासिल किए गए result से बेहतर है। 40 points पर fit किया गया 5000 parameters वाला model table का best model है।

यह double descent है,89 और mechanism last column में visible है। एक बार P>nP > n हो जाए तो parameter settings की infinitely many choices होती हैं जो training data को exactly fit करती हैं, और आपको कौन-सी मिलती है यह इस पर depend करता है कि आप कैसे choose करते हैं। minimum-norm solution smallest चुनता है, और w\lVert w \rVert दिखाता है कि इसका क्या मतलब है: threshold पर यह 14.83 तक peak करता है — जहाँ exactly one interpolating solution है और आप उसी के साथ stuck हैं, चाहे वह कितना भी extreme हो — और फिर PP बढ़ने पर monotonically गिरता है, क्योंकि अधिक parameters का मतलब चुनने के लिए अधिक interpolating solutions है, यानी smallest available solution और छोटा हो जाता है। P=5000P = 5000 पर norm 0.18 है, threshold से अस्सी गुना छोटा।

तो extra parameters complexity नहीं जोड़ रहे। वे choice जोड़ रहे हैं, और selection rule उस choice को simplicity पर खर्च करता है। regularisation loss function में नहीं है; algorithm में है। छोटी initialisation से gradient descent का small-norm solutions की ओर documented bias है, इसलिए यह behaviour real networks में भी दिखता है जो ordinary way से train किए जाते हैं, केवल ऊपर की linear algebra में नहीं।

Practical consequence, जिस पर Chapter 10 depend करता है: "model के पास data से अधिक parameters हैं, इसलिए यह overfit करेगा" valid argument नहीं है। यह अच्छा rule था जब models threshold के left में रहते थे। अब interesting सब कुछ उसके बहुत right में रहता है, जहाँ rule reverse हो जाता है।

इस chapter के tools उस network को train करने के लिए पर्याप्त हैं जो table में रखे जा सकने वाले data पर काम करता है: numbers की rows, labels का एक column।

Language वैसी नहीं है। इससे पहले कि model next word predict कर सके, किसी चीज़ को decide करना होगा कि "word" आखिर है क्या — और answer न letters है न words, बल्कि एक vocabulary है जिसे model training data के raw bytes से सीखता है। यह decision, training शुरू होने से पहले एक बार लिया गया, तय करता है कि model कितनी चीज़ें कह सकता है, request की cost कितनी है, और क्यों वे models जो law exam pass कर सकते हैं, strawberry में letters reliably count नहीं कर पाते।

Chapter 7 tokenizer बनाता है।


ऊपर use किए गए 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 के through चलता है और इस chapter के first half का best hands-on treatment है। Yaser Abu-Mostafa की Learning From Data lectures 8 और 11–13 classical generalisation theory को properly देती हैं, उन 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 reproduce किया गया है।

  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). Note करें कि title में दी गई "internal covariate shift" explanation पर बाद में काफी dispute हुआ है; 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 को नाम दिया।

  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). real deep networks में effect दिखाता है, और 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.
jev13 मिनट पढ़ें

Jev AI मॉडल गद्य के लिए नहीं, निर्णयों के लिए बना है

TypeSafe AI का Jev ध्यान खींच रहा है क्योंकि यह सॉफ्टवेयर इंटेलिजेंस को संभावना की समस्या मानता है: सही शाखा चुनें, भरोसे का स्तर जोड़ें, और जब कोड को निर्णय चाहिए तो LLM से टेक्स्ट लिखवाने पर खर्च न करें।

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering14 मिनट पढ़ें

लॉन्ग-होराइजन AI एजेंट्स के लिए कॉन्टेक्स्ट इंजीनियरिंग

लंबे समय तक चलने वाले एजेंट सिर्फ इसलिए असफल नहीं होते कि विंडो छोटी है। वे तब असफल होते हैं जब फ़ाइलें, टूल आउटपुट और पुराना इतिहास उस काम को ही पीछे धकेल देते हैं जिसे एजेंट को पूरा करना था।

मॉडल चुनने का काम LIA पर छोड़ने के लिए तैयार हैं?

हर AI मॉडल एक ही जगह — आज ही मुफ़्त शुरू करें।