Przejdź do głównej treści

Kontrolowanie propagacji błędów

Obliczenia kwantowe odporne na błędy przypominają wyścig między błędami a ich korekcją. Jeśli liczba błędów jest wystarczająco mała, korekcja błędów skutecznie je poprawi; jeśli jednak błędów jest zbyt wiele, korekcja zawiedzie.

Z tego powodu należy zachować szczególną ostrożność co do sposobu, w jaki wykonuje się obliczenia kwantowe w implementacjach układów odpornych na błędy, aby kontrolować propagację błędów. Błąd na jednym qubicie może bowiem potencjalnie rozprzestrzenić się na wiele qubitów wskutek działania gate'ów w układzie kwantowym, co może dramatycznie zwiększyć liczbę błędów. To kwestia pierwszorzędnej wagi — jeśli nie uda nam się kontrolować propagacji błędów, nasze wysiłki korekcyjne szybko zostaną przytłoczone przez błędy. Jeśli natomiast uda się utrzymać propagację błędów pod kontrolą, korekcja błędów ma realną szansę nadążyć, umożliwiając poprawianie błędów z wystarczająco wysoką częstotliwością, by obliczenia kwantowe działały zgodnie z zamierzeniem.

Punktem wyjścia do technicznej dyskusji na ten temat jest spostrzeżenie, że gate'y dwu-qubitowe (lub ogólniej: gate'y wieloqubitowe) mogą propagować błędy, nawet gdy działają bezbłędnie. Rozważmy na przykład gate CNOT i załóżmy, że tuż przed jego wykonaniem na qubicie kontrolnym pojawia się błąd XX. Jak zaobserwowaliśmy już w lekcji „Korekcja błędów kwantowych", jest to równoważne temu, że błąd XX pojawia się na obu qubitach po wykonaniu CNOT. Analogicznie sytuacja wygląda w przypadku błędu ZZ działającego na qubit docelowy zamiast kontrolny przed wykonaniem gate'u CNOT.

Reprezentacje obwodowe propagacji błędów przez gate'y CNOT

Jest to propagacja błędów, gdyż niefortunne położenie błędu XX lub ZZ przed gate'em CNOT skutecznie zamienia go w dwa błędy po wykonaniu CNOT. Dzieje się tak nawet wtedy, gdy gate CNOT jest idealny — nie możemy też zapomnieć, że dany gate CNOT może sam być zaszumiony, co może tworzyć skorelowane błędy na dwóch qubitach.

Naszą obawę potęguje fakt, że kolejne gate'y dwu-qubitowe mogą propagować te błędy jeszcze dalej, co sugeruje poniższy rysunek.

Reprezentacje obwodowe propagacji błędów przez wiele gate'ów CNOT

W pewnym sensie nigdy nie możemy tego uniknąć — dopóki używamy gate'ów wieloqubitowych, propagacja błędów będzie możliwa. Jednak, jak omówimy w kolejnych podrozdziałach, można podjąć kroki ograniczające wyrządzone szkody, co pozwala zarządzać propagowanymi błędami.

Transversal gate implementations

Najprostszym znanym sposobem ograniczenia propagacji błędów w układach kwantowych odpornych na błędy jest implementowanie gate'ów transversally, czyli budowanie dla nich gadżetów o pewnej prostej formie. Gadżety muszą być iloczynem tensorowym operacji (innymi słowy: układem kwantowym o głębokości jeden), gdzie każda operacja może działać jedynie na jednej pozycji qubitu w każdym bloku kodu, którego dotyka. Najłatwiej wyjaśnić to na przykładach.

Examples of transversal gate implementations

Rozważmy poniższy rysunek sugerujący transversal implementację gate'u CNOT. (Ta konkretna implementacja, w której CNOT-y wykonywane są qubit po qubicie, działa tylko dla CSS codes — lecz działa w istocie dla wszystkich CSS codes.)

Transversal implementacja gate'u CNOT

