Tape sistemi — ara temsil, dönüşüm ve gradyan hattı
PennyLane’de QNode çağrısı arka planda bir tape (kuantum kayıt bandı) üretir: sıralı işlemler, parametreler, ölçümler ve gözlemlenebilirler bu nesnede toplanır. Tape, yürütücüye giden ortak dildir; otomatik türev, batch genişletme ve JIT önbelleği çoğu zaman tape üzerinde tanımlı dönüşümler ile yapılır. Bu sayfa, differentiable quantum programming perspektifinde tape’in eğitim döngüsündeki rolünü anlatır — Qiskit transpiler veya donanım routing burada merkezde değildir.
Tape: Ara Temsil ve QNode İlişkisi
Kullanıcı düzeyinde @qml.qnode bir fonksiyon gibi görünür; motor düzeyinde her değerlendirme, kuantum gövdenin bir tape’e kaydı ve bu tape’in seçilen cihazda yürütülmesidir. Tape, Python kaynak kodunun tekrar yorumlanması yerine, yürütülebilir ve dönüştürülebilir bir ara program sunar. Bu ayrım, uzun eğitim döngülerinde kritiktir: aynı tape yapısı yüzlerce kez farklı parametrelerle koşturulabilir.
Qiskit devre nesnesinden fark
Qiskit’te QuantumCircuit hem çizim hem job girdisi olarak yaşar; transpiler doğrudan devre üzerinde çalışır. PennyLane tape’i ise gradyan ve cihaz soyutlaması için tasarlanmıştır: işlemler parametre bağlarıyla gelir, ölçümler gözlemlenebilir cebirine bağlanır, dönüşüm katmanı tape’i genişleterek türev grafiği üretir. Donanım haritalaması tape’ten sonra, cihaz eklentisinin sorumluluğundadır — burada detaylandırılmaz.
Kayıttan Tape’e: Gövde ve Yürütüm Ayrımı
QNode gövdesi çalıştığında PennyLane, kapı çağrılarını ve dönüş satırındaki ölçümleri sırayla tape’e yazar. Bu kayıt anı, klasik kodun kontrol akışı (döngü, koşul) ile etkileşebilir; sabit şablonda tape yapısı epoch’lar arasında değişmez, dinamik grafiklerde ise çağrı başına yeni tape üretilebilir. Yürütüm ise qml.execute benzeri yollarla tape + cihaz + türev yöntemine verilir.
Hibrit ML’de bu ayrım şu anlama gelir: forward = tape oluştur + cihazda değerlendir; backward = tape üzerinde tanımlı gradyan dönüşümü + klasik otograd. QNode sınırı ve dönüş sözleşmesi QNode mimarisi sayfasında; uçtan uca zaman sırası yürütüm akışı başlığında toplanır — burada tape katmanı vurgulanır.
Tape İçeriği: İşlemler, Parametreler, Ölçümler
Bir tape’in gövdesi, sıralı işlem listesidir: her öğe hangi operatörün hangi kablolara uygulandığını ve (varsa) hangi eğitilebilir parametreye bağlandığını taşır. Dönüş satırındaki qml.expval veya qml.probs ifadeleri, tape sonuna ölçüm / gözlemlenebilir düğümleri olarak eklenir. Parametre tensörleri tape ile birlikte yürütücüye gider; bu yüzden aynı tape iskeleti farklı θ ile tekrar çağrılabilir.
Parametre bağları ve eğitilebilirlik
Varyasyonel katmanlarda açılar Torch/JAX tensörlerine bağlıdır; tape bu bağları koruyarak gradyanın hangi kapıya aktığını bilir. Kablo envanteri tape oluşturulurken sabitlenir — kablo yönetimi ile uyumsuzluk kayıt aşamasında patlar. Ölçüm türleri ve dönüş şekilleri ölçüm süreci sayfasında; tape tarafında yalnızca “ölçüm düğümünün tape’e nasıl yazıldığı” önemlidir.
Dönüşümler ve Gradyan Genişletmesi
Tape üzerinde çalışan transform’lar, differentiable programming’in motorudur: kayıtlı bir tape’i alır, gradyan için genişletilmiş yeni tape’ler veya eşdeğer yürütüm planları üretir. Kullanıcı çoğu zaman yalnızca QNode’u çağırır; arka planda seçilen diff_method hangi transform ailesinin devreye gireceğini belirler — bu seçim cihaz sistemi ile birlikte yapılmalıdır; burada transform mantığı özetlenir.
İleri ve geri geçiş (tape düzeyinde)
İleri geçiş: tape + parametre değerleri → cihazda yürütüm → skalar veya tensör çıktı (maliyet). Geri geçiş: çıktının türevi → transform tape’i genişletir veya adjoint yürütür → parametre gradyanları. Klasik otograd (Torch/JAX) ile birleşim noktası, QNode çıktısının tensöre bağlandığı yerdir; kuantum tarafındaki türev kuralları ise transform katmanında yaşanır. Uçtan uca sıra yürütüm akışı sayfasında toplanır — burada yalnızca “gradiyan nerede üretilir?” sorusu vurgulanır.
Üç yol: sezgisel eşleştirme
Backprop (simülatör): tam vektör bilgisi varsa, tape genişlemesi klasik grafikle birleşir; epoch başına yürütüm sayısı düşük kalabilir. Parameter-shift: örneklemeli veya donanım dostu; parametre başına ek tape yürütümü — maliyet çarpanı büyür. Adjoint / reverse-mode: bazı yapılarda geri yönde tek geçişle gradyan; cihaz ve gözlemlenebilir yapısına bağlıdır. Yanlış yöntem, “eğitim çalışıyor gibi” görünüp gradyanı bozabilir; cihaz değişince yöntemi yeniden seçmek gerekir (§6 önbellek ile birlikte düşünün).
Genişletme maliyeti
Parameter-shift ailesi, tape’i fiziksel olarak çoğaltır: her eğitilebilir kapı için ek değerlendirmeler. Kabaca maliyet ∝ (epoch) × (ileri çağrılar) × (türev çarpanı). Backprop uyumlu simülatörde çarpan küçük kalır; fakat shots açık veya donanım yürütümünde backprop her zaman seçenek değildir. Mimari karar verirken yalnızca “kaç parametre var?” değil, “her optimizasyon adımında kaç tape yürütülüyor?” sorusunu sorun — bu, GPU boşta kalırken kuantum tarafının yavaş olduğu yanılsamasını açıklar.
Batch, Genişletme ve Çoklu Tape
Batch, tape düzeyinde “aynı program, birden çok girdi” demektir. Sabit şekilli bir tape şablonu, farklı parametre vektörleri veya farklı gömme girdileriyle genişletilir (expansion); yürütücü bunları tek pakette veya sıralı bloklar halinde işler. Bu, Python for döngüsüyle tek tek QNode çağırmaktan genelde verimlidir — özellikle JAX vmap ile aynı mantık tek derleme altında toplanır.
Batch ekseni vs parametre ekseni
Karıştırılan iki boyut vardır: (1) mini-batch — aynı ansatz, farklı veri satırları; (2) ansatz içi parametreler — farklı açılar, aynı veri. Tape genişletmesi hangi eksende yapıldığına göre farklı maliyet profili üretir. Klasik ön işleme tensörünüzün şekli (batch × features) ile kablo gömme sözleşmesini kablo yönetimi ile hizalayın; aksi halde genişletme sessizce yanlış boyut üretir.
Çoklu tape ve Hamiltonyen toplamları
Tek maliyet, birden çok tape’ten gelen skalarların toplamı olabilir: her Pauli terimi veya her alt gözlemlenebilir için ayrı tape, sonuçların klasik tarafta ağırlıklı toplanması. Tape katmanı terimleri ayrı yürütür; toplama işlemi klasik grafikte kalır ve differentiable zinciri bozmaz. Bu desen VQE/QAOA tarzı maliyetlerde sıktır; optimizasyon döngüsünün klasik kısmı kuantum fonksiyonları sayfasında; burada yalnızca “maliyet = çoklu tape çıktısının toplamı” yapısı vurgulanır.
Döngü ile tek tek tape yürütmek bazen daha okunaklıdır; genişletme ise throughput için tercih edilir. Prototipte döngü, üretim eğitimde genişletme — geçişte epoch süresindeki sıçramayı benchmark ile doğrulayın.
JIT, Önbellek ve Eğitim Maliyeti
Uzun eğitim koşularında tape’in şekli sabit kalıyorsa, kayıt ve derleme maliyeti amorti edilebilir: JIT veya dahili önbellek, yürütüm planını bir kez kurar, sonraki epoch’larda yalnızca parametre değerleri değişir. Bu, “her adımda Python gövdesini yeniden yorumlama” maliyetinden kurtarır; fakat önbelleğin geçerli kalması için gövde, cihaz ve diff_method’un değişmemesi gerekir.
Önbelleği ne kırar?
Şunlar genelde “soğuk başlangıç” tetikler: kuantum fonksiyonunda Python if ile farklı kayıt yolları; cihaz veya shot rejimi değişimi; diff_method değişimi; kablo sayısı veya şablon derinliğinin epoch ortasında değişmesi. Dinamik grafikler kuantum betikleri başlığında ayrıntılandırılır — burada yalnızca “önbellek = sabit tape şablonu varsayımı” hatırlatılır.
Benchmark ve transform birlikte
İlk epoch yavaş, sonrakiler belirgin hızlıysa JIT/önbellek etkisi olabilir; fakat aynı profil, parameter-shift’in ilk çağrıda plan kurmasından da kaynaklanabilir. Karşılaştırma yaparken aynı tape şablonu ve aynı türev yolunu sabitleyin; yalnızca parametreleri değiştirin. Cihaz veya diff_method değişiminden sonra bir “ısınma” epoch’u atmayın — yoksa yanlışlıkla önbellek etkisini başka bir değişkene yazarsınız.
Devre Kaydı ile Ayrım ve Köprü
Devre kaydı, kullanıcının yazdığı kuantum fonksiyonunun nasıl yakalandığını anlatır: hangi Python yapıları kayda girer, hangileri sorun çıkarır. Tape sistemi ise yakalanan bu bilginin yürütülebilir ara temsili ve gradyan motoruna girdiğidir. İkisini karıştırmamak, hata ayıklamayı kolaylaştırır: kayıt garipse önce gövde ve kablolar; yürütüm veya gradyan garipse tape + cihaz + diff_method.
Kod Örnekleri: Tape Oluşturma ve Yürütme
Aşağıdaki örnekler API sürümüne duyarlı olabilir; amaç tape’in elle kurulması ve cihazda yürütülmesi iskeletini göstermektir. Güncel sözdizimi için PennyLane belgelerine bakın.
import pennylane as qml
dev = qml.device("default.qubit", wires=2)
# Tape: sıralı işlemler + ölçüm düğümü (sürüme göre QuantumTape / QuantumScript)
with qml.tape.QuantumTape() as tape:
qml.RX(0.4, wires=0)
qml.CNOT(wires=[0, 1])
qml.expval(qml.PauliZ(0))
# Tape + cihaz + diff_method birlikte yürütülür
result = qml.execute(tape, dev, diff_method="backprop")
print(result)
import pennylane as qml
dev = qml.device("default.qubit", wires=1)
@qml.qnode(dev, diff_method="backprop")
def model(x):
qml.RY(x, wires=0)
return qml.expval(qml.PauliZ(0))
# Kullanıcı tape görmez; her çağrıda içeride tape üretilir ve yürütülür.
print(model(0.2))
İleride ve Yan Sayfalarda Ne Var?
Tape, kayıt ile yürütüm arasındaki köprüdür. Resmî tape / transform girişi için PennyLane belgelerindeki Circuits ve kayıt bölümüne bakın.
- Devre kaydı — QNode gövdesinin yakalanması.
- Yürütüm akışı — kayıt → tape → türev → cihaz sırası.
- QNode mimarisi — çağrılabilir sınır.
- Cihaz sistemi — yürütüm bağlamı ve diff_method.
- Ölçüm süreci — tape sonundaki ölçüm düğümleri.