データエンコーディング
はじめに・表記法
量子アルゴリズムを使用するためには、古典データを何らかの方法で量子回路に取り込む必要があります。これは一般的にデータのエンコーディングと呼ばれますが、データのローディングと呼ばれることもあります。前のレッスンで学んだ特徴マッピング(feature mapping)の概念を思い出してください。特徴マッピングとは、データの特徴をある空間から別の空間へ写す写像です。古典データを量子コンピューターに転送すること自体もある種のマッピングであり、特徴マッピングと呼ぶことができます。実際には、Qiskitに組み込まれている特徴マッピング(z_Feature Map や ZZ Feature Map など)は通常、回転層とエンタングリング層を含み、状態をヒルベルト空間の多くの次元へ拡張します。このエンコーディングプロセスは量子機械学習アルゴリズムの重要な部分であり、その計算能力に直接影響します。
以下に紹介するエンコーディング手法の中には、古典的に効率よくシミュレートできるものもあります。これはとくに、積状態(つまり、量子ビットをエンタングルしない)を生成するエンコーディング手法で容易に確認できます。また、量子的な 優位性は、データセットの量子的な複雑さとエンコーディング手法が適切に一致している場合に生まれる可能性が高いことを覚えておいてください。そのため、独自のエンコーディング回路を作成することになる可能性が非常に高いです。ここでは、様々なエンコーディング戦略を比較対照できるように、また何が可能かを示すために、幅広い手法を紹介します。エンコーディング手法の有用性については、いくつか非常に一般的な言明が可能です。たとえば、完全なエンタングリングスキームを持つ efficient_su2(以下参照)は、積状態を生成する手法(z_feature_map など)よりも、データの量子的特徴を捉える可能性がはるかに高いです。しかしそれは、efficient_su2 があなたのデータセットに対して十分、あるいは十分に適合していて、量子スピードアップをもたらすということを意味するわけではありません。それは、モデル化または分類されるデータの構造を慎重に考慮する必要があります。また、回路の深さとのトレードオフもあります。回路内の量子ビットを完全にエンタングルする多くの特徴マップは非常に深い回路を生成し、現在の量子コンピューターで使用可能な結果を得るには深すぎる場合があります。
表記法
データセットは 個のデータベクトルの集合です:。各ベクトルは 次元、つまり です。これは複素数のデータ特徴にも拡張できます。このレッスンでは、全体の集合 やその特定の要素 などの表記を使用することがあります。しかし、ほとんどの場合、データセットから1度に1つのベクトルをロードすることを想定し、 個の特徴を持つ単一のベクトルを単に と表記することが多いです。
また、 という記号でデータベクトル の特徴マッピング を表すのが一般的です。特に量子コンピューティングでは、量子コンピューティングにおける写像を という表記で表すことが多く、これはこれらの操作のユニタリな性質を強調しています。どちらも特徴マッピングであるため、同じ記号を使うことも正確です。このコースでは次のように使い分けます:
- :機械学習における特徴マッピング全般を議論する際、
- :特徴マッピングの回路実装を議論する際。
正規化と情報損失
古典的機械学習では、訓練データの特徴を「正規化」またはスケール変換することが多く、これによりモデルの性能が向上することがよくあります。一般的な方法の一つは、最小-最大正規化(min-max normalization)ま たは標準化(standardization)を使うことです。最小-最大正規化では、データ行列 の特徴列(たとえば特徴 )を次のように正規化します:
ここで min と max は、データセット 内の 個のデータベクトルにわたる特徴 の最小値と最大値を指します。すべての特徴値は単位区間内に収まります:(すべての 、 について)。
正規化は量子力学・量子コンピューティングにおいても基本的な概念ですが、最小-最大正規化とは少し異なります。量子力学における正規化では、状態ベクトル の長さ(量子コンピューティングの文脈では2-ノルム)が1に等しいことが要求されます:。これにより測定確率の和が1になります。状態は2-ノルムで割ることで正規化されます。すなわち、次のようにスケール変換します:
量子コンピューティングおよび量子力学では、これは人間がデータに課す正規化ではなく、量子状態の根本的な性質です。エンコーディング方式によっては、この制約がデータのスケール変換に影響する場合があります。たとえば、振幅エンコーディング(以下参照)では、量子力学の要請により となるようにデータベクトルが正規化され、これはエンコードされるデータのスケーリングに影響します。位相エンコーディングでは、量子ビットの位相角へのエンコーディングによる modulo- 効果による情報損失を防ぐために、特徴値を となるようにスケール変換することが推奨されています[1,2]。
エンコーディングの方法
次のいくつかのセクションでは、 個のデータベクトル(それぞれ 個の特徴を持つ)からなる小さな例の古典データセット を参照します:
上で導入した表記法を使うと、たとえば集合 の第4データベクトルの第1特徴は と表せます。
基底エンコーディング
基底エンコーディングは、古典的な ビット列を 量子ビット系の計算基底状態にエンコードします。たとえば を考えます。これは4ビット列 として表現でき、4量子ビット系では量子状態 として表されます。より一般的に、 ビット列: に対して、対応する 量子ビット状態は (、)です。これは単一の特徴に対するものであることに注意してください。
量子コンピューティングにおける基底エンコーディングは、各古典ビットを個別の量子ビットとして表現し、データの2進数表現を計算基底の量子状態に直接マッピングします。複数の特徴をエンコードする必要がある場合、各特徴はまず2進数形式に変換され、次に個別の量子ビットグループに割り当てられます(特徴ごとに1グループ)。各量子ビットはその特徴の2進数表現における1ビットを反映します。
例として、ベクトル (5, 7, 0) をエンコードしましょう。
すべての特徴が4ビットで格納されているとします(必要以上ですが、1桁の10進整数を任意に表現するには十分です):
5 → 2進数 0101
7 → 2進数 0111
0 → 2進数 0000
これらのビット列はそれぞれ4量子ビットの3つのグループに割り当てられるため、全体の12量子ビット基底状態は次のようになります:
ここで、最初の4量子ビットが第1特徴、次の4量子ビットが第2特徴、最後の4量子ビットが第3特徴を表します。以下のコードは、データベクトル (5,7,0) を量子状態に変換し、他の1桁の特徴にも汎用化されています。
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit
from qiskit import QuantumCircuit
# Data point to encode
x = 5 # binary: 0101
y = 7 # binary: 0111
z = 0 # binary: 0000
# Convert each to 4-bit binary list
x_bits = [int(b) for b in format(x, "04b")] # [0,1,0,1]
y_bits = [int(b) for b in format(y, "04b")] # [0,1,1,1]
z_bits = [int(b) for b in format(z, "04b")] # [0,0,0,0]
# Combine all bits
all_bits = x_bits + y_bits + z_bits # [0,1,0,1,0,1,1,1,0,0,0,0]
# Initialize a 12-qubit quantum circuit
qc = QuantumCircuit(12)
# Apply x-gates where the bit is 1
for idx, bit in enumerate(all_bits):
if bit == 1:
qc.x(idx)
qc.draw("mpl")