Na rysunku widoczne są dwa bloki kodu, każdy złożony z pięciu qubitów (choć może ich być więcej, co już wcześniej sugerowano). Układ po prawej stronie ma głębokość jeden, a każdy z gate'ów CNOT działa na jednej pozycji qubitu w każdym bloku: zarówno qubit kontrolny, jak i docelowy pierwszego CNOT to najbardziej górny qubit (tj. qubit 0 według konwencji numerowania Qiskit), zarówno qubit kontrolny, jak i docelowy drugiego CNOT to qubit drugi od góry (tj. qubit 1) i tak dalej. Jest to zatem transversal gadżet.

Jako drugi przykład — a właściwie klasę przykładów — rozważmy dowolny Pauli gate. Pauli gates zawsze można implementować transversally dla dowolnego Stabilizer code, budując gadżety złożone z operacji Pauli. W szczególności każdą operację Pauli na logical qubicie zakodowanym przez Stabilizer code można implementować transversally, wybierając odpowiednią operację Pauli na fizycznych qubitach użytych do kodowania. Jest to zgodne z faktem wspomnianym mimochodem w lekcji „Formalizm Stabilizer": z dokładnością do globalnej fazy operacje Pauli komutujące z każdym generatorem Stabilizer danego Stabilizer code działają jak operacje Pauli na qubicie lub qubitach zakodowanych przez ten kod.

Jako konkretny przykład rozważmy 9-qubitowy kod Shora, dla którego stany bazy standardowej można zakodować następująco.

0122(000+111)(000+111)(000+111)1122(000111)(000111)(000111)\begin{aligned} \vert 0\rangle & \:\mapsto\: \frac{1}{2\sqrt{2}} (\vert 000\rangle + \vert 111\rangle) \otimes (\vert 000\rangle + \vert 111\rangle) \otimes (\vert 000\rangle + \vert 111\rangle) \\[3mm] \vert 1\rangle & \:\mapsto\: \frac{1}{2\sqrt{2}} (\vert 000\rangle - \vert 111\rangle) \otimes (\vert 000\rangle - \vert 111\rangle) \otimes (\vert 000\rangle - \vert 111\rangle) \end{aligned}

Gate XX na logical qubicie zakodowanym przez ten kod można implementować transversally za pomocą 9-qubitowej operacji Pauli

ZIIZIIZIIZ \otimes \mathbb{I} \otimes \mathbb{I} \otimes Z \otimes \mathbb{I} \otimes \mathbb{I} \otimes Z \otimes \mathbb{I} \otimes \mathbb{I}

natomiast gate ZZ na logical qubicie można implementować transversally za pomocą 9-qubitowej operacji Pauli

XXXIIIIII.X \otimes X \otimes X \otimes \mathbb{I} \otimes \mathbb{I} \otimes \mathbb{I} \otimes \mathbb{I} \otimes \mathbb{I} \otimes \mathbb{I}.

Obie te operacje Pauli mają wagę 3,3, co jest minimalną wymaganą wagą. (9-qubitowy kod Shora ma odległość 3,3, więc każda nieidentycznościowa operacja Pauli o wadze 22 lub mniejszej jest wykrywana jako błąd.)

I jako trzeci przykład: 7-qubitowy kod Steane'a (a w istocie każdy color code) umożliwia transversal implementację wszystkich Clifford gates. Widzieliśmy już, jak CNOT gates są implementowane transversally dla dowolnego CSS code — pozostaje zatem rozważyć gate'y HH i SS. Hadamard gate zastosowany do wszystkich 77 qubitów kodu Steane'a jest równoważny zastosowaniu HH do logical qubitu, który koduje; natomiast gate SS^{\dagger} (w odróżnieniu od gate'u SS) zastosowany do wszystkich 77 qubitów jest równoważny logicznemu gate'owi SS.

Error propagation for transversal gadgets

Teraz, gdy wiemy, czym są transversal implementacje gate'ów, omówmy ich związek z propagacją błędów.

