Skip to main content
IBM Quantum Platform

Técnicas de mitigação e supressão de erros

Novo modelo de execução, agora em versão beta

A versão beta de um novo modelo de execução já está disponível. O modelo de execução direcionada oferece mais flexibilidade ao personalizar seu fluxo de trabalho de atenuação de erros. Consulte o guia do modelo de execução direcionada para obter mais informações.

  • O código desta página foi desenvolvido usando os seguintes requisitos. Recomendamos o uso dessas versões ou de versões mais recentes.

    qiskit-ibm-runtime~=0.47.0
    

Técnicas de mitigação e supressão de erros são utilizadas para melhorar a qualidade dos resultados ao aumentar a escala para cargas de trabalho maiores. Esta página fornece explicações de alto nível sobre as técnicas de supressão e mitigação de erros disponíveis através do Qiskit Runtime.

A célula a seguir importa a primitiva Estimator e cria um backend que será usado para inicializar o Estimator em células de código posteriores.

from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.least_busy()

Desacoplamento dinâmico

Os circuitos quânticos são executados no hardware IBM® como sequências de pulsos de micro-ondas que precisam ser programados e executados em intervalos de tempo precisos. Infelizmente, interações indesejadas entre qubits podem levar a erros coerentes em qubits ociosos. O desacoplamento dinâmico funciona com a inserção de sequências de pulsos em qubits ociosos para cancelar aproximadamente o efeito desses erros. Cada sequência de pulsos inserida equivale a uma operação de identidade, mas a presença física dos pulsos tem o efeito de suprimir erros. Há muitas opções possíveis de sequências de pulso, e qual sequência é melhor para cada caso específico continua sendo uma área ativa de pesquisa.

Observe que a dissociação dinâmica é útil principalmente para circuitos que contêm lacunas nas quais alguns qubits ficam ociosos sem que nenhuma operação atue sobre eles. Se as operações no circuito forem muito densas, de modo que todos os qubits estejam ocupados na maior parte do tempo, a adição de pulsos de desacoplamento dinâmico poderá não melhorar o desempenho. De fato, ele pode até piorar o desempenho devido a imperfeições nos próprios pulsos.

O diagrama abaixo mostra a dissociação dinâmica com uma sequência de pulsos XX. O circuito abstrato à esquerda é mapeado em uma programação de pulsos de micro-ondas no canto superior direito. A parte inferior direita mostra a mesma programação, mas com uma sequência de dois pulsos X inseridos durante um período ocioso do primeiro qubit.

Representação da dissociação dinâmica

O desacoplamento dinâmico pode ser ativado definindo enable como True nas opções de desacoplamento dinâmico. A opção sequence_type pode ser usada para escolher entre várias sequências de pulso diferentes. O tipo de sequência padrão é "XX".

A célula de código a seguir mostra como ativar o desacoplamento dinâmico para o Estimador e selecionar uma sequência de desacoplamento dinâmico.

estimator = Estimator(mode=backend)
estimator.options.dynamical_decoupling.enable = True
estimator.options.dynamical_decoupling.sequence_type = "XpXm"

Pauli girando

O Twirling, também conhecido como compilação aleatória, é uma técnica amplamente usada para converter canais de ruído arbitrários em canais de ruído com estrutura mais específica.

O giro de Pauli é um tipo especial de giro que usa operações de Pauli. Ele tem o efeito de transformar qualquer canal quântico em um canal Pauli. Executado sozinho, ele pode atenuar o ruído coerente porque o ruído coerente tende a se acumular quadraticamente com o número de operações, enquanto o ruído Pauli se acumula linearmente. O giro de Pauli é frequentemente combinado com outras técnicas de atenuação de erros que funcionam melhor com o ruído de Pauli do que com o ruído arbitrário.

O giro de Pauli é implementado ao intercalar um conjunto escolhido de portas com portas de Pauli de um único qubit escolhidas aleatoriamente, de modo que o efeito ideal da porta permaneça o mesmo. O resultado é que um único circuito é substituído por um conjunto aleatório de circuitos, todos com o mesmo efeito ideal. Ao fazer a amostragem do circuito, as amostras são extraídas de várias instâncias aleatórias, em vez de apenas uma única.

Representação de Pauli girando

Como a maioria dos erros no hardware quântico atual vem de portas de dois qubits, essa técnica costuma ser aplicada exclusivamente a portas de dois qubits (nativas). O diagrama a seguir mostra alguns giros de Pauli para as portas CNOT e ECR. Cada circuito em uma linha tem o mesmo efeito ideal.

Representação de giros de portão

O giro de Pauli pode ser ativado definindo enable_gates como True nas opções de giro. Outras opções notáveis incluem:

  • num_randomizations: O número de instâncias de circuito a serem extraídas do conjunto de circuitos girados.
  • shots_per_randomization: O número de disparos a serem amostrados de cada instância do circuito.

