[CS231n] 강의7. Training Neural Networks (Activation Function, Weight Initialization, Batch Normalization, Transfer Learning) 리뷰
본 글은 2021년 4월에 강의한 스탠포드 대학의 “Convolutional Neural Networks for Visual Recognition” 2021년 강의를 듣고 정리한 내용입니다. 개인 공부 목적으로 작성되었으며, 설명이 맞지 않거나 글 오타가 있으면 알려주시길 바랍니다.
- 원본 링크 : cs231n.stanford.edu
- 한글 번역 링크 : aikorea.org - cs231n
- 강의 링크 : youtube - 2017 Spring (English)
Mini-batch SGD
- 미니 배치 SGD의 과정은 다음과 같다.
- 배치(batch) : GPU가 한번에 처리하는 데이터의 묶음 1
- 배치 단위의 데이터를 샘플링한다.
- 계산 그래프(computational graph)를 통해 순전파(forward pass)를 수행하여 손실(loss)을 계산한다.
- 역전파(backpropagation)를 통해 파라미터별 그레이디언트를 계산한다.
- 계산된 그레이디언트를 바탕으로 파라미터 값을 업데이트한다.
- 위 과정을 반복한다.
Training Neural Networks
- 이 글에서 다루는 것은 다음과 같다.
- 활성화 함수(Activation Function): Sigmoid, tanh, ReLU, Leaky ReLU, ELU, SELU, Maxout, Swish
- 데이터 전처리(Data Preprocessing): 평균 차감(Mean Subtraction) 및 정규화(Normalization)
- 가중치 초기화(Weight Initialization): 가중치 크기에 따른 문제점, Xavier 초기화, He 초기화
- 배치 정규화(Batch Normalization): 원리, 수식, 장단점
- 전이 학습(Transfer Learning): 사전 학습 가중치 활용 전략
Activation Functions

- 입력 이미지가 들어와 가중치 $W$와 곱해진다.
-
이후, 활성화 함수를 통과한다.
- 다음 그림은 활성화 함수의 종류를 보여주고 있다.

Sigmoid

- 시그모이드(Sigmoid)는 x값을 받아서 0~1사이의 값으로 뭉갠다(squash).
- 시그모이드는 뉴런의 발사 주기(firing rate)를 해석하기에 적합하기에 역사적으로 자주 쓰였다.
- 발사하지 않으면 0, 포화된(saturated) 발사는 1로 가정한다.
-
하지만 시그모이드는 3가지 문제점이 존재한다.
- 1. Saturated neurons kill the gradients
- 시그모이드는 포화가 되면 그레이디언트를 없앤다.
- 활성화가 0 또는 1의 어느 한쪽 끝에서 포화되면, 그레이디언트는 거의 0이 된다.

- 먼저 x=-10일 때 그레이디언트는 0에 가까워지고 시그모이드 기울기는 평평해진다.
- x=0일 때는 그레이디언트 흐름이 원활하게 유지된다.
-
x=10일 때도 x=-10일 때와 마찬가지로 양 극단에서 포화되어 그레이디언트가 0에 수렴한다.

-
결국 하위 레이어로 전달되는 역전파 그레이디언트가 0에 수렴하여 가중치가 갱신되지 않는다.
- 2. Sigmoid outputs are not zero-centered
- 뉴런의 뒤쪽 레이어 뉴런들이 0이 중심이 아닌 데이터를 얻기 때문에 경사하강법의 역학(dynamics)에 영향을 미치게 된다.

- 뉴런의 입력이 항상 양수이면 어떻게 될까?
- 모든 $w_i$에 대한 그레이디언트 부호는 upstream scalar gradient 부호와 동일해진다.

- 즉, 모든 x가 양수라면 local gradient는 전부 양수 또는 전부 음수가 된다.
- 가중치에 대한 그레이디언트 업데이트를 할 때 원치 않은 지그재그 경로가 될 수 있다.
-
따라서, 입력 x가 양수와 음수를 모두 가지고 있다면, 전부 같은 방향으로 업데이트되는 일은 발생하지 않을 것이다. 2
- 3. exp() is a bit compute expensive
- 세번째 문제점으로 지수(exponential)함수를 쓰기 때문에 계산 비용이 커진다는 점이다.
- 하지만 현대 하드웨어 연산 환경에서는 포화로 인한 기울기 소실 문제에 비해 상대적으로 미미한 제약이다.
tanh

