
4강 : Neural Networks and Backpropagation
지난 3강에서는 이미지의 분류 과정에서 어떻게 잘 분류했는지에 대한 기준, 즉 점수를 매길 수 있는 Score Function과 이 분류기를 더 개선시키기 위한 손실함수[Loss Function]을 정의할 것인지에 대해서 살펴보았으며 이 손실함수를 최소화하는 과정인 최적화[Optimization]으로 산 꼭대기에서 내려간다는 아이디어를 이용한 경사 하강법[Gradient Descent]와 이를 개선한 다양한 옵티마이저[SGD, RMSProp, Adam]에 대해서 살펴보았다.
이번 4강에서는 인간의 뉴런을 모방하여 딥러닝 구조를 구현한 신경망[Neural Network]과 분류기, 딥러닝 모델 그리고 더 나아가 인공지능의 성능을 개선하는 핵심 기법인 역전파[Backpropagation]에 대해서 살펴볼 예정이다.
신경망 : 비선형 분류
저번시간에는 y=ax+b의 구조인 직선, 즉 선형 모델에 대해서 살펴보았고 이를 통해서 데이터를 구별하는 방법에 대해서 살펴보았다. 하지만 현실에 존재하는 대부분의 문제들은 직선으로 구별할 수 없게 복잡한 형태를 띄고 있다.

위의 그림과 같이 파란 점과 빨간 점 두 가지 종류가 있다고 가정해보자. 점들의 분포가 위와 같을 때, 이 두가지의 종류들을 직선으로 분류할 수 있을까? 점들의 분포를 임의로 바꿔서 직선으로 구별할 수 있게 만들지 않는한 직선으로 분류할 수 없을 것이다. 이렇게 복잡한 문제를 풀기 위해서 사용하는 방법이 바로 비선형(non-linearity)이며 이를 표현할 수 있는 방법은 다음과 같다:
$f=W_2max(0,W_1x)$
- 기존의 직선의 방정식은 기울기가 w 하나였다면 비선형 식은 $W_1,W_2$ 이렇게 두 개가 존재함
- $max(0,W_1x)$은 0과 W_1x 둘 중 더 큰 것을 반환하며 즉 0 또는 양수만을 출력한다.
이러한 비선형 신경망은 층(layer)을 생성하여서 2층의 신경망을 구현할 수 있다. 입력과 출력 사이에 있는 부분은 은닉층[Hidden Layer]라고 하머 입력층에서 출력층까지 순전파를 전달하고 출력층에서 입력층까지 역전파를 전달한다. max((0, ))와 같은 함수를 활성화 함수[Activation Function]라고 하는데 max를 기반으로 하는 활성화 함수를 ReLU라고 한다. ReLU는 널리 자주 사용하지만 음수 부분을 전부 0으로 만들어 버려서 데이터를 완전히 반영하지 못한다는 문제가 있다.

강의에서 그 다음으로 이러한 2층 신경망을 어떻게 코드로 구현하는지에 대해서 설명하고 있는데 4가지로 나눌 수 있다:
- 변수 설정 및 초기화
- : 샘플 수
- $D_{in}$: 입력 차원
- H: 은닉 뉴런 수
- $D_{out}$: 출력 차원
- 순전파[Forward pass]
- 입력에 가중치 W를 순차적으로 곱하여 은닉층 출력을 만들어 출력층에서 최종적으로 행렬곱으로 계산함
- 이후 신경망이 예측한 y값과 실제 y의 차이를 손실(loss)로 설정함
- 최적화[Optimization] - 그래디언트 계산
- 역전파 - 경사 하강법
import numpy as np
from numpy.random import randn
#변수 정의 밑 초기화
N, D_in, H, D_out = 64, 1000, 100, 10
x, y = randn(N, D_in), randn(N, D_out)
w1, w2 = randn(D_in, H), randn(H, D_out)
for t in range(2000):
#순전파 계산
h = 1 / (1 + np.exp(-x.dot(w1)))
y_pred = h.dot(w2)
loss = np.square(y_pred - y).sum()
print(t, loss)
#그래디언트 계산
grad_y_pred = 2.0 * (y_pred - y)
grad_w2 = h.T.dot(grad_y_pred)
grad_h = grad_y_pred.dot(w2.T)
grad_w1 = x.T.dot(grad_h * h * (1 - h))
#역전파 및 경사하강
w1 -= 1e-4 * grad_w1
w2 -= 1e-4 * grad_w2
은닉층의 수에 따라서 네트워크의 크기를 키워서 더 복잡한 패턴을 파악할 수 있으나 너무 많으면 과적합[overfitting]이 발생할 수 있다.
따라서 자주 사용하는 방법으로 네트워크 크기 자체를 충분히 크게 만들고 나서 정규화[regularization]을 통해서 복잡도를 제어하고 $\lambda$를 이용해서 강도를 설정할 수 있다.
정규화 기법 [regularization]

