Japanese
言語
English
Bengali
French
German
Japanese
Korean
Portuguese
Spanish
Tamil

注釈

このページは tutorials/algorithms/01_algorithms_introduction.ipynb から生成されました。

Qiskit におけるアルゴリズム入門

このチュートリアルは Qiskit によるアルゴリズムの入門編となっており、入門にあたって様々な機能の理解に役立つ高水準の概観を提供しています。その他のチュートリアルでは、アルゴリズムやその使用方法などについて、より詳細な資料を提供します。

アルゴリズム・ライブラリの構成

Qiskit は、多くの アルゴリズム を提供しており、それらは適用可能なタスクに応じてカテゴリーごとにグループ分けされています。例えば、化学的なハミルトニアンの基底エネルギーや、イジング・ハミルトニアンとして表現された最適化問題の解といった、演算子の最小固有値を求めるための Minimum Eigensolvers があります。また、量子系の時間発展を解くための Time Evolvers や、金融アプリケーションなどに用いられる推定のための Amplitude Estimators があります。カテゴリーの全セットは、上記リンク先のアルゴリズム・ドキュメンテーションで見ることができます。

アルゴリズムは設定可能で、多くの場合構成の一部は小さなブロックの形になり、構成ブロック・タイプの異なるインスタンスを与えることができます。例えば、変数量子固有ソルバーである VQE の場合、QuantumCircuit と古典的なオプティマイザーの形で、試行波動方程式を取ります。

VQE インスタンスを構築する例を見てみましょう。ここで TwoLocal は変分形式 (試行波動関数) 、つまりパラメーター表示されている変分可能な回路であり、 SLSQP は古典的なオプティマイザーです。これらは別々のインスタンスとして作成され、 VQE の構築時に渡されます。例えば、別の古典的なオプティマイザーや変分形式を試す場合には、単純に所望のインスタンスを作成して、 VQE に渡すだけでよいです。

[1]:
from qiskit.algorithms.optimizers import SLSQP
from qiskit.circuit.library import TwoLocal

num_qubits = 2
ansatz = TwoLocal(num_qubits, "ry", "cz")
optimizer = SLSQP(maxiter=1000)

VQE オプティマイザーが最小固有値を求める際の変分パラメーターが θ[0] から θ[7] であるような QuantumCircuit となっていることを確認するため、 ansatz を描画してみましょう。パラメータについては、後ほど作業例で説明します。

[2]:
ansatz.decompose().draw("mpl", style="iqx")
[2]:
../../_images/tutorials_algorithms_01_algorithms_introduction_4_0.png

しかしアルゴリズムの実行には、これだけではまだ不十分です。次に進みましょう。

アルゴリズムの実行

アルゴリズムは、Primitiveを利用して期待値やサンプル回路を評価します。Primitiveはシミュレーターや実機に基づいており、同じインタフェースを実装しているため、アルゴリズムで互換性を持って使用することができます。

VQEでは、期待値を評価する必要があります。例えば、デフォルトの Qiskit Terra インストール済み環境に同梱されている qiskit.primitives.Estimator を使用することができます。

[3]:
from qiskit.primitives import Estimator

estimator = Estimator()

このEstimetorは、正確な状態ベクトルシミュレーションを使用して期待値を評価します。また、ショットベースでノイズシミュレーターや実際のバックエンドを使用することもできます。 シミュレーターの詳細については、Qiskit Aer を実際のハードウェアについては Qiskit IBM Runtime を参照してください。

すべての成分が用意されてたので、VQEをインスタンス化できます:

[4]:
from qiskit.algorithms.minimum_eigensolvers import VQE

vqe = VQE(estimator, ansatz, optimizer)

これで compute_mininum_eigenvalue() メソッドを呼び出すことができるようになりました。後者は、NatureやOptimizationなどのアプリケーションモジュールで選択されるインターフェースで、特定のカテゴリ内の任意のアルゴリズムと互換性を持って動作できるようにするためのものです。

完全な実例

これまでに学んだことをまとめ、完全な実例を作成します。 VQE は、最小の固有値、つまり、ハミルトニアン演算子の最小エネルギー値を検出するので、 VQE の操作を行うためのオペレーターが必要となります。 そのような作用素は以下のようになります。 これは元々Natureアプリケーションモジュールによって、原子間距離 0.735A の H2 分子のハミルトニアンとして作成されたものです。 これは、 Pauli項の合計です。アルゴリズムを実行することが目標であるため、これ以上のことを明言しませんが、他のチュートリアルで演算子についてより深く説明しています。

[5]:
from qiskit.quantum_info import SparsePauliOp

H2_op = SparsePauliOp.from_list([
    ("II", -1.052373245772859),
    ("IZ", 0.39793742484318045),
    ("ZI", -0.39793742484318045),
    ("ZZ", -0.01128010425623538),
    ("XX", 0.18093119978423156)
])

それでは VQE を実行して、その返り値を表示してみましょう。