W przypadku transversal implementacji gate'u jednobitowego mamy w gadżecie po prostu iloczyn tensorowy gate'ów jednobitowych, działający na blok fizycznych qubitów wybranego kwantowego kodu korekcji błędów. Choć każdy z tych gate'ów może zawieść i wprowadzić błąd, nie będzie propagacji błędów, ponieważ nie są zaangażowane gate'y wieloqubitowe. Bezpośrednio po zastosowaniu gadżetu wykonywana jest korekcja błędów — jeśli liczba błędów wprowadzonych przez gadżet (lub podczas jego wykonywania) jest wystarczająco mała, błędy zostaną skorygowane. Jeśli więc częstość błędów wprowadzanych przez wadliwe gate'y jest wystarczająco mała, korekcja błędów ma duże szanse powodzenia.

W przypadku transversal implementacji gate'u dwu-qubitowego istnieje natomiast potencjał propagacji błędów — nie ma możliwości, by tego uniknąć, jak już wcześniej zaobserwowaliśmy. Zasadnicza kwestia jest jednak taka, że transversal gadżet nigdy nie może spowodować propagacji błędów wewnątrz pojedynczego bloku kodu.

Rozważmy na przykład opisaną powyżej transversal implementację gate'u CNOT dla CSS code: błąd XX może pojawić się na górnym qubicie górnego bloku kodu tuż przed wykonaniem gadżetu, a pierwszy CNOT wewnątrz gadżetu propaguje ten błąd do górnego qubitu w dolnym bloku. Jednak dwa powstałe błędy znajdują się teraz w osobnych blokach kodu. Zakładając zatem, że nasz kod potrafi skorygować błąd XX, kroki korekcji błędów wykonywane po gadżecie skorygują dwa błędy XX niezależnie — ponieważ w każdym bloku kodu występuje tylko jeden błąd. Gdyby natomiast propagacja błędów zachodziła wewnątrz tego samego bloku kodu, mogłaby zamienić błąd o małej wadze w błąd o dużej wadze, którego kod nie może obsłużyć.

Non-universality of transversal gates

Dla dwóch różnych Stabilizer codes może się zdarzyć, że dany gate można implementować transversally przy użyciu jednego kodu, ale nie drugiego. Na przykład choć nie jest możliwe transversal implementowanie bramka TT przy użyciu 77-kubitowego kodu Steane'a, istnieją inne kody, dla których jest to możliwe.

Niestety, dla żadnego nietrywialnego kwantowego kodu korekcji błędów nie jest możliwa implementacja uniwersalnego zestawu gate'ów transversally. Fakt ten znany jest jako twierdzenie Eastina–Knilla.

Twierdzenie

Twierdzenie Eastina–Knilla: Dla dowolnego kwantowego kodu korekcji błędów o odległości co najmniej 2 zbiór logical gates, które można implementować transversally, generuje zbiór operacji, który (z dokładnością do globalnej fazy) jest dyskretny, a zatem nie jest uniwersalny.

Dowód tego twierdzenia nie zostanie tu przedstawiony. (Nie jest to skomplikowany dowód, wymaga jednak podstawowej znajomości grup Liego i algebr Liego, które nie należą do wymagań wstępnych tej serii.) Podstawową ideę można jednak przekazać intuicyjnie: Nieskończone rodziny operacji transversal nie mogą pozostawać w przestrzeni kodu nietrywialnego kodu, ponieważ minimalne różnice między operacjami transversal są dobrze przybliżane przez operacje Pauli o małej wadze, które kod wykrywa jako błędy.

Podsumowując, transversal gadżety oferują prostą i inherentnie odporną na błędy implementację gate'ów — jednak dla każdego rozsądnego wyboru kwantowego kodu korekcji błędów nigdy nie będzie istniał uniwersalny zestaw gate'ów, który można implementować w ten sposób, co wymusza stosowanie alternatywnych gadżetów.

Magic states

Ponieważ dla żadnego nietrywialnego kodu korekcji błędów kwantowych nie jest możliwe transversalne zaimplementowanie uniwersalnego zestawu bramek kwantowych, musimy rozważyć inne metody fault-tolerant implementacji bramek. Jedną z dobrze znanych metod jest podejście oparte na pojęciu magic states, czyli stanów kwantowych qubitów umożliwiających fault-tolerant implementację pewnych bramek.

