GPU 가속 병렬 PCA: NIPALS와 Gram‑Schmidt 기반 알고리즘 비교
초록
본 논문은 대규모 데이터셋에 적용되는 두 가지 반복형 주성분 분석(PCA) 알고리즘, 기존 NIPALS‑PCA와 새롭게 제안된 Gram‑Schmidt 정규화 기반 GS‑PCA를 GPU 환경에서 구현한다. CUBLAS를 이용한 GPU 구현이 CPU 기반 CBLAS 구현보다 최대 12배 빠른 성능을 보이며, GS‑PCA는 정규 직교성을 완벽히 유지해 NIPALS‑PCA가 초기에 겪는 직교성 손실 문제를 해결한다.
상세 분석
이 연구는 두 가지 핵심 문제—연산 속도와 직교성 유지—에 동시에 접근한다. 첫 번째로, NIPALS‑PCA는 반복적으로 회귀와 결함 보정을 수행하면서 각 성분을 순차적으로 추출한다. 그러나 행렬‑벡터 연산에서 누적되는 부동소수점 오차 때문에 점차 직교성이 손상되어, 실제로는 첫 몇 개 성분만 신뢰할 수 있다. 이를 보완하기 위해 저자는 Gram‑Schmidt(GS) 재직교화 절차를 도입한 GS‑PCA를 설계하였다. CGS(클래식 GS)는 수치적으로 불안정하지만, 반복적 적용과 MGS(수정 GS)와 유사한 재정규화를 통해 안정성을 확보한다. 알고리즘 흐름은 각 반복 단계에서 현재까지 계산된 로딩(열)과 스코어(행) 벡터에 대해 상호 직교화(A·U, B·V) 연산을 수행하고, 정규화 후 다시 회귀를 진행한다. 이렇게 하면 모든 성분이 서로 직교함을 보장하고, K=N인 경우 전체 SVD와 동일한 결과를 제공한다.
두 번째로, 구현 측면에서는 CUDA 기반 CUBLAS 라이브러리를 활용해 Level‑1,2,3 BLAS 연산을 GPU에서 병렬 처리한다. 핵심 연산은 dgemv(행렬‑벡터 곱), daxpy(벡터 합), dnrm2(벡터 노름), dger(외적에 의한 행렬 업데이트)이며, 이들 모두가 GPU 메모리 상에서 고속으로 수행된다. CPU 구현은 GNU Scientific Library(GSL)의 CBLAS를 이용해 동일한 연산 흐름을 유지하지만, 메모리 대역폭과 연산량에서 GPU에 비해 현저히 뒤처진다. 실험에서는 M×N 크기의 랜덤 행렬(예: M=1.5×10⁴, N=M/2)과 K=10을 기준으로, GPU가 CPU보다 최대 12배 빠른 실행 시간을 기록했다. 또한 GS‑PCA는 NIPALS‑PCA에 비해 5~7% 정도만 추가 연산 비용이 발생했으며, 이는 직교성 보장을 위한 재직교화 단계에서 발생한다.
결과적으로, GS‑PCA는 수치적 정확도와 직교성 측면에서 기존 방법을 능가하면서도, GPU 가속을 통해 실용적인 실행 속도를 확보한다. 이는 대규모 고차원 데이터 분석, 실시간 신호 처리, 머신러닝 전처리 등에서 PCA를 적용해야 하는 상황에 직접적인 이점을 제공한다.
댓글 및 학술 토론
Loading comments...
의견 남기기