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 . Jak zaobserwowaliśmy już w lekcji „Korekcja błędów kwantowych", jest to równoważne temu, że błąd pojawia się na obu qubitach po wykonaniu CNOT. Analogicznie sytuacja wygląda w przypadku błędu działającego na qubit docelowy zamiast kontrolny przed wykonaniem gate'u CNOT.
Jest to propagacja błędów, gdyż niefortunne położenie błędu lub 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.
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.)
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.
Gate na logical qubicie zakodowanym przez ten kod można implementować transversally za pomocą 9-qubitowej operacji Pauli
natomiast gate na logical qubicie można implementować transversally za pomocą 9-qubitowej operacji Pauli
Obie te operacje Pauli mają wagę co jest minimalną wymaganą wagą. (9-qubitowy kod Shora ma odległość więc każda nieidentycznościowa operacja Pauli o wadze 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 i . Hadamard gate zastosowany do wszystkich qubitów kodu Steane'a jest równoważny zastosowaniu do logical qubitu, który koduje; natomiast gate (w odróżnieniu od gate'u ) zastosowany do wszystkich qubitów jest równoważny logicznemu gate'owi .
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 bramki jednokubitowej mamy w gadżecie po prostu iloczyn tensorowy bramek jednokubitowych, działający na blok fizycznych kubitów wybranego kwantowego kodu korekcji błędów. Choć każda z tych bramek może zawieść i wprowadzić błąd, nie będzie propagacji błędów, ponieważ nie są zaangażowane bramki wielokubitowe. 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 bramki 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 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 , kroki korekcji błędów wykonywane po gadżecie skorygują dwa błędy 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 przy użyciu -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.
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 i bramka , których macierzowe opisy wyglądają następująco.
Z definicji jest operacją Clifforda, natomiast bramka już nie; nie jest możliwe zaimplementowanie bramka za pomocą układu złożonego wyłącznie z bramek Clifforda (bramek , bramek i bramek CNOT).
Można jednak zaimplementować bramka (z dokładnością do globalnej fazy) za pomocą układu złożonego z bramek Clifforda, jeśli dodatkowo dysponujemy kopią stanu
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.
Aby sprawdzić, czy ten układ działa poprawnie, możemy najpierw obliczyć działanie bramki CNOT na wejście.
Pomiar daje zatem wyniki i z jednakowym prawdopodobieństwem. Jeśli wynik wynosi bramka nie jest wykonywana, a wyjściowy stan to jeśli wynik wynosi bramka jest wykonywana, a wyjściowy stan to
Stan 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 stanem i zamieniając bramkę w powyższym układzie na bramkę , implementujemy bramkę — co może być przydatne przy fault-tolerant obliczeniach kwantowych z użyciem kodu, dla którego bramki 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 wydaje się, że i tak musimy zaaplikować bramka do stanu , aby uzyskać magic state, który następnie wykorzystujemy do zaimplementowania bramka . Jaka jest więc zaleta tego podejścia z punktu widzenia fault-tolerance?
Oto trzy kluczowe punkty, które odpowiadają na to pytanie.
-
Tworzenie magic states nie wymaga zastosowania bramki, którą próbujemy zaimplementować, do konkretnego stanu. Na przykład zastosowanie bramka do stanu nie jest jedynym sposobem na uzyskanie stanu .
-
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ń.
-
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 — mając na uwadze, że metodologia ta może być rozszerzona na inne bramki. Fault-tolerant implementacja bramka za pomocą magic states przyjmuje postać sugerowaną przez poniższy rysunek.
Kubity w oryginalnym układzie bramka 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 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 . 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 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 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.
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 proces zakończył się niepowodzeniem i musi zostać uruchomiony ponownie. Jeśli jednak każdy wynik pomiaru wynosi 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 , 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 -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 -qubitowym stanem postaci
gdzie i oznaczają ciągi samych zer i samych jedynek o długości Na przykład jest to stan dla i stan GHZ dla ale ogólnie korekcja błędów Shora wymaga stanu tego rodzaju dla równego wadze mierzonego generatora Stabilizer.
Jako przykład, pokazany tu układ mierzy generator Stabilizer postaci
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 i .
Pokrewna metoda znana jako korekcja błędów Knilla rozszerza tę metodę na dowolne kody stabilizatora z użyciem teleportacji.