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

ڈھلوان کی طرف: Gradient Descent، اور وہ دو قدم جو سب چھوڑ دیتے ہیں

learning rate کی عین حد نکالیں، پھر 3,600 سمتوں کی brute-force تلاش کو gradient دوبارہ دریافت کرتے دیکھیں۔

اس صفحے پر

پچھلا باب ایک وادی پر ختم ہوا تھا۔

استعارے والی نہیں: ایک حقیقی curve، جس میں loss کو ایک parameter کے مقابل plot کیا گیا تھا، نیچے جھکتی ہوئی اور پھر واپس اوپر آتی ہوئی۔ اور اس کے نیچے موجود loss اس لیے نہیں چنا گیا تھا کہ وہ صاف ستھرا تھا — اسے measurements میں noise کے بارے میں ایک statement سے derive کیا گیا تھا، اور squared error دوسری طرف convention کے بجائے consequence کے طور پر نکلا تھا۔

تو ہمارے پاس ایک landscape ہے جس کی تہہ ہے، اور یہ ماننے کی وجہ ہے کہ تہہ ہی صحیح جگہ ہے۔ جو چیز ہمارے پاس نہیں ہے وہ وہاں پہنچنے کا طریقہ ہے۔

یہ باب وہ طریقہ بناتا ہے، اور یہی algorithm اس course کے باقی ہر model کو train کرتا ہے — ہر ایک کو، بغیر exception، ان models تک جن میں hundreds of billions parameters ہوتے ہیں۔ یہ تقریباً بیس lines میں آ جاتا ہے۔ مشکل دو حصے ان بیس lines میں نہیں ہیں، اور یہی وہ دو چیزیں ہیں جنہیں تقریباً ہر explanation چھوڑ دیتی ہے:

  • minus sign کیوں۔ update gradient کو subtract کرتا ہے۔ ہر tutorial اسے لکھتا ہے؛ بہت کم بتاتے ہیں کہ gradient وہ direction کیوں ہے جو اوپر جاتی ہے، اور یہی واحد fact ہے جو minus sign کو ایمان کے عمل کے بجائے معنی دیتا ہے۔
  • قدم کتنا بڑا۔ «بہت بڑا diverge کرتا ہے، بہت چھوٹا slow ہے» درست ہے اور بےکار بھی۔ ایک exact number ہے، loss سے compute کیا جا سکتا ہے، اور یہ باب اسے دو بار compute کرتا ہے — ایک toy parabola کے لیے اور ایک actual data کے لیے۔

setup، اور آپ صرف search کیوں نہیں کر سکتے

اس حصے کا لنک: setup، اور آپ صرف search کیوں نہیں کر سکتے

تاکہ یہ باب اپنے پاؤں پر کھڑا رہے، بات دوبارہ: Chapter 1 کے conveyor belt کے آٹھ parts، مگر سوال مختلف۔ accept یا reject نہیں — وہ بعد میں واپس آئے گا — بلکہ کسی part کا weight اس کی width سے predict کرنا۔

belt.pyPYTHON
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

measurements centred ہیں، بالکل Chapter 1 کی طرح، اور ایک ایسی وجہ سے جو اس باب کے ختم ہونے سے پہلے سود سمیت واپس آتی ہے۔ model ایک line ہے، y^=ax+b\hat{y} = a x + b، اور loss وہ mean squared error ہے جو پچھلے باب نے derive کیا تھا:

L(a,b)=1ni=1n(axi+byi)2L(a, b) = \frac{1}{n} \sum_{i=1}^{n} \left(a x_i + b - y_i\right)^2

دو parameters۔ بس بہت سی values try کیوں نہ کر لیں؟ آئیے واقعی کرتے ہیں — a=0a = 0 سے 55 تک اور b=5b = -5 سے 55 تک ایک grid، 0.010.01 کے steps میں:

TEXT
grid 501 x 1001 = 501,501 evaluations in 3.67 s
  best found: a = 2.1000, b = -0.0000, L = 24.592450

دو numbers کو دو decimal places تک pin down کرنے کے لیے آدھا million evaluations — اور وہ second ایک machine پر wall clock ہے، اس لیے rerun تین سے چھ کے بیچ کہیں بھی آ سکتا ہے؛ evaluation count اور minimum وہ حصہ ہیں جو reproduce ہوتا ہے۔ Gradient descent، اس باب کے آخر میں، آٹھ steps میں چار decimal places اور چھتیس میں full float64 answer حاصل کر لیتا ہے۔

مگر speed اصل argument نہیں، اور یہی point پورے course کا فیصلہ کرتا ہے۔ Grid search PP parameters کے لیے، ہر ایک پر kk values کے ساتھ، kPk^P evaluations مانگتی ہے۔ ہر axis پر ایک ہزار values کے ساتھ:

modelparametersgrid evaluations
یہ line210610^{6}
Chapter 5 کا XOR network9102710^{27}
ایک چھوٹا multilayer network20,0001060,00010^{60{,}000}

تیسری row کوئی بڑا number نہیں، ایک بےمعنی number ہے — observable universe میں تقریباً 108010^{80} atoms ہیں۔ models بڑھنے پر search slow نہیں ہوتی؛ وہ موجود ہی نہیں رہتی۔ آگے آنے والی ہر چیز اسی table کی وجہ سے موجود ہے۔

derivative ایک measurement ہے جو آپ لے سکتے ہیں

اس حصے کا لنک: derivative ایک measurement ہے جو آپ لے سکتے ہیں

