Path: blob/master/site/ja/quantum/tutorials/mnist.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
MNIST の分類
このチュートリアルでは、簡略化された MNIST バージョンを分類する、Farhi et al で使用されたアプローチに似た量子ニューラルネットワーク(QNN)を構築し、古典的なデータ問題における量子ニューラルネットワークのパフォーマンスを従来のニューラルネットワークと比較します。
セットアップ
TensorFlow Quantum をインストールします。
次に、TensorFlow とモジュールの依存関係をインポートします。
1. データを読み込む
このチュートリアルでは、Farhi et al. に従って、数字の 3 と 6 を区別する二項分類器を構築します。このセクションでは、次を行うデータ処理を説明します。
Keras から生データを読み込みます。
データセットを 3 と 6 に絞り込みます。
画像が量子コンピュータに適合するように、画像を縮小します。
矛盾するサンプルを取り除きます。
バイナリ画像を Cirq 回路に変換します。
Cirq 回路を TensorFlow Quantum 回路に変換します。
1.1 生データを読み込む
Keras で配布された MNIST データセットを読み込みます。
3 と 6 の数字のみを保持してほかのクラスを取り除くように、データセットを絞り込みます。同時に、3
を True
、6 を False
というように、ラベル y
をブール型に変換します。
最初のサンプルを表示します。
1.2 画像を縮小する
現在の量子コンピュータでは、画像サイズ 28x28 は大きすぎるため、4x4 に縮小します。
サイズ変更を行ったら、もう一度最初のサンプルを表示します。
1.3 矛盾するサンプルを取り除く
Farhi et al. の 3.3 Learning to Distinguish Digits セクションに説明されているように、データセットから両方のクラスに属するラベルが付けられた画像を取り除きます。
これは標準的な機械学習の手順ではありませんが、論文の手順に従う目的で追加している手順です。
取り除いた結果の数量は、レポートされている値に密に一致していませんが、これは正確な手順が指定されていないためです。
また、この時点で、矛盾するサンプルをフィルタリングすることで、矛盾するトレーニングサンプルがモデルに絶対に送られないということではありません。次のデータの二項化のステップでは、さらに競合が発生します。
1.4 データを量子回路としてエンコードする
Farhi et al. は、量子コンピュータを使って画像を処理するには、ピクセルの値に応じた状態で、各ピクセルをキュービットで表現するように提案しています。最初のステップでは、バイナリエンコーディングへの変換を行います。
この時点で矛盾した画像を取り除く場合、193 個しか画像が残らず、これでは有効なトレーニングを行える数量とは言えません。
しきい値を超える値を持つピクセルインデックスのキュービットは、 ゲートを介して循環します。
これは最初のサンプルに作成された回路です(回路図には、ゼロゲートのキュービットは表示されていません)。
この回路を、画像の値がしきい値を超えるインデックスを比較します。
これらの Cirq
回路を tfq
のテンソルに変換します。
2. 量子ニューラルネットワーク
画像を分類する量子回路構造に関するガイダンスはほとんどありません。分類は読み出されるキュービットの期待に基づいて行われるため、Farhi et al. は、2 つのキュービットゲートを使用して、読み出しキュービットが必ず作用されるようにすることを提案しています。これはある意味、ピクセル全体に小さなユニタリ RNNを実行することに似ています。
2.1 モデル回路を構築する
次の例では、このレイヤー化アプローチを説明しています。各レイヤーは同一ゲートの n 個のインスタンスを使用しており、各データキュービットは読み出しキュービットに影響を与えています。
ゲートのレイヤーを回路に追加する簡単なクラスから始めましょう。
サンプル回路レイヤーを構築して、どのようになるかを確認します。
では、2 レイヤーモデルを構築しましょう。 データ回路サイズに一致するようにし、準備と読み出し演算を含めます。
2.2 tfq-keras モデルでモデル回路をラップする
量子コンポーネントで Keras モデルを構築します。このモデルには、古典的なデータをエンコードする「量子データ」が x_train_circ
からフィードされます。パラメータ化された量子回路レイヤーの tfq.layers.PQC
を使用して、量子データでモデル回路をトレーニングするモデルです。
Farhi et al. は、画像を分類するには、パラメータ化された回路で読み出しキュービットの期待値を使用することを提案しています。期待値は、1 から -1 の値です。
次に、compile
メソッドを使用して、モデルにトレーニング手順を指定します。
期待される読み出しは [-1,1]
の範囲であるため、ヒンジ損失を最適化すると、ある程度自然な適合となります。
注意: もう 1 つの有効なアプローチとして、出力範囲を [0,1]
にシフトし、モデルがクラス 3
に割りてる確率として扱う方法があります。これは、標準的なtf.losses.BinaryCrossentropy
損失で使用することができます。
ここでヒンジ損失を使用するには、小さな調整を 2 つ行う必要があります。まず、ラベル y_train_nocon
をブール型からヒンジ損失が期待する [-1,1]
に変換することです。
次に、[-1, 1]
を y_true
ラベル引数として正しく処理するカスタムの hinge_accuracy
メトリックを使用します。tf.losses.BinaryAccuracy(threshold=0.0)
は y_true
がブール型であることを期待するため、ヒンジ損失とは使用できません。
量子モデルをトレーニングする
では、モデルをトレーニングしましょう。これには約 45 分かかりますが、その時間を待てない方は、小規模なデータのサブセット(以下のNUM_EXAMPLES=500
セット)を使用するとよいでしょう。トレーニング時のモデルの進捗にあまり影響はありません(パラメータは 32 しかなく、これらを制約する上であまりデータは必要ありません)。サンプル数を減らすことでトレーニングを早めに(5 分程度)終わらせることができますが、検証ログに進捗状況を示すには十分な長さです。
このモデルを収束までトレーニングすると、テストセットにおいて 85% を超える精度が達成されます。
注意: トレーニング精度はエポックの平均値を示します。検証精度はエポックの終了ごとに評価されます。
3. 従来のニューラルネットワーク
量子ニューラルネットワークは、この単純化された MNIST 問題で機能するものの、このタスクでは、従来のニューラルネットワークの性能が QNN をはるかに上回ります。1 つのエポックが終了した時点で、従来のニューラルネットワークは縮小したセットで 98% を超える精度を達成することができます。
次の例では、画像をサブサンプリングする代わりに 28x28 の画像を使用した 3 と 6 の分類問題に従来のニューラルネットワークを使用しています。これはほぼ 100% 精度のテストセットに難なく収束します。
上記のモデルには約 120 万個のパラメータがあります。より公正な比較を行うために、サブサンプリングした画像で 37 個のパラメータモデルを使用してみましょう。
4. 比較
解像度の高い入力とより強力なモデルの場合、CNN はこの問題を簡単に解決できますが、似たようなパワー(最大 32 個のパラメータ)を持つ古典的モデルはわずかな時間で似たような精度までトレーニングすることができます。いずれにせよ、従来のニューラルネットワークは量子ニューラルネットワークの性能を簡単に上回ります。古典的なデータでは、従来のニューラルネットワークを上回るのは困難といえます。