Implementowanie bramek za pomocą magic states

Zacznijmy od rozważenia bramek SS i bramka TT, których macierzowe opisy wyglądają następująco.

S=(100i)=(100eiπ/2)andT=(1001+i2)=(100eiπ/4)S = \begin{pmatrix} 1 & 0\\ 0 & i \end{pmatrix} = \begin{pmatrix} 1 & 0\\ 0 & e^{i\pi/2} \end{pmatrix} \qquad\text{and}\qquad T = \begin{pmatrix} 1 & 0\\ 0 & \frac{1+i}{\sqrt{2}} \end{pmatrix} = \begin{pmatrix} 1 & 0\\ 0 & e^{i\pi/4} \end{pmatrix}

Z definicji SS jest operacją Clifforda, natomiast bramka TT już nie; nie jest możliwe zaimplementowanie bramka TT za pomocą układu złożonego wyłącznie z bramek Clifforda (bramek HH, bramek SS i bramek CNOT).

Można jednak zaimplementować bramka TT (z dokładnością do globalnej fazy) za pomocą układu złożonego z bramek Clifforda, jeśli dodatkowo dysponujemy kopią stanu

T+=120+eiπ/421,T\vert {+} \rangle = \frac{1}{\sqrt{2}} \vert 0 \rangle + \frac{e^{i\pi/4}}{\sqrt{2}} \vert 1\rangle,

oraz dopuszczamy pomiary w standardowej bazie i klasycznie sterowane bramki. Poniższy układ pokazuje jeden ze sposobów, jak to osiągnąć. Zilustrowane tu zjawisko jest nieco uproszczonym przykładem kwantowej teleportacji bramek.

A circuit diagram depicting magic state injection

Aby sprawdzić, czy ten układ działa poprawnie, możemy najpierw obliczyć działanie bramki CNOT na wejście.

T+ψCNOT120Tψ+1+i21TψT \vert {+} \rangle \otimes \vert\psi\rangle \stackrel{\text{CNOT}}{\longmapsto} \frac{1}{\sqrt{2}} \vert 0\rangle \otimes T \vert \psi\rangle + \frac{1+i}{2} \vert 1\rangle \otimes T^{\dagger} \vert \psi\rangle

Pomiar daje zatem wyniki 00 i 11 z jednakowym prawdopodobieństwem. Jeśli wynik wynosi 0,0, bramka SS nie jest wykonywana, a wyjściowy stan to Tψ;T\vert\psi\rangle; jeśli wynik wynosi 1,1, bramka SS jest wykonywana, a wyjściowy stan to STψ=Tψ.ST^{\dagger}\vert\psi\rangle = T\vert \psi\rangle.

Stan T+T\vert {+}\rangle nazywamy w tym kontekście magic state, choć nie jest on pod tym względem wyjątkowy: inne stany również noszą tę nazwę, gdy można ich użyć w podobny sposób (dla ewentualnie innych bramek i przy użyciu innych układów). Na przykład, zastępując stan T+T\vert{+}\rangle stanem S+S\vert{+}\rangle i zamieniając bramkę SS w powyższym układzie na bramkę ZZ, implementujemy bramkę SS — co może być przydatne przy fault-tolerant obliczeniach kwantowych z użyciem kodu, dla którego bramki SS nie da się zaimplementować transversalnie.

Fault-tolerant gadżety z magic states

Nie jest od razu oczywiste, że używanie magic states do implementowania bramek jest pomocne dla fault-tolerance. W przypadku opisanej powyżej implementacji bramka TT wydaje się, że i tak musimy zaaplikować bramka TT do stanu +\vert{+}\rangle, aby uzyskać magic state, który następnie wykorzystujemy do zaimplementowania bramka TT. Jaka jest więc zaleta tego podejścia z punktu widzenia fault-tolerance?

