科学しよう

量子計算のプログラミングの解説をメインに、データサイエンス・機械学習について勉強したことをご紹介します

MENU

スワップテスト

アダマールゲートに続いてスワップテストです。 これはアダマールテストのユニタリーゲートについて、SWAPゲートを用いる場合です。 大雑把には制御量子ビット・入力量子ビット1(標的量子ビット1)・入力量子ビット2(標的量子ビット2)の3種類の役割を持つ量子ビットが存在します。 (入力量子ビットは1量子ビットとは限らず、複数量子ビットからなる場合もあります。) 入力量子ビット1, 2を2つのベクトルとした場合の2ベクトル間の内積を評価する量子回路です。

内積を評価する場面はさまざまあり、実装も簡単なため量子機械学習ほか様々な場面で使われるようです。

前提とする知識

  • 線形代数がわかること
  • 簡単な論理演算(AND, OR, NOT)が分かること
  • 基本的な量子ゲート(X, CX, CCX)が分かること

バージョン情報

目次

SWAPテスト回路

アダマールテストおさらい

アダマールテストの詳細については前回の解説を参照してください。

量子回路の形は下図の通りで、この回路を使うことで、ユニタリー \hat{U}によって第一量子ビットを測定した時の状態の確率分布を変化させられることがSWAPテストでは重要な意味があります。

図1. アダマールテストの量子回路

この時の第一量子ビット | 0 \rangle及び | 1 \rangle状態の確率分布は以下です。

\displaystyle{
p_0 = \frac{1 + \mathrm{Re} \langle \psi |_B \hat{U} | \psi \rangle_B}{2}
}
\displaystyle{
p_1 = \frac{1 - \mathrm{Re} \langle \psi |_B \hat{U} | \psi \rangle_B}{2}
}

SWAPテスト回路の理論

SWAPテストによって二つのベクトルの内積を計算できます。 内積の値がアダマールテストの第一量子ビットの確率分布に反映されるのでその確率から内積を逆算できる、ということです。

入力する2つの量子状態を以下のように定義します。

\displaystyle{
| a \rangle = \sum_{i=0}^{N-1} {a_i | i \rangle}
}
\displaystyle{
| b \rangle = \sum_{i=0}^{N-1} {b_i | i \rangle}
}

この2つのベクトル | a \rangle, | b \rangleを以下の量子回路に入力することで、その内積

\displaystyle{
| \langle a | b \rangle|^2 = | \sum_{i=0}^{N-1} {a_i b_i}|^2
}

を評価できます。

図2. SWAPテスト回路

第一量子ビットの状態を測定した時に、 | 0 \rangleとなる確率が以下となることから内積を評価できます。

\displaystyle{
p_0 = \frac{1 + | \langle a | b \rangle |^2}{2}
}

SWAPテストの仕組み導出

まずアダマールゲートを実行すると

\displaystyle{
| 0 \rangle | a \rangle | b \rangle \overset{H_1}\longrightarrow \frac{1}{\sqrt{2}} \left( | 0 \rangle | a \rangle | b \rangle + | 1 \rangle | a \rangle | b \rangle \right)
}

そして前回解説した制御SWAPゲートにより入力ビットの状態を反転させると以下になります。

\displaystyle{
\frac{1}{\sqrt{2}} \left( | 0 \rangle | a \rangle | b \rangle + | 1 \rangle | b \rangle | a \rangle \right)
}

そして最後に第一量子ビットアダマールゲートをかけると全体の量子状態の最終状態 | \psi \rangleは以下になります。


\begin{aligned}
| \psi \rangle &= \frac{1}{2} \left\{ \left( | 0 \rangle + | 1 \rangle \right) | a \rangle | b \rangle + \left( | 0 \rangle - | 1 \rangle \right) | b \rangle | a \rangle \right\} \\

&= \frac{1}{2} \left\{ | 0 \rangle \left( | a \rangle | b \rangle + | b \rangle | a \rangle \right) + | 1 \rangle \left( | a \rangle | b \rangle - | b \rangle | a \rangle \right) \right\}
\end{aligned}

補助量子ビットの状態が | 0 \rangleとなる確率はベクトル | \psi \rangle | 0 \rangle_1成分の長さを求めれば良いので以下となります。


\begin{aligned}
p_0 &= | \langle 0 | \psi \rangle |^2 \\

&= ( \langle 0 | \psi \rangle)^{\dagger}  \langle 0 | \psi \rangle \\

&= \langle \psi | 0 \rangle \langle 0 | \psi \rangle \\

&= \frac{1}{4} (\langle a | \langle b | + \langle b | \langle a | ) (| a \rangle | b \rangle + | b \rangle | a \rangle) \\

