1. Ana sayfa
  2. İçerik planı
  3. Kuantum betikleri · PennyLane
PennyLane · QNode ve kuantum iş akışı

Kuantum betikleri — dinamik kontrol akışı ve kayıt

Varyasyonel eğitimde ideal senaryo, sabit bir kuantum şablonunun tekrar tekrar koşturulmasıdır. Kuantum betikleri ise Python kontrol akışının (koşul, döngü, veriye bağlı dallanma) kayıt ve tape şablonunu çağrıdan çağrıya değiştirdiği durumları kapsar. PennyLane, bunun için hem “düz Python if” risklerini hem de qml.cond / qml.for_loop gibi kontrol primitiflerini sunar. Bu sayfa, differentiable QP ve hibrit QML’de dinamik programlamanın kayıt ve eğitim maliyetine etkisini anlatır — sabit devre kaydı veya tape iç yapısı burada merkezde değildir.

  • Dinamik: veri bağımlı kayıt · çağrı başına şablon
  • Primitif: cond · for_loop · while_loop
  • Maliyet: önbellek kırılması · JIT · epoch süresi

Kuantum Betikleri: Dinamik Programlama

Kuantum betik (quantum script), QNode gövdesinin yalnızca sabit kapı dizisi yazmadığı; klasik koşullara veya ölçüm sonuçlarına bağlı olarak farklı kuantum yolları seçebildiği programlama stilidir. PennyLane’de bu, çoğu zaman Python’un normal if / for yapılarıyla veya çerçevenin sağladığı kuantum kontrol API’leriyle ifade edilir.

Neden hibrit QML’de önemli?

Sabit ansatz eğitimi, kayıt şablonunu epoch boyunca korur; önbellek ve batch genişletme amorti edilir. Betiksel (dinamik) yapılar, “her forward farklı bir devre mi?” sorusunu gündeme getirir — bu da epoch maliyetini ve gradyan yolunu değiştirir. Uçtan uca sıra yürütüm akışı sayfasında; burada yalnızca kontrol akışının kayda etkisi vurgulanır.

Bu sayfanın sınırı Sabit kayıt ve şablon istikrarı devre kaydı §5 sayfasında; tape JIT tape §6 sayfasında. Burada dinamik taraf ve eğitim planlaması anlatılır.

Sabit Şablon ve Veri Bağımlı Kayıt

Sabit şablon: her QNode çağrısında aynı kapı türü ve sırası kayda girer; yalnızca parametre değerleri değişir. Veri bağımlı kayıt: girdi veya klasik koşul hangi dalı seçerse, o dal kayda girer — başka çağrıda tape iskeleti farklı olabilir.

Ne zaman dinamik kaçınılmaz?

Adaptif ölçüm tabanlı algoritmalar, veriye göre derinlik seçimi veya bazı hibrit heuristikler dinamik kayıt gerektirebilir. Çoğu varyasyonel sınıflandırma / VQE prototipinde ise sabit şablon tercih edilir; dinamik yapı “kısa kod” için eklenip eğitim bütçini sessizce şişirebilir. Tasarım kuralı: önce sabit şablonla çalıştırın; dinamikliği bilinçli bir sonraki adım yapın.

Kayıt aşamasının kullanıcı gözü devre kaydı sayfasında; “kayda girmeyen desenler” özellikle §4’te özetlenir — burada dinamik kaydın sonuçları (şablon oynaklığı) vurgulanır.

Python Kontrol Akışı ve Kayıt Riski

Düz Python if x > 0: ile kuantum kapısı seçmek, trace sırasında o anki x değerine göre tek bir dalı kaydeder. Sonraki çağrıda x işaret değişirse, kayıt yeniden çalışır ve farklı tape üretilir — bu beklenen davranıştır ama “sabit şablon” varsayımını bozar.

Sabit sınırlı for vs veri bağımlı for

Kuantum betikleri tartışmasında döngüyü ikiye ayırın: üst sınır trace öncesi biliniyor mu? Biliniyorsa çoğu senaryoda dinamik betik değil, öngörülebilir şablondur; bilinmiyorsa veya gövde veriye bağlı dallanıyorsa kayıt çağrıdan çağrıya oynar.

Sabit üst sınır: DEPTH ve katman sayısı

