---
# System prepended metadata

title: 量子回路学習(QCL)
tags: [量子計算]

---

###### tags: `量子計算`

# 量子回路学習(QCL)

QCL(Quantum Circuit Learning)とは，量子コンピュータを用いて機械学習を行うためのアルゴリズムである．
機械学習とは，ニューラルネットワークを用いて入力に対して出力する関数を近似して，新しいデータに対する結果を予測する作業である．
QCLでは，**ニューラルネットワークを量子回路に置き換える**．QCLのメリットとして，指数関数的に多い基底による表現力の向上や，ユニタリー性による過学習の防止などがある．

> 任意の関数をユニタリー行列からどうやって決める？読み取る．

## QCLの手順
1. 学習データ(入力データと教師データのセット)を準備する．
2. ゲート$U_{in}(x)$と$U(\theta)$を準備する．
3. 入力状態$\left|\psi_{in}\right>$を$\left|\psi_{in}\right>=U_{in}(x)\left|0\right>$により生成する．
4. 出力状態$\left|\psi_{out}\right>$を$\left|\psi_{out}\right>=U(\theta)\left|\psi_{in}\right>$により計算し，そこから得られる期待値$M(\theta) = \left<\psi_{out}\right|\hat M\left|\psi_{out}\right>$を計算する．
5. コスト関数$L(\theta)$を定義し，それを最小化するような$\theta=\theta^*$を探す．コスト関数$L(\theta)$は，出力データ$y_i(\theta)=F_i(M(\theta))$を準備し，教師データとのズレ具合を表すように定義する．
> コスト関数を定義する

6. $y(\theta^*)$が欲しい予測モデルである．

まとめると，QCLは以下の式を$\theta$について最小化する問題に帰着できる．
\begin{eqnarray}
	L\left(F(\left<0\right|U_{in}(x)^\dagger U(x)^\dagger(\theta)\hat M U(\theta)U_{in}\left|0\right>)\right)
\end{eqnarray}

> $\theta$はSU(n)における回転角という解釈でいい？

## 実装
```python=
import numpy as np
import matplotlib.pyplot as plt
from functools import reduce
```

### 
```python=
########  パラメータ  #############
nqubit = 3 ## qubitの数
c_depth = 3 ## circuitの深さ
time_step = 0.77  ## ランダムハミルトニアンによる時間発展の経過時間

## [x_min, x_max]のうち, ランダムにnum_x_train個の点をとって教師データとする.
x_min = - 1.; x_max = 1.;
num_x_train = 50

## 学習したい1変数関数
func_to_learn = lambda x: np.sin(x*np.pi)

## 乱数のシード
random_seed = 0
## 乱数発生器の初期化
np.random.seed(random_seed)
```

## 学習データの準備
```python=
#### 教師データを準備
x_train = x_min + (x_max - x_min) * np.random.rand(num_x_train)
y_train = func_to_learn(x_train)

# 現実のデータを用いる場合を想定し、きれいなsin関数にノイズを付加
mag_noise = 0.05
y_train = y_train + mag_noise * np.random.randn(num_x_train)

plt.plot(x_train, y_train, "o"); plt.show()
```
機械学習では現実的な学習に備えて，理想的なフィッティング関数にノイズを付加させ，教師データを生成する．
\begin{eqnarray}
	y_{train} = \sin (\pi x) + \mathrm{random}(x)
\end{eqnarray}

## 入力状態の生成
\begin{eqnarray}
	U_{in} =&& \prod_j R_j^z\left(\cos^{-1}x^2\right) R_j^y\left(\sin^{-1}x\right) \\
	=&& \exp\left(i \frac{\cos^{-1}x^2}{2} Z_j\right)\exp\left(i \frac{\sin^{-1}x}{2} Y_j\right)
\end{eqnarray}


> \begin{eqnarray}
	> R_x(\theta) = \exp\left(i\frac{\theta}{2}X\right)
> \end{eqnarray}

## 古典的な機械学習
1. 学習データを準備する．
2. ニューラルネットワークを決定する．
3. コスト関数を定義して，それを最小化するようにニューラルネットワークを訓練し直す．


## 参考文献
[Quantum Native Dojo QCL](https://dojo.qulacs.org/ja/latest/notebooks/5.2_Quantum_Circuit_Learning.html)
[Quantum Circuit Learning](https://arxiv.org/abs/1803.00745)
