今回は新版Qiskit Textbookで新たに追加されたQuantum machine learningの章のData encoding(データエンコーディング)のセクションを紹介します。
データエンコーディングとは
量子コンピュータの文脈においてエンコーディングとは、古典データを量子コンピュータ上で操作できるように量子ビットに情報を書き込むことを指します。
量子機械学習に限らず量子計算では、量子ビットに対して何らかの操作が定義された量子回路に入力を与えて出力を得ることが目的です。
そのため機械学習で使われる古典データセット(株価などの数値や画像)は量子回路の入力とするためには量子ビットで表現される必要がありエンコーディングの出番となります。
主なデータエンコーディングの手法
それでは古典データを量子ビットにエンコードする手法としてテキストで紹介されている3つの手法を紹介します。
- 基底エンコーディング
- 振幅エンコーディング
- 角度エンコーディング
基底エンコーディング
基底エンコーディングとは古典データの$N$ビット列をそのまま量子ビットに置き換える方法です。
例えば4量子ビットを用いて実数$x$を基底エンコーディングすると以下のように表すことができます。
|0\rangle=|0000\rangle, |1\rangle=|0001\rangle, |2\rangle=|0010\rangle, |3\rangle=|0011\rangle
つまり古典データセット$\Chi$は重ね合わせを用いて以下のように表すことができます。ここで$x^{(m)}$はNビット列表現です。
|\Chi\rangle=\frac{1}{\sqrt{M}}\sum_{m=1}^M|x^{(m)}\rangle
基底エンコードの特徴は以下の通りです。
基底エンコーディングは古典ビット列をそのまま量子ビットに焼き直すので、原理的に古典コンピュータが実行可能なビット列に対する全ての演算が可能です。
つまり理論上どんな古典アルゴリズムでも量子コンピュータ上で効率的に実装可能で、量子ビット特有の重ね合わせによる並列計算で効率的に計算が可能な場合は量子加速が期待できます。
振幅エンコーディング
振幅エンコーディングとは古典データを量子ビットそのものではなく確率振幅に書き込む方法です。
例えば$N=2^n$次元ベクトル$\mathbf{x}$を振幅エンコードして、量子状態$|\psi_x\rangle$を生成すると以下のようになります。
\mathbf{x} = \begin{bmatrix} x_0 \\ \vdots \\ x_{2^n-1}\end{bmatrix}~ \underrightarrow{encode}~ |\psi_x\rangle = \sum_{j=0}^{N-1}x_j|j\rangle
ただし量子状態の確率振幅の二乗和は1になる必要がある(量子力学の公理)ためベクトル$\mathbf{x}$は規格化されている必要があります。
データセット$\Chi$が行列で表すことができる($N$次元ベクトルのデータ点が$M$個ある$N\times M$行列)場合、以下のようにエンコードされます。
|\Chi\rangle = \sum_{i=0}^{N}\alpha_i|i\rangle \\ ただし\mathbf{\alpha} = A_{norm}(x_1^{(1)}, \cdots, x_N^{(1)}, \cdots, x_N^{(M)})
振幅エンコードの特徴は以下の通りです。
データ点は合計$NM$個なので、量子ビットは$\log NM$個で済むことが最大の特徴です。
振幅エンコーディングではデータを確率振幅に書き込みますが、この情報を私達が知るためには対象の量子状態を測定して確率分布を求める必要があります。確率分布の値は振幅の二乗和の値なので、もともとの値は失われていることになります。
さらに、エンコーディング対象のデータは規格化されている必要がある点も考慮が必要なため、振幅エンコーディングは量子計算では頻繁には使われていないようです。
角度エンコーディング
角度エンコーディングとは古典データを量子ゲートのパラメータに書き込む方法です。
例えば$N=2^n$次元ベクトル$\mathbf{x}$を角度エンコードして、量子状態$|x\rangle$を生成すると以下のようになります。
\mathbf{x} = \begin{bmatrix} x_0 \\ \vdots \\ x_{2^n-1}\end{bmatrix}~ \underrightarrow{encode}~ |x\rangle = \bigotimes_{i=0}^{N}\cos{x_i}|0\rangle+\sin{x_i}|1\rangle
この操作をユニタリ変換として表現する場合Y軸回転ゲートとして表現することが可能です。
|x\rangle = \bigotimes_{i=0}^{N}U(x_i) \\ ただしU(x_i)=RY(2x_i)=\begin{bmatrix} \cos{x_i}& -\sin{x_i} \\ \sin{x_i} & \cos{x_i} \end{bmatrix}
振幅エンコードの特徴は以下の通りです。
エンコーディングは並列に実行可能な回転ゲート操作のみで済むため効率的に操作が可能な点が最大の特徴です。
1つの量子ビットで1つのデータ点しか扱えないため、データ点が増えるほど必要な量子ビット数も増加します。
テキストでは量子ビット数を減らす工夫としてdense angle encodingという相対位相を用いた手法が紹介されていますが、コンセプトは角度エンコーディングと変わりません。
まとめ
量子コンピュータにおけるデータエンコーディングの手法はアルゴリズムの効率を決める一因となる非常に大切なプロセスで、今回取り上げた以外にも多くの方法が考えられています。
データエンコーディングは「必要な量子ビット数」と「状態準備に必要な操作の複雑度」というトレードオフの関係の妥協点を見つける必要があるため、万能な手法は存在しません。
量子アルゴリズムを勉強する上でなぜこのエンコーディング手法が採用されているのかを考えることがベストな手法の勘を養う第一歩かもしれませんね。
より深く学ぶ人向けに
この記事を執筆する上で以下の書籍を参考にしたのでより深く学びたい方は是非こちらを参考にしてください!
- 量子コンピューティング 〜第2章 量子コンピュータの基本〜
- 量子コンピュータによる機械学習 〜第5章 情報の符号化〜
また、Quantum TokyoのYoutubeチャンネルにてConnpass上で開催した勉強会の様子がアップされているのでぜひこちらもご覧ください。
コメント