- tanh 활성화 함수는 시그모이드와 유사하지만 -1~1의 범위를 가진다.
- 단, 주요 차이점으로 tanh는 zero centered이라는 점이다.
- 하지만, saturated되면 여전히 그레이디언트는 낮거나 높은 값에서 여전히 0에 가까워진다.
ReLU

- 다음은 ReLU(Rectified Linear Unit) 활성화 함수이다. 식은 $f(x)=max(0,x)$이다.
- 이 함수는 요소별 연산을 수행하면서 입력이 0 미만의 음수면 0으로 출력하고, 양수이면 출력은 입력값 그대로 출력한다.
- Sigmoid, tanh와 비교해보았을 때 ReLU는 다음과 같은 특성을 갖는다.
- 양수 범위에서는 포화(saturation)되지 않는다.
- 단순 임계치 연산이므로 계산 효율이 뛰어나다.
- AlexNet(Krizhevsky et al., 2012) 실험 기준 4계층 합성곱 신경망에서 CIFAR-10 수렴 속도가 tanh 대비 약 6배 빠르다. 3
- 생물학적 뉴런의 신호 반응(firing rate) 관찰 연구에서도 ReLU의 비선형 특성이 생물학적 뉴런의 활성화 양상과 더 유사하다는 점이 보고되었다.

- 하지만, zero-centered 특성을 만족하지 못한다는 한계가 있다.
- ReLU는 음수 범위에서는 출력이 모두 0이 되므로 역전파 그레이디언트의 절반을 소실시킨다.
-
이로 인해 특정 뉴런이 활성화되지 않고 업데이트가 영구히 중단되는 데드 ReLU(Dead ReLU) 현상이 나타날 수 있다.
- 그래서 실제 학습 시 ReLU 뉴런의 초기 편향(bias)에 작은 양수값(0.01)을 추가해주기도 한다.
- 이는 가중치를 업데이트할 때 뉴런이 활성화 상태(active ReLU)가 될 가능성을 높여주기 위함이다.
Leaky ReLU

- Leaky ReLU는 ReLU에서 살짝 수정된 버전이다.
- 기울기를 줌으로써 음의 영역에도 더 이상 0이 아니게 되었다.
- 따라서, 음의 영역에도 saturation되지 않는다.
-
나머지 특징은 ReLU와 똑같지만, dead ReLU 현상이 없어진게 ReLU와 차이점이다.
- PReLU는 기울기를 $\alpha$로 결정한다. 이는 역전파를 통해 학습이 된다.
ELU

- ELU(Exponential Linear Units)는 ReLU의 이점들을 모두 가져온다.
- zero-centered 특성에 가까워진다.
- 하지만, Leaky ReLU와 비교해볼 때 ELU는 음의 영역에서 saturation된다.
- 하지만 이런 saturation이 노이즈에 강인할 수 있다고 한다.
- 또한, exp() 연산이 필요하다는 단점이 있다.
SELU

- SELU(Scaled Exponential Linear Units)는 심층 신경망의 자기 정규화(Self-normalizing)를 유도하는 ELU의 확장 버전이다.
- 활성화 값이 평균 0과 단위 분산으로 수렴하도록 유도하므로, 배치 정규화(Batch Normalization) 없이도 깊은 신경망을 안정적으로 학습시킬 수 있다.
Maxout

- 이 활성화 함수에서는 내적의 기본적인 형태를 미리 정의하지 않는다.
- 대신에, $max(w_1^Tx+b_1, w_2^Tx+b_2)$를 사용한다.
- Maxout은 두 선형 결합 중 최댓값을 취한다.
- 이는 포화되지 않으며, 그레이디언트 소실을 방지한다.
- 하지만 뉴런마다 가중치 파라미터 수가 두 배로 증가한다는 단점이 있다.
Swish