A célula de código a seguir mostra como ativar o efeito de rotação de Pauli e definir essas opções para o Estimator. Não é necessário definir explicitamente nenhuma dessas opções.

estimator = Estimator(mode=backend)
estimator.options.twirling.enable_gates = True
estimator.options.twirling.num_randomizations = 32
estimator.options.twirling.shots_per_randomization = 100

Erro de leitura do TREX ( eXtinction )

O TREX ( eXtinction ) atenua o efeito dos erros de medição na estimativa dos valores esperados das observáveis de Pauli. Baseia-se no conceito de medições giradas, que são realizadas substituindo-se aleatoriamente portas de medição por uma sequência composta por (1) uma porta Pauli X, (2) uma medição e (3) uma inversão clássica de bits. Assim como na rotação padrão do portão, essa sequência equivale a uma medição simples na ausência de ruído, conforme ilustrado no diagrama a seguir:

Representação do movimento giratório durante a medição

Na presença de erro de leitura, a rotação da medição tem o efeito de diagonalizar a matriz de transferência do erro de leitura, facilitando sua inversão. Um termo de reescalonamento proveniente do canal de ruído diagonal é aprendido por meio da avaliação comparativa de circuitos aleatórios inicializados no estado zero. Isso permite que o serviço elimine o desvio dos valores esperados resultantes do ruído de leitura. A estimativa da matriz de transferência de erros de leitura requer a execução de circuitos de calibração adicionais, o que acarreta uma pequena sobrecarga.

Ative o TREX usando a measure_mitigation opção

O TREX pode ser ativado definindo measure_mitigation como True nas opções de resiliência Qiskit Runtime do Estimator. As opções de aprendizado de ruído de medição são descritas aqui. Assim como no caso do gate twirling, você pode definir o número de randomizações do circuito e o número de disparos por randomização.

A célula de código a seguir mostra como ativar o TREX e definir essas opções para o Estimator. Nenhuma dessas opções precisa ser definida explicitamente.

estimator = Estimator(mode=backend)
estimator.options.resilience.measure_mitigation = True
estimator.options.resilience.measure_noise_learning.num_randomizations = 32
estimator.options.resilience.measure_noise_learning.shots_per_randomization = 100

Ative o TREX usando a resilience_level opção

Você pode ativar o TREX definindo o nível de resiliência para 1, conforme mostrado no exemplo a seguir.

from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

# Setting options during primitive initialization
estimator = Estimator(backend, options={"resilience_level": 1})

Extrapolacão sem ruído (ZNE)

A extrapolação de ruído zero (ZNE) é uma técnica para atenuar erros na estimativa de valores de expectativa de observáveis. Embora muitas vezes melhore os resultados, não é garantido que produza um resultado imparcial.

A ZNE consiste em dois estágios:

  1. Amplificação de ruído : O circuito quântico original é executado várias vezes com diferentes taxas de ruído.
  2. Extrapolação : O resultado ideal é estimado pela extrapolação dos resultados do valor de expectativa com ruído para o limite de ruído zero.

Os estágios de amplificação e extrapolação de ruído podem ser implementados de várias maneiras diferentes. Qiskit Runtime implementa a amplificação de ruído por "dobragem de porta digital", o que significa que as portas de dois qubits são substituídas por sequências equivalentes da porta e seu inverso. Por exemplo, a substituição de um UU unitário por UUUU U^\dagger U produziria um fator de amplificação de ruído de 3. Para a extrapolação, você pode escolher uma das várias formas funcionais, incluindo um ajuste linear ou um ajuste exponencial. A imagem abaixo mostra a dobragem da porta digital à esquerda e o procedimento de extrapolação à direita.

Representação da ZNE

A sobrecarga desse método varia proporcionalmente ao número de fatores de ruído. As configurações padrão calculam o valor esperado com três fatores de ruído, resultando em uma sobrecarga de aproximadamente 3x.

Ative o ZNE usando a zne_mitigation opção

A ZNE pode ser ativada definindo zne_mitigation como True nas opções de resiliência Qiskit Runtime do Estimator. As opções do site Qiskit Runtime para ZNE são descritas aqui. As seguintes opções são notáveis:

  • noise_factors: Os fatores de ruído a serem usados para amplificação de ruído.
  • extrapolator: A forma funcional a ser usada para a extrapolação.

A célula de código a seguir mostra como habilitar o ZNE e definir essas opções para o Estimator. Nenhuma dessas opções precisa ser definida explicitamente.

estimator = Estimator(mode=backend)
estimator.options.resilience.zne_mitigation = True
estimator.options.resilience.zne.noise_factors = (1, 3, 5)
estimator.options.resilience.zne.extrapolator = "exponential"

Ative o ZNE usando a resilience_level opção

Você pode ativar o ZNE (juntamente com o TREX e o gate twirling) definindo o nível de resiliência para 2, conforme mostrado no exemplo a seguir.

from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

