CNN 기반 얼굴 인식 구현 및 병렬 학습 최적화
초록
본 논문은 합성곱 신경망(CNN)의 전방 전달과 역전파 과정을 상세히 분석하고, 이를 Java 환경에서 얼굴 인식 문제에 적용한다. 또한 다중 코어 CPU를 활용한 병렬 학습 전략을 제안하고, 실제 실행 시간 측정을 통해 이론적 최대 가속도와 병렬 효율을 검증한다.
상세 분석
논문은 먼저 CNN의 기본 구조와 핵심 연산인 컨볼루션, 풀링, 활성화 함수를 수식적으로 정리하고, 각 층에서 발생하는 텐서 연산이 어떻게 메모리와 연산량을 결정하는지 설명한다. 전방 전달 단계에서는 입력 이미지가 여러 필터와 stride, padding 설정에 따라 특징 맵으로 변환되는 과정을 구체적인 예시와 함께 제시하고, 역전파 단계에서는 손실 함수에 대한 그래디언트를 각 파라미터(필터 가중치, 편향)로 전파하는 체인 룰을 상세히 전개한다. 특히, 역전파에서 컨볼루션 연산의 전치(transpose)와 패딩 처리에 따른 경계 효과를 어떻게 보정하는지가 핵심 포인트로 강조된다.
구현 부분에서는 Java 기반 딥러닝 프레임워크를 직접 구축했으며, 주요 클래스는 Layer, Conv2D, Pooling, FullyConnected, Optimizer 등으로 구성된다. 행렬 연산은 Apache Commons Math와 ND4J 라이브러리를 활용해 고성능 벡터화 코드를 작성했으며, 메모리 재사용을 위해 버퍼 풀링 기법을 도입했다. 데이터 전처리 단계에서는 얼굴 이미지 정규화, 데이터 증강(회전, 확대, 좌우 반전) 등을 수행해 모델의 일반화 능력을 향상시켰다.
병렬 전략은 크게 두 축으로 나뉜다. 첫 번째는 데이터 병렬로, 배치 단위의 입력을 여러 스레드에 분산시켜 각 스레드가 독립적인 전·역전파를 수행하도록 설계했다. 이때 파라미터 동기화는 매 배치 종료 시점에 Barrier와 AtomicReference를 이용해 구현했으며, 파라미터 집계는 평균화 방식으로 수행한다. 두 번째는 계층 병렬로, 컨볼루션 연산 자체를 다중 코어에 분할해 각 필터별 연산을 동시에 진행한다. 이를 위해 OpenMP와 유사한 Java Fork/Join 프레임워크를 활용했으며, 메모리 접근 충돌을 방지하기 위해 각 스레드에 전용 작업 버퍼를 할당했다.
성능 평가에서는 실제 얼굴 데이터셋(LFW)으로 실험을 진행했으며, 단일 코어 기준 전방 전달 1.2 초, 역전파 2.8 초였던 것이 8코어 환경에서 전방 0.18 초, 역전파 0.42 초로 단축되었다. 이론적 최대 가속도는 Amdahl’s Law에 따라 7.9배였으며, 측정된 가속도는 6.5배로 병렬 효율은 약 82%에 달한다. 병목 현상은 주로 파라미터 동기화 단계와 메모리 대역폭 제한에서 발생했으며, 향후 GPU 기반 구현이나 파라미터 서버 아키텍처 도입으로 개선 가능성을 제시한다.
댓글 및 학술 토론
Loading comments...
의견 남기기