- Swish 활성화 함수는 $f(x) = x \cdot \sigma(\beta x)$ 형태를 갖는다.
- 강화학습 기반 신경망 구조 탐색(NAS)을 통해 다양한 비선형 함수 후보군을 자동으로 탐색하여 설계되었다.
- 심층 레이어 학습 시 특정 벤치마크(Ramachandran et al., 2017)에서 ReLU 대비 향상된 분류 정확도를 보인다. 4
활성화 함수 요약
- 기본(Default) 선택으로는 ReLU를 사용한다. (단, 학습률을 신중하게 조절해야 한다.)
- 실험적으로 Leaky ReLU / ELU / SELU / Maxout 등을 시도해볼 수 있다.
- 깊은 신경망에서는 그레이디언트 소실(Vanishing Gradient)을 유발하는 Sigmoid 및 tanh의 사용을 지양해야 한다.
신경망 학습에서 적절한 활성화 함수를 선택했다면, 다음 단계로는 입력 데이터를 신경망에 적합하게 가공하는 데이터 전처리, 초기 가중치를 올바르게 설정하는 가중치 초기화, 그리고 층을 통과할 때마다 활성화 분포를 안정적으로 유지해주는 배치 정규화와 사전 학습된 지식을 활용하는 전이 학습이 필요하다.
Data Preprocessing

- 입력 데이터(original data)를 학습하려면 전처리(preprocessing) 과정이 필요하다.
- 2번째 경우를 평균 차감(Mean Subtraction)이라고 하는데, 데이터의 모든 특징(feature) 각각에 대해 평균값을 차감하는 방법이다.
- 데이터 군집을 모든 차원에 대하여 원점으로 이동시킨다.
- 다음 3번째 경우를 정규화(Normalization)이라고 하는데, 각 차원의 데이터가 동일한 범위내의 값을 갖도록 하는 전처리 기법을 의미한다.
- Before normalization : 분류 손실(classification loss)은 가중치 행렬의 변화에 매우 민감하며, 최적화하기 어렵다.
- After normalization : 가중치의 작은 변화에 덜 민감하고, 최적화하기 쉽다.
-
정규화를 하는 이유는 모든 차원이 동일한 범위를 갖게 함으로써 전부 동등한 기여(contribution)를 할 수 있게 해주기 위해서다.

- 입력 데이터가 이미지일 경우 zero-centered(평균 차감)만 적용해도 충분하다.
- 이미지는 픽셀 값의 스케일(0~255)이 모든 차원에서 이미 균일하기 때문이다.
- 일반적으로 컴퓨터 비전 분야에서는 주성분 분석(PCA) 등을 통한 차원 축소를 거의 적용하지 않는다.
- CNN에서는 합성곱 연산을 통해 원본 이미지 자체의 2차원 공간적 구조(spatial structure)를 보존하며 특징을 학습하기 때문이다.
Weight Initialization

- 그레이디언트를 계산해서 가중치 행렬 $W$의 값을 업데이트해야 한다.
- 이때 모든 가중치를 0으로 초기화하면 모든 뉴런이 동일한 출력을 계산하고 동일한 그레이디언트로 업데이트되므로, 대칭성 깨기(symmetry breaking)가 실패하여 다양한 특징을 학습할 수 없다.
- 즉, 신경망의 용량과 무관하게 단일 뉴런처럼 동작한다.

- 가중치 초기화를 해결하는 첫번째 방법으로 임의의 랜덤 값으로 초기화하는 것이다.
- 가우시안(gaussian)에서 샘플링한다.
- 이 경우, 작은 신경망에서는 잘 작동하지만, 깊어질수록 문제가 발생한다.
Activation Statistics
- 다음과 같은 코드로 실행했을 때 활성화 통계(activation statistics)를 보여준다.
dims = [4096] * 7
hs = []
x = np.random.randn(16, dims[0])
for Din, Dout in zip(dims[:-1], dims[1:]):
W = 0.01 * np.random.randn(Din, Dout)
x = np.tanh(x.dot(W))
hs.append(x)