DEPTH = 3 ve for d in range(DEPTH): gibi kalıplarda kayıt, döngüyü kapı listesine açılarak sabitler — kullanıcı döngü görür, tape düz liste görür ( devre kaydı §3). Epoch boyunca DEPTH değişmiyorsa tape şablonu stabil kalır; JIT/önbellek ve batch genişletme ( tape §6) için uygundur. Bu, varyasyonel ansatz tasarımında tercih edilen yoldur.

Kablo sayısıyla ölçeklenen döngü

for i in range(n_qubits): veya for w in dev.wires: benzeri yapılar, cihaz/kablo envanteri sabitken yine sabit şablon üretir: her kablo için aynı kapı türü kayda girer, yalnızca kablo indeksi değişir. Dinamik betik sayılmaz; fakat n_qubits epoch ortasında veya çağrı başına değişirse kayıt yeniden çalışır — bu, §2’deki “veri bağımlı kayıt” sınırına yaklaşır.

Veri bağımlı üst sınır ve gövde içi if

Riskli örnekler: for i in range(int(x)):, for _ in range(len(batch)): gibi üst sınırın tensör veya girdiye bağlı olduğu döngüler; veya sabit üst sınırlı döngü içinde if weights[i] > 0: ile farklı kapı seçimi. İkisi de çağrı başına farklı kayıt yolu üretebilir — sabit şablon varsayımı kırılır, epoch maliyeti artar. Tasarım kuralı: üst sınırı modül sabitine veya cihaz sabitine çekin; veriye bağlı seçimi döngü dışında klasik katmana veya §4 primitiflerine taşıyın.

Python for vs qml.for_loop (kısa ayrım)

Sabit sınırlı Python for çoğu eğitim prototipinde yeterlidir. qml.for_loop, üst sınır veya gövde dinamikken kayıt/türev motoruna yapıyı bildirmek için düşünülür — her senaryoda Python döngüsünün yerine geçmez. Ayrıntı bir sonraki bölümde; burada yalnızca “sabit for = genelde betik değil” ayrımı hatırlatılır.

Pratik kontrol İki ardışık QNode çağrısında (farklı parametre, aynı girdi şekli) kayıt çıktısındaki kapı sayısı ve sırası aynı mı? Evet → sabit şablon; hayır → dinamik betik — §5 ve §6’yı gözden geçirin.

Erken return ve dallanmış ölçüm

Gövdede koşullu return, hangi ölçümün kayda gireceğini çağrıya göre değiştirir — maliyet ve gradyan yolu kayar. Hata ayıklamada “aynı QNode, farklı çıktı şekli” şüphesi: yürütüm akışı §7.

PennyLane Kontrol Primitifleri

PennyLane, dinamik programı yalnızca ham Python ile bırakmaz; kontrol primitifleri kayıt katmanının anlayabileceği yapılar sunar. API sürümüne göre isimler değişebilir; kavramsal olarak:

  • qml.cond — klasik veya ölçüme bağlı koşullu kuantum blok.
  • qml.for_loop — sayaç veya koleksiyon üzerinde kuantum döngü.
  • qml.while_loop — koşul sağlandığı sürece tekrar (dikkatli kullanın; kayıt ve türev maliyeti yüksek olabilir).

Neden primitif tercih edilir?

Amaç, “Python if trace’i kandırmak” değil; kontrol akışını tape ve türev motoruna bildirmek. Doğru primitif, gradyan yolunun ve (mümkünse) JIT’in dinamik yapıyla uyumlu kalmasına yardım eder — her senaryoda mükemmel değildir. Güncel sözdizimi için PennyLane dinamik kuantum devreleri belgelerine bakın.

Ham Python if ile primitif arasındaki fark, kayıt katmanının gördüğü grafiktir; yürütüm sırası yürütüm akışı §2 ile birlikte düşünülmelidir.

Kayıt, Tape ve Gradyan Etkisi

Dinamik betik, tape şablonunu oynattığında üç sonuç doğar: (1) kayıt maliyeti çağrı başına tekrarlanır; (2) transform / diff_method planı yeniden kurulabilir; (3) parameter-shift gibi yöntemlerde iç çarpan artabilir.

Çağrı başına yeni tape

