コスト関数
このレッスンでは、コスト関数の評価方法を学びます。
- まず、Qiskit Runtime primitives について学びます。
- コスト関数 を定義します。これはオプティマイザーが最小化(または最大化)すべき問題の目標を定義する、問題固有の関数です。
- Qiskit Runtime primitives を使った測定戦略を定義し、速度と精度のトレードオフを最適化します。
Primitives
古典・量子を問わず、あらゆる物理系はさまざまな状態を取り得ます。たとえば、道路上の車は質量・位置・速度・加速度といった物理量によってその状態が特徴付けられます。同様に、量子系も異なる配置や状態を持ちますが、測定や状態の時間発展の扱い方が古典系とは異なります。これにより、量子力学に固有の重ね合わせやエンタングルメントといった特性が生じます。車の状態を速度や加速度などの物理量で記述できるように、量子系の状態も数学的オブジェクトであるオブザーバブルを用いて記述できます。
量子力学では、状態は規格化された複素数の列ベクトル、すなわちケット()で表され、オブザーバブルはケットに作用するエルミート線形演算子()で表されます。オブザーバブルの固有ベクトル()は固有状態と呼ばれます。オブザーバブルをその固有状態のひとつ()に対して測定すると、対応する固有値()が読み出しとして得られます。
量子系をどのように測定するか、そして何を測定できるかについては、Qiskit が提供する 2 つの primitive が役立ちます。
Sampler:量子状態 が与えられた場合、この primitive は各計算基底状態が得られる確率を求めます。Estimator:量子オブザーバブル と状態 が与えられた場合、この primitive は の期待値を計算します。
Sampler primitive
Sampler primitive は、状態 を準備する量子 Circuit が与えられたとき、計算基底の各状態 が得られる確率を計算します。具体的には以下を計算します。
ここで は Qubit の数、 は任意の出力バイナリ文字列 の整数表現(すなわち 2 進数の整数)です。
Qiskit Runtime の Sampler は、量子デバイス上で Circuit を複数回実行し、各実行で測定を行い、得られたビット列から確率分布を復元します。実行回数(ショット数)が多いほど結果は正確になりますが、より多くの時間と量子リソースが必要です。
ただし、可能な出力の数は Qubit 数 に対して指数的に増加する(すなわち )ため、密な確率分布を捉えるにはショット数も指数的に増やす必要があります。そのため、Sampler が効率的に機能するのは疎な確率分布の場合に限られます。ここで、目標状態 は計算基底状態の線形結合として表現可能であり、その項数が Qubit 数に対して高々多項式的に増加することが条件です。
また Sampler は、Circuit の一部分(全状態の部分集合)から確率を取得するように設定することもできます。
Estimator primitive
Estimator primitive は、量子状態 に対するオブザーバブル の期待値を計算します。ここで、オブザーバブルの確率は で表され、 はオブザーバブル の固有状態です。期待値は、状態 の測定で得られる全ての可能な結果 (すなわちオブザーバブルの固有値)を、対応する確率で重み付けした平均として定義されます。
しかし、オブザーバブルの期待値を計算することは常に可能とは限りません。固有基底が未知の場合が多いからです。Qiskit Runtime の Estimator は、複雑な代数的処理を用いて、実際の量子デバイス上でオブザーバブルを固有基底が既知の他のオブザーバブルの組み合わせに分解することで期待値を推定します。
簡単に言えば、Estimator は測定方法が不明なオブザーバブルを、