- 모두 0가 되어 학습을 할 수 없게 된다.
-
Initialization too small!
- 만약 0.01 부분을 0.05로 바꾸면 어떻게 될까?

- local gradient가 모두 0이 되어 학습을 할 수 없게 된다.
- Initialization too big!
Xavier Initialization
- 선형 또는 tanh 활성화 함수에서 가중치 분산을 유지하기 위해 Xavier 초기화(Glorot & Bengio, 2010)를 사용한다. 5
- 표준편차 공식 : $\text{std} = 1 / \sqrt{D_{in}}$
- 컨볼루션 레이어에서 $D_{in}$은 $\text{filterSize}^2 \times \text{inputChannels}$이다.
dims = [4096] * 7 hs = [] x = np.random.randn(16, dims[0]) for Din, Dout in zip(dims[:-1], dims[1:]): W = np.random.randn(Din, Dout) / np.sqrt(Din) x = np.tanh(x.dot(W)) hs.append(x)

- 활성화 분포가 전 층에 걸쳐 안정적으로 유지된다.
- Initialization just right!
Kaiming / MSRA Initialization
- 하지만 ReLU 활성화 함수는 입력의 절반(음수 영역)을 0으로 만드므로, Xavier 초기화를 적용하면 층이 깊어질수록 분산이 절반씩 줄어 신호가 0으로 수렴한다.
dims = [4096] * 7
hs = []
x = np.random.randn(16, dims[0])
for Din, Dout in zip(dims[:-1], dims[1:]):
W = np.random.randn(Din, Dout) / np.sqrt(Din)
x = np.maximum(0, x.dot(W))
hs.append(x)

- 이러한 ReLU 계열의 신호 절반 소실을 보정하기 위해 Kaiming He 등의 He 초기화(He Initialization, 2015)를 사용한다. 6
- 표준편차 공식 : $\text{std} = \sqrt{2 / D_{in}}$
dims = [4096] * 7 hs = [] x = np.random.randn(16, dims[0]) for Din, Dout in zip(dims[:-1], dims[1:]): W = np.random.randn(Din, Dout) * np.sqrt(2.0 / Din) x = np.maximum(0, x.dot(W)) hs.append(x)
- 표준편차 공식 : $\text{std} = \sqrt{2 / D_{in}}$

- ReLU 활성화 함수에서도 활성화 분포가 층마다 안정적으로 유지되는 것을 확인할 수 있다.
Batch Normalization
- 배치 정규화(Batch Normalization)는 레이어로부터 나온 배치 단위만큼의 활성화가 있을 때, 이 값들이 단위 가우시안(unit gaussian)이기를 원할 때 쓰인다.
- 각 차원을 평균이 0, 단위 분산으로 만들기 위해서 다음을 적용
- $\hat x^{(k)}=\frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}}$
- 배치 단위로 한 레이어에 입력으로 들어오는 모든 값들을 이용해서 평균(mean)과 분산(variance)를 계산해 정규화(normalization)를 해준다.

- 배치당 NxD 형태의 x가 있다고 하자.
- 정확히는 N개의 학습 데이터가 있고 각 데이터는 D차원이다.
- 각 차원별로 평균(mean)을 각각 계산한다.
- 하나의 배치 내에서 전부 계산하여 정규화한다.
- 따라서 정규화된 x는 다음과 같다.
- $\hat x_{i,j}=\frac{x_{i,j}-\mu_j}{\sqrt{\sigma_j^2+\epsilon}}$
- 여기서 $\epsilon$은 분모가 0이 되는 문제를 방지하고 수치적 안정성을 보장하기 위한 아주 작은 상수($10^{-5}$ 등)이다. 7
-
즉, 각 차원에 대한 경험적 평균과 분산을 독립적으로 계산한다.
- 하지만 평균이 0이고 단위 분산인 제약이 모델 표현력 측면에서 항상 최선이 아닐 수도 있으므로, 네트워크가 최적의 분포를 학습할 수 있도록 파라미터를 부여한다.