# Setting options during primitive initialization
estimator = Estimator(backend, options={"resilience_level": 2})

Amplificação de erro probabilística (PEA)

Um dos principais desafios da ZNE é amplificar com precisão o ruído que afeta o circuito-alvo. A dobragem de porta oferece uma maneira fácil de realizar essa amplificação, mas é potencialmente imprecisa e pode levar a resultados incorretos. Consulte o artigo "Scalable error mitigation for noisy quantum circuits produces competitive expectation values" e, especificamente, a página 4 das informações complementares para obter detalhes. A amplificação de erro probabilística oferece uma abordagem mais precisa para a amplificação de erro por meio do aprendizado de ruído.

A PEA é uma técnica mais sofisticada que realiza experimentos preliminares para reconstruir o ruído e, em seguida, usa essas informações para realizar uma amplificação precisa. Ele começa aprendendo o modelo de ruído giratório de cada camada de portas emaranhadas no circuito antes de serem executadas (consulte LayerNoiseLearningOptions para ver as opções de aprendizado relevantes). Após a fase de aprendizado, os circuitos são executados em cada fator de ruído, onde cada camada de emaranhamento dos circuitos é amplificada pela injeção probabilística de ruído de um único qubit proporcional ao modelo de ruído aprendido correspondente. Consulte o artigo "Evidence for the utility of quantum computing before fault tolerance" para obter mais detalhes.

A PEA consiste em três estágios:

  1. Aprendizado : O modelo de ruído giratório de cada camada de portas de emaranhamento no circuito é aprendido.
  2. Amplificação de ruído : O circuito quântico original é executado várias vezes com diferentes fatores de ruído.
  3. Extrapolação : O resultado ideal é estimado pela extrapolação dos resultados do valor de expectativa com ruído para o limite de ruído zero.

Para experimentos em escala de serviços públicos, a PEA é geralmente a melhor opção.

Como a PEA é uma técnica de amplificação de ruído ZNE, você também precisa ativar a ZNE configurando resilience.zne_mitigation = True. Outras resilience.zne opções podem ser usadas adicionalmente para definir extrapoladores, níveis de amplificação e assim por diante. A PEA requer um modelo de ruído, que é gerado automaticamente ao usar primitivos.

O trecho a seguir fornece um exemplo em que a PEA é usada para atenuar o resultado de um trabalho do Estimator:

estimator = Estimator(mode=backend)
estimator.options.resilience.zne_mitigation = True
estimator.options.resilience.zne.amplifier = "pea"

Cancelamento probabilístico de erros (PEC)

O cancelamento de erro probabilístico (PEC) é uma técnica para atenuar erros na estimativa de valores de expectativa de observáveis. Ao contrário do ZNE, ele retorna uma estimativa imparcial do valor esperado. No entanto, em geral, ele incorre em uma sobrecarga maior.

No PEC, o efeito de um circuito-alvo ideal é expresso como uma combinação linear de circuitos ruidosos que são realmente implementáveis na prática:

Oideal=iηiOnoisy,i\mathcal{O}_{\text{ideal}} = \sum_{i} \eta_i \mathcal{O}_{noisy, i}

A saída do circuito ideal pode então ser reproduzida pela execução de diferentes instâncias de circuitos ruidosos extraídos de um conjunto aleatório definido pela combinação linear. Se os coeficientes ηi\eta_i formarem uma distribuição de probabilidade, eles poderão ser usados diretamente como as probabilidades do conjunto. Na prática, alguns dos coeficientes são negativos, portanto, eles formam uma distribuição de quase-probabilidade. Eles ainda podem ser usados para definir um conjunto aleatório, mas há uma sobrecarga de amostragem relacionada à negatividade da distribuição de quase-probabilidade, que é caracterizada pela quantidade

γ=iηi1.\gamma = \sum_{i} \lvert \eta_i \rvert \geq 1.

A sobrecarga de amostragem é um fator multiplicativo do número de disparos necessários para estimar um valor de expectativa com uma determinada precisão, em comparação com o número de disparos que seriam necessários no circuito ideal. Ele é escalonado quadraticamente com γ\gamma, que, por sua vez, é escalonado exponencialmente com a profundidade do circuito.

O PEC pode ser ativado definindo pec_mitigation como True nas opções de resiliência Qiskit Runtime do Estimator. As opções do Qiskit Runtime para o PEC são descritas aqui. Um limite para a sobrecarga de amostragem pode ser definido usando a opção max_overhead . Observe que a limitação da sobrecarga de amostragem pode fazer com que a precisão do resultado exceda a precisão solicitada. O valor padrão de max_overhead é 100.

A célula de código a seguir mostra como habilitar o PEC e definir a max_overhead opção para o Estimator.

estimator = Estimator(mode=backend)
estimator.options.resilience.pec_mitigation = True
estimator.options.resilience.pec.max_overhead = 100

Próximas etapas

Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.