ایک لمحے کے لیے b=0b = 0 fix کر دیں تاکہ ایک parameter اور ایک curve رہ جائے، وہی picture جو پچھلا باب چھوڑ گیا تھا۔ اس پر ایک point لیں، a=1a = 1، اور پوچھیں: اگر میں aa کو ایک چھوٹی مقدار hh سے nudge کروں تو loss فی unit nudge کتنا move کرتا ہے؟

L(a+h)L(a)h\frac{L(a + h) - L(a)}{h}

یہ ratio rise over run ہے — curve پر دو points کے بیچ straight line کی slope۔ جیسے جیسے hh shrink ہوتا ہے، دونوں points ساتھ ساتھ slide کرتے ہیں اور line tangent بن جاتی ہے۔ اس کی slope derivative L(a)L'(a) ہے: aa میں change کے فی unit loss کے change کی rate۔ کسی چیز کی approximation نہیں، اور کوئی infinitely small quantity بھی نہیں۔ ordinary ratios کا limit۔

اسے run کرنا worth it ہے، کیونکہ numbers وہ بات کہتے ہیں جو definition نہیں کہتی:

slope.pyPYTHON
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}")
TEXT
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

یہاں دو چیزیں ہوتی ہیں اور دونوں load-bearing ہیں۔

error مبہم طور پر hh کے proportional نہیں — وہ exact 7.445h7.445\,h ہے۔ hh کو سو سے divide کریں، error بھی سو سے divide ہو جاتا ہے، ہر بار چار significant figures تک۔ وہ constant decoration نہیں: وہ loss کے second derivative کا half ہے، اور اس idea کی پہلی جھلک ہے جو دو sections بعد آئے گا — کہ point کے نزدیک curve ایک line plus ایک correction جیسا ہوتا ہے جو h2h^2 کے proportional ہوتا ہے۔

اور پھر pattern ٹوٹ جاتا ہے۔ h=108h = 10^{-8} سے نیچے estimate بدتر ہو جاتا ہے، اور 101410^{-14} پر وہ second digit میں غلط ہے۔ mathematical کچھ نہیں ہوا؛ پچھلے باب کا floating-point box ہوا۔ L(a+h)L(a+h) اور L(a)L(a) اپنے پہلے دس digits میں agree کرتے ہیں، انہیں subtract کرنے سے وہ digits تباہ ہو جاتے ہیں، اور wreckage کو tiny number سے divide کرنا باقی بچے ہوئے کو amplify کر دیتا ہے۔ ایک best hh ہے — یہاں تقریباً 10810^{-8}، machine epsilon کے square root کے لگ بھگ — اور اس سے چھوٹا جانا زیادہ careful نہیں، کم careful ہے۔ اسے یاد رکھیں؛ اس باب کے آخر میں ایک function اس پر depend کرتا ہے۔

calculus سے exact slope، measurement کے بجائے، 16.385-16.385 ہے۔ تو ہم measuring روک کر deriving شروع کر سکتے ہیں۔

یہ وہ idea ہے جس پر باقی course built ہے، ایک بار صاف لفظوں میں۔

دو functions کو compose کرنا یعنی ایک کو دوسرے میں feed کرنا: (fg)(x)=f(g(x))(f \circ g)(x) = f(g(x))۔ بس۔

deep network composition جیسا نہیں ہوتا۔ وہ ہے composition۔ layer ایک function ہے؛ layers stack کرنا انہیں compose کرنا ہے؛ «depth» chain میں functions کی تعداد ہے۔ جب Chapter 5 ایک network بناتا ہے تو وہ f4f3f2f1f_4 \circ f_3 \circ f_2 \circ f_1 بنا رہا ہوتا ہے، اور کچھ نہیں۔ جس کا مطلب ہے کہ ہمارے purposes کے لیے calculus کا single most important rule وہ ہے جو composition کو differentiate کرتا ہے:

ddxf(g(x))=f(g(x))g(x)\frac{d}{dx} f(g(x)) = f'(g(x)) \cdot g'(x)

Rates multiply کرتی ہیں۔ اگر gg، xx کے مقابل تین گنا تیزی سے change کرتا ہے، اور ff، gg کے مقابل دو گنا تیزی سے، تو ff، xx کے مقابل چھ گنا تیزی سے change کرتا ہے۔ یہی پوری بات ہے، اور اسی لیے دس layers سے واپس گزرتا ہوا signal دس numbers سے multiply ہوتا ہے — یہی وجہ ہے کہ Chapter 6 ایک section اس بات پر خرچ کرتا ہے کہ جب وہ numbers سب کے سب ایک سے تھوڑے کم ہوں تو کیا ہوتا ہے۔

اسے اپنے loss پر use کریں۔ residual ri=axi+byir_i = a x_i + b - y_i لکھیں، تاکہ L=1nri2L = \frac{1}{n}\sum r_i^2۔ ہر rir_i، aa پر inner function axia x_i کے ذریعے depend کرتا ہے، جس کا derivative xix_i ہے۔ Chain rule، term by term:

La=1ni2rixi,Lb=1ni2ri1\frac{\partial L}{\partial a} = \frac{1}{n}\sum_i 2 r_i \cdot x_i, \qquad \frac{\partial L}{\partial b} = \frac{1}{n}\sum_i 2 r_i \cdot 1

وہ curly \partial symbols ایک partial derivative mark کرتے ہیں: ایک variable کے respect میں differentiate کریں اور ہر دوسرے کو constant treat کریں۔ کچھ نیا نہیں ہوتا — وہی limit ہے جو پہلے تھا، بس ایک axis کے along لیا گیا۔ partials کو ایک vector میں collect کریں اور آپ کے پاس gradient ہے:

