양자 컴퓨터를 양자역학으로 이해하려 하기보다, 초고차원 복소 벡터에 행렬을 곱하고 마지막에 샘플링하는 계산기로서의 관점에서 설명한다.
양자 컴퓨터를 ‘양자역학’으로 이해하려고 하는 것은 돌아가는 길입니다. 그 실체는, ‘초고차원의 복소 벡터’에 ‘행렬’을 곱해 나가고, 마지막에 ‘샘플링’하는 것뿐인 계산기입니다.
신경망(Neural Network, NN)을 다뤄본 사람이라면, 사실 그리 이질감 없이 이해할 수 있는 구조를 하고 있습니다.
1비트(양자비트)는, 두 개의 복소수를 원소로 갖는 벡터에 지나지 않습니다.
[ \mathbf{v} = \begin{pmatrix} a \ b \end{pmatrix} ]
여기서 (|a|^2 + |b|^2 = 1) 이라는 제약(정규화 조건)만 있을 뿐입니다.
‘0과 1이 동시에 존재한다’라는 표현은, 단지 **‘벡터 안에 인덱스 0의 성분과 1의 성분이 둘 다 들어 있다’**라고 바꿔 말할 수 있습니다.
프로그램을 작성한다는 것은, 이 벡터 (\mathbf{v}) 에 대해 유니터리 행렬(벡터의 길이를 바꾸지 않는 행렬) (\mathbf{M}) 을 곱해, 새로운 벡터 (\mathbf{v}') 를 얻는 작업입니다.
[ \mathbf{v}' = \mathbf{M}\mathbf{v} ]
비트를 반전시키는 것, 혹은 ‘중첩(superposition)’을 만드는 조작도, 모두 특정한 성분을 가진 행렬을 순서대로 왼쪽에서 곱해 나가는 처리에 불과합니다.
계산이 끝난 뒤의 벡터 (\mathbf{v}_{final}) 을 우리는 직접 볼 수 없습니다. 이 점이 NN과 조금 비슷한 부분입니다.
최종적으로 수행되는 것은, ‘벡터의 각 성분의 절댓값의 제곱을 확률로 보고, 인덱스를 하나 뽑는’ 샘플링(관측) 작업입니다.
[ P(\text{index}=i) = |v_i|^2 ]
즉 양자 계산이란, **‘원하는 답의 인덱스가 선택될 확률이 높아지도록, 행렬 계산을 조합해 벡터의 가중치를 조정하는 게임’**입니다.
‘양자 컴퓨터는 병렬 계산이니까 빠르다’라는 설명은, 현재로서는 상당히 의심스럽거나 혹은 정확하지 않다고 여겨집니다.
확실히 (n) 비트가 있으면 (2^n) 차원의 벡터를 다룰 수 있습니다. 30비트면 10억 차원입니다. 한 번의 행렬 연산으로 이 10억 원소를 일괄 업데이트할 수 있다는 것은 얼핏 대단해 보이지만, 아래와 같은 문제가 있습니다.
양자 컴퓨터가 고전 컴퓨터를 압도할 수 있음이 수학적으로 증명되어 있는 문제는 극히 일부뿐입니다.
많은 실용적 문제(기계학습이나 최적화 등)에 대해서 ‘정말로 행렬 연산 횟수나 샘플링 횟수까지 포함해서 고전보다 빨라지는가?’는 현재도 연구 단계이며, 아직 결론이 나지 않았습니다.
‘차원이 크니까 빠르다’라는 단순한 이야기가 아니라, ‘그 큰 차원을 살릴 수 있는 특수한 구조의 문제가 얼마나 있느냐’라는, 지극히 제한적인 승부를 하고 있는 것이 현 상황입니다.