- 입력 데이터 $x$는 $N\times D$
- 학습 가능한 매개변수인 $\gamma$와 $\beta$를 사용하여 선형 변환을 수행한다: $y_{i,j} = \gamma_j \hat x_{i,j} + \beta_j$
- $\gamma$ : 스케일(Scale) 파라미터 ($\gamma_j = \sqrt{Var(x_j)}$ 학습 시 원형 복원 가능)
- $\beta$ : 시프트(Shift) 파라미터 ($\beta_j = E(x_j)$ 학습 시 원형 복원 가능)
- 중간체(intermediates)
- $\mu,\sigma : D$
- $\hat x : N\times D$
- 출력 데이터 $y$는 $N\times D$
-
엄격한 정규화로 인해 활성화 함수의 비선형 표현력이 제한되는 문제를 방지하며, 네트워크가 필요할 경우 항등 사상(identity mapping)을 스스로 복원할 수 있도록 지원한다. 8
- 보통 배치 정규화는 완전 연결 층이나 합성곱 층 뒤, 비선형 활성화 함수 바로 앞에 배치한다.
- FC $\to$ BN $\to$ ReLU $\to$ FC $\to$ BN $\to$ ReLU …
Pros and cons
- Pros
- 심층 신경망의 기울기 소실 및 폭주를 완화하여 최적화 과정을 안정화한다.
- 역전파 그레이디언트 흐름을 개선한다.
- 더 높은 학습률(learning rate) 적용이 가능해져 수렴 속도가 빨라진다.
- 가중치 초기화 민감도를 크게 낮춘다.
- 미니배치 통계량의 변동성으로 인해 일종의 규제(regularization) 효과를 제공한다.
- 테스트 시 미니배치 통계 대신 누적 이동 평균을 사용하여 완전 연결/합성곱 가중치와 융합할 수 있으므로 추론 오버헤드가 적다.
- Cons
- 학습 시에는 미니배치 통계량($\mu_B, \sigma_B^2$)을 사용하지만, 추론(테스트) 시에는 이동 평균 통계량을 사용하므로 학습-추론 모드 간 동작 차이를 명확히 관리해야 한다.
- 미니배치 크기($N$)가 너무 작으면 배치 통계의 분산이 커져 정규화 효과가 불안정해진다.
Transfer learning
- 전이 학습(Transfer Learning) : ImageNet과 같이 대규모 데이터셋에서 사전 학습된(pre-trained) 모델의 가중치를 가져와, 해결하고자 하는 목표 작업(target task)에 맞게 재학습 또는 미세 조정(fine-tuning)하여 사용하는 기법이다. 9
- low level : 엣지(edge), 색상(color), 텍스처 등 범용적 시각 특징
- high level : 특정 클래스 형태 등 도메인 특화 특징(classification)