&= \frac{1}{4} (\langle a | \langle b | a \rangle | b \rangle + \langle a | \langle b | b \rangle | a \rangle + \langle b | \langle a | a \rangle | b \rangle + \langle b | \langle a | b \rangle | a \rangle)
\end{aligned}

 \langle a | b \rangleなどは内積取ってしまったらただの数なので自由に交換できますので式を整理し


\begin{aligned}
p_0 &= \frac{1}{4} ( \langle a | b \rangle \langle b | a \rangle + \langle a | a \rangle \langle b | b \rangle + \langle b | b \rangle \langle a | a \rangle + \langle b | a \rangle \langle a | b \rangle ) \\

&= \frac{1}{4} (| \langle a | b \rangle|^2 + 1 + 1 + |\langle a | b \rangle|^2 ) \\

&= \frac{1}{4} \left( 2 + 2 |\langle a | b \rangle|^2 \right) \\

&= \frac{1 + |\langle a | b \rangle|^2}{2}
\end{aligned}

以上では愚直に計算しましたが、制御ユニタリで実行しているゲート \hat{U}に対応するものとしてSWAPゲートを示す \hat{U}_{\mathrm{SWAP}}にして実行したアダマールテストです。

アダマールテストだと思った時の入力量子ビット | \psi \rangle = | a \rangle | b \rangleです。

SWAPゲートを示すユニタリー \hat{U}_{\mathrm{SWAP}}は以下です。

\displaystyle{
\hat{U}_{\mathrm{SWAP}} = \begin{pmatrix}
1 & 0 &0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}
}

この行列の固有ベクトル


\begin{aligned}
| x_+ \rangle &= \begin{pmatrix}
0 \\
1 \\
1 \\
0
\end{pmatrix} \\

&= | 1 \rangle | 0 \rangle + | 0 \rangle | 1 \rangle

\end{aligned}

\begin{aligned}
| x_- \rangle &= \begin{pmatrix}
0 \\
1 \\
-1 \\
0
\end{pmatrix} \\

&= | 1 \rangle | 0 \rangle - | 0 \rangle | 1 \rangle

\end{aligned}

のため、一般の入力状態


\begin{aligned}
| \psi \rangle &= | a \rangle | b \rangle \\

&= \left( \alpha | 0 \rangle + \beta | 1 \rangle \right) \left( u | 0 \rangle + v | 1 \rangle \right) \\

&= \alpha u | 0 \rangle | 0 \rangle + \alpha v | 0 \rangle | 1 \rangle + \beta u | 1 \rangle | 0 \rangle + \beta v | 1 \rangle | 1 \rangle \\

&= \begin{pmatrix}
\alpha u \\
\alpha v \\
\beta u \\
\beta v
\end{pmatrix}

\end{aligned}

は固有状態とは限りません。

従って第一量子ビットの状態が | 0 \rangleである確率は以下となります。


\begin{aligned}
p_0 &= \frac{1 + \mathrm{Re} \langle \psi | \hat{U}_{\mathrm{SWAP}} | \psi \rangle}{2} \\

&= \frac{1 + \alpha^2 u^2 + 2 \alpha \beta u v + \beta^2 v^2}{2} \\

&= \frac{1 + (\alpha u + \beta v)^2}{2} \\

&= \frac{1 + \left| \begin{pmatrix} \alpha & \beta \end{pmatrix} \begin{pmatrix} u \\ v \end{pmatrix} \right|^2}{2} \\

&= \frac{1 + \left| \langle a | b \rangle \right|^2}{2}

\end{aligned}

ということで、やはり愚直にやった計算と一致しました。
そのためユニタリーがわかっていれば、今後アダマールテストの計算する時は愚直に計算しなくとも、確率の式に当てはめれば良いです。

この確率の式から、入力ベクトルが直交している場合は確率0.5で平行であれば確率1であることがわかる。(ベクトルの正負の向きまではわからない。)

SWAPテスト回路の実装

実際に内積を計算してみます。

単純なベクトルの計算

今は | a \rangle = \alpha | 0 \rangle + \beta | 1 \rangle, | b \rangle = u | 0 \rangle + v | 1 \rangleの二次元平面上のベクトルを考えています。
普段量子ビットを考えるときは[tex | 0 \rangle]と | 1 \rangleはBlock球面上の上下正反対を向いたベクトル(下図左)ですが、この二つのベクトルは正規直交基底(直交して、その平面・空間の軸に平行な単位ベクトル)なので直交座標上では直交しています(下図右)。