Oto trzy kluczowe punkty, które odpowiadają na to pytanie.

  1. Tworzenie magic states nie wymaga zastosowania bramki, którą próbujemy zaimplementować, do konkretnego stanu. Na przykład zastosowanie bramka TT do stanu +\vert {+} \rangle nie jest jedynym sposobem na uzyskanie stanu T+T\vert{+}\rangle.

  2. Tworzenie magic states może odbywać się oddzielnie od obliczeń, w których są używane. Oznacza to, że błędy powstające w procesie tworzenia magic state nie będą propagować się do właściwych obliczeń.

  3. Jeśli poszczególne bramki w układzie implementującym wybraną bramkę za pomocą magic state można zaimplementować fault-tolerantly, a zakładamy dostępność magic states, uzyskujemy fault-tolerant implementację wybranej bramki.

Aby uprościć dalsze rozważania, skupmy się na bramka TT — mając na uwadze, że metodologia ta może być rozszerzona na inne bramki. Fault-tolerant implementacja bramka TT za pomocą magic states przyjmuje postać sugerowaną przez poniższy rysunek.

A circuit diagram depicting magic state injection on an encoded qubit

Kubity w oryginalnym układzie bramka TT odpowiadają logical qubitom na tym diagramie, które są zakodowane przez kod używany dla fault-tolerance. Wejścia i wyjścia na diagramie należy więc rozumieć jako kodowania tych stanów. Oznacza to w szczególności, że potrzebujemy nie tylko magic states — potrzebujemy zakodowanych magic states. Bramki w oryginalnym układzie bramka TT są tutaj zastąpione przez gadżety, które zakładamy są fault-tolerant.

Ten konkretny rysunek sugeruje zatem, że dysponujemy już fault-tolerant gadżetami dla bramek CNOT i SS. Dla kodu kolorowego gadżety te mogłyby być transversalne; dla kodu powierzchniowego (lub dowolnego innego kodu CSS) CNOT można wykonać transversalnie, podczas gdy gadżet bramki SS mógłby sam być zaimplementowany przy użyciu magic states, jak wcześniej sugerowaliśmy. (Rysunek sugeruje również, że dysponujemy fault-tolerant gadżetem do wykonywania pomiarów w standardowej bazie, co dotychczas pomijaliśmy. Może to być wyzwaniem dla niektórych kodów, ale dla kodu CSS sprowadza się do pomiaru każdego fizycznego kubitu, po którym następuje klasyczne przetwarzanie końcowe.)

Implementacja jest zatem fault-tolerant, zakładając że dysponujemy kodowaniem magic state T+.T\vert{+}\rangle. Nadal jednak nie rozwiązaliśmy kwestii tego, jak uzyskać kodowanie tego stanu. Jednym ze sposobów uzyskiwania zakodowanych magic states (a ściślej mówiąc: poprawiania ich jakości) jest proces znany jako magic state distillation. Poniższy diagram ilustruje, jak wygląda ten proces na najwyższym poziomie.

A circuit diagram representing distillation of encoded magic states

Mówiąc wprost: zbiór zaszumionych zakodowanych magic states jest podawany na wejście specjalnego układu zwanego destylarnią. Wszystkie bloki wyjściowe poza jednym są mierzone — oznacza to, że logical kubity są mierzone w standardowej bazie. Jeśli którykolwiek wynik pomiaru wynosi 1,1, proces zakończył się niepowodzeniem i musi zostać uruchomiony ponownie. Jeśli jednak każdy wynik pomiaru wynosi 0,0, wynikowy stan górnego bloku kodu będzie mniej zaszumionym zakodowanym magic state. Stan ten mógłby następnie dołączyć do czterech innych jako wejścia do kolejnej destylarni lub być użyty do zaimplementowania bramka TT, jeśli uzna się go za wystarczająco bliski prawdziwemu zakodowanemu magic state. Oczywiście proces musi gdzieś się zacząć — jedną z możliwości jest przygotowanie stanów w sposób nieodporny na błędy.