[6]:
result = vqe.compute_minimum_eigenvalue(H2_op)
print(result)
{   'aux_operators_evaluated': None,
    'cost_function_evals': 102,
    'eigenvalue': -1.857275020719397,
    'optimal_circuit': <qiskit.circuit.library.n_local.two_local.TwoLocal object at 0x7f96da26a470>,
    'optimal_parameters': {   ParameterVectorElement(θ[0]): -2.403507257619715,
                              ParameterVectorElement(θ[5]): 1.7060524493254914,
                              ParameterVectorElement(θ[1]): 3.085467047665086,
                              ParameterVectorElement(θ[2]): -2.1949965223522487,
                              ParameterVectorElement(θ[3]): 4.276089268519914,
                              ParameterVectorElement(θ[4]): -3.098644972035885,
                              ParameterVectorElement(θ[6]): 0.032773583818940334,
                              ParameterVectorElement(θ[7]): 2.8861019033185396},
    'optimal_point': array([-2.40350726,  3.08546705, -2.19499652,  4.27608927, -3.09864497,
        1.70605245,  0.03277358,  2.8861019 ]),
    'optimal_value': -1.857275020719397,
    'optimizer_evals': None,
    'optimizer_result': <qiskit.algorithms.optimizers.optimizer.OptimizerResult object at 0x7f96da2a4d60>,
    'optimizer_time': 0.29071593284606934}

上記の結果から、与えられたH2分子の電子基底状態エネルギーである最小固有値 \(\approx -1.85727\) を見つけるまで、オプティマイザーが行ったコスト関数(=エネルギー)評価の回数を見ることができます。また、ansatzの最適パラメーターは、ansatzが最小値であった時の値を見ればわかります。

VQE内部のprimitiveを更新します

最後に、VQE内部のestimator primitiveも変更してみましょう。シミュレーションの結果に満足して、今度はショットベースのシミュレーターを使ったり、ハードウェアで実行したくなったのではないでしょうか?

この例では、Qiskit Terraの参照primitiveを使用して、ショットベースのestimatorに変更します。しかし、このprimitiveを例えばQiskit Aerのestimator (qiskit_aer.primitives.Estimator) や、実際のバックエンド (qiskit_ibm_runtime.Estimator) で置き換えることができます。

ノイズの多い損失関数に対しては、SPSAオプティマイザが一般的に良い性能を示すので、オプティマイザーも更新します。ショットベースとノイズの多いシミュレーションの詳細については、noisy VQE tutorial も参照してください。

[7]:
from qiskit.algorithms.optimizers import SPSA

estimator = Estimator(options={"shots": 1000})

vqe.estimator = estimator
vqe.optimizer = SPSA(maxiter=100)
result = vqe.compute_minimum_eigenvalue(operator=H2_op)
print(result)
{   'aux_operators_evaluated': None,
    'cost_function_evals': 200,
    'eigenvalue': -1.8574503552440247,
    'optimal_circuit': <qiskit.circuit.library.n_local.two_local.TwoLocal object at 0x7f96da2f4250>,
    'optimal_parameters': {   ParameterVectorElement(θ[0]): -7.7940259581467375,
                              ParameterVectorElement(θ[5]): 0.28827257835035214,
                              ParameterVectorElement(θ[1]): -1.8091021117029589,
                              ParameterVectorElement(θ[2]): -2.460381278734678,
                              ParameterVectorElement(θ[3]): -7.725013961075425,
                              ParameterVectorElement(θ[4]): -1.3793338621798832,
                              ParameterVectorElement(θ[6]): -2.4148423942537587,
                              ParameterVectorElement(θ[7]): -1.8555574263247812},
    'optimal_point': array([-7.79402596, -1.80910211, -2.46038128, -7.72501396, -1.37933386,
        0.28827258, -2.41484239, -1.85555743]),
    'optimal_value': -1.8574503552440247,
    'optimizer_evals': None,
    'optimizer_result': <qiskit.algorithms.optimizers.optimizer.OptimizerResult object at 0x7f96da26a5f0>,
    'optimizer_time': 0.8142139911651611}

注:ここではシミュレーターのランダムシードを固定していないため、再実行すると若干結果が異なります。

これで Qiskit におけるアルゴリズムの入門編は終了です。このシリーズの他のアルゴリズム・チュートリアルでは、より広い範囲のアルゴリズムをより詳細に学ぶことができます。

[8]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
qiskit-terra0.23.0.dev0+f52bb33
qiskit-aer0.11.1
qiskit-ignis0.7.1
qiskit-ibmq-provider0.19.2
qiskit-nature0.5.0
qiskit-optimization0.5.0
qiskit-machine-learning0.6.0
System information
Python version3.10.4
Python compilerClang 12.0.0
Python buildmain, Mar 31 2022 03:38:35
OSDarwin
CPUs4
Memory (Gb)32.0
Wed Dec 07 11:02:26 2022 CET

This code is a part of Qiskit

© Copyright IBM 2017, 2022.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

[ ]: