Path: blob/main/translations/ja/ch-machine-learning/machine-learning-qiskit-pytorch.ipynb
3860 views
PyTorchとQiskitを用いた量子古典ハイブリッド・ニューラル・ネットワーク
機械学習 (Machine learning、ML) は、データから一般化された情報を数学的に抽出しようとする学際的分野を自分自身で確立しました。量子コンピューターを利用することで、機械学習を補完するため量子力学の原理を利用したり、あるいはその逆を行う興味深い研究分野が増加しています。 難しい計算を量子コンピューターに任せることで古典MLアルゴリズムを拡張するにせよ、古典MLアルゴリズムを用いて量子アルゴリズムを最適化するにせよ、どちらも量子機械学習(quantum machine learning、QML)の多種多様な傘下にあるのです。
この章では、古典的なニューラル・ネットワークを部分的に量子化して、ハイブリッド量子古典ニューラル・ネットワークを作成する方法を探ります。Qiskit と最先端のオープンソース・ソフトウェアである PyTorch を統合して、簡単な例をコード化します。この例の目的は、Qiskitと既存のMLツールとの統合が容易であることを示し、MLの専門家が量子コンピューティングで何が可能かを探求することを奨励することにあります
目次
どのように動作するのか? 1.1 導入
いざ、コーディング! 3.1 インポート 3.2 Qiskitを用いた「量子クラス」の作成 3.3 PyTorchを用いた「量子古典クラス」の作成 3.4 データのロードと前処理 3.5 ハイブリッド・ニューラル・ネットワークの作成 3.6 ネットワークの学習 3.7 ネットワークのテスト
1.1 導入
ここで語られる古典ニューラル・ネットワークの背景には、関連する知識や共通の用語の確立も含まれますが、俄然とてもハイレベルなものです。もし古典ニューラル・ネットワークに深く踏み込みたい場合は、YouTuberによるよくできたビデオシリーズ 3Blue1Brown をご覧ください。または、もし既に古典ネットワークに詳しい場合は 次のセクションにスキップ できます。
ニューロンと重み
ニューラル・ネットワークは、最終的には、ニューロンと呼ばれる小さなビルディング・ブロックを構成することで作られる精巧な機能です。ニューロン は、通常シンプルで計算しやすい非線形の関数で、1つ以上の入力を1つの実数にマップします。ニューロンの一つの出力は、通常他のニューロンへの入力としてコピーされフィードされます。図示する場合、ニューロンをグラフ内のノードとして表し、あるニューロンの出力が他のニューロンへの入力としてどのように使用されるかを示すため、ノード間の有向エッジを描画します。また、グラフ内の各エッジは、しばしば重みと呼ばれるスカラー値に関連付けられることに注意する必要があります。ここでの考え方は、ニューロンへの各入力はそれぞれ異なるスカラー値が乗じられた後、集められて1つの値に処理されるということです。ニューラル・ネットワークの学習の主たる目的は、特定の方法でネットワークが振る舞うよう重みを決めることです。
フィードフォワード・ニューラル・ネットワーク
また、私たちが関心のあるタイプのニューラル・ネットワークは、フィードフォワード・ニューラル・ネットワーク (Feed-Forward Neural Network, FFNN) と呼ばれることにも注目する必要があります。これは、ニューラル・ネットワークにデータが流れるとき、データは一度訪れているニューロンに戻ることがないことを意味します。言い換えるならば、このニューラル・ネットワークを記述するグラフは、有向非巡回グラフ (Directed Acyclic Graph, DAG) だということです。さらに、ニューラル・ネットワークの同じ層にあるニューロンは、それらの間にエッジがないことも条件となります。
層のIO構造
ニューラル・ネットワークへの入力は、古典的な(実数値の)ベクトルです。入力ベクトルの各成分は、ネットワークのグラフ構造に従って、異なる重みを乗じられ、ニューロンの層にフィードされます。 層内の各ニューロンが評価された後、結果は新しいベクトルに集められ、 i番目の成分はi番目のニューロンの出力を記録します。この新しいベクトルは、新しい層の入力として処理され、以下同様に処理されます。ネットワークの最初と最後以外の層は、隠れ層 という標準的用語を使って表現しましょう。
2. 量子はどのように画像を入力するのか?
量子古典ニューラル・ネットワークを構築するには、パラメータ化された量子回路を使用してニューラル・ネットワークの隠れ層を実装する方法があります。 ここで「パラメータ化された量子回路」とは、各ゲートの回転角が古典入力ベクトルの成分によって指定される量子回路を意味します。ニューラル・ネットワークの前の層からの出力が集められ、パラメーター化された回路の入力として使用されます。これらの量子回路の測定統計は集められ、続くの層の入力として使用することができます。以下に簡単な例を示します:

