Örnek sorular
Aipy Tensor Ops AutogradZorluk 1
PyTorch-tarzı bir tensor kütüphanesinde, autograd'ın forward pass sırasında oluşturduğu 'computation graph' (hesaplama grafiği) nedir?
- aÇalıştırılan operasyonların bir kaydı; sonradan chain rule ile gradyan hesaplamak için kullanılır.✓
- bDaha önce hesaplanmış gradyanların önbelleği; tekrarlanan backward çağrıları yeniden hesaplamayı tamamen atlar.
- cHer operasyonun hangi cihazda (CPU ya da GPU) çalışacağına karar veren statik bir zamanlama.
- dEğitim başlamadan önce oluşturulan, modelin ağırlıklarının sıkıştırılmış bir kopyası.
Açıklama:Autograd, çalışırken her türevlenebilir operasyonu kaydeder (tensor'lar ve onları üreten fonksiyonlardan oluşan yönlü bir graf); backward() bu grafı gezerek chain rule uygular ve gradyanları hesaplar. (b) önbelleklemeyi anlatır, graf oluşturmayı değil. (c) cihaz yerleşimi/zamanlamayı anlatır, gradyan takibiyle ilgisizdir. (d) autograd'ın yapmadığı bir ağırlık sıkıştırmasını anlatır.
Aipy Tensor Ops AutogradZorluk 1
Doğrudan veriden yeni bir tensor oluşturduğunuzda (örn. torch.tensor([1.0, 2.0])) başka bir şey belirtmeden, requires_grad'ın varsayılan değeri nedir?
- aTrue, çünkü her float tensor varsayılan olarak gradyan takip eder.
- bFalse; requires_grad açıkça True yapılmadıkça tensor autograd'a dahil olmaz.✓
- cTensor'un birden fazla elemanı varsa True olur.
- dTensor oluşturma anında GPU'nun mevcut olup olmamasına bağlıdır.
Açıklama:Düz veriden oluşturulan tensor'lar varsayılan olarak requires_grad=False'tur; autograd'ın o tensor'u takip etmesi için açıkça devreye almanız gerekir (oluşturmada requires_grad=True ya da sonradan requires_grad_()). (a) ve (c) varsayılanı belirlemeyen koşullar uyduruyor. (d) cihaz erişilebilirliğini requires_grad varsayılanıyla karıştırıyor; bunlar ilgisizdir.
Aipy Tensor Ops AutogradZorluk 1
Bir autograd hesaplama grafında 'leaf tensor' (yaprak tensor) nedir?
- aLoss fonksiyonunun nihai çıktısı olarak üretilen herhangi bir tensor.
- bBir GPU cihazına taşınmış herhangi bir tensor.
- cKullanıcı tarafından doğrudan oluşturulan, takip edilen bir operasyonun sonucu olmayan bir tensor; örneğin bir model parametresi ya da girdi.✓
- dEğitim boyunca değeri hiç değişmeyen herhangi bir tensor.
Açıklama:Leaf tensor'lar grafın 'kenarlarında' yer alır: takip edilen bir operasyonun sonucu değil, doğrudan kullanıcı tarafından oluşturulmuşlardır; requires_grad=True ise backward() sonrası .grad özellikleri doldurulur. Model parametreleri ve doğrudan oluşturulan girdiler tipik yapraklardır. (a) grafın kökünü/çıktısını anlatır, yaprağı değil. (b) cihaz yerleşimini graf konumuyla karıştırıyor. (d) sabitleri anlatır, özellikle leaf kavramını değil.
Aipy Tensor Ops AutogradZorluk 2
Tipik bir eğitim döngüsünde, her loss.backward() çağrısından önce neden optimizer.zero_grad() (ya da param.grad = None) çağırmanız gerekir?
- abackward() varsayılan olarak .grad'ın üzerine yazdığı için, zero_grad() gerçek bir etkisi olmayan yalnızca savunmacı bir alışkanlıktır.
- bUnutulursa backward() anında bir exception fırlatır.
- czero_grad(), bir sonraki adımdan önce modelin ağırlıklarını başlangıç değerlerine sıfırlar.
- dbackward(), her çalıştığında yeni gradyanları .grad'daki mevcut değerin üzerine ekleyerek biriktirir.✓
Açıklama:Autograd birikimlidir: her backward() çağrısı yeni hesaplanan gradyanları .grad'daki mevcut değerin yerine koymaz, üzerine ekler. zero_grad() atlanırsa, önceki adımların gradyanları sessizce mevcut adımın gradyanlarına eklenir ve güncelleme yönünü bozar. (a) gerçek birikim davranışını tersine çeviriyor. (b) yanlıştır — hiçbir exception fırlatılmaz. (c) gradyan sıfırlamayı, zero_grad()'ın yapmadığı ağırlık sıfırlamayla karıştırıyor.
Aipy Tensor Ops AutogradZorluk 2
Leaf bir tensor x, requires_grad=True ve x.grad = None ile başlıyor. y = x**2 çalıştırıyorsunuz ve y.backward()'ı art arda iki kez çağırıyorsunuz (arada zero_grad yok, graf-serbest-bırakıldı hatasından kaçınmak için retain_graph=True geçirilmiş). Mevcut x için dy/dx her hesaplandığında 6.0 veriyorsa, ikinci backward() çağrısından sonra x.grad nedir?
- a6.0, çünkü .grad her zaman yalnızca en son gradyan katkısını saklar.
- b12.0, çünkü her backward() çağrısı hesapladığı gradyanı (6.0) mevcut .grad değerinin üzerine ekler.✓
- cNone, çünkü aynı graf üzerinde backward()'ı iki kez çağırmak .grad'ı None'a sıfırlar.
- d0.0, çünkü iki çağrı birbirini götürür.
Açıklama:Gradyan birikimi şu anlama gelir: .grad None ile başlar, ilk backward()'dan sonra 6.0 olur, ikinci backward()'dan sonra 6.0 + 6.0 = 12.0 olur; bu, birikim döngüsünün gerçek davranışıyla doğrulanır. (a) birikimi tamamen görmezden geliyor. (c) ve (d), birikim mekanizmasının sergilemediği davranışları anlatıyor.
Aipy Tensor Ops AutogradZorluk 1
requires_grad olan bir tensor x verildiğinde, x.detach() ne döndürür?
- ax'in verisini paylaşan ama graftan koparılmış yeni bir tensor.✓
- bx'in kendi ayrı storage'ına sahip derin bir kopyası; hâlâ autograd tarafından takip edilir.
- cx'in loss'a göre gradyanı; anında hesaplanır.
- dx hangi cihazdaysa olsun, CPU'ya taşınmış bir tensor.
Açıklama:detach(), x'in storage'ını paylaşan bir view verir, ama hesaplama grafından koparılmıştır: requires_grad=False ve grad_fn yoktur, bu yüzden üzerindeki operasyonlar takip edilmez ve gradyanlar x'in grafına geri akmaz. (b) yanlışlıkla bir veri kopyası ve devam eden takip iddia ediyor. (c) detach etmeyi gradyan hesaplamayla karıştırıyor. (d) detach()'i .cpu() gibi bir cihaz-transfer çağrısıyla karıştırıyor.