Skip to main content
IBM Quantum Platform

Techniques d'atténuation et de suppression des erreurs

Nouveau modèle d'exécution, en version bêta

La version bêta d'un nouveau modèle d'exécution est désormais disponible. Le modèle d'exécution dirigée offre une plus grande flexibilité lors de la personnalisation de votre flux de travail d'atténuation des erreurs. Voir le guide du modèle d'exécution dirigée pour plus d'informations.

  • Le code de cette page a été développé en tenant compte des exigences suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.

    qiskit-ibm-runtime~=0.47.0
    

Les techniques d'atténuation et de suppression des erreurs sont utilisées pour améliorer la qualité des résultats lors de la mise à l'échelle vers des charges de travail plus importantes. Cette page présente, dans les grandes lignes, les techniques de prévention et d'atténuation des erreurs disponibles avec IBM Quantum Compute.

La cellule suivante importe la primitive Estimator et crée un backend qui sera utilisé pour initialiser l'Estimator dans les cellules de code suivantes.

from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit_ibm_runtime import QiskitRuntimeService

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

Découplage dynamique

Les circuits quantiques sont exécutés sur le matériel IBM® sous forme de séquences d'impulsions micro-ondes qui doivent être programmées et exécutées à des intervalles de temps précis. Malheureusement, des interactions indésirables entre les qubits peuvent entraîner des erreurs de cohérence sur les qubits au repos. Le découplage dynamique consiste à insérer des séquences d'impulsions sur les qubits au repos afin d'annuler approximativement l'effet de ces erreurs. Chaque séquence d'impulsions insérée équivaut à une opération d'identification, mais la présence physique des impulsions a pour effet de supprimer les erreurs. Il existe de nombreux choix possibles de séquences d'impulsions, et le choix de la meilleure séquence pour chaque cas particulier reste un domaine de recherche actif.

Il convient de noter que le découplage dynamique est principalement utile pour les circuits contenant des lacunes dans lesquelles certains qubits restent inactifs sans qu'aucune opération ne soit effectuée sur eux. Si les opérations dans le circuit sont très denses, de sorte que tous les qubits sont occupés la plupart du temps, l'ajout d'impulsions de découplage dynamique pourrait ne pas améliorer les performances. En fait, elle pourrait même détériorer les performances en raison d'imperfections dans les impulsions elles-mêmes.

Le diagramme ci-dessous illustre le découplage dynamique avec une séquence d'impulsions XX. Le circuit abstrait de gauche est mis en correspondance avec un programme d'impulsions micro-ondes en haut à droite. Le schéma en bas à droite représente le même programme, mais avec une séquence de deux impulsions X insérées pendant une période d'inactivité du premier qubit.

Représentation du découplage dynamique

Le découplage dynamique peut être activé en réglant enable sur True dans les options de découplage dynamique. L'option sequence_type permet de choisir parmi plusieurs séquences d'impulsions différentes. Le type de séquence par défaut est "XX".

La cellule de code suivante montre comment activer le découplage dynamique pour l'estimateur et choisir une séquence de découplage dynamique.

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

Pauli tournoyant

Le tourbillonnage, également connu sous le nom de compilation aléatoire, est une technique largement utilisée pour convertir des canaux de bruit arbitraires en canaux de bruit ayant une structure plus spécifique.

Le tournoiement de Pauli est un type particulier de tournoiement qui utilise les opérations de Pauli. Il a pour effet de transformer tout canal quantique en canal de Pauli. Effectuée seule, elle peut atténuer le bruit cohérent, car celui-ci a tendance à s'accumuler de manière quadratique avec le nombre d'opérations, alors que le bruit de Pauli s'accumule de manière linéaire. Le tourbillon de Pauli est souvent combiné à d'autres techniques d'atténuation des erreurs qui fonctionnent mieux avec le bruit de Pauli qu'avec le bruit arbitraire.

Le tourbillon de Pauli est mis en œuvre en prenant en sandwich un ensemble choisi de portes avec des portes de Pauli à qubit unique choisies au hasard, de telle sorte que l'effet idéal de la porte reste le même. Le résultat est qu'un circuit unique est remplacé par un ensemble aléatoire de circuits, tous avec le même effet idéal. Lors de l'échantillonnage du circuit, les échantillons sont tirés de plusieurs instances aléatoires, plutôt que d'une seule.

Représentation de Pauli en train de virevolter

Étant donné que la plupart des erreurs du matériel quantique actuel proviennent de portes à deux qubits, cette technique est souvent appliquée exclusivement aux portes (natives) à deux qubits. Le diagramme suivant illustre certains tourbillons de Pauli pour les portes CNOT et ECR. Chaque circuit d'une même rangée a le même effet idéal.