L=(La, Lb)\nabla L = \left( \frac{\partial L}{\partial a},\ \frac{\partial L}{\partial b} \right)

point (a,b)=(1,4)(a, b) = (1, 4) پر یہ vector (16.385, 8.0)(-16.385,\ 8.0) ہے۔ دو numbers۔ سوال یہ ہے کہ ان کا مطلب کیا ہے، اور یہی وہ پہلا قدم ہے جسے سب چھوڑ دیتے ہیں۔

gradient axes کے along slopes کا vector ہے۔ ہم نے بس اتنا prove کیا ہے۔ یہ obvious نہیں — obvious ہونا بھی نہیں چاہیے — کہ انہیں vector میں assemble کرنے سے کوئی چیز کسی خاص direction میں point کرتی ہے۔

تو وہ چیز define کریں جو ہمیں واقعی چاہیے۔ ایک unit vector u\mathbf{u} pick کریں، ایک direction۔ directional derivative وہ rate ہے جس سے loss اس direction میں چلنے پر change کرتا ہے:

DuL=limh0L(θ+hu)L(θ)hD_{\mathbf{u}} L = \lim_{h \to 0} \frac{L(\boldsymbol{\theta} + h\mathbf{u}) - L(\boldsymbol{\theta})}{h}

Chain rule اسے computable بنا دیتا ہے۔ u\mathbf{u} کے along چلنا aa کو rate u1u_1 سے اور bb کو rate u2u_2 سے change کرتا ہے، اور contributions add ہو جاتی ہیں:

DuL=Lau1+Lbu2=LuD_{\mathbf{u}} L = \frac{\partial L}{\partial a} u_1 + \frac{\partial L}{\partial b} u_2 = \nabla L \cdot \mathbf{u}

کسی بھی direction میں rate of change gradient اور اس direction کا dot product ہے۔ اور اب punchline، geometry کی ایک line۔ vectors کے بیچ angle ϕ\phi کے ساتھ dot product لکھتے ہوئے،

Lu=Lucosϕ=Lcosϕ\nabla L \cdot \mathbf{u} = \lVert \nabla L \rVert \, \lVert \mathbf{u} \rVert \cos\phi = \lVert \nabla L \rVert \cos\phi

کیونکہ u\mathbf{u} کی length 1 ہے۔ آپ صرف cosϕ\cos\phi control کرتے ہیں، جو ϕ=0\phi = 0 پر largest اور half turn، ϕ=180\phi = 180 degrees پر smallest ہے۔ اس لیے:

  • steepest ascent خود L\nabla L کے along ہے، اور وہاں slope exact L\lVert \nabla L \rVert ہے۔
  • steepest descent L-\nabla L کے along ہے، اور وہاں slope L-\lVert \nabla L \rVert ہے۔
  • gradient کے perpendicular، loss بالکل change نہیں کرتا۔ اسی لیے contour map کی lines gradient کو right angles پر cross کرتی ہیں۔

یہی minus sign ہے۔ convention نہیں، کسی کا chosen sign flip نہیں: fastest decrease کی direction negative gradient ہے کیونکہ cosϕ\cos\phi half turn پر minimise ہوتا ہے، اور کسی اور وجہ سے نہیں۔

چونکہ یہ claim تمام directions کے بارے میں ہے، اسے تمام directions کے against test کریں۔ 3,600 directions sample کریں، ہر tenth of a degree پر ایک، اور ہر ایک کو nudge کر کے measure کریں:

directions.pyPYTHON
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")
TEXT
gradient       [-16.385   8.   ]
its length     18.23371122399386
its angle      153.97598928042032 degrees
steepest slope 18.233709624837502 at 154.0 degrees

ایک search جسے gradients کے بارے میں کچھ نہیں معلوم، 3,600 directions پر، اپنی steepest climb 154.0 degrees پر پاتی ہے — gradient کی اپنی direction، search کی 0.1-degree resolution کے اندر۔ اور وہاں جو slope ملتی ہے، 18.2337، چھ figures تک gradient کی length ہے۔ theorem gradients کے معنی کی story نہیں؛ یہ measurable fact ہے، اور یہ اس کی measurement ہے۔

downhill ایک چھوٹا step واقعی مدد کیوں کرتا ہے

اس حصے کا لنک: downhill ایک چھوٹا step واقعی مدد کیوں کرتا ہے

اب دوسرا skipped step۔ ہمیں معلوم ہے down کس طرف ہے۔ اس سے یہ follow نہیں کرتا کہ اس طرف چلنے سے loss کم ہو گا، کیونکہ «down» infinitesimal nudge کے بارے میں statement ہے اور step infinitesimal نہیں ہوتا۔

bridge linearisation ہے۔ ایک point کے near، smooth function اپنی tangent plus correction ہوتا ہے:

L(θ+δ)=L(θ)+Lδ+O(δ2)L(\boldsymbol{\theta} + \boldsymbol{\delta}) = L(\boldsymbol{\theta}) + \nabla L \cdot \boldsymbol{\delta} + O(\lVert\boldsymbol{\delta}\rVert^2)

یہ first-order Taylor expansion ہے۔ discard کیا گیا O(δ2)O(\lVert\boldsymbol{\delta}\rVert^2) curvature ہے — وہی term جس نے slope table کے estimate کو exact 7.445h7.445\,h سے wrong بنایا۔ وہ step ڈالیں جو ہم لینے کا intend رکھتے ہیں، δ=ηL\boldsymbol{\delta} = -\eta \nabla L:

