양자 분류기를 처음 짠다면 — QSVM·QNN·VQC와 PennyLane 구현

Quantum SVM, Quantum Neural Networks, Variational Quantum Circuits의 구조적 차이와 PennyLane 코드로 구현하는 VQC 이진 분류기, 실무 트레이드오프를 정리한다

2026-08-12 · 최초 발행 2025-12-12

양자 머신러닝을 처음 구현하려 하면 곧바로 선택의 기로에 선다. 커널 기반으로 갈 것인가, 파라미터화 회로로 갈 것인가. NISQ 시대의 제약 안에서 Quantum SVM(QSVM), Quantum Neural Networks(QNN), Variational Quantum Circuits(VQC)는 서로 다른 답을 준다. 이 글은 세 접근의 구조적 차이를 짚고, PennyLane으로 실제 동작하는 VQC 분류기를 코드로 보여준 뒤, 실무에서 마주치는 설계 트레이드오프를 정리한다.

커널이냐, 파라미터화 회로냐

QSVM은 양자 회로로 유도한 양자 커널(내적)로 클래스 간 경계를 분리하는 커널 기반 분류기다. 고차원 힐베르트 공간으로의 암묵적 매핑을 통해 비교적 얕은 회로로도 복잡한 결정 경계를 모델링할 수 있다는 게 강점이다.

QNN은 양자 회로를 뉴런·레이어처럼 해석해 파라미터화된 회로로 비선형 함수를 근사하는 모델이다. 측정 기대값을 출력으로 쓰고, 고전적 최적화기로 파라미터를 갱신하는 하이브리드 학습 구조를 취한다.

VQC는 이 둘을 잇는 범용 프레임워크에 가깝다. 파라미터화된 양자 게이트(앤자츠)와 데이터 인코딩 회로를 결합해 최적화 문제로 정식화한 것으로, QNN을 구현하는 단위로도 쓰인다. 목적함수는 측정값 기반의 비용 함수를 사용한다.

세 접근 모두에 공통으로 걸리는 설계 변수가 있다. 데이터 인코딩(앵글 임베딩, 아모리튜드 임베딩, ZZ-상호작용 기반 피처맵)은 특히 QSVM에서 모델 성능과 표현력을 좌우한다. 앤자츠 선택(Hardware-efficient vs Problem-inspired)은 회로 깊이와 잡음 민감도 사이의 상충 관계를 만들며, NISQ 환경에서는 얕은 회로가 실용적이다. 학습 루프는 측정→고전적 손실 계산→파라미터 갱신을 반복하는데, 샷 노이즈와 바이어스에 강한 SPSA, Adam, Natural Gradient 같은 최적화기가 선호된다. 유한 샷으로 기대값을 추정하면 분산이 발생하므로 샷 수를 늘릴수록 계산 비용·대기시간이 늘어나는 대신 분산은 줄어드는 트레이드오프도 항상 따라온다. 노이즈 저감에는 Zero-noise extrapolation, measurement error mitigation, subspace expansion이 실무적으로 쓰이고, 과적합 방지에는 회로 정규화(깊이·파라미터 수 제한), 조기 종료, 데이터 증강이 적용된다.

하이브리드 학습 파이프라인

아니오아니오데이터 입력(X, y)전처리 스케일링('-π~π'매핑)데이터 인코딩회로('Angle/Amplitude/ZZFeature Map')파라미터화된앤자츠('Hardware-efficient/Problem-inspired')측정 기대값 추정('Shots =N')손실계산('Cross-entropy/MSE/하드마진')'수렴 조건' 또는 '에폭 한도'도달 여부클래식최적화기('SPSA/Adam/NGD') 파라미터 갱신모델 고정 검증 수행'샷 노이즈' 또는 '측정 에러'과다 여부 증가 또는 '에러 완화' 적용

QSVM vs QNN vs VQC 비교

지표 QSVM QNN VQC
성능 작은 데이터·복잡 커널에 강점, 결정경계 안정적 표현력 높으나 초기화·최적화 민감 QNN의 일반형, 손실 설계 유연
확장성 커널 계산 비용 증가 우려, 미니배치 커널 필요 큐빗·깊이 증가 시 바렌 플래토 위험 앤자츠 설계로 깊이 제어 가능
일관성 결정적 예측, 커널 매개변수에 의존 초기값·샷에 따른 변동성 샷·최적화 설정에 따라 변동성
안정성 노이즈에 비교적 견고(얕은 회로) 노이즈 민감, 완화 필요 회로 설계에 따라 안정성 조절
운영 편의 커널 재사용·캐싱 용이 학습 루프·로그 관리 필요 실험 관리·하이퍼파라미터 탐색 유의

정량 평가는 하드웨어·회로·데이터에 따라 변동하므로, 도입 시점의 최신 런타임·미티게이션 기능은 별도로 확인해야 한다.

실무에서는 이렇게 쓴다

소규모 데이터의 비선형 분류는 피처 스케일링 후 ZZ 피처맵을 설계하고 QSVM으로 학습하며 커널 매트릭스를 캐싱하는 절차를 따른다. 데이터 수 n이 수백 이하일 때 커널 계산·메모리 비용이 수용 가능하고, 샷 수 2k~8k 범위에서 안정화되는 경향을 보인다.

분자·재료 특성 이진 분류는 분자 디스크립터를 PCA나 t-SNE로 축소한 뒤 Angle 임베딩과 얕은 VQC 분류기, ZNE(Zero-noise extrapolation)를 적용하는 흐름이다. 도메인 피처 엔지니어링이 성능을 좌우하므로 하드웨어 효율 앤자츠로 깊이를 최소화하는 것이 관건이다.