Représentation des tournoiements du portail

Le tournoiement de Pauli peut être activé en réglant enable_gates sur True dans les options de tournoiement. Parmi les autres options notables, on peut citer

  • num_randomizations: Le nombre d'instances de circuits à tirer de l'ensemble des circuits tournoyants.
  • shots_per_randomization: Le nombre de prises de vue à échantillonner à partir de chaque instance de circuit.

La cellule de code suivante montre comment activer le « Pauli twirling » et configurer ces options pour Estimator. Il n'est pas nécessaire de définir explicitement ces options.

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

eXtinction d'erreur de lecture en spirale (TREX)

La méthode TREX ( eXtinction ) atténue l'effet des erreurs de mesure lors de l'estimation des valeurs attendues des observables de Pauli. Ce principe repose sur la notion de mesures « twirled », qui s'obtiennent en remplaçant aléatoirement les portes de mesure par une séquence composée (1) d'une porte de Pauli X, (2) d'une mesure et (3) d'un renversement de bit classique. Tout comme dans le cas d'une porte tournante standard, cette séquence équivaut à une mesure simple en l'absence de bruit, comme l'illustre le schéma suivant :

Représentation d'un mouvement de rotation lors d'une mesure

En cas d'erreur de lecture, la rotation des mesures a pour effet de diagonaliser la matrice de transfert de l'erreur de lecture, ce qui facilite son inversion. Un terme de mise à l'échelle provenant du canal de bruit diagonal est appris en comparant des circuits aléatoires initialisés à l'état zéro. Cela permet au service d'éliminer le biais des valeurs attendues résultant du bruit de lecture. L'estimation de la matrice de transfert des erreurs de lecture nécessite l'exécution de circuits d'étalonnage supplémentaires, ce qui entraîne une légère surcharge.

Activez TREX à l'aide de measure_mitigation l'option

Pour activer TREX, il suffit de définir measure_mitigation sur True dans les options de résilience de calcul de l'estimateur, sous « IBM Quantum ». Les différentes options d'apprentissage du bruit de mesure sont décrites ici. Comme pour la rotation des portes, vous pouvez définir le nombre de randomisations de circuit et le nombre de tirs par randomisation.

La cellule de code suivante montre comment activer TREX et définir ces options pour Estimator. Aucune de ces options ne doit être définie explicitement.

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

Activez TREX à l'aide de resilience_level l'option

Vous pouvez activer TREX en définissant le niveau de résilience sur 1, comme le montre l'exemple suivant.

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})

Extrapolation sans bruit (ZNE)

L'extrapolation à bruit nul (ZNE) est une technique permettant d'atténuer les erreurs dans l'estimation des valeurs attendues des observables. Bien qu'il améliore souvent les résultats, il n'est pas garanti qu'il produise un résultat impartial.

Les ZNE se déroulent en deux étapes :

  1. Amplification du bruit : Le circuit quantique original est exécuté plusieurs fois à des taux de bruit différents.
  2. Extrapolation : Le résultat idéal est estimé en extrapolant les résultats bruyants de la valeur attendue jusqu'à la limite du bruit zéro.

Tant l'étape d'amplification du bruit que celle d'extrapolation peuvent être mises en œuvre de nombreuses façons différentes. IBM Quantum Compute met en œuvre l'amplification du bruit par « repliement numérique des portes », ce qui signifie que les portes à deux qubits sont remplacées par des séquences équivalentes composées de la porte et de son inverse. Par exemple, le remplacement d'une « UU » par « UUUU U^\dagger U » entraînerait un facteur d'amplification du bruit égal à 3. Pour l'extrapolation, vous pouvez choisir parmi plusieurs formes fonctionnelles, notamment un ajustement linéaire ou un ajustement exponentiel. L'image ci-dessous illustre, à gauche, le pliage numérique en porte et, à droite, la procédure d'extrapolation.

Représentation des ZNE

La charge de cette méthode augmente proportionnellement au nombre de facteurs de bruit. Les paramètres par défaut échantillonnent la valeur attendue pour trois niveaux de bruit, ce qui entraîne une surcharge d'environ 3x.

Activez ZNE à l'aide de zne_mitigation l'option

La fonctionnalité ZNE peut être activée en définissant zne_mitigation sur True dans les options de résilience de calcul de l'estimateur, sous « IBM Quantum ». Les options relatives au ZNE sont décrites ici. Parmi les options suivantes, il convient de noter :

  • noise_factors: Les facteurs de bruit à utiliser pour l'amplification du bruit.
  • extrapolator: La forme fonctionnelle à utiliser pour l'extrapolation.

La cellule de code suivante montre comment activer ZNE et définir ces options pour Estimator. Aucune de ces options ne doit être définie explicitement.

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"

