ML,DL

[cs231n] 신경망 파트 1 : 네트워크 구조 정하기

yeeunnnn 2026. 2. 3. 22:52

🚨cs231n 2017 강의를 듣고 작성하였습니다.

🚨해당 게시글에 포함된 이미지 중 출처가 쓰여있지 않은 이미지는 모두 직접 그렸습니다.

 

5.1. Neural networks : without the brain stuff

먼저, 뇌에 비유하지 않고 신경망을 이해해보자.

선형분류에 관한 섹션에서, W가 행렬이고 x가 입력 열벡터(이미지)로 주어졌을 때, s=Wx의 공식을 이용하여 주어진 이미지를 가지고 각 카테고리에 해당하는 스코어를 계산했다.

출처 : https://cs231n.stanford.edu/

비선형 레이어 위에 선형레이어를 쌓아서 2-layer Neural Network를 만들 수 있다.

이렇게 더 많은 레이어를 쌓아 임의의 깊은 신경망을 구성할 수 있다.


5.2. Biological motivation and connections

뉴런의 다이어그램을 보자.

우리는 각 뉴런에 따라 전달되는 신호를 가지고 있고 연결된 많은 뉴런을 가지고 있다.

출처 : https://cs231n.stanford.edu/

각 뉴런은 수상돌기(dendrite)를 가지고 있고 이를 통해 뉴런에 들어온 신호를 받는다.

세포체(cell body)를 통해 들어오는 신호를 종합한다.

종합한 후에 모든 신호는 축삭(axon)을 통해 하류 뉴런과 다른 세포체로 이동한다.

출처 : https://cs231n.stanford.edu/

선형분류를 위의 과정처럼 computational graph를 통해 나타낼 수 있다.

노드가 그래프에서 서로 연결되어있고 입력은 x이다.

뉴런에서 신호가 들어가는 것처럼 x0, x1, x2 등 모든 x는 가중치 W와 결합되어 합쳐진다.

선형분류에서 했던 계산처럼 W와 x를 곱하고 b를 더하고, 활성함수를 적용하여 출력값을 얻어 연결된 뉴런에 전달한다.

하나의 뉴런에서 forward-propagating code는 아래와 같다.

class Neuron(object):
  # ...
  def forward(inputs):
    """ assume inputs and weights are 1-D numpy arrays and bias is a number """
    cell_body_sum = np.sum(inputs * self.weights) + self.bias
    firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)) # sigmoid activation function
    return firing_rate

5.3. Single neuron as a linear classifier

사실 뉴런의 수학적 포워딩 모델은 익숙할 것이다.

선형분류기에서 다루었듯이, 하나의 뉴런은 선형적인 특정 입력 값을 ‘활성화시키거나’ 또는 ‘비활성화시킬 수 있는’ 능력이 있다.

따라서 뉴런의 출력값에 적절한 손실함수를 적용하면 뉴런을 다음과 같은 선형분류기로 사용할 수 있을 것이다.

  • Binary Softmax classifier

활성화 함수를 통과해 얻은 값을 특정 클래스에 해당하는 확률 p로써 해석할 수 있다.

교차엔트로피 손실함수를 사용한다면, 뉴런을 이진 소프트맥스 분류기로 사용할 수 있게 된다.

예를 들어, 시그모이드 함수는 [0,1]의 범위로 출력이 나오게 되므로, 해당 출력값을 확률처럼 해석하여 클래스를 분류할 수 있다.

  • Binary SVM classifier

출력값에 자체를 보고, 최대 마진값을 고려하는 hinge loss를 적용한다면, 뉴런을 SVM처럼 사용할 수 있다.

이 경우에는 정답이 맞다면 loss를 0으로, 경계 근처라면 패널티를 준다.


5.4. Commonly used activation functions

모든 활성화 함수는 하나의 숫자를 사용하여 특정한 수학 연산을 수행한다.

  • 활성화 함수(Activation functions)

출처 : https://cs231n.stanford.edu/

5.4.1. Sigmoid

sigmoid 비선형함수는 위와 같은 형태를 갖는다.

  • 입력 값을 가져와 0과 1사이의 값이 되도록 한다.
  • 입력의 값이 작으면 출력이 0에 가깝고 입력의 값이 크면 출력이 1에 가깝다.
  • 0 근처를 보면 선형함수같다.

아래 3가지의 문제를 갖는다.

  1. gradient 소실 문제를 가질 수 있다. (양/음의 방향으로 큰 값을 가진다면)
  2. zero-centered가 아니기때문에 gradient 업데이트가 효율적이지 않다.
  3. exp()로 인해 연산비용이 크다.

각 문제를 하나씩 자세하게 확인해보자.

1. gradient 소실 문제를 가질 수 있다.(양/음의 방향으로 큰 값을 가진다면)

출처 : https://cs231n.stanford.edu/

sigmoid gate를 computational graph로 나타내면 위와 같다.

