この記事の立ち位置
- 量子回路学習をやってみて、所感です。
- 正確性は保証できないよ。
量子回路学習については、
https://dojo.qulacs.org/ja/latest/notebooks/5.2_Quantum_Circuit_Learning.html
量子回路学習
量子回路学習は、NISQ(Noisy Intermediate Scale Quantum)、すなわち近未来の雑音あり量子コンピューターで
動くことを目指した量子機械学習アルゴリズムです。
量子回路学習では、機械学習させるモデルとして量子ゲート回路を用います。
量子ゲート回路の各素子(量子ゲート)は、パラメータを持っており、このパラメータを学習させることで
望む出力を吐き出す量子ゲート回路を生成します。
例えば、量子状態に回転操作をするゲートは、回転角度がパラメータとなります。
学習には、勾配情報を必要としない最適化アルゴリズムを用いることが多い?ようですが、
勾配を効率的に計算する方法も知られており、そちらを使うことも可能(なはず)です。
- ざっくりいえば、パラメータをシフトさせた量子ゲート回路との差分(数値微分)を見ることで勾配がわかるという方法です。
量子回路学習における古典データ埋め込み
多くの量子機械学習アルゴリズムでは、古典データが理想的な形で量子状態に埋め込めることを
出発点とします。
例えば、量子状態の確率振幅に古典複素数データを埋め込めることを前提とします。
これを振幅エンコーディングといいます。
しかし振幅エンコーディングは、現在の量子コンピューターでは実行が難しいほど長いゲート回路を
必要としてしまいます。1
https://qiita.com/notori48/items/383015c6529e8fae4e64
量子回路学習はNISQを対象としますので、振幅エンコーディングを回避する必要があります。
そこで、
- 古典データを$x$としたときに、$x$で決まる何らかの(1量子ビット)ゲート操作$U(x)$を行う
という方法で、「埋め込み」としています。
本当は振幅エンコーディングで$x$を量子状態の振幅にそのまま埋め込みたいのですが、それが難しいので、
$x$に依存した何かの値ならいいだろうということになっています。2
### 量子回路学習におけるデータ埋め込みの問題
量子回路学習は確かに雑音下でも学習が進むという意味で画期的です。
しかし、問題もあります。
古典データ$x$が次元$N$のベクトルであったとします。
量子状態は、$n$qubitあれば$2^{n}$個の確率振幅を持ちます。
なので、理想的には$\log_{2}(N)$個のqubitがあれば、次元$N$の古典データを確率振幅に埋め込めます。
しかし量子回路学習の埋め込み方法では、$N$個の古典データを埋め込むには$N$qubitが必要です。
1量子ビット目に$U(x_{1})$を作用させ、2量子ビット目には$U(x_{2})$を作用させ・・・ という操作になるからです。
なので、入力データの次元が10, 20ぐらいになると、シミュレーターではなかなか計算できない計算量になります。
なぜならば、$K$qubitのシミュレーションには$2^{K} \times 2^{K}$の行列計算を何度も繰り返す必要があるためです。3
シミュレーションができないと、なかなか作業が進みません。。
古典ニューラルネットワークでは、入力データの次元が$10^{1}$ではへっちゃらだと思いますので、
これは大きなディスアドバンテージです。
#まとめ
アルゴリズムの計算部分だけではなく、データの埋め込みにも注目することが大事。