L(θηL)L(θ)ηL2L(\boldsymbol{\theta} - \eta \nabla L) \approx L(\boldsymbol{\theta}) - \eta \lVert \nabla L \rVert^2

loss ηL2\eta \lVert \nabla L \rVert^2 سے drop کرتا ہے۔ اس کا ہر part non-negative ہے، اس لیے promise real ہے — کافی چھوٹے η\eta کے لیے، کیونکہ neglected term η2\eta^2 کی طرح grow کرتا ہے اور آخرکار اسے کھا جاتا ہے۔ یہی پوری theory ہے۔ یہ promise پہلے پورا ہوتا، پھر ٹوٹتا ہوا:

TEXT
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

اسے bottom سے پڑھیں۔ جیسے η\eta shrink ہوتا ہے delivered drop promised drop پر converge کرتا ہے — ratio 0.99938، پھر 0.99994 — یعنی Taylor's theorem صحیح ہے۔ top سے پڑھیں تو η=0.2\eta = 0.2 پر delivered «drop» negative sixteen ہے۔ step downhill گیا اور loss اوپر چلا گیا۔

تو update rule ہے

θθηL(θ)\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \eta \nabla L(\boldsymbol{\theta})

اور اس کے ساتھ ایک condition آتی ہے جو کوئی state نہیں کرتا، کہ η\eta کافی چھوٹا ہے۔ کس کے مقابل کافی چھوٹا، exactly، یہ اگلا section ہے۔

learning rate کی ایک ceiling ہے، اور وہ computable ہے

اس حصے کا لنک: learning rate کی ایک ceiling ہے، اور وہ computable ہے

سب سے simple valley سے شروع کریں، f(x)=x2f(x) = x^2، جہاں f(x)=2xf'(x) = 2x۔ gradient descent کا ایک step ہے

xxη2x=x(12η)x \leftarrow x - \eta \cdot 2x = x\,(1 - 2\eta)

position ہر step پر (12η)(1 - 2\eta) سے multiply ہوتی ہے۔ یہ geometric sequence ہے، اور geometric sequences کا exact ایک rule ہے: جب multiplier absolute value میں 1 سے چھوٹا ہو تو وہ shrink کرتی ہیں، ورنہ grow۔ تو 12η<1\lvert 1 - 2\eta \rvert < 1، یعنی 0<η<10 < \eta < 1۔

boundary exactly η=1\eta = 1 پر ہے۔ «around 1» نہیں، «1 usually too big ہے» نہیں۔ η=1\eta = 1 پر multiplier 1-1 ہے اور point ہمیشہ xx اور x-x کے بیچ bounce کرتا رہتا ہے، نہ قریب آتا ہے نہ escape کرتا ہے۔ اس سے نیچے، converge؛ اس سے اوپر، diverge۔ interval دوبارہ η=0.5\eta = 0.5 پر split ہوتا ہے، جہاں multiplier sign بدلتا ہے: اس سے نیچے approach monotone ہے، اس سے اوپر point overshoot کر کے sides alternate کرتا ہے، اور exact 0.50.5 پر multiplier 0 ہے اور ایک ہی step minimum پر land کر جاتا ہے۔

algebra کی چار lines سے چار regimes۔ جا کر boundaries خود cross کریں:

14 مراحل، اختتام x = -0.0836 پر۔

ڈیٹا کو جدول کی صورت میں دیکھیں
مرحلہxf(x)
0⁨-1.9000⁩⁨3.6100⁩
1⁨-1.5200⁩⁨2.3104⁩
2⁨-1.2160⁩⁨1.4787⁩
3⁨-0.9728⁩⁨0.9463⁩
4⁨-0.7782⁩⁨0.6057⁩
5⁨-0.6226⁩⁨0.3876⁩
6⁨-0.4981⁩⁨0.2481⁩
7⁨-0.3985⁩⁨0.1588⁩
8⁨-0.3188⁩⁨0.1016⁩
9⁨-0.2550⁩⁨0.0650⁩
10⁨-0.2040⁩⁨0.0416⁩
11⁨-0.1632⁩⁨0.0266⁩
12⁨-0.1306⁩⁨0.0170⁩
13⁨-0.1045⁩⁨0.0109⁩
14⁨-0.0836⁩⁨0.0070⁩
گریڈینٹ ڈیسنٹ، انٹرایکٹو

0.1 کی rate پر fourteen steps، x=1.9x = -1.9 سے، 0.0836-0.0836 پر ending۔ rate کو 0.5 تک push کریں اور very first step bottom پر land کر جاتا ہے۔ اسے 0.9 تک push کریں اور یہ اسی 0.0836-0.0836 پر end کرتا ہے جس پر 0.1 نے کیا — same distance، opposite style، کیونکہ 12η\lvert 1 - 2\eta \rvert دونوں کے لیے 0.8 ہے — مگر یہ ایک side سے نیچے چلنے کے بجائے valley کے across zig-zag کرتے ہوئے وہاں پہنچتا ہے۔

اور اب interesting one:

14 مراحل، اختتام x = -1.9000 پر۔