x=-10이면, → 그러면 0에 가까운 값이 backprop된다. 이 부분에서 앞으로 계속 0이 전달되어 gradient 소실 문제가 발생한다.

x=0이면, 적절한 gradient를 갖는다.

x=10이면, x=-10일 때와 같이 gradient 소실 문제가 발생한다.

2. zero-centered가 아니기 때문에 gradient 업데이트가 효율적이지 않다.

출처 : https://cs231n.stanford.edu/

뉴런의 입력이 항상 양수일 때 위와 같다고 하면, 입력 x는 가중치와 곱해지고 활성함수를 통과한다.

W에 대한 gradient를 생각해보면 local gradient(∂f/∂W)는 x이므로 gradient(∂L/∂W)는 모두 양수이거나 모두 음수이다.

→ W가 모두 같은 방향으로만 움직일 것이다.

→ 파라미터를 업데이트할 때, 다 같이 증가하거나 다 같이 감소할 것이다.

→ 이런 gradient의 업데이트는 비효율적이다.

3. exp()로 인해 연산비용이 크다.

큰 문제는 아니다. 다른 연산들, 가령 내적의 계산의 연산비용이 더 크다.

5.4.2. tanh

출처 : https://cs231n.stanford.edu/

  • sigmoid와 유사하지만 범위가 [-1,1]이다.
  • zero-centered이다.
  • 양/음의 방향으로 큰 값을 가진다면 gradient소실 문제가 발생할 수 있다.

5.4.3. ReLU

ReLU 함수는 아래와 같은 형태를 갖는다.

출처 : https://cs231n.stanford.edu/

  • element-wise 연산을 수행하여 입력값이 음수면 값이 0이 되고 양수이면 입력값을 출력한다.
  • 계산 효율이 뛰어나다.
  • 아래의 문제를 갖는다.
    • zero-centered가 아니다.
    • 입력값이 양수일 때는 기울기 소실 문제가 나타나지 않지만, 음수일때는 발생한다.

문제를 자세하게 확인해보자.

1. 입력값이 양수일 때는 기울기 소실 문제가 나타나지 않지만, 음수일때는 발생한다.

x=-10일 때, gradient는 0 / x=10일 때, gradient는 선형 영역에 속함 / x=0일 때, gradient는 0

→ ReLU는 gradient의 절반을 죽인다. 즉, dead ReLU 현상을 겪을 수 있다.

예를 들어, 아래와 같은 data cloud(데이터 분포)가 있다고 하자.

ReLU가 data cloud에서 떨어져있는 경우에 “Dead ReLU”가 발생할 수 있다.

Dead ReLU에서는 activate가 일어나지 않고 update되지 않는다.

반면 active ReLU는 일부는 active되고 일부는 active 하지 않을 것이다.

dead ReLU가 발생하는 이유는 1) 초기화를 잘못해서 dead ReLU 구역에서 시작, 2) Learning rate가 지나치게 높은 경우 이다.

출처 : https://cs231n.stanford.edu/

5.4.4. Leaky ReLU

  • ReLU와 비슷하지만 negative 구역에서 0이 아니다. → negative구역에서 기울기 소실 문제가 발생하지 않는다.
  • 계산 효율이 뛰어나다.
  • dead ReLU 현상이 없다.

출처 : https://cs231n.stanford.edu/

5.4.5. Parametric Rectifier(PReLU)

  • negative 구역에 기울기가 있다는 점에서 Leaky ReLU와 유사하다.
  • 기울기가 α라는 파라미터로 결정되며 α는 backprop으로 학습시키는 파라미터이다.

5.4.6. Exponential Linear Units(ELU)

출처 : https://cs231n.stanford.edu/

  • ReLU의 이점을 그대로 가져오지만 zero-mean에 가까운 출력값을 보인다.
  • negative 구역에서 값을 가지고 기울기가 0에 가까워지게 된다.
  • ReLU와 Leaky ReLU의 중간 정도라고 보면 된다.

5.4.7. Maxout

  • 입력을 받아들이는 특정한 기본형식을 미리 정의하지 않는다.
  • ReLU와 leaky ReLU의 좀 더 일반화된 형태이다.
  • 선형함수이기 때문에 기울기 소실 문제가 발생하지 않는다. → 문제점은 뉴런 당 파라미터의 수가 두 배가 된다.

🌟 실제로 가장 많이 사용하는 것은 ReLU이다.(learning rate 설정 주의)

  • Leaky ReLU, Maxout, ELU도 사용 가능
  • tanh도 사용가능하지만 ReLU들이 더 잘 작동함
  • sigmoid는 사용하지 않는 것이 좋다.

5.5. Neural Network architectures

신경망에서 각 레이어는 행렬곱을 했다.

위에서 2-layer 신경망이라고 불렀던 것은 아래의 왼쪽 그림과 같이 나타낼 수 있다.

출처 : https://cs231n.stanford.edu/

5.5.1. Layer-wise organization