**이상탐지(금융·운영 로그)**는 슬라이딩 윈도우로 피처링한 뒤 원클래스 QSVM(양자 커널)으로 이상 점수를 매기고 임계값을 튜닝한다. 커널 하이퍼파라미터 감도 분석이 필수이며, 임계값은 Precision-Recall 균형을 기준으로 정한다.

커널 추정이 핵심인 과제는 Fidelity 기반 양자 커널로 다변량 하이퍼파라미터를 탐색하고 미니배치 커널로 근사하는 방식이다. n이 큰 경우 Nystrom 근사와 랜덤 서브샘플링을 병행해 대응한다. 커널 근사·캐싱·미니배치를 적용하면 O(n^2)이던 커널 계산 부담을 O(nm) 근사로 완화할 수 있다(n≫m인 경우).

PennyLane으로 구현하는 VQC 이진 분류기

Python 3.10+, pennylane 0.35 이상, scikit-learn 1.2 이상 환경(버전은 예시이며 최신 정보 확인 필요)에서 CPU만으로 실행 가능하고, 촬영(shots) 기반 추정을 사용한다.

# 실행 가능 예시: VQC로 make_moons 분류
import pennylane as qml
from pennylane import numpy as np
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 1) 데이터 준비
X, y = make_moons(n_samples=300, noise=0.2, random_state=42)
scaler = StandardScaler()
X = scaler.fit_transform(X)  # 2차원 -> 2 큐빗 앵글 임베딩
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)

# 2) 디바이스/회로 정의
n_qubits, n_layers, shots = 2, 2, 1000
dev = qml.device("default.qubit", wires=n_qubits, shots=shots)

@qml.qnode(dev)
def vqc(x, weights):
    qml.AngleEmbedding(x, wires=range(n_qubits))
    qml.StronglyEntanglingLayers(weights, wires=range(n_qubits))
    return qml.expval(qml.PauliZ(0))  # [-1, 1] 범위

def predict_proba(X, weights):
    exps = np.array([vqc(x, weights) for x in X])  # 기대값
    return (1 + exps) / 2.0  # [0, 1] 매핑

def bce_loss(y_true, p):
    eps = 1e-7
    return -np.mean(y_true * np.log(p + eps) + (1 - y_true) * np.log(1 - p + eps))

# 3) 파라미터 초기화 및 최적화
key = np.random.default_rng(0)
weights = 0.01 * key.standard_normal((n_layers, n_qubits, 3))
opt = qml.AdamOptimizer(stepsize=0.1)

for step in range(60):
    def loss_fn(w):
        p = predict_proba(X_train, w)
        return bce_loss(y_train, p)
    weights = opt.step(loss_fn, weights)
    if (step + 1) % 10 == 0:
        p_train = predict_proba(X_train, weights)
        p_test = predict_proba(X_test, weights)
        train_acc = np.mean((p_train > 0.5) == y_train)
        test_acc = np.mean((p_test > 0.5) == y_test)
        print(f"step {step+1:02d} - loss: {loss_fn(weights):.4f}, acc(train/test): {train_acc:.3f}/{test_acc:.3f}")

# 4) 최종 평가
p_test = predict_proba(X_test, weights)
y_pred = (p_test > 0.5).astype(int)
print("Test accuracy:", np.mean(y_pred == y_test))

샷 수를 늘리면 분산이 줄어드는 대신 학습 시간이 늘어나므로 균형을 맞춰야 한다. 샷을 2k에서 8k로 늘리면 분산이 약 50% 수준까지 줄고 수렴 속도도 개선되는 경향을 보인다. 초기화 스케일(예제의 0.01)과 레이어 수는 바렌 플래토 완화에 기여하고, 회로 깊이 제한·조기 종료·K-겹 교차검증은 일반화를 보장하는 데 쓰인다.

회로 설계와 최적화에서 실제로 갈리는 지점

회로 설계와 깊이 관리는 문제 영감 앤자츠나 얕은 하드웨어 효율 앤자츠를 우선 적용하고 깊이·2큐빗 게이트 수를 최소화하는 것이 모범사례다. 깊이를 늘리면 표현력은 올라가지만 노이즈와 샷 비용이 급증하는 트레이드오프가 뒤따른다.

최적화 안정화는 SPSA·Adam, 학습률 워밍업, 파라미터 재초기화 전략을 함께 쓰는 게 정석이다. 샷을 절약하는 추정 방식은 바이어스가 늘 수 있어 반복 수를 늘려 상쇄해야 한다.

데이터 인코딩은 스케일링과 피처 선택으로 큐빗 수를 최소화하고, 문제 구조를 반영한 상호작용 항을 포함시키는 것이 좋다. 인코딩 깊이가 과도하면 노이즈가 쌓이고, 너무 얕으면 표현력이 부족해지는 딜레마가 있다.

운영·보안 측면에서는 클라우드 양자 백엔드를 쓸 때 데이터를 최소한만 전송하고 식별자를 마스킹하며 잡 메타데이터를 관리해야 한다. 온프레미스 시뮬레이션은 안전하지만 속도·정확도에 한계가 있고, 클라우드는 대기열과 비용이 발생한다는 트레이드오프가 있다.

QSVM은 소규모·복잡 경계 문제에서 안정적인 커널 학습이 강점이고, QNN·VQC는 높은 표현력과 설계 유연성을 제공하는 대신 최적화와 노이즈 관리 역량이 성패를 좌우한다. 실무 도입은 얕은 회로, 보수적인 샷 수, 노이즈 저감, 교차검증을 기준으로 단계적으로 확대하는 편이 안전하다.

양자머신러닝QSVMQNNVQCPennyLane