@me가져온 글 · 사람 검토

상태 준비

상태 준비는 알고리즘이 시작되는 지점입니다. 데이터를 어떤 양자상태로 올릴지에 따라 회로 깊이와 전체 이점이 결정됩니다.

## Basis state 준비 {#basis}

고전 비트열 $x$를 계산기저 상태 $|x\rangle$로 준비하려면 1인 비트에 X를 적용합니다.

$$
|0000\rangle \xrightarrow{X_1X_3} |0101\rangle
$$

## 균등중첩 {#uniform}

모든 입력을 동시에 탐색하려면 Hadamard를 전체 큐비트에 적용합니다.

$$
H^{\otimes n}|0^n\rangle
=
{1\over\sqrt{2^n}}\sum_{x=0}^{2^n-1}|x\rangle
$$

Deutsch-Jozsa, Bernstein-Vazirani, Grover의 시작점입니다.

## Angle encoding {#angle}

실수 데이터 $x$를 회전각으로 넣을 수 있습니다.

$$
R_y(x)|0\rangle
=
\cos{x\over2}|0\rangle+\sin{x\over2}|1\rangle
$$

데이터 차원만큼 큐비트 또는 반복 업로드가 필요하지만, amplitude encoding보다 준비가 단순합니다.

## Amplitude encoding {#amplitude}

정규화된 벡터 $v\in\mathbb{C}^{2^n}$를 진폭으로 직접 올리는 방식입니다.

$$
v=(v_0,\dots,v_{2^n-1})
\quad\Rightarrow\quad
|v\rangle=\sum_i v_i|i\rangle
$$

표현은 압축적이지만, 임의 상태 준비 회로는 일반적으로 비쌉니다. 데이터 로딩 비용이 알고리즘 이점을 먹어버릴 수 있습니다.

## 상태 준비 체크리스트 {#check}

1. 데이터를 basis, angle, amplitude 중 무엇으로 넣는가?
2. 상태 준비 회로 깊이가 알고리즘 본체보다 크지 않은가?
3. 정규화 조건이 맞는가?
4. uncompute가 필요한 중간 데이터인가?

## 정규화부터 확인하기 {#normalization}

상태 준비에서 가장 먼저 확인할 조건은 확률합입니다. 복소 진폭 $\alpha_i$를 직접 지정한다면 아래가 반드시 1이어야 합니다.

$$
\sum_i |\alpha_i|^2=1
$$

예를 들어 벡터 $(1,2,0,1)$을 2큐비트 진폭으로 올리고 싶다면 norm은 $\sqrt{1^2+2^2+0^2+1^2}=\sqrt6$입니다.

$$
|v\rangle
=
{1\over\sqrt6}|00\rangle
+{2\over\sqrt6}|01\rangle
+0|10\rangle
+{1\over\sqrt6}|11\rangle
$$

측정확률은 각각 $1/6,4/6,0,1/6$입니다. 상태 준비가 제대로 되었는지 확인할 때는 항상 이 확률합부터 봅니다.

## 단일 큐비트 상태 준비 {#single-qubit-prepare}

실수 진폭만 있는 단일 큐비트 상태는 $R_y$ 하나로 만들 수 있습니다.

$$
R_y(\theta)|0\rangle
=
\cos{\theta\over2}|0\rangle+\sin{\theta\over2}|1\rangle
$$

원하는 상태가 $\alpha|0\rangle+\beta|1\rangle$이고 $\alpha,\beta$가 실수라면 $\alpha=\cos(\theta/2)$, $\beta=\sin(\theta/2)$를 맞추면 됩니다.

상대위상이 필요하면 $R_z$를 함께 씁니다.

$$
|\psi\rangle
=
\cos{\theta\over2}|0\rangle
+e^{i\phi}\sin{\theta\over2}|1\rangle
$$

이 형태는 Bloch sphere의 극각 $\theta$와 방위각 $\phi$로 상태를 준비하는 방식입니다.

## 여러 큐비트 상태 준비의 재귀 구조 {#recursive-prepare}

2큐비트 상태를 첫 큐비트 기준으로 나누면 아래처럼 쓸 수 있습니다.

$$
|\psi\rangle
=
\alpha|0\rangle|\psi_0\rangle
+\beta|1\rangle|\psi_1\rangle
$$

먼저 첫 큐비트에 $\alpha,\beta$를 만들고, 첫 큐비트가 0일 때는 $|\psi_0\rangle$, 1일 때는 $|\psi_1\rangle$을 controlled preparation으로 만듭니다. 이 논리를 반복하면 임의 $n$큐비트 상태 준비가 가능합니다.

다만 임의 상태는 $2^n$개의 진폭을 갖습니다. 따라서 일반적인 amplitude encoding 준비 비용도 대체로 지수적으로 커집니다. 상태 표현은 압축적이지만, 그 상태를 실제로 만드는 비용까지 자동으로 압축되는 것은 아닙니다.

## 데이터 로딩 병목 {#data-loading-warning}

양자 머신러닝 설명에서 amplitude encoding은 자주 매력적으로 보입니다. $2^n$차원 벡터를 $n$큐비트로 표현할 수 있기 때문입니다. 하지만 입력 벡터가 고전 메모리에 있다면, 그 벡터를 양자상태로 올리는 회로가 필요합니다.

만약 상태 준비가 $O(2^n)$이면 이후 알고리즘이 빠르더라도 전체 이점이 사라질 수 있습니다. 그래서 회로설계 문서에서는 “상태를 어떻게 표현할까”와 “그 상태를 어떻게 싸게 준비할까”를 분리해서 봐야 합니다.