[CS231n] 강의4. Neural Networks and Backpropagation 리뷰
본 글은 2021년 4월에 강의한 스탠포드 대학의 “Convolutional Neural Networks for Visual Recognition” 2021년 강의를 듣고 정리한 내용입니다. 개인 공부 목적으로 작성되었으며, 설명이 맞지 않거나 글 오타가 있으면 알려주시길 바랍니다.
원본 링크 : cs231n.stanford.edu 한글 번역 링크 : aikorea.org - cs231n 강의 링크 : youtube - 2017 Spring (English)
Neural Networks
- 신경망(Neural Networks) : 인공 뉴런이나 노드로 구성된 인공 신경망 1
- Linear score function
- $f=Wx$
- 2-layer Neural Network
- $f=W_2max(0, W_1x)$

- 여기서 비선형 함수인 $max(0,x)$를 이용한다.
- 만약, 비선형 변환없이 선형 함수만 계속 추가되면 다시 입력의 선형 함수가 되어버린다.

- 기존 linear layer 행렬곱에 의한 스코어 함수 $f=Wx$에서 가중치 행렬 $W$의 각 행이 클래스 각각의 템플릿과 비슷한지 비교하였다.
- 하지만 단일 선형 계층은 각 클래스당 하나의 템플릿만 학습할 수 있는 반면, 다중 레이어 신경망은 비선형 은닉 계층을 거치며 여러 모달리티의 특징 패턴을 조합해 복잡한 결정 경계를 형성한다.
- 3-layer Neural Network
- $f=W_3max(0, W_2max(0,W_1x))$
Activation functions
- 활성화 함수(activation function) : 입력된 데이터의 가중 합을 출력 신호로 변환하는 함수 2
- 이전 레이어에 대한 가중 합의 크기에 따라 활성 여부가 결정된다.
- 다음은 활성화 함수의 종류이다.

Example feed-foward computation of a neural network

import numpy as np
f = lambda x: 1.0/(1.0+np.exp(-x)) # 활성화 함수 정의(시그모이드)
x = np.random.randn(3, 1)
h1 = f(np.dot(W1, x) + b1)
h2 = f(np.dot(W2, h1) + b2)
out = np.dot(W3, h2) + b3
- 다음은 계산 과정의 전반적인 그림이다.

여기서 편향(bias)을 추가해 주는 이유는 데이터와 독립적으로 클래스별 기본 선호도를 조절하고 결정 경계가 원점을 통과해야 하는 제약을 해소하기 위함이다.
Setting the number of layers and their sizes

Types of regularization

Backpropagation
- 이제 어떻게 그레이디언트를 계산할 것인지가 남아 있다.
- 해석적 미분(Analytic gradient)을 계산할 때 계산 그래프(computational graph)를 이용하면 복잡한 합성 함수도 기본 연산 노드로 분해하여 체계적으로 표현할 수 있다3.
미분은 각 변수가 해당 값에서 전체 함수(expression)의 결과 값에 영향을 미치는 민감도와 같은 개념이다.

- 초록색 숫자는 피드포워드 값, 빨간색 숫자는 미분값이다.
- $\frac{\partial f}{\partial y}$는 연쇄법칙(chain-rule)을 이용해 계산할 수 있다.
- $\frac{\partial f}{\partial x}$는 연쇄법칙(chain-rule)을 이용해 계산할 수 있다.

- 위 그림과 같이 각 노드가 local gradient를 갖고 있으며, backpropagation을 통해 상위 노드 방향으로 전달되고, 이것을 이전 노드가 전달받아 그 노드의 local gradient와 곱해주면서 나아간다.
- upstream gradient : 노드의 output에 대한 gradient (이미 계산)
- local gradient : 해당 노드내에서만 계산되는 gradient
-
downstream gradient : 노드의 input에 있는 변수에 대한 gradient 4
- 다음은 역전파를 계산하는 다른 예시이다.