ڈیٹا کو جدول کی صورت میں دیکھیں
مرحلہxf(x)
0⁨-1.9000⁩⁨3.6100⁩
1⁨1.9000⁩⁨3.6100⁩
2⁨-1.9000⁩⁨3.6100⁩
3⁨1.9000⁩⁨3.6100⁩
4⁨-1.9000⁩⁨3.6100⁩
5⁨1.9000⁩⁨3.6100⁩
6⁨-1.9000⁩⁨3.6100⁩
7⁨1.9000⁩⁨3.6100⁩
8⁨-1.9000⁩⁨3.6100⁩
9⁨1.9000⁩⁨3.6100⁩
10⁨-1.9000⁩⁨3.6100⁩
11⁨1.9000⁩⁨3.6100⁩
12⁨-1.9000⁩⁨3.6100⁩
13⁨1.9000⁩⁨3.6100⁩
14⁨-1.9000⁩⁨3.6100⁩
گریڈینٹ ڈیسنٹ، انٹرایکٹو

Exactly boundary پر۔ rate 1 پر fourteen steps، اور یہ 1.9-1.9 پر finish کرتا ہے: precisely جہاں شروع ہوا تھا، bounce کرنے کے سوا کچھ نہ کرتے ہوئے۔ ایک nudge زیادہ اور bouncing hold کرنے کے بجائے grow کرتی ہے؛ 1.2 پر یہ چار steps میں chart سے باہر ہے۔ جو rate بہت بڑی ہو وہ slowly converge نہیں کرتی۔ وہ converge ہی نہیں کرتی۔

اب general rule، جو اسی argument سے نکلتا ہے۔ multiplier 12η1 - 2\eta دراصل 1ηf1 - \eta f'' تھا، اور minimum کے near multi-parameter loss میں ہر direction کے لیے ایسا ایک number ہوتا ہے — second derivatives کی matrix کے eigenvalues۔ ہر direction کو ایک ساتھ stable ہونا پڑتا ہے، اس لیے ceiling largest سے set ہوتی ہے:

η<2λmax\eta < \frac{2}{\lambda_{\max}}

f(x)=x2f(x) = x^2 کے لیے، f=2f'' = 2، ceiling 1، جو ہم نے ابھی derive کیا۔ ہماری belt کے لیے، second-derivative matrix 2nAA\frac{2}{n} A^{\top} A ہے جس میں AA inputs کی two-column matrix ہے، اور اس کے eigenvalues 2 اور 14.89 ہیں، اس لیے ceiling 2/14.89=0.134322 / 14.89 = 0.13432 ہے۔ یہ پانچ significant figures والی prediction ہے۔ اسے test کریں:

TEXT
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

linear algebra کی ایک line اور for loop کی ایک hundred thousand iterations کے بیچ پانچ decimal places کی agreement۔

اور یہی وہ جگہ ہے جہاں Chapter 1 واپس آتا ہے۔ اوپر سب کچھ centred measurements کے ساتھ تھا۔ identical code raw millimetres اور grams پر run کریں تو eigenvalues 2 اور 14.89 کے بجائے 0.0298 اور 998.1 ہیں۔ ceiling 0.134 سے collapse ہو کر 0.002004 رہ جاتی ہے — اتنی ہی exact، lr=0.002003 پر converging اور lr=0.002004 پر blowing up۔

ceiling سے بھی worse eigenvalues کے بیچ ratio ہے۔ condition number measure کرتا ہے کہ valley round سے کتنی دور ہے: ایک long thin trench rate کو steep walls کے لیے کافی چھوٹا رکھنے پر مجبور کرتی ہے، اور پھر trench کا floor بھی اسی crawl پر walk ہوتا ہے۔ ہمارا centred میں 7.44 سے raw میں 33,452 ہو جاتا ہے۔ ہر version کی best rate کے ساتھ:

featurescondition numberbest rateoptimum کے 1% کے اندر پہنچنے کے steps
centred7.440.118410
raw millimetres and grams33,4520.002003779,513

same data، same code، end پر same answer — اور آٹھ ہزار گنا کام، کیونکہ کسی نے mean subtract نہیں کیا۔ Chapter 1 میں اسی omission نے perceptron کو epochs میں factor of six thousand cost کیا، اور وہاں diagnosis geometric تھی: data origin سے بہت دور float کر رہا تھا۔ یہاں یہی geometry optimisation کے costume میں ہے، اور اسی لیے input normalisation hygiene advice نہیں بلکہ arithmetic ہے۔1

اوپر کسی چیز کو library کی ضرورت نہیں تھی۔ یہ پورا optimiser ہے۔

descent.pyPYTHON
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))
TEXT
[ 2.10040296e+00 -2.76445533e-15] 24.592448791134984

ان آٹھ points کے لیے closed-form least-squares answer a=2.100403a = 2.100403، b=0b = 0 ہے، loss 24.59244924.592449 کے ساتھ۔ loop نے یہ آٹھ significant figures تک find کر لیا، یہ جانے بغیر کہ closed form exist کرتی ہے — جو matter کرتا ہے، کیونکہ Chapter 5 کے بعد کوئی closed form نہیں ہو گی۔

trajectory، کیونکہ اسے دیکھنا ہی point ہے:

TEXT
   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

distance کا زیادہ حصہ پہلے دو steps میں cover ہو جاتا ہے، کیونکہ gradient سب سے بڑا تب ہوتا ہے جب آپ bottom سے سب سے دور ہوتے ہیں اور قریب آتے ہوئے shrink ہوتا ہے۔ Gradient descent minimum کے near خود بخود slow ہو جاتا ہے۔ یہ feature ہے اور Chapter 6 میں problem بھی۔