図3. | 0 >と| 1 >の位置関係 左: Bloch球面上 右: 直交座標上

わかりやすい例だと | a \rangle = | 0 \rangle, | b \rangle = | 0 \rangleなら \langle a | b \rangle = 1 | a \rangle = | 0 \rangle, | b \rangle = | 1 \rangleなら \langle a | b \rangle = 0です。

 | a \rangle | 0 \rangleに固定して、 | b \rangle | 0 \rangleから - | 0 \rangleまで直交座標上で \pi (Bloch球面上で 2 \pi)だけ連続的に変化させた時は


\begin{aligned}
\langle a | b \rangle &= \langle 0 | \left( \cos \frac{\theta}{2} | 0 \rangle + \sin \frac{\theta}{2} | 1 \rangle \right) \\

&= \cos \frac{\theta}{2}

\end{aligned}

のため下図のようになります。( \thetaはBloch球面上の | 0 \rangleとなす角度)

図4. <a | b >の角度依存性

 | 0 \rangleから \piだけ角度が違うものが | 1 \rangleに一致して、確かに直交して \cos \pi / 2 = 0になってますね。

スワップテスト回路で内積を計算

単純にベクトル計算した時と同じように、以下のように | a \rangleは固定して | b \rangleをY軸に周りに | 0 \rangleから | 1 \rangleを経由して一周して | 0 \rangleに戻るまで角度を変えていった場合に内積が計算できていることを確認します。

図5. スワップテスト回路の例

これで | b \rangleの角度を0から 2 \piに変えた時に第一量子ビット | 0 \rangleが観測される確率が下図です。

図6. 第一量子ビットで| 0 >が観測される確率

\displaystyle{
p_0 = \frac{1 + \left| \langle a | b \rangle \right|^2}{2}
}

から \left| \langle a | b \rangle \right|^2を算出すると下図です。
ノイズの関係でマイナスになる関係で残念ながら自乗を外せません。

図7. |<a|b>|^2を測定と計算から求めた場合の比較

ベクトル計算から求めた場合と測定から求めた場合とでの誤差をRMSEで求めると0.02程度でした。
目盛の間隔が0.2ずつなのでその1/10です。

この誤差が大きいのか小さいのかは実際に解きたい問題に依存すると思うのでここでは評価しませんが、ほぼほぼベクトル計算だけから求めた場合と同等の値を測定から求められると思って良いと思います。

この時のソースです。

effs = np.linspace(0, 2, 51)
print(effs)
probs = []
for idx, eff in enumerate(effs):
    rad = np.pi * eff
    
    qr_control = QuantumRegister(1, 'control')
    qr_1 = QuantumRegister(1, 'a')
    qr_2 = QuantumRegister(1, 'b')
    cr = ClassicalRegister(1)
    qc = QuantumCircuit(qr_control, qr_1, qr_2, cr)

    qc.rx(rad, qr_2)

    qc.barrier()

    qc.h(qr_control)

    qc.cx(qr_1, qr_2)
    qc.ccx(qr_control, qr_2, qr_1)
    qc.cx(qr_1, qr_2)

    qc.h(qr_control)

    qc.barrier()

    qc.measure(qr_control, cr)
        
    backend = Aer.get_backend('qasm_simulator')
    job = execute(qc, backend, shot=1024)

    result = job.result()
    probs.append({
        'theta': rad,
        'prob': calc_p0(result)
    })

df_result = pd.DataFrame(probs)
display(df_result)

thetas = np.linspace(0, 2, 51)
thetas = np.asarray([theta * np.pi for theta in thetas])
cos = np.cos(thetas / 2)

fig = plt.figure()
plt.scatter(df_result['theta'] / np.pi, (df_result['prob']*2-1), marker='o', label='測定結果から求めた結果', color='blue')
plt.plot(thetas / np.pi, cos**2, label='代数的に求めた結果', color='red', linewidth=2)
rmse = sqrt(mean_squared_error(df_result['prob']*2-1, cos**2))
xlim = plt.xlim()
ylim = plt.ylim()
dy = ylim[1] - ylim[0]
plt.text(x=xlim[0], y=ylim[0]+0.1*dy, s=f'RMSE: {rmse:.3f}', fontsize=12)
plt.xlabel('θ / π', fontsize=15)
plt.ylabel('|<a|b>|^2', fontsize=15)
plt.legend(fontsize=12)
plt.show()
plt.close()

光の系でスワップテストを実装(ちゃんと読んでないですけど実験の提案だけかも)の論文がありました。

www.nature.com

まとめ

参考


量子コンピューティング 基本アルゴリズムから量子機械学習まで [ 情報処理学会出版委員会 ]