Devre kaydı — kuantum gövdenin yakalanması ve trace
PennyLane’de kuantum “devresi”, çoğu zaman elle çizilmiş bir nesne değil; QNode’a bağlı kuantum fonksiyonunun çalıştırılarak kayda alınması (trace) ile oluşur. Her qml.RY, qml.CNOT ve dönüş satırındaki qml.expval çağrısı, o an tape’e yazılır. Bu sayfa, differentiable quantum programming perspektifinde kullanıcı gözüyle kayıt sürecini anlatır — tape iç yapısı, yürütüm sırası veya Qiskit transpiler burada merkezde değildir.
Devre Kaydı: Trace ve Kullanıcı Gövdesi
Devre kaydı, kuantum fonksiyonunuzun Python gövdesinin QNode bağlamında bir kez (veya dinamik senaryoda her çağrıda) yürütülmesi ve her kuantum API çağrısının sıralı bir işlem listesine dönüştürülmesidir. Kullanıcı “devre çiziyorum” sanır; motor “gövdeyi trace ediyorum” der. Bu liste daha sonra tape nesnesine aktarılır — tape’in iç cebiri tape sistemi sayfasındadır.
Qiskit QuantumCircuit’ten fark
Qiskit’te QuantumCircuit nesnesine kapıları siz eklersiniz; devre görselleştirme ve job girdisi aynı nesnedir. PennyLane’de kayıt fonksiyon merkezlidir: dekoratörlü gövde çalışır, kayıt katmanı operatör çağrılarını yakalar. Transpile, routing ve backend kuyruğu bu aşamada yoktur; kısa köprü: QuantumCircuit yapısı.
QNode Çağrısı Kaydı Nasıl Tetikler
@qml.qnode(dev) ile sarılmış fonksiyon çağrıldığında PennyLane önce girdileri bağlar ( yürütüm akışı §2), ardından kuantum gövdesini kayıt modunda çalıştırır. Bu sırada gerçek kuantum durumu “eğitim için” tam anlamıyla simüle edilmek zorunda değildir; amaç, hangi operatörlerin hangi sırayla uygulandığını sabitlemektir.
Kayıt anı vs yürütüm anı
Aynı QNode çağrısında kayıt ve yürütüm ardışık aşamalardır: önce trace ile tape şablonu oluşur, sonra cihaz bu tape’i değerlendirir. Kullanıcı tek satır görür; mimari olarak iki adımdır. Zaman sırasının tamamı yürütüm akışı sayfasında; burada yalnızca “gövde ne zaman, nasıl yakalanır?” sorusu vardır.
QNode sınırı, imza ve dekoratör seçenekleri QNode mimarisi sayfasında; kayıt davranışını etkileyen tipik seçenekler cihaz ve arayüzdür, fakat kayıt mantığı gövdeye bağlıdır.
Kayda Giren: Kapılar, Şablonlar, Ölçümler
Kayda giren her şey, trace sırasında tape’e yazılacak bir işlem veya gözlemlenebilir düğümü olarak yakalanır. Kullanıcı Python’da qml.* çağırır; kayıt katmanı bunu sıralı bir programa çevirir — tape’in iç listesi tape sistemi §3 sayfasında; burada hangi çağrıların kayda girdiği vurgulanır.
- Tekil kapılar · şablonlar · dönüş ölçümleri — aşağıda alt başlıklar.
Tekil kapılar: her çağrı bir kayıt satırı
qml.RX, qml.Hadamard, qml.CNOT gibi tekil operatörler, kayıt anında bir işlem kaydı üretir: operatör kimliği, hedef kablolar (ve varsa kontrol kabloları), parametre bağlantısı. Parametre Python sayısıysa o çağrıda sabit açı yazılabilir; tensörse yuva bırakılır — ayrıntı §6.
Kayıt perspektifinden sıra önemlidir: gövdede hangi sırada çağrıldıysa tape’de o sırada görünür. “Aynı kapı” iki kez çağrılırsa iki ayrı satır vardır; Qiskit’te circuit.ry’yi iki kez eklemekle aynı mantık. Kablo listesi bu adımda doğrulanır — tanımsız kablo kayıtta patlar; kablo yönetimi ile önceden hizalayın.
Şablonlar ve katmanlar: kayıtta açılma (unroll)
qml.StronglyEntanglingLayers, qml.AngleEmbedding veya özel @qml.template blokları, kullanıcıya tek satır görünür; kayıt sırasında içlerindeki tekil kapılara açılır. Trace sonunda tape’de yüksek seviye blok kalmaz — yalnızca temel işlemler listesi vardır.
Bu açılmanın kayıt aşamasında olması önemlidir: şablonun şekil sözleşmesi (kaç katman, kaç kablo, ağırlık tensörü boyutu) kayıt anında kontrol edilir; uyumsuzluk burada görülür. Epoch boyunca aynı şablon çağrılıyorsa kayıt iskeleti sabit kalır; farklı şablon derinliği her çağrıda yeni kayıt demektir ( §5). Şablon içi matematik veya donanım native seti burada değil — yalnızca “blok → kapı listesi” dönüşümü.
Dönüş ölçümleri: kaydın kapanışı
Kuantum fonksiyonunun return satırındaki qml.expval, qml.probs, qml.sample vb. ifadeler kayıt sırasında tape sonuna gözlemlenebilir düğümleri olarak eklenir. Trace, ölçüm yazılmadan “bitmiş” sayılmaz: dönüş, kayıt akışının zorunlu kapanışıdır.
Birden fazla ölçüm demet olarak dönebilir (return qml.expval(A), qml.probs(wires=...)); kayıt her birini ayrı düğüm olarak yazar, sıra demet sırasıyla uyumludur. Hangi ölçümün maliyete girdiği ve gradyan davranışı ölçüm süreci sayfasında; burada yalnızca “return satırı = kayıt olayı” hatırlatılır. Ölçüm yoksa veya gövde erken return ile dallanırsa kayıt yolu değişir — §4’e bakın.
Döngüler ve Python yapısı
Sabit üst sınırlı for döngüleri genelde kayda açılarak girer: her iterasyon ayrı kapı satırı üretir. Bu, Qiskit’te elle tekrarlanan circuit.ry(...) çağrılarının fonksiyonel karşılığıdır. Kablo indeksleri döngü değişkeniyle üretiliyorsa, kayıt öncesi kablo envanterinin tutarlı olması gerekir — kablo yönetimi ile hizalayın.
Klasik–kuantum karışımı gövdede
Gövde içinde klasik hesap (liste, NumPy) yapılabilir; fakat kayda yalnızca qml.* kuantum çağrıları ve dönüş ölçümleri yazılır. Klasik kod, parametre değerini hazırlamak için kullanılır; kuantum işlem listesine doğrudan “print” veya dosya I/O yazılmaz. Hibrit modelde klasik ön katman genelde QNode dışında kalır — kuantum fonksiyonları sayfasındaki eğitim iskeletine bakın.
Kayda Girmeyen ve Sorunlu Desenler
Her Python ifadesi kayda dönüşmez. Kayıt katmanı, kuantum programın statik veya yarı-statik bir iskeletini çıkarmaya çalışır; klasik kontrol akışı bu iskeleti oynatırsa eğitim ve önbellek beklentileri bozulur.
Veri bağımlı dallanma
if x > 0: gibi girdiye bağlı dallar, çağrı başına farklı kayıt yolu üretebilir — tape şablonu sabit kalmaz. Bu desen kuantum betikleri başlığında ayrıntılandırılır; burada yalnızca “kayıt her çağrıda yeniden mi yazılıyor?” sorusunu sorun.
Yan etkiler ve gizli durum
Global değişkenle kablo sayısını değiştirmek, kayıt ile yürütüm arasında sürpriz üretir. QNode gövdesi mümkün olduğunca saf fonksiyon gibi yazılmalı: girdiler → kuantum işlemler → ölçüm dönüşü. Yan etki şüphesi varsa tek çağrıda tape çıktısını (debug API veya düşük seviye kayıt) kontrol edin.
Yanlış kablo veya operatör
Tanımsız kablo, cihazın desteklemediği operatör veya uyumsuz ölçüm çoğu zaman kayıt veya hemen sonrasında exception verir — henüz epoch ortasında “gradyan bozuk” sanmayın. Belirti → katman eşlemesi: yürütüm akışı §7.
Sabit Şablon ve Dinamik Kayıt
Uzun eğitim koşularında ideal senaryo: aynı kayıt şablonu, yalnızca parametre değerleri değişir. Böylece tape yeniden oluşturulmaz; JIT/önbellek ve batch genişletme amorti edilir ( tape §6).
Sabit şablon ne demek?
Kapı türü ve sırası epoch’lar arasında aynı; yalnızca açılar veya bağlı tensör değerleri güncellenir. Kayıt maliyeti ilk çağrıda ödenir, sonrakilerde yürütüm ağırlıklıdır. Benchmark yaparken ilk epoch’u ısınma sayın.
Dinamik kayıt ne zaman olur?
Python if, değişen döngü sınırı veya epoch ortasında değişen gövde, çağrı başına yeni tape üretir. Bu hata değildir; fakat throughput ve önbellek planını değiştirir. Dinamik kontrol için kuantum betikleri sayfasına geçin.
Parametreler Kayıt Anında
Kapıya verilen değer kayıt sırasında nasıl görülürse, tape’de öyle saklanır: Python sayısı çoğu zaman sabit açı; Torch/JAX tensörü parametre yuvası. Bu ayrım eğitilebilirliği ve şablon stabilitesini belirler.
Sabit açı vs eğitilebilir yuva
qml.RY(0.5, wires=0) ile kayıt: açı sabitlenmiş olabilir. qml.RY(weights[0], wires=0) ile kayıt: yapı sabit, değer yürütümde dolar. Yanlışlıkla sabit bırakılan eğitim parametresi “gradyan yok” üretir — önce kayıt çıktısını, sonra bağlamayı kontrol edin ( yürütüm akışı §2).
Veri gömme (x) ve ağırlıklar (weights)
Veri genelde her forward’da değişir; kayıt şablonu sabit kalıyorsa x tensör yuvası olarak yazılır. Ağırlıklar epoch boyunca güncellenir; kayıt bunları parametre düğümü olarak işaretler. Gömme boyutu ve kablo sayısı uyumu kablo yönetimi sayfasında.
Tape ile Ayrım ve Köprü
Devre kaydı = kullanıcı gövdesinin yakalanması (trace). Tape sistemi = yakalanan listenin yürütülebilir ara programı, transform ve gradyan genişletmesi. İkinci aşama olmadan birinci anlamlıdır; birinci olmadan ikinci oluşmaz.
Kayıt tamamlandıktan sonra akış: tape sistemi → cihaz yürütümü (cihaz sistemi) → tensör dönüşü → (eğitimde) türev ( yürütüm akışı). Bu sayfa zincirin yalnızca ilk halkasıdır.
Kod Örnekleri: Kayıt ve Şablon
Aşağıdaki örnekler kayıt davranışını sezmek içindir; API sürümüne duyarlı olabilir. Güncel kayıt API’si için PennyLane Circuits ve kayıt belgelerine bakın.
import pennylane as qml
dev = qml.device("default.qubit", wires=3)
@qml.qnode(dev)
def ansatz(weights):
# Sabit derinlik: kayıt şablonu epoch'lar arasında aynı kalır
for w in range(3):
qml.RY(weights[w], wires=w)
qml.CNOT(wires=[0, 1])
qml.CNOT(wires=[1, 2])
return qml.expval(qml.PauliZ(0))
# İki çağrı: aynı kapı sırası, farklı parametre değerleri
print(ansatz([0.1, 0.2, 0.3]))
print(ansatz([0.4, 0.5, 0.6]))
import pennylane as qml
dev = qml.device("default.qubit", wires=4)
DEPTH = 2 # sabit üst sınır → kayıt öngörülebilir
@qml.qnode(dev)
def layer(x, weights):
qml.AngleEmbedding(x, wires=range(4))
for d in range(DEPTH):
for i in range(4):
qml.RY(weights[d, i], wires=i)
for i in range(3):
qml.CNOT(wires=[i, i + 1])
return qml.expval(qml.PauliZ(0))
İleride ve Yan Sayfalarda Ne Var?
Kayıt tamamlandıktan sonraki halkalar:
- Tape sistemi — ara temsil, transform, batch, JIT.
- Yürütüm akışı — kayıttan tensöre ve eğitim döngüsüne sıra.
- Kablo yönetimi — kayıt öncesi kablo envanteri.
- Ölçüm süreci — dönüş satırı ve çıktı türleri.
- Kuantum betikleri — dinamik kayıt ve kontrol akışı.