اب تک کے argument میں ایک hole ہے۔ step تب stop ہوتا ہے جب L=0\nabla L = \mathbf{0}، اور ہم اسے «the minimum» کہتے آئے ہیں۔ zero gradient والا point critical point ہے، اور minimum ہونا اس کے ایک ہونے کے صرف ایک طریقہ ہے:

  • ایک local minimum: ہر direction میں uphill، مگر ممکن ہے anywhere ایسا lowest point نہ ہو؛
  • ایک local maximum: ہر direction میں downhill؛
  • ایک saddle point: کچھ directions میں uphill اور کچھ میں downhill۔ surface f(x,y)=x2y2f(x,y) = x^2 - y^2 کے پاس f=(2x,2y)\nabla f = (2x, -2y) ہے، جو origin پر zero ہے، جہاں function xx-axis کے along minimum اور yy-axis کے along اسی وقت maximum ہے۔

Gradient descent انہیں apart نہیں tell کر سکتا، کیونکہ وہ صرف gradient کو دیکھتا ہے، اور gradient تینوں پر zero ہے۔

ہماری line کا ایک critical point ہے اور وہی answer ہے — linear model پر squared-error loss convex ہے، ایک single bowl، اور اس پر descent global minimum find کرنے میں fail نہیں ہو سکتا۔ یہ property اس course سے contact survive نہیں کرتی۔ neural network کا loss convex نہیں ہوتا، اور Chapter 5 سے آگے «the minimum» کوئی existing چیز نہیں: بہت سے minima ہوتے ہیں، different depths کے، اور آپ کو کون سا ملتا ہے اس پر depend کرتا ہے کہ آپ نے کہاں start کیا۔ یہ ایک sentence ہے اور ایک sentence ہی رہتا ہے، کیونکہ theory بڑی ہے اور practical consequence چھوٹا۔

آپ پورا consequence ایک curve پر دیکھ سکتے ہیں۔ f(x)=x44x22+x10f(x) = \tfrac{x^4}{4} - \tfrac{x^2}{2} + \tfrac{x}{10} لیں، جس میں different depths کی دو valleys ہیں:

TEXT
   x =  -1.046681   f(x) =  -0.352386   minimum
   x =   0.101031   f(x) =   0.005026   maximum
   x =   0.945649   f(x) =  -0.152639   minimum

40 مراحل، اختتام x = 0.9456 پر۔

ڈیٹا کو جدول کی صورت میں دیکھیں
مرحلہxf(x)
0⁨0.1100⁩⁨0.0050⁩
1⁨0.1122⁩⁨0.0050⁩
2⁨0.1149⁩⁨0.0049⁩
3⁨0.1182⁩⁨0.0049⁩
4⁨0.1223⁩⁨0.0048⁩
5⁨0.1275⁩⁨0.0047⁩
6⁨0.1338⁩⁨0.0045⁩
7⁨0.1416⁩⁨0.0042⁩
8⁨0.1513⁩⁨0.0038⁩
9⁨0.1633⁩⁨0.0032⁩
10⁨0.1781⁩⁨0.0022⁩
11⁨0.1962⁩⁨0.0007⁩
12⁨0.2183⁩⁨-0.0014⁩
13⁨0.2453⁩⁨-0.0046⁩
14⁨0.2779⁩⁨-0.0093⁩
15⁨0.3170⁩⁨-0.0160⁩
16⁨0.3633⁩⁨-0.0253⁩
17⁨0.4172⁩⁨-0.0377⁩
18⁨0.4783⁩⁨-0.0535⁩
19⁨0.5455⁩⁨-0.0721⁩
20⁨0.6163⁩⁨-0.0922⁩
21⁨0.6869⁩⁨-0.1116⁩
22⁨0.7526⁩⁨-0.1277⁩
23⁨0.8092⁩⁨-0.1393⁩
24⁨0.8540⁩⁨-0.1463⁩
25⁨0.8868⁩⁨-0.1499⁩
26⁨0.9091⁩⁨-0.1516⁩
27⁨0.9236⁩⁨-0.1522⁩
28⁨0.9325⁩⁨-0.1525⁩
29⁨0.9379⁩⁨-0.1526⁩
30⁨0.9411⁩⁨-0.1526⁩
31⁨0.9430⁩⁨-0.1526⁩
32⁨0.9441⁩⁨-0.1526⁩
33⁨0.9448⁩⁨-0.1526⁩
34⁨0.9451⁩⁨-0.1526⁩
35⁨0.9454⁩⁨-0.1526⁩
36⁨0.9455⁩⁨-0.1526⁩
37⁨0.9455⁩⁨-0.1526⁩
38⁨0.9456⁩⁨-0.1526⁩
39⁨0.9456⁩⁨-0.1526⁩
40⁨0.9456⁩⁨-0.1526⁩
گریڈینٹ ڈیسنٹ، انٹرایکٹو

x=0.11x = 0.11 سے forty steps، 0.94560.9456 پر settle ہوتے ہوئے — دو valleys میں shallower والی۔ اب starting point کو ایک notch left، 0.100.10 تک move کریں۔ same rate، same forty steps، اور یہ بجائے اس کے 1.0461-1.0461 پر settle ہوتا ہے، جہاں loss 0.199747 lower ہے۔ watershed 0.1010310.101031 پر hump ہے، اور دونوں answers کے بیچ پورا فرق صرف یہ ہے کہ آپ happen کس side پر start ہوئے۔

