Path: blob/main/notebooks/summer-school/2021/resources/lab-notebooks/lab-3-ja.ipynb
3855 views
Lab 3: 量子カーネルとサポートベクターマシン
このラボでは、Qiskitに量子フィーチャーマップ、量子カーネル、量子サポートベクトル分類を実装する方法を学びます。
まずは必要なパッケージをロードしましょう。
データ
今日扱うデータは、scikit-learnで利用可能で、よく知られている手書きの 数字データセットの小さなサブセットです。 '0'と'1'の区別をつけることを目指します。
データ処理
このデータセットには、合計360個のデータポイントが含まれています。各データポイントは、8×8の数字の画像で、配列に折りたたまれており、各要素は0(白)から16(黒)までの整数でです。古典的な分類と同様に、データセットを学習用(100)とテスト用(20)のサンプルに分割し、正規化する必要があります。このデータセットを量子分類に用いるためには、範囲を-1から1の間にスケーリングし、次元を使用したい量子ビットの数(4)に縮小する必要があります。
Qiskitでは、qiskit_machine_learning.datasets.digitsに含まれるこのデータセットですでに行われていますが、将来のためにこのラボでは明示的に処理を行います。
データエンコード
古典的なデータを、量子特徴量マップを用いて量子状態空間にエンコードしていきます。どの特徴量マップを使用するかは重要で、分類したいデータセットに依存することがあります。ここでは、Qiskitで利用可能な特徴量マップを見て、データをエンコードするために1つを選択してカスタマイズします。
量子特徴量マップ
その名の通り, 量子特徴量マップ は古典特徴量ベクトルから量子状態 へのマップです。ここで n はエンコードに使う量子ビットの数として、このマップは初期状態上でユニタリ演算を適用することで実現しています。
現在Qiskitで利用可能な特徴量マップ (PauliFeatureMap、 ZZFeatureMap と ZFeatureMap) は、Havlicek et al. Nature 567, 209-212 (2019)の中で紹介されているもので、特にZZFeatureMap は古典的なシミュレーションが困難であり、近未来の量子デバイス上で短深度回路として実装可能であると推測されています。
PauliFeatureMap は次のように定義されます:
深さのユニタリ演算子を記述します:
アダマールゲートとの場合に以下の回路図のように古典データを符号化した量子もつれのブロックを交互に入れたものを含んでいます。
量子もつれブロックの中で、 : はパウリ行列であり, 添字は異なる量子ビットやデータ点の間を繋いでいることを示しています。: , そして初期設定ではデータマッピング関数 は次のようになります。
のとき, これは ZFeatureMapです:
次のように定義されます:
この特徴量マップにはエンタングルメントがないことから、この特徴量マップは古典的なシミュレーションが容易であり、量子的な優位性が得られないことを意味しています。
そしてのとき、 これはZZFeatureMapです:
次のように定義されます:
特徴量マップに量子もつれが存在することから、量子もつれマップを定義することができます。
特徴量マップの中のパウリゲートをカスタマイズすることができます、例えば:
独自のデータマッピング関数を定義することができます、例えば:
Qiskitの回路ライブラリに含まれるNLocal と TwoLocal 関数も特徴量マップとしてパラメーター化された量子回路を作成するために使うことができます。
どちらの関数も回転層と絡み合い層を交互に繰り返すパラメータ化された回路を作成します。どちらの層でも、パラメータ化された回路ブロックが、定義された方法で回路に作用します。回転層では、ブロックを重ねて適用し,エンタングルメント層では,エンタングルメント戦略に従って適用します。各層は何度か繰り返され、デフォルトでは最後に回転層が追加されます。
「NLocal」では、回路ブロックは任意の大きさ(回路内の量子ビット数以下)を持つことができ、「TwoLocal」では、回転層はすべての量子ビットに適用される単一量子ビットゲートであり、エンタングルメント層は2量子ビットゲートを使用します。
例えば、これは回転層にと を使い、量子もつれ層には巡回量子もつれを使った TwoLocal回路です。
そして同等のNLocal回路です:
これは別のNLocal回路で、2量子ビット間での回転ブロックと、線形量子もつれを使った4量子ビットの量子もつれ層を使っています:
また、完全にカスタマイズされたパラメータ付きの回路特徴量マップを作成することも可能です。 そうするために、 単純に ParameterVectorでQuantumCircuitを作ります。 こちらが例です:
ZZFeatureMapを使っている最初の学習用サンプルをエンコードしてみましょう:
Exercise 1: データエンコード
4回の繰り返しを持つZZFeatureMap と初期データマッピング関数を使って、データ点をエンコードしてみましょう。
量子カーネル推定
量子特徴量マップは自然に類似度( と が近くなるとが大きくなる)の測定に見えるような量子カーネルを生じさせます。
有限のデータを考える場合、量子カーネルを行列で表すことができます:
このカーネル行列の各要素を量子コンピュータ上で計算することで、遷移の振幅を算出することができます。
特徴量マップがパラメータ化された量子回路であると仮定すると、それは量子ビットのユニタリー変換として記述することができます。
これにより、量子カーネル行列の推定値が得られ、サポートベクトル分類などのカーネル機械学習アルゴリズムに使用することができます。
Havlicek et al. Nature 567, 209-212 (2019)で議論されているように、量子カーネルマシンアルゴリズムは、対応する量子カーネルを古典的に推定するのが難しい場合にのみ、古典的なアプローチに対して量子的な優位性を発揮する可能性があります。
後述するように、古典的な資源を用いてカーネルを推定することの難しさは、もちろん、量子的な優位性を得るための必要条件に過ぎず、必ずしも十分条件ではありません。
しかしながら、 最近では Liu et al. arXiv:2010.02174 (2020)の中で、量子カーネル法を利用した学習者が古典的な学習者よりも量子的に有利な学習問題が存在する、ということが証明されています。
学習データとテストデータの準備ができたので、ZZFeatureMapを使ってQuantumKernelクラスを設定します。 そしてBasicAerのstatevector_simulatorを使って学習とテストのカーネル行列を推定します。
学習用カーネル行列の要素の1つである、第1学習用データサンプルと第2学習用データサンプルの間の遷移振幅を計算してみましょう。
最初に回路を作り描画してみます:
ゲートのパラメータは少し読みにくいですが、回路が対称になっていることに注目してください。一方の半分はデータサンプルの一方を、もう一方の半分はもう一方をコード化しています。
次に回路のシミュレーションを行います。回路には計測値が含まれているので、qasm_simulatorを使用しますが、サンプリングノイズの影響を減らすために、ショット数を増やします。
遷移の振幅は、ゼロ状態のカウント数の割合です:
このプロセスを,学習データサンプルのペアごとに繰り返して学習カーネル行列を埋め,学習データサンプルとテストデータサンプルの間で繰り返してテストカーネル行列を埋めていきます。なお,各行列は対称形であるため,計算時間を短縮するために,エントリの半分だけを明示的に計算します。
ここでは、学習とテストのカーネル行列を計算し、プロットします。
Exercise 2: 量子カーネル
4回の繰り返しを持つZZFeatureMapと、初期データマッピング関数を使ってとの間の遷移確率を計算してください。shots = 8192、 seed_simulator = 1024 と seed_transpiler = 1024としてqasm_simulatorを使ってください。
量子サポートベクター分類
Havlicek et al. Nature 567, 209-212 (2019)で紹介されてりるように、量子サポートベクター分類は、以下のステップで構成されています:
学習とテストの量子カーネル行列を構築します
学習用データ点の各ペア に対して、 特徴量マップの適用と遷移確率の測定をします: .
各学習用データ点 とテスト用データ点 に対して、 特徴量マップの適用と遷移確率の測定をします: .
古典的なサポートベクターマシン分類アルゴリズムにおいて,学習用およびテスト用の量子カーネル行列を使用します。
scikit-learn svcアルゴリズムによって、2つの方法で custom kernel を定義することができるようになります: カーネルを呼び出し可能な関数として提供したり、カーネル行列を事前に計算したりすることができます。QiskitのQuantumKernelクラスを使って、これらのいずれかを行うことができます。
以下のコードは,先に計算した学習用とテスト用のカーネル行列を受け取り,scikit-learnのsvcアルゴリズムに提供しています:
以下のコードでは、カーネルを呼び出し可能な関数として提供しています:
これは、量子カーネルを様々な古典カーネルと簡単に比較することができるので便利です:
Exploration: 量子サポートベクター分類
異なるQiskit feature mapsとdatasetsを使ってQuantum Support Vector Classificationを実行してみてください。