ここで、 は 非線形関数、 は各隠れ層におけるニューロン の値です。 は に等しい角の回転ゲートを表し、はこのハイブリッド・ネットワークから生成される最終予測値になります。
誤差逆伝播法はどうか?
古典MLに詳しいならば、 量子回路が含まれる場合、どのように勾配を計算するのか という疑問がすぐ浮かぶでしょう。これには、最急降下法 といった、強力な最適化手法を列挙する必要があるでしょう。少し技術的になりますが、手短に言えば、量子回路をブラック・ボックスとみなすとき、パラメーターに対するこのブラック・ボックスの勾配は次のように計算できます:

ここで、 は量子回路のパラメーターを、 は巨視的シフトを表します。すると、勾配は回路を と で評価した時の差になります。このように、より大きな誤差伝播ルーチンの一部として、量子回路を体系的に区別することができます。量子回路パラメータの勾配を計算するこの閉形式ルールは、パラメーター・シフト・ルール として知られています。
この実装をテストしてみましょう。
3.3 PyTorchを用いた「量子古典クラス」の作成
量子回路を定義できましたので、 PyTorchを使って誤差逆伝播法に必要な関数を作成できます。順伝播と逆伝播 には、Qiskitクラスの要素が含まれています。 逆伝播は、上記で導入した有限差分公式を使用して、分析勾配を直接計算します。
3.4 データのロードと前処理
以上をすべてをまとめる:
MNIST データ・セット の2種類の数字(0または1)のイメージを分類するための、簡単なハイブリッド・ニューラル・ネットワークを作成します。まずMNISTをロードし、0と1を含む画像をフィルタリングします。これらは、分類するニューラル・ネットワークの入力として扱われます。
学習データ
テスト・データ
ここまでで、データをロードし、1つの学習パラメータを含む量子回路を作成するクラスをコーディングしました。この量子パラメータは、他の古典パラメータとともに古典ニューラル・ネットワークに入力され、ハイブリッド・ニューラル・ネットワークを形成します。また、逆伝播・順伝播関数を作ることにより、誤差逆伝播法を実現しニューラル・ネットワークを最適化することができました。最後に、PyTorchが提供する最適化技術を使って、パラメーターの学習を開始できるよう、ニューラル・ネットワーク・アーキテクチャーを指定する必要があります。
3.5 ハイブリッド・ニューラル・ネットワークの作成
NEAT PyTorchパイプラインを使って、ニューラルネットワーク・アーキテクチャを構築できます。量子層(すなわち量子回路)を挿入する場合、ネットワークは次元に対して互換性が必要です。この例の量子回路はパラメータを1つ含んでいるので、ネットワークがニューロンをサイズ1まで縮小するようにしなければなりません。最終的に、2層の全結合層からなる典型的な畳み込みニューラル・ネットワークを作成します。全結合層の最後のニューロンの値は、パラメーターとして量子回路に与えられます。回路測定は、の測定によってもたらされる0または1の最終予測値として与えられます。
3.6 ネットワークの学習
ハイブリッド・ネットワークを学習させる全ての材料が揃いました!複数のエポックに渡り学習させるため、PyTorchの最適化法や学習率 、 損失関数/目的関数 などを指定することができます。この例では、Adam最適化ツール 、学習率0.001、負の対数尤度損失関数 を使用します。
学習グラフをプロットします。
4. 次は何?
ハイブリッド・ニューラルネットワークを作成することは確かに可能ですが、実際に何らかの恩恵があったでしょうか?
事実、このネットワークの古典的な層は、量子層がなくとも完全に良く(実際には、より良く)学習されます。さらに、ここで学習された量子層は、エンタングルメントを全く生成しないことに気が付いたかもしれません。つまり、この特定のアーキテクチャーを拡張する際は、古典的にシミュレーション可能であるということです。これは、ハイブリッド・ニューラル・ネットワークを使用して量子優位性を実現したい場合は、このコードを拡張し、より洗練された量子層を組み込むことから始める必要があることを意味します。
この演習のポイントは、興味のある要素が実際にあるかを調べるため、MLと量子コンピューティングの技術の統合を考えることでした。PyTorchとQiskitのおかげで、これは少し楽になっています。