shallow valley میں land کرنا loss میں 56.7% worse ہے، اور algorithm کے پاس جاننے کا کوئی طریقہ نہیں، کیونکہ valley کے اندر سے ہر direction uphill ہے۔ gradient descent میں اس کی کوئی repair نہیں اور آنے بھی نہیں والی۔ practice میں جو ہے وہ finding ہے کہ یہ picture جتنا suggest کرتی ہے اس سے کہیں کم matter کرتا ہے — real network کی very high dimensions میں زیادہ تر critical points traps کے بجائے saddles نکلتے ہیں،2 اور Chapter 5 measure کرتا ہے کہ ایک small network حقیقت میں کتنی بار stuck ہوتا ہے۔

اوپر grad کے بارے میں ایک چیز آپ کو bother کرنی چاہیے: یہ ہر step کے لیے پورے dataset پر sum کرتا ہے۔ آٹھ parts کچھ نہیں۔ ایک million یعنی parameters کو ایک بار move کرنے کے لیے ایک million gradient computations۔

escape یہ ہے کہ gradient ایک average ہے، اور average کو sample سے estimate کیا جا سکتا ہے۔ random handful — ایک minibatch — پر compute کریں، اور اسی پر step لیں۔ estimate noisy ہے؛ یہ unbiased بھی ہے، اور hundreds of cheap noisy steps ایک expensive exact step کو beat کرتے ہیں۔ ایک hundred thousand synthetic parts پر، steps کے بجائے per-example gradients count کرتے ہوئے:

methodoptimum کے 0.1% کے اندر پہنچنے کے stepsper-example gradients
full batch7700,000
32 کا minibatch1003,200
ایک example at a time17,58017,580

same place تک پہنچنے کے لیے two hundred and nineteen times کم arithmetic۔ اور extreme — ایک example at a time، Robbins and Monro3 کی original stochastic approximation — winner نہیں ہے: یہ 32 کے batches سے five times worse ہے، کیونکہ matrices multiply کرنے والے hardware پر 32 examples ایک سے تقریباً کچھ زیادہ cost نہیں کرتے، جبکہ noise batch size کے square root کے ساتھ fall off کرتا ہے۔ یہی trade-off ہے جس کی وجہ سے ہر training script جو آپ کبھی پڑھیں گے اس میں batch_size ہو گا۔

Momentum دوسرا cheap fix ہے، اور اس کا نشانہ سیدھا trench ہے۔ badly conditioned valley میں steps narrow direction کے across zig-zag کرتے ہیں جبکہ long one کے along crawl کرتے ہیں۔ Momentum past gradients کی running average رکھتا ہے، تاکہ oscillating components cancel ہوں اور consistent component accumulate ہو:4

vβv+L(θ),θθηv\mathbf{v} \leftarrow \beta \mathbf{v} + \nabla L(\boldsymbol{\theta}), \qquad \boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \eta \mathbf{v}

دو extra lines۔ raw uncentred belt پر — condition number 33,452، ہمارے پاس worst case — اس best rate پر جو plain descent لے سکتا ہے:

TEXT
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%

دو lines of code کے لیے factor of 172۔ Chapter 6 اسے Adam میں بدلتا ہے؛ mechanism پہلے ہی یہاں ہے۔

وہ check جس کی آپ کو Chapter 5 میں ضرورت ہو گی

اس حصے کا لنک: وہ check جس کی آپ کو Chapter 5 میں ضرورت ہو گی

اس باب میں ہر gradient hand سے derive کیا گیا تھا، اس لیے wrong ہو سکتا تھا۔ fix beginning کی slope table ہے: derivative کو numerically measure کریں اور compare کریں۔ central difference use کریں، L(θ+h)L(θh)2h\frac{L(\theta+h) - L(\theta-h)}{2h}، جو leading error term cancel کرتا ہے اور اسی hh کے لیے بہت زیادہ accurate ہے۔

gradcheck.pyPYTHON
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)))

comparison کی relative form matter کرتی ہے: 10410^{-4} کا absolute difference 10310^{-3} size کے gradient پر disaster ہے اور 10610^{6} size کے gradient پر irrelevant۔

TEXT
relative error: 1.8929136036763527e-11
with 2 dropped: 0.33333333331650744

first line اوپر hand-derived gradient ہے۔ second وہی function ہے جس میں ایک component سے factor of 2 چھوڑ دیا گیا — single character کی typo — اور check اسے immediately catch کر لیتا ہے۔ تقریباً 10710^{-7} سے نیچے کچھ بھی agreement ہے؛ 10410^{-4} سے اوپر کچھ بھی bug ہے۔ یہ function رکھیں: Chapter 5 اسے automatic differentiation engine debug کرنے کے لیے use کرتا ہے، اور یہی واحد وجہ ہے کہ wrong gradient findable ہے۔

اس باب کی ہر چیز ایک ایسے assumption پر rest کرتی تھی جو کبھی stated نہیں تھا: کہ آپ L/θ\partial L / \partial \theta لکھ سکتے ہیں۔

دو parameters والی line کے لیے، وہ algebra کی ایک line تھی۔ یہ تقریباً فوراً ہی ایک line رہنا چھوڑ دیتی ہے۔ کسی symbolic algebra system سے network کے loss کا derivative single first-layer weight کے respect میں، single example کے لیے مانگیں، اور answer میں arithmetic count کریں:

networkایک partial derivative میں operations
چار hidden units، ایک layer40
چار hidden units، دو layers301
چار hidden units، تین layers1,717