Activez ZNE à l'aide de resilience_level l'option

Vous pouvez activer ZNE (ainsi que TREX et le « gate twirling ») en définissant le niveau de résilience sur 2, comme le montre l'exemple suivant.

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})

Amplification probabiliste des erreurs (PEA)

L'un des principaux défis du ZNE est d'amplifier avec précision le bruit affectant le circuit cible. Le pliage de porte est un moyen facile d'effectuer cette amplification, mais il est potentiellement imprécis et peut conduire à des résultats incorrects. Voir l'article "Scalable error mitigation for noisy quantum circuits produces competitive expectation values", et plus particulièrement la page 4 des informations complémentaires pour plus de détails. L'amplification probabiliste des erreurs constitue une approche plus précise de l'amplification des erreurs par l'apprentissage du bruit.

La PEA est une technique plus sophistiquée qui réalise des expériences préliminaires pour reconstruire le bruit et utilise ensuite ces informations pour réaliser une amplification précise. Il commence par apprendre le modèle de bruit tourbillonnant de chaque couche de portes enchevêtrées dans le circuit avant qu'elles ne soient exécutées (voir LayerNoiseLearningOptions pour les options d'apprentissage correspondantes). Après la phase d'apprentissage, les circuits sont exécutés à chaque facteur de bruit, où chaque couche d'enchevêtrement des circuits est amplifiée par l'injection probabiliste d'un bruit à qubit unique proportionnel au modèle de bruit appris correspondant. Voir l'article "Evidence for the utility of quantum computing before fault tolerance" pour plus de détails.

L'EEP se déroule en trois étapes :

  1. Apprentissage : Le modèle de bruit tourbillonnant de chaque couche de portes enchevêtrées dans le circuit est appris.
  2. Amplification du bruit : Le circuit quantique original est exécuté plusieurs fois à différents facteurs de bruit.
  3. Extrapolation : Le résultat idéal est estimé en extrapolant les résultats bruyants de la valeur attendue jusqu'à la limite du bruit zéro.

Pour les expériences à grande échelle, la PEA est souvent le meilleur choix.

La PEA étant une technique d'amplification du bruit ZNE, vous devez également activer ZNE en réglant resilience.zne_mitigation = True. D'autres options resilience.zne peuvent également être utilisées pour définir des extrapolateurs, des niveaux d'amplification, etc. La PEA nécessite un modèle de bruit, qui est automatiquement généré lors de l'utilisation de primitives.

L'extrait suivant donne un exemple d'utilisation de la PEA pour atténuer le résultat d'un travail d'estimation :

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

Annulation probabiliste d'erreur (PEC)

L'annulation probabiliste des erreurs (PEC) est une technique permettant d'atténuer les erreurs dans l'estimation des valeurs attendues des observables. Contrairement à ZNE, il renvoie une estimation non biaisée de la valeur espérée. Cependant, elle entraîne généralement des frais généraux plus importants.

Dans le PEC, l'effet d'un circuit cible idéal est exprimé sous la forme d'une combinaison linéaire de circuits bruyants qui peuvent être mis en œuvre dans la pratique :

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

La sortie du circuit idéal peut alors être reproduite en exécutant différentes instances de circuits bruyants tirées d'un ensemble aléatoire défini par la combinaison linéaire. Si les coefficients ηi\eta_i forment une distribution de probabilité, ils peuvent être utilisés directement comme probabilités de l'ensemble. Dans la pratique, certains des coefficients sont négatifs, de sorte qu'ils forment plutôt une distribution de quasi-probabilité. Elles peuvent toujours être utilisées pour définir un ensemble aléatoire, mais il y a un surcoût d'échantillonnage lié à la négativité de la distribution de quasi-probabilité, qui est caractérisée par la quantité

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

La surcharge d'échantillonnage est un facteur multiplicatif du nombre de tirs nécessaires pour estimer une valeur attendue avec une précision donnée, par rapport au nombre de tirs qui seraient nécessaires avec le circuit idéal. Elle évolue de manière quadratique avec γ\gamma, qui à son tour évolue de manière exponentielle avec la profondeur du circuit.

La fonction PEC peut être activée en définissant pec_mitigation sur True dans les options de résilience de calcul de l'estimateur, sous « IBM Quantum ». Les options disponibles pour PEC sont décrites ici. Il est possible de définir une limite pour la surcharge liée à l'échantillonnage à l'aide de l'option max_overhead . Notez que la limitation de la surcharge liée à l'échantillonnage peut entraîner une précision du résultat supérieure à celle demandée. La valeur par défaut de est max_overhead 100.

La cellule de code suivante montre comment activer le PEC et définir max_overhead l'option pour l'estimateur.

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

Etapes suivantes

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.