Veri bağımlı dallanma varsa, mini-batch’in her satırı farklı kayıt yolu üretebilir. Batch genişletme ve vectorization varsayımları zayıflar ( tape §5). Throughput düşer; kod okunaklı kalabilir — mimari bilinçli tercih olmalıdır.

Gradyan ve ölçüm

Koşullu yollarda hangi dalın türevlendiği diff_method ve ölçüm türüne bağlıdır; “çalışıyor” görünüp yanlış gradyan üretebilir. Dinamik yapı ekledikten sonra tek parametre gradyan testi yapın. Ölçüm sözleşmesi ölçüm süreci; transform maliyeti tape §4 sayfalarında.

Önbellek, JIT ve Eğitim Planı

Sabit tape şablonu, JIT ve dahili önbelleğin “bir kez derle, çok kez koştur” varsayımına dayanır. Dinamik betik bu varsayılmı kırar: epoch ortasında süre sıçraması, ilk çağrı ile sonraki çağrılar arasında tutarsız profil görülebilir.

Pratik planlama

  • Prototipte dinamik yapıyı açıkça işaretleyin; benchmark’ta sabit şablonla kıyaslayın.
  • Isınma epoch’larını dinamik çağrı sayısıyla birlikte loglayın.
  • Mümkünse veri bağımlı derinliği klasik ön katmana taşıyın; QNode’a sabit ansatz verin.
  • Cihaz değişimi + dinamik kayıt birlikteyse maliyeti katlayın ( cihaz sistemi).

“İlk epoch yavaş, sonra hızlı” profilinin dinamik kayıtta yorumu farklı olabilir — kısmi önbellek veya yalnızca transform planı kurulumu. Karşılaştırma notları: yürütüm akışı §7.

Qiskit Dinamik Devrelere Köprü

Qiskit tarafında dinamik devreler (mid-circuit measurement, klasik kontrol) donanım ve transpiler ile yakından ilişkilidir. PennyLane betikleri de benzer ifade gücü sunar; fakat merkez differentiable eğitim ve QNode kaydıdır — transpile/kuyruk bu sayfada değil.

Kısa köprüler: dinamik devreler, klasik kontrol. IBM donanımına PennyLane köprüsü kullanıyorsanız, altta Qiskit yürütmesi olsa bile önce PennyLane kayıt davranışını anlayın ( QNode mimarisi · Qiskit köprüsü).

Kod Örnekleri: Sabit vs Koşullu

Aşağıdaki örnekler kavramsal ayrım içindir; üretimde API ve cihaz desteğini doğrulayın.

dynamic_python_if.py Python
import pennylane as qml

dev = qml.device("default.qubit", wires=1)

@qml.qnode(dev)
def risky(x):
    qml.Hadamard(wires=0)
    if x > 0:          # trace anındaki x'e göre TEK dal kayda girer
        qml.RZ(x, wires=0)
    else:
        qml.RY(x, wires=0)
    return qml.expval(qml.PauliZ(0))

# x işareti değişince kayıt yolu değişebilir — sabit şablon yok
print(risky(0.3))
print(risky(-0.2))
pennylane · dynamic Python if · çağrı başına şablon
static_depth_loop.py Python
import pennylane as qml

dev = qml.device("default.qubit", wires=2)
DEPTH = 3  # sabit → kayıt şablonu öngörülebilir

@qml.qnode(dev)
def stable(weights):
    for d in range(DEPTH):
        qml.RY(weights[d, 0], wires=0)
        qml.RY(weights[d, 1], wires=1)
        qml.CNOT(wires=[0, 1])
    return qml.expval(qml.PauliZ(0))

# Dinamik betik değil; döngü kayıtta açılır (devre kaydı §3)
pennylane Sabit DEPTH · şablon stabil UTF-8 · LF

İleride ve Yan Sayfalarda Ne Var?

Kuantum betikleri, QNode biriminin dinamik programlama kapanış başlığıdır. Sabit hat için geri dönün:

Özet PennyLane kuantum betikleri, kontrol akışının kayıt ve tape şablonunu oynatmasıdır. Hibrit QML’de çoğu üretim yolu sabit ansatz ister; dinamik yapı bilinçli ve ölçülmüş olmalıdır — aksi halde epoch maliyeti ve gradyan güvenilirliği sessizce zarar görür.