- 1번은 ImageNet으로 사전 학습된 CNN이다.
- 보유 데이터셋이 작고 원본 데이터와 유사할 경우, 2번과 같이 기존 가중치를 고정(freeze)하고 최종 분류기(
FC-C) 부분만 재초기화한 후 학습을 진행한다. - 보유 데이터셋이 충분히 크다면 3번과 같이 상위 층(
FC-4096등)까지 고정을 해제하여 미세 조정을 수행하거나 전체 네트워크를 낮은 학습률로 재학습한다.
한계 및 트레이드오프
- 활성화 함수 선택의 트레이드오프: ReLU는 단순한 연산과 기울기 소실 방지 장점이 있으나 음수 영역의 데드 뉴런(Dead ReLU) 위험이 있으며, Leaky ReLU나 ELU 등은 이를 보완하는 대신 추가적인 하이퍼파라미터 설정이나 지수 함수 연산 오버헤드가 발생한다.
- 초기화 기법의 비선형성 의존도: Xavier 초기화는 선형/tanh 함수 가정에 기반하므로 비선형 ReLU 계열에서는 분산이 반감되어 신호가 사라지며, He 초기화는 활성화 함수 구조에 강하게 종속되어 복합 아키텍처 적용 시 주의가 필요하다.
- 배치 정규화의 연산 및 환경 제약: 훈련 안정성과 초기화 민감도 완화라는 이점이 있으나, 작은 배치 크기(Micro-batch)에서는 통계치 편차가 심화되어 성능이 저하되고, 시계열(RNN)이나 분산 학습 환경에서 추가적인 동기화 비용이 발생한다.
- 전이 학습의 도메인 불일치: ImageNet과 목표 데이터셋 간의 도메인 격차가 크거나 목표 데이터셋 규모가 극단적으로 작을 경우, 사전 학습 가중치 미세 조정(Fine-tuning) 과정에서 치명적 망각(Catastrophic Forgetting) 또는 과적합(Overfitting)이 발생할 수 있다.
핵심 정리
- 활성화 함수 선택(Activation Functions): Sigmoid와 tanh는 포화 영역에서 그레이디언트가 소실(vanishing gradient)되고 zero-centered 문제를 겪을 수 있어, 기본적으로 양수 영역에서 포화되지 않는 ReLU를 기본으로 사용하고 상황에 따라 Leaky ReLU, ELU, SELU, Maxout 등을 고려한다.
- 데이터 전처리(Data Preprocessing): 제로 센터링(Mean Subtraction)과 정규화(Normalization)를 통해 가중치 업데이트가 특정 방향으로 편향되는 지그재그 현상을 방지하며, 이미지 데이터는 채널별/픽셀별 평균 차감만으로도 효과적인 최적화 경로를 확보할 수 있다.
- 가중치 초기화(Weight Initialization): 모든 가중치를 0이나 너무 작게(0.01) 초기화하면 신호가 0으로 사라지고, 너무 크게(0.05) 초기화하면 포화 상태에 빠진다. tanh 계열에는 분산을 고려한 Xavier 초기화($1/\sqrt{D_{in}}$), ReLU 계열에는 신호 절반 소실을 보정하는 He 초기화($\sqrt{2/D_{in}}$)가 필수적이다.
- 배치 정규화(Batch Normalization): 미니배치 단위로 평균과 분산을 계산하여 각 층의 입력 분포를 안정화하고, 학습 가능한 파라미터($\gamma, \beta$)로 표현력을 유지함으로써 높은 학습률 적용, 빠른 수렴, 초기화 민감도 완화, 규제 효과를 동시에 얻는다.
- 전이 학습(Transfer Learning): 대규모 데이터셋(ImageNet 등)으로 사전 훈련된 특성 추출기(CNN의 저수준 특징: 엣지, 색상)를 재사용하고, 보유 데이터셋 크기에 따라 최종 분류기(FC층)만 재학습하거나 상위 층까지 미세 조정(Fine-tuning)하여 적은 데이터로도 높은 성능을 달성한다.
References
-
Stanford CS231n Lecture 6 (2017) - Mini-batch SGD; 배치와 미니 배치, 확률적 경사하강법 - skyil ↩
-
Stanford CS231n Lecture 6 (2017) - Sigmoid non-zero-centered dynamics; Lecture 6: Training Neural Networks I - 조마조마 ↩
-
Krizhevsky et al., ImageNet Classification with Deep Convolutional Neural Networks, NeurIPS 2012; Stanford CS231n Lecture 6 Slides ↩
-
P. Ramachandran et al., Searching for Activation Functions, arXiv:1710.05941, 2017; Activation Function(활성화 함수) 종류 - 염창동형준킴 ↩
-
X. Glorot and Y. Bengio, Understanding the difficulty of training deep feedforward neural networks, AISTATS 2010; Stanford CS231n Lecture 6 Slides ↩
-
K. He et al., Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification, ICCV 2015; Stanford CS231n Lecture 6 Slides ↩
-
S. Ioffe and C. Szegedy, Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, ICML 2015; Deep Learning Batch Normalization - Enough is not enough ↩
-
Stanford CS231n Lecture 6 (2017) - Batch Normalization Scale & Shift Parameters ↩
-
Stanford CS231n Lecture 7 (2017) - Transfer Learning and Fine-tuning Strategy; 전이학습(transfer learning) 재밌고 쉽게 이해하기 - bskyvision ↩
댓글남기기