2-layer 신경망은 선형 레이어를 2개 가지고 있고, 그것은 행렬 곱을 하는 연결된 두 layer이다.

이것을 하나의 히든 레이어로 부를 수 있다.

따라서 2-layer 신경망을 1-hidden-layer 신경망이라고 할 수 있다.

  • naming conventions

n-layer 신경망을 말할 때 입력 레이어는 계산하지 않는다.

  • output layer

신경망의 모든 레이어와 달리 출력 레이어 뉴런에는 활성화 기능이 없다.

이는 일반적으로 마지막 출력 레이어가 클래스 스코어를 나타내는 데 사용되기 때문이다.

  • sizing neural networks

신경망의 크기를 측정하기 위해 일반적으로 사용하는 두 가지는 뉴런의 수와 파라미터의 수이다 (일반적으로 파라미터의 수)

→ 왼쪽에는 4+2=6개의 뉴런(입력 계산X), (3x4)+(4x2)=20개의 weights, 4+2=6개의 bias가 있다. 총 26개의 학습가능한 파라미터가 있다.

→ 오른쪽에는 4+4+1=9개의 뉴런, (3x4)+(4x4)+(4x1)=32개의 weights, 4+4+1=9개의 bias가 있다. 총 41개의 학습가능한 파라미터가 있다.


5.6. Example feed-forward computation

신경망이 계층으로 구성되는 주된 이유 중 하나는 이 구조가 행렬 벡터 연산을 사용하여 신경망을 평가하는 것을 매우 간단하고 효율적으로 만들기 때문이다.

아래의 다이어그램을 통해 이해해보자.

출처 : https://cs231n.stanford.edu/

# forward-pass of a 3-layer neural network:
f = lambda x: 1.0/(1.0 + np.exp(-x)) # activation function (use sigmoid)
x = np.random.randn(3, 1) # random input vector of three numbers (3x1)
h1 = f(np.dot(W1, x) + b1) # calculate first hidden layer activations (4x1)
h2 = f(np.dot(W2, h1) + b2) # calculate second hidden layer activations (4x1)
out = np.dot(W3, h2) + b3 # output neuron (1x1)

여기서 f는 sigmoid함수이다.

데이터를 x로 받는다.(x는 [3x1]벡터)

첫 번째 히든 레이어의 가중치 W1은 [4x3]행렬이고 bias b1은 [4x1]이다.

비슷하게, 두 번째 히든 레이어 h2를 얻기 위한 두 번째 행렬곱을 한다.

그리고 최종출력을 얻는다.


5.7. Representational power

representational power란? 해당 신경망이 다양한 입력 데이터를 얼마나 효과적으로 모델링할 수 있는지를 나타내는 개념, 즉, 신경망이 학습한 함수가 데이터의 복잡한 구조와 패턴을 효과적으로 표현할 수 있는 능력

  • 좋은 representational power을 갖는 신경망은 입력 데이터의 다양한 특징과 패턴을 잘 파악하고 추상화할 수 있어, 해당 문제에 대해 더 좋은 일반화 성능을 가질 수 있다.
    • 얕은 신경망은 단순한 선형 분리만을 수행할 수 있으며, 좀 더 깊고 복잡한 신경망은 비선형 문제를 해결하는 능력이 더 강력하다.
    • representational power가 충분하지 않은 경우에는 복잡한 문제를 충분히 표현하고 해결하기 어려울 수 있다.
  • 하지만, representational power가 너무 높으면 과적합(overfitting)과 같은 문제가 발생할 수 있어 높으면 높을수록 좋다고 할 수 없다.
    • 적절한 크기와 구조의 신경망을 선택하여 representational power를 조절하는 것이 중요하다.

이를 위해 모델의 구조를 조정하거나 regularization 기법을 사용하여 적절한 일반화를 이끌어내는 것이 일반적인 신경망 학습의 관점에서 중요한 요소이다!


5.8. Setting number of layers and their sizes

출처 : https://cs231n.stanford.edu/

위 그림을 통해 더 많은 뉴런을 가지는 신경망이 더 복잡한 함수를 표현할 수 있음을 알 수 있다.

그러나, 필요 이상으로 복잡한 함수를 나타내어 (data의 noise까지 학습하여) overfitting이 발생한다.

이 과정에서 데이터가 overfitting을 방지할 만큼 충분히 복잡하지 않은 경우 더 작은 신경망이 선호될 수 있는 것이라고 생각할 수 있으나. 과적합을 방지하기 위해 사용하는 다른 방법(L2정규화, 드롭아웃, 입력 노이즈)이 있다.

 무작정 neuron이 적은 모델을 선호하기보다는 neuron의 개수는 비슷하게 가져가면서 L2 regularization, dropout, input noise와 같은 overfitting을 방지할 수 있는 방법을 함께 사용한다.

출처 : https://cs231n.stanford.edu/

위 이미지는 L2 regularization을 적용한 경우로 효과가 커질수록 overfitting에서 벗어남을 확인할 수 있다