Basis state 준비
고전 비트열 x를 계산기저 상태 |x\rangle로 준비하려면 1인 비트에 X를 적용합니다.
$$
|0000\rangle \xrightarrow{X_1X_3} |0101\rangle
$$균등중첩
모든 입력을 동시에 탐색하려면 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
실수 데이터 x를 회전각으로 넣을 수 있습니다.
$$
R_y(x)|0\rangle
=
\cos{x\over2}|0\rangle+\sin{x\over2}|1\rangle
$$데이터 차원만큼 큐비트 또는 반복 업로드가 필요하지만, amplitude encoding보다 준비가 단순합니다.
Amplitude encoding
정규화된 벡터 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
$$표현은 압축적이지만, 임의 상태 준비 회로는 일반적으로 비쌉니다. 데이터 로딩 비용이 알고리즘 이점을 먹어버릴 수 있습니다.
상태 준비 체크리스트
- 데이터를 basis, angle, amplitude 중 무엇으로 넣는가?
- 상태 준비 회로 깊이가 알고리즘 본체보다 크지 않은가?
- 정규화 조건이 맞는가?
- uncompute가 필요한 중간 데이터인가?
정규화부터 확인하기
상태 준비에서 가장 먼저 확인할 조건은 확률합입니다. 복소 진폭 \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입니다. 상태 준비가 제대로 되었는지 확인할 때는 항상 이 확률합부터 봅니다.
단일 큐비트 상태 준비
실수 진폭만 있는 단일 큐비트 상태는 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로 상태를 준비하는 방식입니다.
여러 큐비트 상태 준비의 재귀 구조
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 준비 비용도 대체로 지수적으로 커집니다. 상태 표현은 압축적이지만, 그 상태를 실제로 만드는 비용까지 자동으로 압축되는 것은 아닙니다.
데이터 로딩 병목
양자 머신러닝 설명에서 amplitude encoding은 자주 매력적으로 보입니다. 2^n차원 벡터를 n큐비트로 표현할 수 있기 때문입니다. 하지만 입력 벡터가 고전 메모리에 있다면, 그 벡터를 양자상태로 올리는 회로가 필요합니다.
만약 상태 준비가 O(2^n)이면 이후 알고리즘이 빠르더라도 전체 이점이 사라질 수 있습니다. 그래서 회로설계 문서에서는 “상태를 어떻게 표현할까”와 “그 상태를 어떻게 싸게 준비할까”를 분리해서 봐야 합니다.