Kwantowa diagonalizacja Kryłowa
W tej lekcji dotyczącej kwantowej diagonalizacji Kryłowa (KQD) odpowiemy na następujące pytania:
- Czym jest metoda Kryłowa w ogólnym ujęciu?
- Dlaczego metoda Kryłowa działa i pod jakimi warunkami?
- Jaką rolę odgrywa obliczanie kwantowe?
Część kwantowa obliczeń opiera się w dużej mierze na pracy z Ref [1].
Poniższe wideo przedstawia ogólny przegląd metod Kryłowa w obliczeniach klasycznych, motywuje ich zastosowanie oraz wyjaśnia, jaką rolę może odgrywać obliczanie kwantowe w tym nurcie pracy. W dalszym tekście znajdują się bardziej szczegółowe informacje oraz implementacja metody Kryłowa zarówno klasycznie, jak i przy użyciu komputera kwantowego.
1. Wprowadzenie do metod Kryłowa
Metoda podprzestrzeni Kryłowa może odnosić się do dowolnej z kilku metod zbudowanych wokół tak zwanej podprzestrzeni Kryłowa. Pełny przegląd tych metod wykracza poza zakres tej lekcji, lecz Ref [2-4] mogą dostarczyć znacznie szerszego kontekstu. Skupimy się tutaj na tym, czym jest podprzestrzeń Kryłowa, jak i dlaczego jest użyteczna w rozwiązywaniu problemów wartości własnych, a w końcu jak może być zaimplementowana na komputerze kwantowym. Definicja: Dla symetrycznej, dodatnio półokreślonej macierzy o wymiarze , przestrzeń Kryłowa rzędu jest przestrzenią rozpinaną przez wektory otrzymane przez mnożenie wyższych potęg macierzy , aż do , przez wektor odniesienia .
Chociaż wektory powyżej rozpinają to, co nazywamy podprzestrzenią Kryłowa, nie ma powodu sądzić, że będą one ortogonalne. Często stosuje się iteracyjny proces ortonormalizacji podobny do ortogonalizacji Grama-Schmidta. Tutaj proces jest nieco inny, ponieważ każdy nowy wektor jest czyniony ortogonalnym do pozostałych w momencie jego generowania. W tym kontekście nazywa się to iteracją Arnoldiego. Zaczynając od wektora początkowego , generuje się następny wektor , a następnie zapewnia się, że ten drugi wektor jest ortogonalny do pierwszego przez odjęcie jego rzutu na . Czyli
Łatwo teraz zauważyć, że ponieważ
Robimy to samo dla kolejnego wektora, zapewniając, że jest ortogonalny do obu poprzednich:
Jeśli powtórzymy ten proces dla wszystkich wektorów, otrzymamy kompletną ortonormalną bazę dla przestrzeni Kryłowa. Zauważ, że proces ortogonalizacji w tym miejscu daje zero, gdy , ponieważ ortogonalnych wektorów z konieczności rozpina pełną przestrzeń. Proces również da zero, jeśli dowolny wektor jest wektorem własnym , ponieważ wszystkie kolejne wektory będą wielokrotnościami tego wektora.
1.1 Prosty przykład: Kryłow ręcznie
Przejdźmy krok po kroku przez generowanie podprzestrzeni Kryłowa na trywialnie małej macierzy, tak aby zobaczyć ten proces. Zaczynamy od interesującej nas początkowej macierzy :
Dla tego małego przykładu możemy łatwo wyznaczyć wektory i wartości własne nawet ręcznie. Tutaj pokazujemy rozwiązanie numeryczne.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-ibm-runtime scipy sympy
# One might use linalg.eigh here, but later matrices may not be Hermitian. So we use linalg.eig in this lesson.
import numpy as np
A = np.array([[4, -1, 0], [-1, 4, -1], [0, -1, 4]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print("The eigenvalues are ", eigenvalues)
print("The eigenvectors are ", eigenvectors)
The eigenvalues are [2.58578644 4. 5.41421356]
The eigenvectors are [[ 5.00000000e-01 -7.07106781e-01 5.00000000e-01]
[ 7.07106781e-01 1.37464400e-16 -7.07106781e-01]
[ 5.00000000e-01 7.07106781e-01 5.00000000e-01]]
Zapisujemy je tutaj do późniejszego porównania:
Chcielibyśmy zbadać, jak ten proces działa (lub zawodzi), w miarę jak zwiększamy wymiar naszej podprzestrzeni Kryłowa, . W tym celu zastosujemy następujący proces:
- Wygeneruj podprzestrzeń pełnej przestrzeni wektorowej, zaczynając od losowo wybranego wektora (nazwij go , jeśli jest już znormalizowany, jak powyżej).
- Zrzutuj pełną macierz na tę podprzestrzeń i znajdź wartości własne tej zrzutowanej macierzy .
- Zwiększ rozmiar podprzestrzeni, generując więcej wektorów, dbając o to, aby były one ortonormalne, przy użyciu procesu podobnego do ortogonalizacji Grama-Schmidta.
- Zrzutuj na większą podprzestrzeń i znajdź wartości własne otrzymanej macierzy .
- Powtarzaj to, aż wartości własne zbiegną się (lub, w tym zabawkowym przypadku, aż wygenerujesz wektory rozpinające pełną przestrzeń wektorową oryginalnej macierzy ).
Normalna implementacja metody Kryłowa nie musiałaby rozwiązywać problemu wartości własnych dla macierzy rzutowanej na każdą podprzestrzeń Kryłowa w miarę jej budowania. Można by skonstruować podprzestrzeń o żądanym wymiarze, zrzutować macierz na tę podprzestrzeń i zdiagonalizować zrzutowaną macierz. Rzutowanie i diagonalizowanie przy każdym wymiarze podprzestrzeni jest wykonywane tylko w celu sprawdzenia zbieżności.
Wymiar :
Wybieramy losowy wektor, powiedzmy
Jeśli nie jest on już znormalizowany, znormalizuj go.
Teraz rzutujemy naszą macierz na podprzestrzeń tego jednego wektora:
To jest nasze rzutowanie macierzy na naszą podprzestrzeń Kryłowa, gdy zawiera ona tylko pojedynczy wektor, . Wartość własna tej macierzy wynosi trywialnie 4. Możemy traktować to jako nasze oszacowanie zerowego rzędu wartości własnych (w tym przypadku tylko jednej) macierzy . Chociaż jest to słabe oszacowanie, jest to poprawny rząd wielkości.
Wymiar :
Teraz generujemy kolejny wektor w naszej podprzestrzeni poprzez działanie na poprzedni wektor:
Teraz odejmujemy rzut tego wektora na poprzedni wektor, aby zapewnić ortogonalność.
Jeśli nie jest już znormalizowany, znormalizuj go. W tym przypadku wektor był już znormalizowany, więc
Teraz rzutujemy naszą macierz A na podprzestrzeń tych dwóch wektorów:
Pozostaje nam jeszcze problem wyznaczenia wartości własnych tej macierzy. Ale ta macierz jest nieco mniejsza niż pełna macierz. W problemach dotyczących bardzo dużych macierzy praca z tą mniejszą podprzestrzenią może być niezwykle korzystna.
Chociaż nadal nie jest to dobre oszacowanie, jest lepsze niż oszacowanie zerowego rzędu. Wykonamy jeszcze jedną iterację, aby upewnić się, że proces jest jasny. Jednak podważa to sens metody, ponieważ w następnej iteracji będziemy diagonalizować macierz 3x3, co oznacza, że nie zaoszczędziliśmy czasu ani mocy obliczeniowej.
Wymiar :
Teraz generujemy kolejny wektor w naszej podprzestrzeni poprzez działanie A na poprzedni wektor:
Teraz odejmujemy rzut tego wektora na oba nasze poprzednie wektory, aby zapewnić ortogonalność.
Jeśli nie jest już znormalizowany, znormalizuj go. W tym przypadku wektor był już znormalizowany, więc
Teraz rzutujemy naszą macierz na podprzestrzeń tych wektorów:
Wyznaczamy teraz wartości własne:
Te wartości własne są dokładnie wartościami własnymi macierzy oryginalnej . Tak musi być, ponieważ rozszerzyliśmy naszą podprzestrzeń Krylov, by rozpinała całą przestrzeń wektorową macierzy oryginalnej .
W tym przykładzie metoda Krylov może nie wydawać się szczególnie łatwiejsza niż bezpośrednia diagonalizacja. W istocie, jak zobaczymy w kolejnych sekcjach, metoda Krylov jest korzystna dopiero powyżej pewnego wymiaru macierzy; ma ona nam pomóc w rozwiązywaniu problemów wartości własnych/wektorów własnych niezwykle dużych macierzy.

To jedyny przykład, który pokażemy rozwiązany „ręcznie”, ale sekcja 2 poniżej przedstawia przykłady obliczeniowe.
Wyjaśnienie terminów
Powszechnym nieporozumieniem jest przekonanie, że dla danego problemu istnieje tylko jedna podprzestrzeń Krylov. Jednak oczywiście, ponieważ istnieje wiele wektorów początkowych, do których można zastosować naszą macierz, istnieje wiele możliwych podprzestrzeni Krylov. Wyrażenia „the Krylov subspace” („ta podprzestrzeń Krylov”) będziemy używać wyłącznie w odniesieniu do konkretnej podprzestrzeni Krylov już zdefiniowanej dla konkretnego przykładu. Dla ogólnych podejść do rozwiązywania problemów będziemy mówić o „a Krylov subspace” („pewnej podprzestrzeni Krylov”). Ostatnie wyjaśnienie: poprawne jest także odwoływanie się do „przestrzeni Krylov”. Często spotyka się określenie „podprzestrzeń Krylov” ze względu na jej zastosowanie w kontekście rzutowania macierzy z przestrzeni początkowej na podprzestrzeń. Zgodnie z tym kontekstem będziemy tu najczęściej mówić o podprzestrzeni.
Sprawdź swoje zrozumienie
Przeczytaj poniższe pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby odsłonić każde rozwiązanie.
Wyjaśnij, dlaczego (a) nie jest użyteczne i (b) nie jest możliwe rozszerzanie wymiaru podprzestrzeni Krylov ponad wymiar rozpatrywanej macierzy.
Odpowiedź:
(a) Ponieważ ortonormalizujemy wektory w miarę ich wytwarzania, zbiór takich wektorów utworzy bazę kompletną, co oznacza, że ich liniowa kombinacja może zostać użyta do utworzenia dowolnego wektora w przestrzeni. (b) Proces ortogonalizacji polega na odejmowaniu rzutu nowego wektora na wszystkie poprzednie wektory. Jeżeli wszystkie poprzednie wektory rozpinają pełną przestrzeń wektorową, to odejmowanie rzutów na pełną podprzestrzeń zawsze pozostawi nam wektor zerowy.
Przypuśćmy, że kolega-badacz demonstruje metodę Krylov zastosowaną do niewielkiej macierzy przykładowej kilku współpracownikom. Ów kolega-badacz planuje użyć macierzy i wektora początkowego:
oraz
Czy coś jest z tym nie tak? Jak doradziłbyś swojemu koledze?
Odpowiedź:
Twój kolega przypadkowo wybrał wektor własny jako swój wektor początkowy. Działanie macierzą na wektor początkowy po prostu zwróci ten sam wektor, przeskalowany o wartość własną. Nie wygeneruje to podprzestrzeni o rosnącym wymiarze. Doradź koledze wybór innego wektora początkowego, upewniając się, że nie jest on wektorem własnym.
Zastosuj metodę Krylov do poniższej macierzy, wybierając odpowiedni nowy wektor początkowy. Zapisz oszacowania minimalnej wartości własnej w 0-tym i 1-szym rzędzie Twojej podprzestrzeni Krylov.
Odpowiedź:
Istnieje wiele możliwych odpowiedzi w zależności od wyboru wektora początkowego. Wybierzemy:
Aby otrzymać , stosujemy jednokrotnie do , a następnie czynimy ortogonalnym do
W 0-tym rzędzie rzut na naszą podprzestrzeń Krylov wynosi
W 1-szym rzędzie rzut na tę podprzestrzeń Krylov wynosi
Można to wykonać ręcznie, ale najłatwiej zrobić to przy użyciu numpy:
import numpy as np
vstar = np.array([[1/np.sqrt(3),1/np.sqrt(3),1/np.sqrt(3)],[-1/np.sqrt(6),np.sqrt(2/3),-1/np.sqrt(6)]]
)
A = np.array([[1, 1, 0],
[1, 1, 1],
[0, 1, 1]])
v = np.array([[1/np.sqrt(3),-1/np.sqrt(6)],[1/np.sqrt(3),np.sqrt(2/3)],[1/np.sqrt(3),-1/np.sqrt(6)]])
proj = vstar@A@v
print(proj)
eigenvalues, eigenvectors = np.linalg.eig(proj)
print("The eigenvalues are ", eigenvalues)
print("The eigenvectors are ", eigenvectors)
zwraca:
[[ 2.33333333 0.47140452]
[ 0.47140452 -0.33333333]]
The eigenvalues are [ 2.41421356 -0.41421356]
The eigenvectors are [[ 0.98559856 -0.16910198]
[ 0.16910198 0.98559856]]
Oszacowanie minimalnej wartości własnej wynosi -0.414.
1.2 Rodzaje metod Krylov
„Metody podprzestrzeni Krylov” mogą odnosić się do dowolnej z kilku technik iteracyjnych stosowanych do rozwiązywania dużych układów liniowych i problemów wartości własnych. Wspólną ich cechą jest to, że konstruują przybliżone rozwiązanie z podprzestrzeni Krylov
gdzie to przybliżenie początkowe (zob. odn. [5]). Różnią się one sposobem wyboru najlepszego przybliżenia z tej podprzestrzeni, równoważąc takie czynniki jak szybkość zbieżności, zużycie pamięci i ogólny koszt obliczeniowy. Celem tej lekcji jest wykorzystanie obliczeń kwantowych w kontekście metod podprzestrzeni Krylov; wyczerpujące omówienie tych metod wykracza poza jej zakres. Poniższe krótkie definicje mają charakter wyłącznie kontekstowy i zawierają pewne odnośniki do dalszego zgłębiania tych metod.
Metoda gradientów sprzężonych (CG): Metoda ta jest używana do rozwiązywania symetrycznych, dodatnio określonych układów liniowych[6]. Minimalizuje ona normę A błędu w każdej iteracji, co czyni ją szczególnie skuteczną dla układów powstających z dyskretyzacji eliptycznych równań różniczkowych cząstkowych[7]. Użyjemy tego podejścia w następnej sekcji, aby uzasadnić, dlaczego podprzestrzeń Krylov byłaby efektywną podprzestrzenią, w której można poszukiwać lepszych rozwiązań układów liniowych.
Metoda uogólnionej minimalnej reszty (GMRES): Została zaprojektowana do rozwiązywania ogólnych niesymetrycznych układów liniowych. Minimalizuje normę reszty nad przestrzenią Krylov w każdej iteracji, co czyni ją solidną, lecz potencjalnie pamięciochłonną dla dużych układów[7].
Metoda minimalnej reszty (MINRES): Metoda ta jest używana do rozwiązywania symetrycznych nieokreślonych układów liniowych. Jest podobna do GMRES, ale wykorzystuje symetrię macierzy w celu zmniejszenia kosztu obliczeniowego[8].
Inne godne uwagi podejścia to metoda pełnej ortogonalizacji (FOM), ściśle powiązana z metodą Arnoldiego dla problemów wartości własnych, metoda bi-sprzężonych gradientów (BiCG) oraz metoda indukowanej redukcji wymiaru (IDR).
1.3 Dlaczego metoda podprzestrzeni Krylov działa
Tutaj uzasadnimy, że metoda podprzestrzeni Krylov powinna być efektywnym sposobem przybliżania wartości własnych macierzy poprzez iteracyjne udoskonalanie przybliżeń wektorów własnych, z perspektywy najszybszego spadku. Będziemy argumentować, że przy zadanym początkowym przybliżeniu stanu podstawowego, przestrzenią kolejnych poprawek do tego początkowego przybliżenia zapewniającą najszybszą zbieżność jest podprzestrzeń Krylov. Nie posuwamy się do rygorystycznego dowodu zachowania zbieżności.
Załóżmy, że nasza rozpatrywana macierz jest symetryczna i dodatnio określona. Czyni to nasze rozumowanie najbardziej adekwatnym dla powyższej metody CG. Nie czynimy tu żadnych założeń dotyczących rzadkości; nie twierdzimy również, że musi być macierzą hermitowską (co jest wymagane, jeśli ma ona być Hamiltonianem).
Zazwyczaj chcemy rozwiązać problem postaci
Można by sobie wyobrazić, że , gdzie to pewna stała, jak w problemie wartości własnych. Nasze sformułowanie problemu pozostaje jednak na razie bardziej ogólne.
Zaczynamy od wektora , który jest przybliżonym rozwiązaniem. Mimo że istnieją analogie między tym przybliżeniem a z Sekcji 1.1, nie wykorzystujemy ich tutaj. Nasze przybliżenie obarczone jest błędem, który nazwiemy
Definiujemy również resztę
Używamy tutaj dużej litery , aby odróżnić resztę od wymiaru naszej podprzestrzeni Krylov .

Chcemy teraz wykonać krok korekcyjny postaci
o którym mamy nadzieję, że poprawi nasze przybliżenie. Tutaj jest pewnym wektorem jeszcze do wyznaczenia. Niech będzie błędem po dokonaniu korekty. Wówczas

Interesuje nas, jak zachowuje się nasz błąd przekształcony przez naszą macierz. Obliczmy zatem normę błędu. To jest
gdzie wykorzystaliśmy symetrię oraz fakt, że Tutaj to pewna stała niezależna od . Jak wspomniano w Sekcji 1.2, norma błędu nie jest jedyną wielkością, jaką moglibyśmy wybrać do minimalizacji, ale jest dobrą miarą. Chcemy zobaczyć, jak ta wielkość zmienia się wraz z naszym wyborem wektorów korekcyjnych Definiujemy zatem funkcję poprzez ustalenie
jest po prostu błędem jako funkcją poprawki mierzoną w normie . Chcemy zatem wybrać tak, aby było możliwie jak najmniejsze. W tym celu obliczamy gradient . Korzystając z symetrii mamy
Gradient wskazuje kierunek najszybszego wzrostu, co oznacza, że jego przeciwieństwo daje nam kierunek, w którym funkcja maleje najszybciej: kierunek najszybszego spadku. W naszym początkowym przybliżeniu , gdzie , mamy Zatem funkcja maleje najszybciej w kierunku residuum Nasz początkowy wybór najbardziej skorzystałby więc z dodania wektora dla pewnego skalaru .
W następnym kroku ponownie wybieramy wektor i dodajemy jego wartość do bieżącego przybliżenia. Używając tego samego argumentu co poprzednio, wybieramy dla pewnego skalaru . Kontynuujemy w ten sposób, tak że iteracja naszego wektora ma postać
Równoważnie, chcemy zbudować przestrzeń, z której wybieramy nasze ulepszone oszacowania, poprzez dodawanie kolejno , i tak dalej. oszacowany wektor leży w
Teraz, korzystając z relacji