third row 57 parameters والا network ہے — اتنا small network کہ Chapter 6 میں footnote ہوتا — اور اس کا gradient hand سے لکھنے کا مطلب ایک training example کے لیے تقریباً 97,869 operations ہے۔ کوئی notation اسے rescue نہیں کرتی۔ جو rescue کرتی ہے وہ observation ہے کہ composition پر apply کیا گیا chain rule enormous structure رکھتا ہے، کہ وہی intermediate quantities بار بار appear ہوتی ہیں، اور انہیں right order میں compute کرنے سے تمام derivatives تقریباً ایک forward pass کی price پر مل جاتے ہیں۔ یہی Chapter 5 ہے۔

لیکن پہلے ایک چھوٹا problem ہے، اور وہ فوراً انتظار کر رہا ہے۔

اب ہمارے پاس ایک machine ہے جو کسی بھی differentiable loss پر downhill roll کرے گی۔ اسے belt کے original question پر point کریں — accept یا reject، ایک target جو 1 یا 0 ہے — output پر sigmoid لگائیں تاکہ یہ probability predict کرے، اور squared error minimise کریں۔ یہ run کرے گی۔ یہ تب بمشکل move بھی کرے گی جب یہ سب سے زیادہ wrong ہو، اور gradient بتاتا ہے کیوں:

output zzpredictiontruthsquared error کے ساتھ gradientcross-entropy کے ساتھ gradient
000.500012.5×1012.5 \times 10^{-1}5.0×1015.0 \times 10^{-1}
2-20.119211.850×1011.850 \times 10^{-1}8.808×1018.808 \times 10^{-1}
6-60.002514.921×1034.921 \times 10^{-3}9.975×1019.975 \times 10^{-1}
10-104.54×1054.54 \times 10^{-5}19.079×1059.079 \times 10^{-5}1.0001.000

ایک model جو confidently، catastrophically wrong ہے — 0.0000454 predict کرتے ہوئے جب answer 1 ہے — 9×1059 \times 10^{-5} کا squared-error gradient produce کرتا ہے۔ اسے idea ہی نہیں کہ یہ trouble میں ہے۔ دوسری column، ایک ایسے loss سے جسے ہم نے ابھی derive نہیں کیا، 1.0 report کرتی ہے: maximum urgency، exactly وہاں جہاں deserved ہے۔

جس سے وہ question اٹھتا ہے جس سے اگلا باب شروع ہوتا ہے۔ پچھلے باب نے کہا تھا کہ loss noise کے بارے میں assumption ہے، اور squared error Gaussian noise assume کرتا ہے۔ yes-or-no answer کا noise model کیا ہوتا ہے — اور جب آپ اسی derivation کو اس پر run کرتے ہیں تو کون سا loss نکلتا ہے؟


method ان سب سے پرانا ہے: Cauchy نے 1847 میں Académie des Sciences کو ایک note میں اسے describe کیا، equations کے systems solve کرنے کے ایک طریقے کے طور پر، ان کے squared residuals کے sum پر downhill چلتے ہوئے۔ اس باب کے ساتھ یہ بھی پڑھنے کے قابل ہیں: Sebastian Ruder کا An overview of gradient descent optimization algorithms (arXiv:1609.04747)، جو momentum سے Adam تک چودہ readable pages میں cover کرتا ہے؛ Nocedal and Wright کی Numerical Optimization (2nd ed., Springer, 2006) کا chapter 3، جس کا theorem 3.3 condition number کے terms میں quadratic پر steepest descent کی convergence rate دیتا ہے — یہی وہ theory ہے جو بتاتی ہے کہ conditioning step count decide کیوں کرتی ہے، اگرچہ یہ اوپر measure کی گئی fixed-step 2/λmax2/\lambda_{\max} ceiling کے بجائے line search treat کرتی ہے، یا Deisenroth, Faisal and Ong کی Mathematics for Machine Learning کے §5.8 اور §7.1 اسی ground کے لیے کم machinery کے ساتھ؛ Prince کی Understanding Deep Learning کا §6.1 اور Goodfellow, Bengio and Courville کی Deep Learning کا §4.3؛ Dive into Deep Learning §12.1–12.3، جس میں minibatch analysis یہاں جگہ سے زیادہ measurements کے ساتھ ہے؛ اور Géron کی Hands-On Machine Learning (3rd ed.) کا chapter 4، learning rate کا سب سے practical treatment ایک ایسی چیز کے طور پر جسے آپ tune کرتے ہیں، derive نہیں۔ MIT 6.390 notes classification سے پہلے gradient descent رکھتے ہیں، جیسے یہ course کرتا ہے اور اسی وجہ سے۔

  1. 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. Section 4.3 recommendation دیتا ہے اور section 5.1 وہ argument جو اوپر detail box میں use ہوا: inputs کو centring اور scaling کرنا second-derivative matrix کے eigenvalues بدلتا ہے، اور therefore steps کی تعداد، نہ کہ صرف numerical comfort۔

  2. 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). یہ argument کہ high dimensions میں critical points overwhelmingly local minima کے بجائے saddles ہوتے ہیں، کیونکہ minimum کے لیے thousands of directions میں سے ہر ایک کو ایک ساتھ upward curve کرنا پڑتا ہے۔

  3. Robbins, H. and Monro, S. A Stochastic Approximation Method. Annals of Mathematical Statistics 22(3), pp. 400–407 (1951). وہ paper جس نے establish کیا کہ gradient کا noisy estimate کافی ہے، بشرطیکہ step size right way میں shrink ہو۔

  4. 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). heavy-ball method، جو اوپر momentum update ہے، backpropagation کے اس field تک پہنچنے سے بائیس سال پہلے۔


تیار کردہ

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 ماڈل ایک ہی جگہ — آج ہی مفت شروع کریں۔