지난 포스팅에서 우리는 인공 뉴런의 핵심인 MAC(Multiply-Accumulate) 연산이 하드웨어, 특히 곱셈기(Multiplier) 면적과 메모리 대역폭 측면에서 얼마나 비싼 비용을 치르는지 확인했습니다.
MAC 연산이 끝나면, 그 결과값(Y)은 다음 레이어로 넘어가기 전에 반드시 활성화 함수(Activation Function)라는 관문을 통과해야 합니다. 소프트웨어 개발자에게는 torch.relu()나 torch.sigmoid() 같은 함수 호출 한 번이면 끝나는 간단한 작업입니다. 하지만 하드웨어 엔지니어에게 활성화 함수는 “연산의 복잡도(Complexity)”와 “실리콘 면적(Area)”을 조절해야 하는 골치 아픈 문제입니다.
이번 글에서는 AI 딥러닝의 비선형성(Non-linearity)을 담당하는 활성화 함수들이 실리콘 위에서 어떻게 구현되는지, 그리고 왜 현대 NPU들이 Sigmoid를 기피하고 ReLU를 선할 수밖에 없는지 그 물리적인 이유를 파헤쳐 보겠습니다.
1. 왜 비선형 함수가 필요한가?
하드웨어 비용을 논하기 전에, 왜 굳이 비싼 비용을 들여 활성화 함수를 써야 하는지 짚고 넘어가야 합니다. 만약 활성화 함수가 없다면, 딥러닝 모델은 아무리 깊게 쌓아도(Deep Layer) 결국 하나의 거대한 선형 변환(Linear Transformation)에 불과해집니다.
복잡한 데이터의 패턴을 배우기 위해서는 반드시 선형성을 깨트리는 비선형 함수가 필요합니다. 문제는 이 비선형 함수를 하드웨어로 구현하는 것이 생각보다 까다롭다는 점입니다.
2. Sigmoid & Tanh: 하드웨어가 싫어하는 초월함수
초기 딥러닝 모델에서 주로 사용되던 Sigmoid와 Tanh(Hyperbolic Tangent) 함수의 수식을 봅시다.
여기서 하드웨어 엔지니어를 절망케 하는 항은 바로 지수함수 ex (Exponential)입니다.
덧셈, 곱셈과 달리 지수함수는 초월함수(Transcendental Function)입니다. 디지털 논리회로(Digital Logic)는 기본적으로 0과 1의 사칙연산 기반이기에, 초월함수를 정확하게 계산하는 하드웨어는 존재하지 않습니다. 오직 ‘근사(Approximation)’만 있을 뿐입니다.
하드웨어에서 ex를 구현하는 대표적인 방법 3가지는 다음과 같습니다.
- 테일러 급수 (Taylor Series):
- 비용: 수많은 곱셈기와 덧셈기가 필요합니다. x의 범위가 넓을수록 항이 많이 필요해져 연산량(Latency)이 폭발합니다.
- CORDIC 알고리즘: 회전 변환을 이용해 반복적으로 계산하는 방식.
- 비용: 곱셈기는 덜 쓰지만, 여러 클럭 사이클(Multi-cycle)을 소모하므로 처리 속도(Throughput)가 느립니다.
- Look-Up Table (LUT): 미리 계산된 값들을 메모리에 저장해두고 꺼내 쓰는 방식. (가장 많이 사용됨)
3. LUT 구현의 딜레마: 면적(Area) vs 정밀도(Precision)
대부분의 NPU는 Sigmoid나 Tanh를 구현하기 위해 LUT(Look-Up Table) 방식을 사용합니다. x값이 입력되면, 그에 대응하는 y값을 메모리(ROM/RAM)에서 읽어오는 것입니다.
하지만 여기에는 치명적인 트레이드오프가 존재합니다.
- 정밀도를 높이려면: 테이블의 크기가 커집니다. 예를 들어, 16-bit 입력에 대한 모든 결과값을 저장하려면
- 용량의 메모리가 필요합니다. 뉴런 하나를 위해 이 정도 온칩 메모리(SRAM)를 쓰는 것은 미친 짓입니다.
- 면적을 줄이려면: 테이블 크기를 줄여야 합니다. 대신 구간을 나누어 직선으로 근사하는 PWL(Piecewise Linear Approximation) 방식을 씁니다. 하지만 이 경우 제어 로직이 복잡해지고, 근사 오차(Error)로 인해 모델의 정확도가 떨어질 수 있습니다.
결국 Sigmoid는 하드웨어 입장에서 “비싼 메모리를 잡아먹거나” 아니면 “연산기를 혹사시키는” 골칫덩어리입니다.
4. ReLU: 하드웨어 설계자의 구세주
2012년 AlexNet의 등장과 함께 ReLU(Rectified Linear Unit)가 표준이 되었을 때, 가장 환호한 것은 AI 연구자가 아니라 하드웨어 엔지니어들이었을 겁니다.
이 수식이 하드웨어로 구현될 때의 비용은 얼마나 될까요? 놀랍게도 거의 공짜(Near Zero Cost)에 가깝습니다.
하드웨어에서 숫자는 보통 2의 보수(Two’s Complement)로 표현됩니다. 2의 보수 체계에서 양수와 음수를 판별하는 방법은 가장 앞쪽 비트인 MSB(Most Significant Bit, 부호 비트)만 보면 됩니다.
- MSB = 0 (양수): 입력값 x를 그대로 통과시킵니다. (Pass)
- MSB = 1 (음수): 모든 비트를 0으로 만듭니다. (Masking)
논리 회로로 구현하면 멀티플렉서(MUX) 1개 혹은 AND 게이트 몇 개면 끝납니다. 수천 개의 게이트가 필요한 지수함수 구현이나, 거대한 면적을 차지하는 LUT와 비교하면 ReLU는 면적과 전력 소모가 0에 수렴합니다.
5. 숨겨진 이점: 희소성(Sparsity)과 Zero-Skipping
ReLU가 하드웨어에 주는 선물은 ‘구현 비용이 싸다’는 것에서 끝나지 않습니다. 진짜 선물은 바로 ‘0(Zero)’입니다.
ReLU를 통과하면 입력 데이터의 약 50% 이상이 정확히 0이 됩니다. 이를 데이터의 희소성(Sparsity)이라고 합니다. 하드웨어 아키텍처에서는 이 ‘0’을 적극적으로 활용하여 성능을 최적화합니다.
- 메모리 절약: 0인 데이터는 DRAM에 저장하거나 전송할 필요가 없습니다. (Compression)
- 연산 생략 (Zero-Skipping): 입력이 0이면 곱셈기를 아예 돌리지 않도록(Clock Gating) 설계하여 전력을 획기적으로 아낄 수 있습니다.
Sigmoid는 결과값이 0에 가까워질 뿐 정확히 0이 되지 않기 때문에, 이런 희소성 기반의 최적화를 적용하기 어렵습니다. 반면 ReLU는 하드웨어에게 “이 데이터는 계산 안 해도 돼!”라고 알려주는 신호등 역할을 합니다.
6. 최신 트렌드: GELU와 Swish의 등장
최근 Transformer 모델(BERT, GPT)이나 EfficientNet에서는 GELU나 Swish 같은 함수가 쓰입니다.
이 함수들은 ReLU의 장점과 곡선의 부드러움을 모두 가지고 있어 정확도가 높습니다. 하지만 하드웨어 관점에서는 다시 “Sigmoid의 악몽”이 되살아나는 것입니다.
그래서 최신 NPU들은 이 함수들을 처리하기 위해 “ReLU와 유사한 형태의 구간 선형 근사(Hardware-friendly approximation)” 버전을 사용하거나, 아주 작은 전용 LUT 유닛을 특수 목적으로 배치하는 전략(Special Function Unit, SFU)을 취합니다. 정확도와 하드웨어 비용 사이의 줄타기는 여전히 현재 진행형입니다.
7. 결론: 하드웨어 친화적인 알고리즘이 살아남는다
소프트웨어 연구자들은 정확도(Accuracy)를 1% 올리기 위해 복잡한 수식을 도입하지만, 시스템 아키텍트는 그 수식이 실리콘 위에서 차지할 면적과 전력을 걱정합니다.
결국 AI 딥러닝의 역사는 “하드웨어로 구현하기 쉬운 구조”가 승리하는 과정이었습니다. Sigmoid가 ReLU로 대체된 것은 학습 효율 때문이기도 하지만, 하드웨어 구현 효율성(Hardware Efficiency)이 폭발적으로 좋았기 때문에 대세가 될 수 있었습니다.
다음 글에서는 GPU와 NPU가 CPU를 제치고 AI 연산의 패권을 쥘 수 있었던 핵심 이유, “행렬곱(MatMul)과 병렬 처리의 미학”에 대해 다루겠습니다.