理解度チェック
以下の問いを読んで答えを考えてから、三角印をクリックして解答を確認してください。
例のデータセット の第1ベクトルをエンコードするコードを書いてください:
基底エンコーディングを使用して。
解答:
import math
from qiskit import QuantumCircuit
# Data point to encode
x = 4 # binary: 0100
y = 8 # binary: 1000
z = 5 # binary: 0101
# Convert each to 4-bit binary list
x_bits = [int(b) for b in format(x, '04b')] # [0,1,0,0]
y_bits = [int(b) for b in format(y, '04b')] # [1,0,0,0]
z_bits = [int(b) for b in format(z, '04b')] # [0,1,0,1]
# Combine all bits
all_bits = x_bits + y_bits + z_bits # [0,1,0,0,1,0,0,0,0,1,0,1]
# Initialize a 12-qubit quantum circuit
qc = QuantumCircuit(12)
# Apply x-gates where the bit is 1
for idx, bit in enumerate(all_bits):
if bit == 1:
qc.x(idx)
qc.draw('mpl')
振幅エンコーディング
振幅エンコーディングは、データを量子状態の振幅にエンコードします。正規化された古典的な 次元データベクトル を、 量子ビット量子状態 の振幅として表現します:
ここで は前と同じデータベクトルの次元数、 は の 番目の要素、 は 番目の計算基底状態です。 はエンコードするデータから決定される正規化定数です。これは量子力学が課す正規化条件です:
一般に、これは各特徴についてすべてのデータベクトルにわたって行う最小-最大正規化とは異なる条件です。これをどのように扱うかは問題によって異なりますが、上記の量子力学的な正規化条件は避けて通れません。
振幅エンコーディングでは、データベクトルの各特徴が異なる量子状態の振幅として格納されます。 量子ビット系は 個の振幅を提供するため、 個の特徴の振幅エンコーディングには 量子ビットが必要です。
例 として、例のデータセット の第1ベクトル を振幅エンコーディングでエンコードしてみましょう。得られたベクトルを正規化すると:
となり、結果として得られる2量子ビット量子状態は: