Swap testi — durumlara dokunmadan benzerlik ölçmek
İki kuantum durumunu doğrudan ölçmek onları bozar; Swap testi, bir yardımcı kübit ve Fredkin (CSWAP) kapısı yardımıyla iki durumun örtüşmesini klasik bir olasılığa dönüştürür. Sonuç bir mesaj değildir; durumlar arasındaki geometrik mesafenin sayısal bir özetidir.
Swap testi nedir? (derinlemesine analiz)
Swap testi, iki kuantum durumunun (state) birbirine olan yakınlığını — yani fidelity'sini (Türkçesiyle sadakat ya da benzerlik derecesi) — ölçmek için kullanılan temel bir protokoldür. Klasik dünyada iki dosyayı karşılaştırmak için bitlerini tek tek kontrol ederiz; ne var ki kuantum dünyasında bir durumu doğrudan ölçmek o durumu bozar. Swap testi tam da bu yüzden vardır: iki durumu “birbirine değdirmeden” aralarındaki örtüşmeyi okumamızı sağlar.
Çıktı, kübitlerin içeriği değildir; yalnızca yardımcı (ancilla) kübitin ölçüm istatistiğidir. Bu istatistik, iki sistemin geometrik mesafesini klasik bir olasılığa çevirir; sayfa boyunca buna kısaca örtüşme (overlap) diyeceğiz.
Neden kullanılır?
Kuantum makine öğrenmesinden (QML) hata düzeltme kodlarına kadar üç tipik kullanımı vardır:
-
Kuantum benzerlik ölçümü
İki kuantum verisi arasındaki mesafeyi sayısal bir overlap'e dönüştürmek; kuantum kernel yöntemlerinin temel taşıdır.
-
Durum karşılaştırma
Bilinmeyen bir durumun, hazırlanmış bir referans duruma ne kadar yakın olduğunu — durumu okumadan — değerlendirmek.
-
Girişim ölçümü
İki durumun üst üste binme (overlap) değerini Hadamard girişimi üzerinden hesaplamak.
Matematiksel temel
Swap testi'nin arkasındaki sihir Fredkin kapısı (Controlled-SWAP) ve tek bir yardımcı (ancilla) kübittir. İki durumu karşılaştırmak istiyoruz: ve . Yardımcı kübit 'da başlar.
-
Yardımcıya Hadamard H
Ancilla, ile süperpozisyona alınır; sistemin geri kalanını denetlemek üzere hazırlanır.
-
Fredkin (CSWAP) CSWAP
Yardımcı kübit iken ile 'nin yeri değiştirilir; iken hiçbir şey yapılmaz. Bu adım sistemleri üst üste bindirme yoluyla birbirine bağlar.
-
İkinci Hadamard ve ölçüm H
Yardımcı kübite tekrar uygulanır — süperpozisyon girişime dönüşür — sonra ancilla ölçülür. Ölçüm sonucu, klasik bir olasılığa indirgenmiş overlap bilgisidir.
Matematiksel “meali”
Yardımcı kübitin ölçülme olasılığı tek bir kapalı formdadır:
Geometrik bakış Bu formül, iki kuantum vektörü arasındaki açının kosinüs karesini hesaplamaya benzer. Vektörler aynı yöne bakıyorsa (aynı durumlar) aralarındaki açı 'dır, kosinüs 'dir ve örtüşme tamdır; birbirine dik (90°) iseler ortak yönleri yoktur, kosinüs 'dır ve örtüşme sıfırdır. Aradaki her açı, ile arasında bir kısmi benzerliğe karşılık gelir.
-
Aynı durumlar
Meal: Overlap olduğundan yardımcı kübit her zaman 0 ölçülür; histogramda yalnızca 0 sütunu görünür.
-
Tamamen dik durumlar
Meal: Overlap sıfırdır; yardımcı kübit 0 ve 1'i ~%50–%50 dağıtır. Aradaki her ara değer kısmi benzerliğe karşılık gelir.
Algoritmanın adım adım reçetesi
Yapı her zaman dört adımdan oluşur. Aşağıda yardımcı kübitin ve sistemin tam durum vektörü her aşamada nasıl evrildiği özetlenmiştir.
-
Hazırlık
Karşılaştırılacak iki kayıt — ve — ile bir ancilla kübit () belirlenir. Sistem ile başlar.
-
Hadamard sonrası (ancilla)
Yalnızca yardımcı kübite uygulanır; karşılaştırılan iki kayıt değişmez:
-
Fredkin (CSWAP) sonrası
Ancilla iken ile yer değiştirir; iken sistem dokunulmadan kalır. Sistem ikiye dallanır:
-
Girişim ve çöküş (ikinci )
Ancilla'ya uygulandığında iki dal birbiriyle girişim yapar. ölçülmesinin olasılığı doğrudan iki durumun örtüşmesine bağlanır:
Qiskit ile uygulama
Aşağıdaki örnek uçtan uca bir Swap testi kurar: yardımcı kübiti hazırlar, iki kübiti dik bir konfigürasyona getirir, CSWAP ile girişimi tetikler ve ölçtüğü P(0)'dan overlap'i geri okur. AerSimulator üzerinde 2048 atış çalıştırılır.
import numpy as np
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
# 1. Devre Kurulumu: 1 yardımcı + 2 karşılaştırılacak + 1 klasik bit
qc = QuantumCircuit(3, 1)
# Karşılaştırılacak kübitleri hazırla:
# q1 = |0>, q2 = |1> (birbirine dik durumlar)
qc.x(2)
qc.barrier()
# 2. Swap Testi Başlıyor
qc.h(0) # Yardımcı kübiti süperpozisyona al
qc.cswap(0, 1, 2) # Fredkin Kapısı (Controlled-SWAP)
qc.h(0) # Girişimi oluştur
# 3. Ölçüm
qc.measure(0, 0)
# 4. Çalıştırma ve Sonuç
simulator = AerSimulator()
job = simulator.run(qc, shots=2048)
counts = job.result().get_counts()
print("\nSwap Testi Sonuçları:")
print(counts)
# Örtüşme (Overlap) Hesaplama: ||^2 = 2*P(0) - 1
p0 = counts.get('0', 0) / 2048
overlap = 2 * p0 - 1
print(f"Hesaplanan Benzerlik (Overlap): {max(0, overlap):.4f}")
Kod analizi · satır satır
Importlar QuantumCircuit devre nesnemizi tutar; AerSimulator yerel makinemizde gürültüsüz bir kuantum donanımı taklit eder. numpy bu örnekte küçük bir hesap için (olasılık → overlap dönüşümü) kullanılır; daha karmaşık durum hazırlıklarında dizilerle çalışmak için Qiskit ile kol kola gider.
qc = QuantumCircuit(3, 1) Kayıt mimarisi şu: üç kübit ama yalnızca bir klasik bit. Üç kübitin ilki yardımcı (ancilla, q0); kalan ikisi karşılaştıracağımız durumları (q1, q2) tutar. Tek klasik bit, sadece ancillayı ölçeceğimiz için yeterlidir; karşılaştırılan iki kübit hiç ölçülmez — kuantum bilgileri korunur.
qc.x(2) Karşılaştırma için iki bilinen, kasten dik durum hazırlıyoruz: |0⟩ (q1, varsayılan) ve |1⟩ (q2, X kapısıyla çevrildi). Bu seçim algoritmanın doğru çalıştığını ölçmek için bir "kalibrasyon"dur: dik durumlarda overlap teorik olarak 0 olmalı; kod bunu doğruluyor mu kontrol ederiz. Üst satıra # koyarsanız iki taraf da |0⟩ kalır → aynı durumlar.
qc.barrier() Hesaplamaya etkisi yok; sadece görsel ve mantıksal bir ayraçtır. Devreyi qc.draw() ile çizdirdiğinizde "hazırlık", "swap testi" ve "ölçüm" aşamaları arasına dikey çizgi koyar. Optimizasyon (transpiler) sırasında kapıların barrier'ın iki tarafı arasında yer değiştirmesini de engeller — kontrollü deneylerde işe yarar.
qc.h(0) — ilk Hadamard Ancilla'yı (|0⟩ + |1⟩)/√2 süperpozisyonuna sokar. Bu, "kontrol kübitini her iki olasılıkta birden çalıştır" demektir; CSWAP'in iki farklı dünyayı (swap olmuş / olmamış) aynı anda üretmesini mümkün kılar. Algoritmanın klasik bir döngüden farkı tam olarak buradadır.
qc.cswap(0, 1, 2) — Fredkin Bu devrenin kalbi. Ancilla |0⟩ ise q1/q2 olduğu gibi kalır; |1⟩ ise yer değiştirirler. Ancilla süperpozisyonda olduğu için iki dünya birden gerçekleşir → tüm bu işlemden sonra ancilla'nın durumu, q1 ile q2'nin "ne kadar benzediğine" bağlı bir girişim (interference) deseni taşır.
qc.h(0) — ikinci Hadamard İlk Hadamard, ancillayı süperpozisyona soktu; ikincisi onu yine ölçülebilir bir tabana çevirir, ama bu sefer iki dünyanın girişiminin bilgisi taşınmış olur. Bunu fiziksel olarak Mach-Zehnder interferometresine benzetebilirsiniz: ışın ayırıcıdan geçirilip yine ayırıcıya geri gönderilir; sonuç, iki yolun ne kadar örtüştüğüne bağlıdır. Burada iki "yol" = q1/q2'nin değişip değişmemiş hâli.
qc.measure(0, 0) Sadece ancilla ölçülür. q1 ve q2'ye dokunulmaz; durumları korunur, dolayısıyla başka bir devrede tekrar kullanılabilirler. Ölçüm 0 verirse iki durum benzer; 1 verirse farklı yönde. Bir tek atış az bilgi taşır; istatistik için çok atış gerek.
shots=2048 Bell devresinde 1024 kullanmıştık; burada 2048 verdik çünkü overlap iki küçük olasılığın farkını okur. Daha fazla shot, hassasiyeti yaklaşık ile geliştirir: 2048, ~%2 hassasiyet sunar. Donanımda paranın/zamanın izin verdiği ölçüde shot artırmak, overlap tahminini yumuşatır.
p0 = counts.get('0', 0) / 2048 Klasik bir bölme: ancillanın 0 görünme oranı. counts.get('0', 0)'in iki avantajı var: anahtar yoksa (örn. tüm atışlar 1) 0 döner ve KeyError atılmaz; ayrıca okunması kolaydır.
overlap = 2 * p0 - 1 Tüm matematiği tek satıra indiren formül. p0 = (1 + |⟨ψ|φ⟩|²)/2 teorik ilişkisini geri çeviririz. Aynı durum (overlap = 1) için p0 = 1.0, dik durum (overlap = 0) için p0 = 0.5 beklenir. Sonlu shot ve gürültüde küçük negatife düşebilir; max(0, overlap) ile bunu fiziksel aralıkta kırparız.
Swap testi, Kuantum Kernel Metotları'nın temel hesap birimidir. Klasik bir SVM / kernel modelinde benzerlik (kernel) fonksiyonu, iki örneğin iç çarpımı ile tanımlanır; kuantum kernel ise iki örneği farklı kuantum durumlarına kodlar () ve aralarındaki örtüşmeyi olarak Swap testi ile ölçer.
Bu yaklaşım, klasik benzerlik fonksiyonlarıyla erişilemeyen yüksek boyutlu özellik uzaylarında — özellikle küçük veri rejimlerinde — alternatif sınıflandırma ve kümeleme stratejileri önerir.
Çalıştırma için qiskit ve qiskit-aer paketleri yeterlidir; kurulumun özeti ana sayfadaki IDE ve çalıştırma bölümündedir. Gerçek donanımda denemek için AerSimulator() satırını QiskitRuntimeService().backend("ibm_brisbane") gibi bir IBM cihazıyla değiştirin; Fredkin kapısı pahalı olduğu için NISQ donanımında beklenen overlap'tan ~%5–%10 sapma normaldir.
Devre ve doğrulama
Aşağıdaki şema üç kübitlik en yalın Swap testidir. Sol uçta, kodun qc.x(2) satırını yansıtan turuncu çerçeveli minik X kapısı q2'yi durumuna hazırlar — bu sayede karşılaştırılan iki durum dik (orthogonal) hâle gelir. Hemen ardından ancilla'ya , Fredkin (mor kontrol noktası + iki “×”), ikinci ve ölçüm gelir.
Yardımcı kübit için: . Örnek kodda , olduğundan overlap ve . Histogram 0 ve 1'i ~%50–%50 dağıtır.
- 0 ≈ %50
- 1 ≈ %50
- Overlap = 2P(0) − 1 ≈ 0
-
Aynı durumda ne olur?
Kodda qc.x(2) satırını silerseniz iki kübit de olur; histogram yalnızca 0 gösterir, overlap .
-
Atış sayısı önemlidir
Overlap istatistiksel bir tahmindir. Düşük atışta 2P(0) − 1 küçük negatif değerler verebilir; örnek kod max(0, overlap) ile bunu kırpar.
-
Çoklu kübit
İki kayıt birden fazla kübitten oluşuyorsa Fredkin, kübit-kübit eşleşmeleri için paralel CSWAP'lar olarak genişletilir; matematiksel form aynıdır.
-
Donanımda maliyet · NISQ
Fredkin doğal kapı kümesinde olmadığı için ayrıştırma sonrası birden çok iki kübitlik kapıya açılır; bu derinlik artışı, NISQ donanımlarda gürültü sınırını belirler. Bu yüzden gerçek cihazda mükemmel bir 0,50 dağılımı yerine 0,48–0,52 arası küçük sapmalar görmek normaldir; bu sapmalar cihazın hata oranı (error rate) hakkında dolaylı bir okumadır.