Sample-based Quantum Diagonalization (SQD)
A diagonalização quântica baseada em amostras (SQD, do inglês sample-based quantum diagonalization) combina álgebra linear clássica e o poder da computação quântica para diagonalizar um Hamiltoniano (matriz) e calcular seus autovalores e autovetores. A diagonalização de matrizes é uma operação matemática importante, pois muitos problemas em ciência, computação e otimização fazem uso desse método.
O vídeo abaixo apresenta uma visão geral do SQD, o que determina sua utilidade e o que o torna mais rápido do que muitas outras abordagens. O texto a seguir entra em mais detalhes.
1. Introdução e motivação
Considere a equação de autovalores de energia tornada famosa por Schrödinger, como exemplo.
é o Hamiltoniano de um sistema, é a função de onda (também conhecida como autoestado) e é um autovalor. Os autovalores da matriz representam os níveis de energia do sistema. Por exemplo, se o sistema for uma molécula, o menor autovalor representa a energia do estado fundamental da molécula. Em muitos problemas, estamos interessados na estimativa da energia do estado fundamental.
Aplicando técnicas de diagonalização exata da álgebra linear, podemos diagonalizar a matriz completa. No entanto, a abordagem torna-se computacionalmente cara (ou até impossível) à medida que a matriz cresce. Por exemplo, mesmo para pequenas moléculas químicas, pode ser proibitivamente grande (por exemplo, o Hamiltoniano da molécula com a base cc-PVDZ tem dimensão
Felizmente, nem sempre precisamos de todos os autovalores e autovetores de um Hamiltoniano , e portanto a diagonalização da matriz completa não é necessária em muitos casos práticos. Por exemplo, no caso da estimativa do estado fundamental, estamos interessados no menor autovalor e no autovetor correspondente. Isso nos permite aplicar o conceito de projeção em um subespaço (útil).
Considere uma matriz , , em que o espaço vetorial completo (espaço de Hilbert) tem dimensão ( é grande). Em seguida, selecionamos um subespaço () — que é um subconjunto do espaço de Hilbert completo — de dimensão , onde é suficientemente pequeno. Após projetar nesse subespaço, a matriz projetada (digamos, ) será menor (). A menor pode ser diagonalizada usando um método numérico clássico adequado, gerando autovalores e autovetores para aquele subespaço.
Observe que o subespaço deve ter suporte no nosso autoestado alvo (por exemplo, o estado fundamental). Em outras palavras, o Hamiltoniano projetado deve estar em um subespaço que inclua o menor autovalor.
2. Projeção e Diagonalização
Considere que queremos encontrar o menor autovalor e o autovetor correspondente para a seguinte matriz Hamiltoniana , .
Vamos diagonalizar a matriz completa junto com diferentes versões projetadas () para diferentes subespaços, a fim de demonstrar a escalabilidade e a importância da escolha do subespaço.
A energia do estado fundamental (autovalor mínimo) da matriz é e a função de onda (autovetor) exata do estado fundamental é:
ou seja, o estado fundamental da matriz é gerado por dois estados da base computacional (vetores) e .
# Added by doQumentation — required packages for this notebook
!pip install -q numpy scipy
import numpy as np
from scipy.linalg import eigh
np.set_printoptions(precision=4, sign="-", suppress=True, linewidth=100)
H = np.array(
[
[0.2235, -0.039, -0.1035, -0.0818, 0.1746, 0.1091, 0.1165, -0.0104],
[-0.0390, 0.6621, 0.0706, -0.1964, -0.0782, 0.2619, 0.1095, 0.0029],
[-0.1035, 0.0706, 0.9961, 0.1724, 0.1067, -0.2299, -0.1817, 0.1571],
[-0.0818, -0.1964, 0.1724, -0.1773, 0.1019, -0.4778, -0.1272, -0.0414],
[0.1746, -0.0782, 0.1067, 0.1019, 0.1418, -0.1359, -0.1793, -0.0766],
[0.1091, 0.2619, -0.2299, -0.4778, -0.1359, 0.1014, 0.1696, 0.0552],
[0.1165, 0.1095, -0.1817, -0.1272, -0.1793, 0.1696, 0.4227, 0.2702],
[-0.0104, 0.0029, 0.1571, -0.0414, -0.0766, 0.0552, 0.2702, 0.4456],
]
)
eigvals, eigvecs = eigh(H)
print("Eigenvalues:")
print(eigvals)
print(f"Minimum eigenvalue: {eigvals.min()}")
print("\nEigenvectors (columns represent vectors):")
print(eigvecs)
print("\nEigenvector for the minimum eigenvalue (ground state)")
print(eigvecs[:, np.argmin(eigvals)])
Eigenvalues:
[-0.5357 -0.1321 0.1049 0.1258 0.3616 0.6405 0.947 1.3039]
Minimum eigenvalue: -0.5356560029438817
Eigenvectors (columns represent vectors):
[[-0. -0.5612 0.098 -0.0024 0.8051 -0.0806 0.0643 0.1288]
[-0. -0.1403 -0.1985 -0.4249 -0.0092 0.585 -0.5952 0.2526]
[ 0. 0.0416 0.3041 0.2122 0.1509 -0.0139 -0.5794 -0.7086]
[ 0.8 -0.1936 -0.0127 -0.4376 -0.1081 -0.0838 0.1557 -0.2966]
[ 0. 0.6716 -0.3535 -0.2552 0.5395 0.0954 0.1449 -0.1941]
[ 0.6 0.258 0.017 0.5834 0.1441 0.1118 -0.2076 0.3954]
[ 0. 0.3088 0.5504 -0.4197 0.0626 -0.468 -0.2625 0.3657]
[-0. -0.1146 -0.6559 0.0356 -0.0394 -0.6352 -0.3856 0.0418]]
Eigenvector for the minimum eigenvalue (ground state)
[-0. -0. 0. 0.8 0. 0.6 0. -0. ]
A seguir, vamos projetar a matriz em diferentes subespaços e verificar se conseguimos obter o estado fundamental exato. Em particular, vamos projetar a matriz em um subespaço gerado por:
- vetores do estado fundamental exato ( e ).
- vetores que excluem alguns ou todos os vetores do estado fundamental exato (por exemplo, , e ).
- vetores que incluem tanto o estado fundamental exato quanto vetores fora do estado fundamental (mas não todos os vetores possíveis no espaço de Hilbert).
2.1 Caso 1: o subespaço inclui o estado fundamental
Suponha que queremos projetar em um subespaço () gerado por dois vetores e . O Hamiltoniano projetado é definido por:
x1 = np.zeros(8)
x1[3] = 1 # binary 011 is 3 in decimal. |011> = |3> = [0,0,0,1,0,0,0,0]
x2 = np.zeros(8)
x2[5] = 1 # binary 101 is 5 in decimal
Hs = np.array([[x1 @ H @ x1.T, x1 @ H @ x2.T], [x2 @ H @ x1.T, x2 @ H @ x2.T]])
print(Hs)
[[-0.1773 -0.4778]
[-0.4778 0.1014]]
eigvals, eigvecs = eigh(Hs)
print(f"Minimum eigenvalue: {eigvals.min()}")
print(f"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}")
Minimum eigenvalue: -0.535656000064295
Eigenvector for minimum eigenvalue: [-0.8 -0.6]
Podemos fazer várias observações importantes aqui.
- Como geramos o subespaço com dois vetores, a dimensão da matriz projetada () é , menor do que a matriz completa ().
- O autovalor mínimo da matriz projetada coincide com o autovalor do estado fundamental exato.
- Os valores na variável
eigvecsrepresentam a amplitude dos vetores que geram o subespaço, e com eles podemos reconstruir o autoestado (estado fundamental). Nesse caso, chegamos ao estado fundamental exato (a menos de uma fase global):
2.2 Caso 2: o subespaço exclui alguns ou todos os vetores do estado fundamental
A seguir, projetamos em um subespaço gerado por três vetores , e . Escolhemos deliberadamente os vetores de modo a excluir um vetor do estado fundamental (). O Hamiltoniano projetado é definido por:
x1 = np.zeros(8)
x1[0] = 1
x2 = np.zeros(8)
x2[3] = 1
x3 = np.zeros(8)
x3[6] = 1
Hs = np.array(
[
[x1 @ H @ x1.T, x1 @ H @ x2.T, x1 @ H @ x3.T],
[x2 @ H @ x1.T, x2 @ H @ x2.T, x2 @ H @ x3.T],
[x3 @ H @ x1.T, x3 @ H @ x2.T, x3 @ H @ x3.T],
]
)
print(Hs)
[[ 0.2235 -0.0818 0.1165]
[-0.0818 -0.1773 -0.1272]
[ 0.1165 -0.1272 0.4227]]
eigvals, eigvecs = eigh(Hs)
print(f"Minimum eigenvalue: {eigvals.min()}")
Minimum eigenvalue: -0.21108858736702252
O autovalor nesse caso não coincide com o autovalor mínimo do Hamiltoniano completo. A observação principal aqui é: se projetarmos em um subespaço que exclui estados da base presentes no nosso estado alvo (fundamental) — parcialmente ou completamente — o estado fundamental estimado será diferente do exato.
2.3 Caso 3: o subespaço inclui tanto vetores do estado fundamental quanto vetores que não pertencem ao estado fundamental
A seguir, mostramos um caso em que o subespaço é gerado por vetores que incluem os vetores do estado fundamental exato junto com vetores indesejados. Suponha que nosso subespaço seja gerado por , (presentes no estado fundamental exato) e (ausente no estado fundamental exato).
x1 = np.zeros(8)
x1[3] = 1
x2 = np.zeros(8)
x2[5] = 1
x3 = np.zeros(8)
x3[7] = 1
Hs = np.array(
[
[x1 @ H @ x1.T, x1 @ H @ x2.T, x1 @ H @ x3.T],
[x2 @ H @ x1.T, x2 @ H @ x2.T, x2 @ H @ x3.T],
[x3 @ H @ x1.T, x3 @ H @ x2.T, x3 @ H @ x3.T],
]
)
print(Hs)
[[-0.1773 -0.4778 -0.0414]
[-0.4778 0.1014 0.0552]
[-0.0414 0.0552 0.4456]]
eigvals, eigvecs = eigh(Hs)
print(f"Minimum eigenvalue: {eigvals.min()}")
print(f"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}")
Minimum eigenvalue: -0.53565600006461
Eigenvector for minimum eigenvalue: [ 0.8 0.6 -0. ]
Nesse caso, obtemos novamente como o autovalor mínimo, que coincide com a matriz completa (ou seja, o estado fundamental exato). Outro resultado interessante é a amplitude de retornada pelo processo de projeção e diagonalização. A amplitude é , e quando reconstruímos a função de onda (autoestado) com as amplitudes e vetores calculados, obtemos:
Portanto, mesmo que nosso subespaço inclua alguns vetores que não são o alvo (juntamente com o conjunto completo de vetores alvo), ainda conseguimos calcular o autovalor e o autoestado corretos, pois o processo de projeção e diagonalização filtra os vetores indesejados definindo suas amplitudes como . Essa propriedade do SQD proporciona uma tolerância inerente ao ruído.
3. O papel do quantum no SQD
As análises acima estabelecem a importância dos vetores que abrangem o subespaço, os quais precisam estar no suporte do estado alvo. Isso levanta uma questão importante: Como escolhemos vetores com suporte no estado alvo para a construção do subespaço?
É aqui que os computadores quânticos entram em cena. A sinergia quântico-clássica funciona da seguinte forma no paradigma do SQD:
- Usando um circuito quântico adequado, tentamos preparar um estado em um computador quântico que irá gerar estados de base nos quais a função de onda alvo (por exemplo, o estado fundamental) tem suporte significativo. Os estados de base amostrados (bitstrings) vão abranger o subespaço para a projeção do Hamiltoniano.
- Um computador clássico projeta o Hamiltoniano no subespaço (abrangido pelas amostras/vetores do computador quântico) e o diagonaliza para calcular autovalores e autovetores usando métodos numéricos adequados.
Existem várias maneiras de preparar um estado quântico assim, e elas podem ser variacionais ou não variacionais dependendo do problema.
Nas próximas duas lições, mostraremos dois exemplos específicos de preparação de estados e amostragem a partir deles.
- Na Lição 4, usaremos um ansatz paramétrico LUCJ (unitary coupled Jastrow local) para gerar amostras para um problema de química (estimativa de energia do estado fundamental da molécula ). Vamos inicializar o ansatz LUCJ com parâmetros provenientes de um cálculo clássico de coupled cluster com singles e doubles (CCSD).
- Na Lição 5, vamos amostrar a partir de estados da base de Krylov para abranger o subespaço em um problema de física da matéria condensada. Essa abordagem é de natureza não variacional.
Além das abordagens específicas ao problema acima, uma abordagem genérica para a preparação de estados envolve um ansatz variacional, onde atualizaremos iterativamente os parâmetros do ansatz usando um otimizador clássico.
Amostras de computadores quânticos pré-tolerantes a falhas podem ser ruidosas. O SQD emprega um processo de recuperação de configuração autoconsistente para corrigir amostras ruidosas [1]. Vamos discutir o processo de recuperação de configuração com mais detalhes e aplicá-lo para corrigir amostras ruidosas iterativamente, refinando a estimativa de energia do estado fundamental de um problema de química na Lição 4.
3.1 Notas sobre o suporte do estado fundamental
Vamos explicar melhor o conceito de suporte do estado fundamental. O suporte do estado fundamental pode ser definido como o conjunto de estados de base onde o estado fundamental tem amplitude não nula (até um limiar de corte).
Suponha que o estado fundamental exato de um problema de qubits seja
Se amostrarmos o estado acima, devemos obter um conjunto de estados de base computacional , (outros estados de base computacional têm amplitude zero no estado fundamental e, portanto, idealmente não aparecerão durante a amostragem).
Idealmente, o conjunto de vetores de base para esse estado consiste em (em outras palavras, o subespaço desse estado é abrangido por esses dois vetores de base).
Na prática, não precisamos preparar o estado fundamental exato, pois amostrar muitos outros estados pode nos fornecer o mesmo conjunto de vetores. Por exemplo:
Preparar e amostrar a partir de qualquer um dos estados acima vai gerar vetores que têm amplitude não nula no estado fundamental, e todos eles se qualificam como tendo suporte do estado fundamental. Vale notar que amostrar inclui um vetor extra que tem amplitude no estado fundamental exato. No entanto, mostramos anteriormente que incluir tais vetores no subespaço não é problemático, pois a operação de projeção e diagonalização define a amplitude dos vetores indesejados como , e podemos obter o autovalor esperado e reconstruir o autoestado correto.
Portanto, preparar e amostrar a partir do estado fundamental exato não é necessário. Na verdade, fazer isso pode ser difícil, pois o estado fundamental exato não é conhecido a priori, e muitas vezes é vantajoso não preparar e amostrar a partir do estado fundamental exato, especialmente se a função de onda (estado) for assimétrica, com alguns estados de base tendo probabilidades muito altas. Considere a seguinte função de onda:
Essa é uma função de onda assimétrica em que os estados de base e têm amplitudes muito maiores em comparação com e . Quando amostrados, obteremos e com mais frequência ( para e cada, para e para ). Com um orçamento de amostragem finito (shots), é muito provável que nosso conjunto amostrado contenha apenas e . Como mostramos anteriormente, se abrangermos o subespaço com um conjunto assim, com vetores faltando, não seremos capazes de encontrar o autovalor mínimo verdadeiro. Portanto, será vantajoso (e necessário) amostrar a partir de um estado com suporte no estado fundamental.
3.2 Um argumento contra a amostragem uniforme
Pode ser tentador extrair amostras de uma distribuição uniforme para abranger o subespaço. Embora isso possa funcionar para problemas pequenos, vai começar a falhar para problemas maiores e mais práticos. Para problemas grandes com muitos qubits, o espaço de Hilbert pode ser proibitivamente grande. Por exemplo, um espaço de Hilbert de 32 qubits tem mais de bilhões de vetores de base possíveis (). Se amostramos uniformemente desse espaço com um orçamento de amostras finito (digamos, vetores para manter o processo de diagonalização viável), o subespaço pode excluir vetores com suporte no estado fundamental com mais frequência, já que o processo será aleatório. Portanto, precisamos de uma forma sistemática de amostrar a partir do suporte do estado fundamental aproveitando circuitos quânticos.
4. SQD e a esparsidade da função de onda
A lacuna entre o espaço de Hilbert completo e as dimensões de subespaço viáveis traz outro aspecto importante do SQD: a esparsidade da função de onda. A abordagem SQD funciona bem para funções de onda esparsas ou concentradas, onde uma pequena fração dos estados de base tem amplitudes não desprezíveis. Há dois motivos para isso:
- Se a função de onda for ampla (isto é, muitos estados de base têm amplitudes não desprezíveis) e não incluirmos vetores com suporte no estado alvo no subespaço, podemos acabar com autovalores e autovetores incorretos.
- Para evitar o problema acima, precisamos incluir muitos vetores no subespaço. No entanto, a dimensão do Hamiltoniano projetado está diretamente relacionada à dimensão do subespaço. Um subespaço maior significa um Hamiltoniano maior, que pode se tornar inviável de diagonalizar.
Demonstramos o problema com a seguinte matriz (). O menor autovalor de é , e a função de onda (autoestado) correspondente é ampla:
H_new = np.array(
[
[-0.958, 0.1853, -0.2663, -0.3875, -0.0524, -0.3779, -0.0145, -0.3369],
[0.1853, -0.4081, -0.8549, -0.2312, 0.0615, -0.2493, -0.3804, -0.3312],
[-0.2663, -0.8549, -0.6929, -0.0063, -0.0478, -0.0236, -0.2494, -0.0669],
[-0.3875, -0.2312, -0.0063, -0.4468, -0.6301, -0.4627, -0.1188, 0.0753],
[-0.0524, 0.0615, -0.0478, -0.6301, -0.6664, -0.1514, -0.3571, -0.3644],
[-0.3779, -0.2493, -0.0236, -0.4627, -0.1514, -0.9605, 0.0137, 0.0035],
[-0.0145, -0.3804, -0.2494, -0.1188, -0.3571, 0.0137, -1.1449, 0.0433],
[-0.3369, -0.3312, -0.0669, 0.0753, -0.3644, 0.0035, 0.0433, -1.2307],
]
)
eigvals, eigvecs = eigh(H_new)
print(f"Minimum eigenvalue: {eigvals.min()}")
print(f"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}")
Minimum eigenvalue: -2.208137504726661
Eigenvector for minimum eigenvalue: [0.3536 0.3536 0.3536 0.3536 0.3535 0.3536 0.3535 0.3535]
Suponha que projetamos em um subespaço abrangido por quatro vetores: , , e , e calculamos o autovalor.
x1 = np.zeros(8)
x1[0] = 1
x2 = np.zeros(8)
x2[2] = 1
x3 = np.zeros(8)
x3[5] = 1
x4 = np.zeros(8)
x4[6] = 1
H_new_s = np.array(
[
[x1 @ H_new @ x1.T, x1 @ H_new @ x2.T, x1 @ H_new @ x3.T, x1 @ H_new @ x4.T],
[x2 @ H_new @ x1.T, x2 @ H_new @ x2.T, x2 @ H_new @ x3.T, x2 @ H_new @ x4.T],
[x3 @ H_new @ x1.T, x3 @ H_new @ x2.T, x3 @ H_new @ x3.T, x3 @ H_new @ x4.T],
[x4 @ H_new @ x1.T, x4 @ H_new @ x2.T, x4 @ H_new @ x3.T, x4 @ H_new @ x4.T],
]
)
print(H_new_s)
[[-0.958 -0.2663 -0.3779 -0.0145]
[-0.2663 -0.6929 -0.0236 -0.2494]
[-0.3779 -0.0236 -0.9605 0.0137]
[-0.0145 -0.2494 0.0137 -1.1449]]
eigvals, eigvecs = eigh(H_new_s)
print(f"Minimum eigenvalue: {eigvals.min()}")
Minimum eigenvalue: -1.4266552340586673
O exemplo acima mostra que, quando a função de onda é ampla e não incluímos estados de base no subespaço, o cálculo do autovalor se torna incorreto.
5. SQD vs. VQE
Como mencionado anteriormente, o SQD pode precisar de um circuito quântico variacional e atualizações iterativas de parâmetros para preparar e amostrar a partir do suporte do estado fundamental. Como essa rotina iterativa de atualização de parâmetros é semelhante ao VQE, pode-se perguntar como esses métodos diferem e quais são as vantagens do SQD sobre o VQE. Nesta seção, comparamos os métodos e discutimos as vantagens do SQD usando uma molécula descrita com um conjunto de base mínimo (sto-3g) como exemplo.
| VQE | SQD | |
|---|---|---|
| Sobrecarga de medição | Muitos termos de Pauli, muitos circuitos de medição: O Hamiltoniano para a molécula tem termos de Pauli únicos. Como os termos de Pauli podem conter termos e , e as medições quânticas típicas são feitas na base , precisamos de uma mudança de base de medição para avaliar esses termos. Quando otimizados para medições, os termos podem ser agrupados em grupos, onde cada grupo pode ser avaliado usando um único circuito. Assim, precisamos de pelo menos circuitos únicos para avaliar todos os termos de Pauli. Muitos shots por circuito para menor variância. Além disso, o valor esperado avaliado de cada termo de Pauli tem uma variância associada a ele, que depende inversamente de . Portanto, para estimar com precisão cada termo, precisamos alocar muitos shots por circuito. Por exemplo, para atingir precisão química ( kcal/mol), normalmente precisamos de shots na ordem de - por circuito. Assim, o VQE precisa de muitos circuitos de medição, cada um com um certo número de shots. Em casos práticos, essa sobrecarga de medição pode ser restritiva. | No SQD, não precisamos de diferentes circuitos de medição para cada grupo de termos de Pauli. Normalmente, medimos um único circuito para um número fixo de shots. Embora possamos definir o número de shots como um valor grande dependendo do problema, a sobrecarga permanece muito menor do que no VQE. Além disso, as estimativas de energia usando o processo de diagonalização são exatas, o que significa que os autovalores calculados são exatos naquele subespaço e não têm variância associada a eles como no VQE. (No caso de amostragem de estados da base de Krylov (Lição 5), precisamos medir vários circuitos, mas o número de circuitos permanece muito menor do que no VQE). |
| Limite da energia estimada | No VQE, as estimativas de energia não são limitadas e podem ser menores do que os valores mínimos verdadeiros devido ao ruído. | O processo de estimativa de energia no SQD sempre produz um limite superior para a energia do estado fundamental, e a energia estimada nunca será menor do que a energia do estado fundamental verdadeiro. |
| Tolerância a ruído | A estimativa de energia do VQE é suscetível ao ruído de computadores quânticos pré-tolerantes a falhas. | O SQD tem tolerância inerente ao ruído. Computadores quânticos pré-tolerantes a falhas podem produzir amostras ruidosas. Mesmo que incluamos essas amostras no subespaço, a diagonalização subsequente pode suprimir essas amostras definindo suas amplitudes como zero. Além disso, discutiremos um método chamado recuperação de configuração em relação ao SQD que melhora ainda mais a tolerância ao ruído do SQD. |
6. Resumo
- No SQD, um computador quântico gera amostras e um computador clássico projeta um Hamiltoniano em um subespaço abrangido pelas amostras e o diagonaliza para calcular autovalores e autovetores.
- As amostras geradas devem provir do suporte do estado alvo (fundamental).
- Dependendo do problema, o fluxo de preparação do estado quântico e geração de amostras pode ser iterativo ou não iterativo.
- O SQD funciona melhor para funções de onda esparsas. Uma função de onda ampla exigirá um subespaço grande para soluções precisas, o que torna a operação clássica de projeção e diagonalização custosa.
- O SQD tem várias vantagens sobre o VQE, como menor sobrecarga de medição e limite superior para a energia do estado fundamental estimada, o que o torna mais escalável.
Referências
[1] J. Robledo-Moreno et al., "Chemistry Beyond Exact Solutions on a Quantum-Centric Supercomputer" (2024). arXiv:quant-ph/2405.05068.