그림과 같이 은닉층의 수를 크게 늘리면 더욱 구분을 하는 능력[capacity]가 좋아진다라는 것을 알 수 있다. 하지만 점점 더 늘리다보면 train accuracy는 높아지지만 test accuracy가 오히려 낮아지는 오버피팅[overfitting] 현상이 발생할 수 있기 때문에 너무 많은 은닉층은 오히려 좋지 않다. 그리고 은닉층의 갯수를 조절하는 것이 아닌 정규화[regularization]를 이용해서 오버피팅이 일어나지 않도록 조절할 수 있는 하이퍼파라미터이다. 이 정규화 변수 $ \lambda $로 표현하며 손실함수에 더해져서 모델의 capacity를 조절한다.

생물학적 뉴런과 모방
뉴런[neuron]은 신경조직을 이루는 기본 단위로 뉴런을 통해서 신경계의 모든 작용이 일어나며 눈을 통해서 사물을 인지하고 이를 외부의 자극으로 인식하여 뉴런이 이 자극을 전달하고 최종적으로 척수와 뇌 등의 중추신경계로 도달하여 정보를 처리하고 다시 몸의 조직으로 전달하여 명령을 수행한다. 뉴런이 자극을 전달하는 과정은 수상돌기[dendrite]로 들어온 신호가 세포체[cell body]에서 통합되고 축삭[axon]을 통해 다음 뉴런으로 전달하듯이 신경망도 비슷하게 이전 층의 출력을 합산해 활성화 함수를 통과시키고 다음 층으로 넘기는 구조이다.

신경망에서의 손실함수
우리는 이전 강의에서 모델의 성능을 평가하는 방법으로 score function을 사용하였고 개선하는 방법으로 loss function을 사용한다는 것을 알게 되었으며 이를 수학식으로 정리해 보면 다음과 같이 나눌 수 있다:
- 비선형 점수 함수
- 힌지 손실 함수
- 정규화
- 최종 손실

이제 모델을 개선하여 손실을 최소화시킬 수 있는 방법인 역전파 적용이 남았다. 이를 위해서는 손실 함수 L을 $W_1, W_2$에 대해 편미분하여 그래디언트를 구해야 한다. 그렇게 하기 위해서 전부 다 수학식으로 복잡하게 유도하는 대신에 계산 그래프[computational graph]를 이용해서 모든 연산을 노드로 표현하여 입력에서 출력[손실]까지의 과정을 단계별로 나타낼 수 있다. 간단한 계산 그래프 예시를 살펴보자.
$$f(x,y,z)=(x+y)z$$
이 식을 그래프로 표현하면

괄호 안에 x와 y를 먼저 더하는 과정을 q라고 하고 이후 q와 z를 곱하여서 f의 결과를 출력한다. 이제 여기서 편미분을 구하여서 그래디언트를 구하고 가중치를 업데이트하는 방법을 보게 될 것이다. 먼저 편미분을 구해야 하는 것은 $\partial f / \partial x, \partial f / \partial y, \partial f / \partial z$로 역전파는 끝에서 시작하여 거꾸로 진행된다. f와 y의 편미분을 구해야 하지만 f와 y사이에 q가 있어서 직접적으로 구할 수가 없다 이럴 때 사용하는 방법이 연쇄 법칙(chain rule)이다
$$ \frac{\partial f}{\partial y} = \frac{\partial f}{\partial q} \bullet \frac{\partial q}{\partial y}$$
이렇게 그래디언트를 구할 수 있지만 두 가지 개념을 구분할 수 있으며 local gradient와 upstream gradient이다.
local gradient은 해당 노드의 출려과 입력 사이의 gradient이고 upstream gradient은 다음 노드에서 흘러온 그 노드로 전해져 오는 gradient으로 $ \frac{\partial f}{\partial y}$은 upstream이다.
강의 자료
CS231n 강의 공식사이트 - cs231n.stanford.edu
CS231n Spring 2025 유튜브 강의 - youtube
CS231n 강의 슬라이드 - cs231n.stanford.edu/slides/2025
CS231n 과제 및 자료 - cs231n.stadford.edu.github.io
'[2025] CS231n' 카테고리의 다른 글
| [2025] CS231n 6강: Training CNNs and CNN Architectures - CS231n 강의 노트 (0) | 2025.11.20 |
|---|---|
| [2025] CS231n 5강: Image Classification with CNNs - CS231n 강의 노트 (0) | 2025.11.17 |
| [2025] CS231n 3강: Regularization and Optimization - CS231n 강의 노트 (1) | 2025.09.22 |
| [2025] CS231n 2강: Image Classification with Linear Classifiers - CS231n 강의 노트 (1) | 2025.09.19 |
| [2025] CS231n 1강:Introduction - CS231n 강의 노트 (0) | 2025.09.15 |