-
1/x gate
- $f(x)=\frac{1}{x}\to\frac{df}{dx}=-\frac{1}{x^2}$
- $(1.00)(\frac{-1}{1.37^2})=-0.53$
-
+1 gate
- $f_c(x)=c+x\to$ $\frac{df}{dx}=1$
- $(-0.53)(1)=-0.53$
-
exp gate
- $f(x)=e^x\to$ $\frac{df}{dx}=e^x$
- $(-0.53)(e^{-1})=-0.20$
-
*-1 gate
- $f_a(x)=ax\to$ $\frac{df}{dx}=a$
- $(-0.20)(-1)=0.20$
-
+ gate
- $(0.20)(1.00)=0.20$
- $(0.20)(1.00)=0.20$
-
+ gate
- $(0.20)(1.00)=0.20$
- $(0.20)(1.00)=0.20$
-
* gate
- $w_0=(0.20)(-1.00)=-0.20$
- $x_0=(0.20)(2.00)=0.40$
-
* gate
- $w_1=(0.20)(-2.00)=-0.40$
- $x_1=(0.20)(-3.00)=-0.60$
Patterns in gradient flow
-
add gate : 항상 출력의 미분을 전방 전달(forward pass)에 상관없이 모든 입력에 균등하게 분배한다.

-
mul gate : local gradient는 입력 값이고 이는 chain rule 동안 출력에 대한 그레이디언트로 곱해진다.

- 이 과정을 forward와 backward API로 직접 구현하면 다음과 같다 (PyTorch)5.

class Multiply(torch.autograd.Function): @staticmethod def forward(ctx, x, y): # backward에서 사용하기 위해 일부 값을 저장해야 한다. ctx.save_for_backward(x, y) z = x * y return z @staticmethod def backward(ctx, grad_z): # upstream gradient x, y = ctx.saved_tensors # upstream gradient와 local gradient를 곱셈 grad_x = y * grad_z # dz/dx * dL/dz grad_y = x * grad_z # dz/dy * dL/dz return grad_x, grad_y -
max gate : 미분을 정확히 하나의 입력(앞으로 전방 전달하는 동안 가장 높은 값을 가진 입력)으로 분배한다.

Gradients add at branches

- 만약 그레이디언트가 양쪽에 있다면, 각각을 더해주기만 하면 된다.
Summary
- 완전 연결망(Fully-connected Neural Networks) : 선형 함수와 비선형 함수의 스택(stack)으로, 단일 선형 분류기 대비 복잡한 결정 경계를 구성할 수 있는 높은 표현력(representational power)을 제공한다.
- 역전파(Backpropagation) : 모든 입력(input)과 매개변수(parameter), 중간 단계(intermediate)의 그레이디언트를 계산하기 위해 계산 그래프를 따라 연쇄법칙(chain rule)을 재귀적(recursive)으로 적용한다.
- 구현은 노드가 정방향(forward), 역방향(backward) API를 구현하는 그래프 구조를 유지한다.
- 정방향(forward) : 연산 결과를 계산하고 역전파에 필요한 중간 활성화 값을 메모리에 저장한다.
- 역방향(backward) : 연쇄법칙(chain rule)을 적용하여 최종 손실 함수(loss function)에 대한 각 변수의 그레이디언트를 계산한다.
한계 및 트레이드오프
- 기울기 소실(Vanishing Gradient): Sigmoid와 같이 양 끝단에서 도함수가 0에 가깝게 포화(saturation)되는 활성화 함수를 깊은 신경망에 적용하면, 역전파 과정에서 국소 기울기가 곱해질수록 하위 계층으로 전달되는 그레이디언트가 소실된다.
- 메모리 오버헤드와 연산 비용: 역전파 단계에서 국소 기울기를 구하기 위해 정방향 연산 과정의 모든 중간 텐서(
ctx.save_for_backward)를 메모리에 유지해야 하므로, 네트워크 깊이와 배치 크기에 비례해 GPU/RAM 점유율이 증가한다. - 과적합(Overfitting) 위험: 비선형 계층과 파라미터 수가 늘어남에 따라 모델의 표현력이 확장되어 훈련 데이터의 잡음까지 암기할 수 있으므로, L2 가중치 감쇠(Weight Decay)나 드롭아웃(Dropout) 같은 정규화 기법이 필수적으로 수반되어야 한다.
댓글남기기