Istnieją różne znane sposoby budowania samej destylarni, ale nie będą tu omawiane ani analizowane. Na poziomie logical, typowe podejście — co jest zarazem niezwykłe i po części przypadkowe — polega na uruchomieniu układu kodującego dla kodu Stabilizer w odwrotnym kierunku! Może to być kod Stabilizer inny od tego używanego do korekcji błędów. Na przykład, można potencjalnie używać kodu powierzchniowego lub kolorowego do korekcji błędów, ale uruchamiać koder dla kodu 55-qubitowego w odwrotnym kierunku na potrzeby magic state distillation. Układy kodujące dla kodów Stabilizer wymagają tylko bramek Clifforda, co upraszcza fault-tolerant implementację destylarni. W praktyce szczegóły zależą od używanych kodów.

Podsumowując, ta sekcja miała na celu jedynie bardzo ogólne omówienie magic states, z zamiarem przedstawienia podstawowego obrazu tego, jak to działa. Czasem twierdzi się, że narzut związany z użyciem magic states do fault-tolerant implementacji bramek byłby niezwykle wysoki, przy czym zdecydowana większość pracy idzie w proces destylacji. Nie jest to jednak wcale takie oczywiste — istnieje wiele potencjalnych sposobów optymalizacji tych procesów. Istnieją ponadto alternatywne podejścia do budowania fault-tolerant gadżetów dla bramek, których nie można zaimplementować transversalnie. Na przykład code deformation i code switching to słowa kluczowe związane z niektórymi z tych schematów — a nowe sposoby są nadal opracowywane i udoskonalane.

Fault-tolerant error correction

Oprócz implementacji różnych gadżetów wymaganych do fault-tolerant realizacji danego układu kwantowego, istnieje jeszcze jedna ważna kwestia, którą należy rozpoznać: implementacja samych kroków korekcji błędów. Wiąże się to z ideą, że wszystko, co dotyczy informacji kwantowej, jest podatne na błędy — w tym układy, które same w sobie mają błędy korygować.

Rozważmy na przykład rodzaj układu opisanego w lekcji „Formalizm Stabilizer" służącego do niedestruktywnego pomiaru generatorów Stabilizer za pomocą estymacji fazy. Układy te ewidentnie nie są fault-tolerant, ponieważ mogą powodować propagację błędów wewnątrz bloku kodu, na którym operują. Może to wydawać się poważnym problemem, ale istnieje wiele znanych sposobów na fault-tolerant korekcję błędów, które nie powodują propagacji błędów wewnątrz korygowanych bloków kodu.

Jedna metoda znana jest jako korekcja błędów Shora, ponieważ po raz pierwszy odkrył ją Peter Shor. Idea polega na wykonywaniu pomiarów syndrome za pomocą tzw. stanu kota, który jest nn-qubitowym stanem postaci

120n+121n,\frac{1}{\sqrt{2}} \vert 0^n \rangle + \frac{1}{\sqrt{2}} \vert 1^n \rangle,

gdzie 0n0^n i 1n1^n oznaczają ciągi samych zer i samych jedynek o długości n.n. Na przykład jest to stan ϕ+\vert\phi^+\rangle dla n=2n=2 i stan GHZ dla n=3,n=3, ale ogólnie korekcja błędów Shora wymaga stanu tego rodzaju dla nn równego wadze mierzonego generatora Stabilizer.

Jako przykład, pokazany tu układ mierzy generator Stabilizer postaci P2P1P0.P_2\otimes P_1 \otimes P_0.

A Shor error detection circuit

Wymaga to skonstruowania samego stanu kota, a żeby działało to niezawodnie w obecności błędów i potencjalnie wadliwych bramek, metoda faktycznie wymaga wielokrotnego uruchamiania takich układów w celu wnioskowania o tym, gdzie podczas procesu mogły wystąpić różne błędy.

Alternatywna metoda znana jest jako korekcja błędów Steane'a. Metoda ta działa inaczej i jest przeznaczona wyłącznie dla kodów CSS. Idea polega na tym, że w rzeczywistości nie wykonujemy pomiarów syndrome na zakodowanych stanach kwantowych w układzie, który próbujemy uruchomić, lecz celowo propagujemy błędy do systemu pomocniczego, a następnie mierzymy ten system i klasycznie wykrywamy błędy. Poniższe diagramy układów ilustrują, jak można to zrobić odpowiednio dla wykrywania błędów XX i ZZ.

A Steane error detection circuit