콘텐츠로 이동

Lab 6. 양자 회귀 (VQR)

실습 실행: Google Colab에서 바로 실행

학습 목표

  • 변분 양자 회귀(VQR)로 \(y = x_1 \times x_2\) 문제를 학습한다
  • Lab 5(MLP)와 동일한 데이터, 동일한 스케일링으로 공정하게 비교한다
  • 양자 회로의 출력 \([-1, 1]\)을 \([0, 1]\)로 변환하는 방법을 이해한다

핵심 개념

VQR 구조

q0: -RY(x1)-●--[ -RY(w1)-●- ] x n_layers -- <Z>
q1: -RY(x2)-X--[ -RY(w2)-X- ]
    |Encoding|  |----- Ansatz -----|          |Meas|

인코딩은 Lab 4의 Angle Encoding + CNOT이고, Ansatz는 RY + CNOT을 반복한다. ⟨Z⟩ ∈ [-1, 1]이므로 (⟨Z⟩ + 1) / 2로 [0, 1]에 매핑한 뒤, Lab 5와 동일한 역스케일링으로 원래 y 범위를 복원한다.

Lab 5와의 비교 포인트

MLP (Lab 5) VQR (Lab 6)
모델 Linear → Tanh → Linear → Sigmoid RY+CNOT → Ansatz → ⟨Z⟩
프레임워크 PyTorch PennyLane
출력 범위 [0, 1] (Sigmoid) [-1, 1] → [0, 1] 변환
데이터/스케일링 동일 동일
분할 동일 (seed=42) 동일

Lab 5와 동일한 데이터

공정한 비교를 위해 데이터, 스케일링, 분할 모두 Lab 5와 동일하게 사용한다.

Lab 5와 동일한 seed, 동일한 분할이다. 이것이 보장되어야 MLP vs VQR 비교가 의미 있다.

회로 정의

@qml.qnode(dev)
def vqr_circuit(inputs, weights):
    # 인코딩: RY + CNOT (Lab 4에서 배운 구조)
    qml.RY(inputs[0], wires=0)
    qml.RY(inputs[1], wires=1)
    qml.CNOT(wires=[0, 1])
    # Ansatz: RY + CNOT 반복
    for l in range(n_layers):
        qml.RY(weights[l, 0], wires=0)
        qml.RY(weights[l, 1], wires=1)
        qml.CNOT(wires=[0, 1])
    return qml.expval(qml.PauliZ(0))

회로 시각화

비용 함수와 예측 함수

⟨Z⟩ ∈ [-1, 1]을 (⟨Z⟩ + 1) / 2로 [0, 1]에 매핑한다. 이것은 MLP의 Sigmoid 출력과 동일한 범위이다.

학습 (실시간 시각화)

시각화: 학습 곡선

VQR 학습 곡선

시각화: 예측 vs 실제

VQR 예측과 실제 비교

과제 1: n_layers 비교

n_layers를 1과 3으로 각각 실행하라. 파라미터가 2개(n_layers=1)일 때 y = x₁ × x₂를 학습할 수 있는가?

# 학생 수정: n_layers = 1 → 재실행 (파라미터 2개)
# 다시: n_layers = 3 → 재실행 (파라미터 6개)
# 학습 곡선과 scatter를 비교하라

과제 2: 학습률 비교

lr을 0.001과 0.1로 각각 실행하라. VQR에서도 MLP와 같은 패턴(느림/발산)이 나타나는가?

# 학생 수정: lr = 0.001 → 재실행
# 다시: lr = 0.1 → 재실행

과제 3: 출력 변환 이해

VQR의 출력 변환 (⟨Z⟩ + 1) / 2가 왜 필요한지 확인하라. 변환 없이 ⟨Z⟩를 직접 사용하면 어떻게 되는가?

힌트: ⟨Z⟩의 범위는 [-1, 1]이고 y_sc의 범위는 [0, 1]이다. 변환 없이 ⟨Z⟩를 사용하면, 음수 예측이 나올 수 있고 MSE 계산에서 범위 불일치가 생긴다. MLP의 Sigmoid가 [0, 1]을 보장하는 것과 같은 역할이다.