Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/translations/ja/quantum-machine-learning/encoding.ipynb
3855 views
Kernel: Python 3

データの符号化

このページでは、量子機械学習のためのデータ符号化の問題を紹介し、さまざまなデータ符号化手法について説明し、実装します。

はじめに

機械学習モデルを成功させるには、データの表現が非常に重要です。古典的な機械学習の場合では、データをいかに数値的に表現し、古典的な機械学習アルゴリズムで最適に処理できるようにするかが問題となります。

量子機械学習の場合、問題は似ていますが、より基本的です:問題は、データをどうやって表現して、量子システムに効率的に入力し、量子機械学習アルゴリズムで処理できるようにするかです。これは通常、データの符号化(データ エンコーディング )と呼ばれますが、データの 埋め込み または ロード とも呼ばれます。

このプロセスは、量子機械学習アルゴリズムの重要な部分であり、その計算能力に直接影響します。

手法

それぞれが NN個の特徴量を持つMM個のサンプルで構成される古典的なデータセットX\mathscr{X}を考えてみましょう:

ParseError: KaTeX parse error: Undefined control sequence: \class at position 1: \̲c̲l̲a̲s̲s̲{script-x}{\mat…

ここで、x(m)x^{(m)} は、m=1,...,Mm = 1, ..., MNN 次元ベクトルです。このデータセットを量子ビットのシステムで表すために、さまざまな埋め込み手法を使用できます。以下に、その一部を参考文献12に従って簡単に説明し、実装します。

計算基底符号化

計算基底符号化は、古典的なNNビット文字列をNN量子ビットシステムの 計算基底状態 に関連付けます。 たとえば、x=5x = 5の場合、これは01010101として44ビット文字列として表すことができ、量子状態0101|0101\rangleとして4量子ビットシステムによって表すことができます。より一般的には、NNビット文字列:x=(b1,b2,...,bN)x = (b_1, b_2, ... , b_N)の場合、対応するNN-量子ビット状態はParseError: KaTeX parse error: Undefined control sequence: \cssId at position 1: \̲c̲s̲s̲I̲d̲{ket-x}{| x \ra…です。ここで、n=1,,Nn = 1 , \dots , Nに対してParseError: KaTeX parse error: Undefined control sequence: \class at position 5: b_n \̲c̲l̲a̲s̲s̲{in}{\in} {0,1} です。

上記の古典的なデータセット X\mathscr{X} の場合、計算基底符号化を使用するには、各データ ポイントをNN ビットの文字列x(m)=(b1,b2,...,bN)x^{(m)} = (b_1, b_2, ... , b_N)とし 、これを量子状態 xm=b1,b2,...,bN|x^{m}\rangle = |b_1, b_2, ... , b_N \rangle にマッピングします。ここでn=1,...,Nn = 1, ..., N において、bn0,1b_n \in {0, 1 } であり、また、 m=1,...,Mm = 1, ..., Mです。データセット全体を計算基底状態の重ね合わせとして表すことができます。

ParseError: KaTeX parse error: Undefined control sequence: \cssId at position 1: \̲c̲s̲s̲I̲d̲{_ket-dataset}{…

計算基底符号化

q-statevector-binary-encoding p 左の入力データセットにビット列を追加したり削除したりすると、右の状態ベクトルに計算基底符号化がどのように符号化されるかを見ることができる。

Qiskitでは、どのような状態でデータセットを符号化するかを計算したら、initialize 関数を使用して準備することができます。 たとえば、データセット X=x(1)=101,x(2)=111\mathscr{X} = {x^{(1)}=101, x^{(2)}=111} は、X=12(101+111)|\mathscr{X}\rangle= \frac{1}{\sqrt{2}}(|101\rangle+|111\rangle) の状態としてエンコードされます:

import math from qiskit import QuantumCircuit desired_state = [ 0, 0, 0, 0, 0, 1 / math.sqrt(2), 0, 1 / math.sqrt(2)] qc = QuantumCircuit(3) qc.initialize(desired_state, [0,1,2]) qc.decompose().decompose().decompose().decompose().decompose().draw()
Image in a Jupyter notebook

この例は、計算基底符号化の欠点も示しています。つまり、計算基底符号化は理解するのは簡単ですが、状態ベクトルは非常に疎になる可能性があり、実装するスキームが通常効率的ではありません。

振幅符号化

振幅符号化は、データを量子状態の振幅に符号化します。これは、正規化された古典的なNN 次元データポイントxx を、nn 量子ビットの量子状態 ψx|\psi_x\rangle の振幅として表します:

ψx=i=1Nxii|\psi_x\rangle = \sum_{i=1}^N x_i |i\rangle

ここで、N=2nN = 2^nxix_ixxii 番目の要素であり、i|i\rangleii 番目の計算基底状態です。

上記の古典的なデータセット X\mathscr{X} を符号化するために、すべての MM NN 次元のデータ ポイントを、長さ N×MN \times M の 1 つの振幅ベクトルに連結します:

ParseError: KaTeX parse error: Undefined control sequence: \cssId at position 8: \alpha=\̲c̲s̲s̲I̲d̲{*a-norm}{A*{\t…

ここで、AnormA_{\text{norm}} は正規化定数であり、α2=1|\alpha|^2 = 1 です。 データセット X\mathscr{X} は、計算基底で次のように表すことができます。

X=i=1Nαii|\mathscr{X}\rangle = \sum_{i=1}^N \alpha_i |i\rangle

ここで、αi\alpha_i は振幅ベクトルの要素であり、i|i\rangle は計算基底状態です。 符号化される振幅の数は N×MN \times M です。 nn 量子ビットのシステムは 2n2^n 個の振幅を提供するので、振幅の埋め込みには nlog2(NM)n \ge \mathrm{log}_2(NM) 個の量子ビットが必要です。

振幅符号化

q-statevector-amplitude-encoding p 左側のデータポイントの値を変更し、振幅エンコーディングがこれらを右側の状態ベクトルとしてどのようにエンコードするかを確認します。

例として、振幅符号化を使用してデータセット X=x(1)=(1.5,0),x(2)=(2,3)\mathscr{X}= {x^{(1)}=(1.5,0), x^{(2)}=(-2,3)} を符号化してみましょう。両方のデータポイントを連結し、結果のベクトルを正規化すると、次のようになります:

α=115.25(1.5,0,2,3)\alpha = \frac{1}{\sqrt{15.25}}(1.5,0,-2,3)

結果として得られる2量子ビットの量子状態は次のようになります:

X=115.25(1.500210+311)|\mathscr{X}\rangle = \frac{1}{\sqrt{15.25}}(1.5|00\rangle-2|10\rangle+3|11\rangle)

上記の例では、振幅ベクトルの要素の総数N×MN \times Mは2の累乗です。N×MN \times Mが2の累乗でない場合、2nMN2^n\geq MN となるようにnnの値を選び、振幅ベクトルに無意味な定数を埋め込めばよいです。

計算基底符号化と同様に、データセットを符号化する状態を計算したら、Qiskitでinitialize関数を使用してを準備できます:

desired_state = [ 1 / math.sqrt(15.25) * 1.5, 0, 1 / math.sqrt(15.25) * -2, 1 / math.sqrt(15.25) * 3] qc = QuantumCircuit(2) qc.initialize(desired_state, [0,1]) qc.decompose().decompose().decompose().decompose().decompose().draw()
Image in a Jupyter notebook

振幅符号化の利点は、符号化に必要なのはlog2(NM)\mathrm{log}_2(NM)量子ビットのみであるということです。 ただし、その後のアルゴリズムは量子状態の振幅を操作する必要があり、量子状態を準備し測定する方法は効率的ではない傾向があります。

角度符号化

角度符号化は、NN 個の機能量を nn 量子ビットの回転角に符号化します。ここで、NnN \le n です。たとえば、データ ポイント x=(x1,...,xN)x = (x_1,...,x_N) は次のように符号化できます。

ParseError: KaTeX parse error: Undefined control sequence: \cssId at position 1: \̲c̲s̲s̲I̲d̲{_}{|x\rangle} …

これは、前の2つの符号化方法とは異なり、データセット全体ではなく、一度に1つのデータポイントのみを符号化する方法です。ただし、使用するのはNN 量子ビットで量子回路の深さも一定であるため、現在の量子ハードウェアに適用可能です。

角度符号化はユニタリー演算で指定することができます:

ParseError: KaTeX parse error: Undefined control sequence: \class at position 11: S_{x_j} = \̲c̲l̲a̲s̲s̲{*big-o-times-n…

ここで

U(xj(i))=[cos(xj(i))amp;sin(xj(i)) sin(xj(i))amp;cos(xj(i)) ]U(x_j^{(i)}) = \begin{bmatrix} \cos(x_j^{(i)}) & -\sin(x_j^{(i)}) \ \sin(x_j^{(i)}) & \cos(x_j^{(i)}) \ \end{bmatrix}

YY 軸周りの単一量子ビットの回転は次のとおりでした:

RY(θ)=exp(iθ2Y)=(cosθ2amp;sinθ2 sinθ2amp;cosθ2)RY(\theta) = \exp(-i \frac{\theta}{2} Y) = \begin{pmatrix} \cos{\frac{\theta}{2}} & -\sin{\frac{\theta}{2}} \ \sin{\frac{\theta}{2}} & \cos{\frac{\theta}{2}} \end{pmatrix}

U(xj(i))=RY(2xj(i))U(x_j^{(i)}) = RY(2x_j^{(i)}) に注意し、例として、qiskitを使用してデータポイント x=(0,π/4,π/2)x = (0, \pi/4, \pi/ 2)を符号化します:

qc = QuantumCircuit(3) qc.ry(0, 0) qc.ry(2*math.pi/4, 1) qc.ry(2*math.pi/2, 2) qc.draw()
Image in a Jupyter notebook

高密度角度符号化は、角度符号化を少し一般化したものであり、相対位相を使用して1量子ビットごとに2つの特徴を符号化します。データポイント x=(x1,...,xN)x = (x_1,...,x_N) は次のように符号化されます:

ParseError: KaTeX parse error: Undefined control sequence: \class at position 13: |x\rangle = \̲c̲l̲a̲s̲s̲{*big-o-times-n…

角度および高密度角度符号化は、正弦波関数および指数関数を使用しますが、この関数は特別である必要はなく、任意の関数を使う一般的な量子ビットの符号化クラスに簡単に抽象化できます。次のように、任意のユニタリー演算で定義されたパラメタライズド量子回路で符号化を実装することもできます。

任意の符号化

任意の符号化は、NN 個の特徴をnn 量子ビット上の NN 個のパラメーター化されたゲートの回転として符号化します。ここで、nNn \leq N です。角度符号化と同様に、データセット全体ではなく、一度に1つのデータポイントのみを符号化します。 また、一定の深さの量子回路と nNn \leq N 量子ビットを使用しているため、現在の量子ハードウェアで実行できます。

たとえば、EfficientSU2回路を使用して12個の特徴を符号化するには、3個の量子ビットを使用するだけです:

from qiskit.circuit.library import EfficientSU2 circuit = EfficientSU2(num_qubits=3, reps=1, insert_barriers=True) circuit.decompose().draw()
Image in a Jupyter notebook

例えば、データポイント x=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2]x = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2] を12の特徴量で符号化し、パラメーター化された各ゲートを使用して異なる特徴量を符号化します。

x = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2] encode = circuit.bind_parameters(x) encode.decompose().draw()
Image in a Jupyter notebook

3量子ビットのQiskitZZFeatureMap回路は、6つのパラメーター化ゲートがあるにもかかわらず、3つの機能のデータポイントしか符号化しません:

from qiskit.circuit.library import ZZFeatureMap circuit = ZZFeatureMap(3, reps=1, insert_barriers=True) circuit.decompose().draw()
Image in a Jupyter notebook
x = [0.1, 0.2, 0.3] encode = circuit.bind_parameters(x) encode.decompose().draw()
Image in a Jupyter notebook

クイッククイズ

パラメーター化された量子回路には16個のパラメーターがあります。 エンコードできる機能の最大数はいくつですか?

  1. 4

  1. 8

  1. 16

  1. 32

さまざまなタイプのデータに対するさまざまなパラメータ化された量子回路の性能は、活発に研究されている分野です。

ParseError: KaTeX parse error: Undefined control sequence: \cssId at position 1: \̲c̲s̲s̲I̲d̲{big-o-times}{\…

参考文献

  1. Maria Schuld and Francesco Petruccione, Supervised Learning with Quantum Computers, Springer 2018, doi:10.1007/978-3-319-96424-9.

  2. Ryan LaRose and Brian Coyle, Robust data encodings for quantum classifiers, Physical Review A 102, 032420 (2020), doi:10.1103/PhysRevA.102.032420, arXiv:2003.01695.

# pylint: disable=unused-import import qiskit.tools.jupyter %qiskit_version_table
/usr/local/anaconda3/lib/python3.7/site-packages/qiskit/aqua/__init__.py:86: DeprecationWarning: The package qiskit.aqua is deprecated. It was moved/refactored to qiskit-terra For more information see <https://github.com/Qiskit/qiskit-aqua/blob/main/README.md#migration-guide> warn_package('aqua', 'qiskit-terra')