Data/ML&DL

FFNN(Feed Forward Neural Net)

동동 2023. 4. 22. 23:52
728x90

FFNN(Feed Forward Neural Net)

배경

**트랜스포머(transformer)**를 이해하려면 Attention을 이해해야한다.

Attention을 이해하려면 RNN을 이해해야하고

RNN을 이해하기 위해선 FFNN을 이해해야한다.

FFNN은 아래 목차 수준으로 이해하고 있으면 된다.


  1. 퍼셉트론이란
    1. AND분류
    2. OR분류
    3. XOR분류
      1. 직선 두 개를 이용한다.
  2. Multi-layer Perceptron
    1. MLP학습을 위해 해야할 일
      1. Input Layer의 Node 수 결정
      2. output Layer의 Node 수 결정
      3. hidden Layer의 Node 수 결정
      4. 학습 Algorithm을 이용한 weight 추정
          1. Forward propagation
        1. Back-propagation알고리즘 이용
          1. Activation 함수 : Sigmoid

 🎑 Back-propagation

MLP(Multi-Layer Perceptron)에서 Backpropagation은 역전파 알고리즘이라고도 불리며, 학습 데이터를 이용하여 신경망의 가중치(weight)와 편향(bias)을 조정하는 방법 중 하나입니다. 역전파 알고리즘은 기울기 하강법(Gradient Descent)과 함께 사용되며, 기울기 하강법은 손실 함수(Loss Function)의 값을 최소화하기 위해 가중치와 편향을 업데이트합니다.

Backpropagation의 핵심 아이디어는 출력층에서부터 입력층으로 거꾸로 오차를 전파하는 것입니다. 먼저, 신경망의 출력층에서 손실 함수를 계산하고, 이 손실 함수의 기울기를 구합니다. 그리고 이 기울기를 이용하여 출력층에서부터 역순으로 미분 값을 계산하면서, 입력층까지 오차를 전파합니다. 이렇게 구한 기울기를 이용하여 가중치와 편향을 업데이트합니다.

간단한 MLP에서는 Backpropagation을 다음과 같은 단계로 수행할 수 있습니다.

  1. 입력층에서부터 순전파(forward pass)를 수행하여 출력값을 계산합니다.
  2. 출력층에서부터 역전파(backward pass)를 수행하여 오차를 전파합니다.
  3. 각 층에서 구한 오차를 이용하여 가중치와 편향을 업데이트합니다.
  4. 위의 단계를 반복하여 학습을 진행합니다.

각 층에서 오차를 계산하기 위해서는 다음과 같은 방법으로 수행합니다.

  1. 출력층에서부터 역순으로 미분 값을 계산합니다.
  2. 이전 층에서의 미분 값과 현재 층에서의 가중치를 곱하여 이전 층으로 오차를 전파합니다.
  3. 위의 단계를 반복하여 모든 층에서 오차를 전파합니다.

오차를 전파하면서 구한 기울기를 이용하여 가중치와 편향을 업데이트하는 방법은 다음과 같습니다.

  1. 기울기 하강법을 이용하여 가중치와 편향을 업데이트합니다.
  2. 학습률(learning rate)과 함께 가중치와 편향을 업데이트합니다.

위와 같은 방법으로 Backpropagation을 수행하여 MLP 모델을 학습할 수 있습니다. 이 알고리즘은 다층 신경망에서 가장 많이 사용되며, 심층 신경망을 학습시키는 데에도 사용됩니다. Backpropagation은 딥러닝 분야에서 가장 기본적이고 핵심적인 알고리즘 중 하나입니다.

Backpropagation 알고리즘에서 가장 중요한 것은 그래디언트(gradient)입니다. 그래디언트는 손실 함수의 파라미터에 대한 기울기를 나타내며, 파라미터를 어떤 방향으로 업데이트해야 할 지 결정하는 데 사용됩니다. Backpropagation 알고리즘에서는 역전파 과정에서 각 노드의 그래디언트를 계산하고, 이를 이용하여 파라미터를 업데이트합니다.

Backpropagation은 매우 강력한 알고리즘이지만, 다음과 같은 문제점도 가지고 있습니다.

  1. 그래디언트 소멸 문제: 딥러닝 모델이 깊어질수록 그래디언트가 소멸되는 문제가 발생합니다. 이 문제를 해결하기 위해 ReLU와 같은 활성화 함수가 사용됩니다.
  2. 과적합 문제: 모델이 학습 데이터에만 과적합되는 문제가 발생합니다. 이 문제를 해결하기 위해 드롭아웃(Dropout)과 같은 정규화 기법이 사용됩니다.

이러한 문제점을 해결하기 위해 다양한 개선된 알고리즘이 제안되고 있습니다. 예를 들어, ResNet, DenseNet, LSTM과 같은 모델이 소개되었고, Adam, RMSprop과 같은 최적화 알고리즘도 개발되었습니다. 이러한 알고리즘을 적절히 조합하여 보다 강력한 딥러닝 모델을 개발할 수 있습니다.


실제 계산을 통해 순전파와 역전파를 공부하기

역전파(backpropagation) 알고리즘에서는 각 노드(node)에서의 그래디언트(gradient)를 계산하여, 이를 이용해 모델의 파라미터를 업데이트합니다. 이 과정에서 미분이 사용됩니다.

예를 들어, 다음과 같은 간단한 MLP(multi-layer perceptron)을 생각해 봅시다.

이 MLP 모델은 2개의 입력 노드, 3개의 은닉 노드, 1개의 출력 노드로 구성되어 있습니다. 각 노드에서는 활성화 함수로 시그모이드 함수가 사용됩니다.

이제 이 모델을 학습시키기 위해 역전파 알고리즘을 적용해 보겠습니다. 이때, 손실 함수(loss function)로는 평균 제곱 오차(Mean Squared Error, MSE)를 사용하겠습니다.

  1. Forward propagation

먼저, 입력값을 모델에 입력하여 forward propagation을 수행합니다. 즉, 입력값을 은닉층에서 출력층으로 전달하면서, 각 노드에서의 출력값을 계산합니다.

  • 입력값 x1, x2를 받는 입력 노드의 출력값은 그대로 입력값입니다. 따라서, a1 = x1, a2 = x2 입니다.

은닉층에서는 각 노드의 출력값을 계산하기 위해, 입력값과 가중치(weight)를 곱한 후, 시그모이드 함수를 적용합니다. 예를 들어, 은닉 노드 h1의 출력값은 다음과 같이 계산됩니다.

z1 = w11a1 + w21a2 + b1

h1 = sigmoid(z1)

여기서 w11, w21, b1은 각각 은닉 노드 h1에 대한 가중치(weight)와 편향(bias)을 나타냅니다.

마찬가지로, 은닉 노드 h2와 h3의 출력값도 계산할 수 있습니다.

  • z2 = w12a1 + w22a2 + b2
  • h2 = sigmoid(z2)
  • z3 = w13a1 + w23a2 + b3
  • h3 = sigmoid(z3)

마지막으로, 출력 노드에서는 은닉 노드의 출력값과 가중치를 곱한 후, 시그모이드 함수를 적용하여 최종 출력값 y를 계산합니다.

  • z4 = w14h1 + w24h2 + w34*h3 + b4
  • y = sigmoid(z4)

이렇게 계산된 y값과 실제 정답값을 비교하여 손실 함수를 계산합니다.

  1. Backward propagation

이제, 손실 함수를 최소화하기 위해 역전파 알고리즘에서는, 출력 노드에서부터 입력 노드 방향으로 그래디언트(gradient)를 계산합니다. 이를 위해서는, 각 노드에서의 그래디언트 값을 계산해야 합니다.

먼저, 출력 노드의 그래디언트를 계산합니다. 손실 함수의 출력값 y에 대한 그래디언트를 계산하면 됩니다. 여기서는 MSE 손실 함수를 사용하므로, y에 대한 손실 함수의 그래디언트는 다음과 같습니다.

  • dL/dy = 2(y - t)

여기서 t는 실제 정답값을 나타냅니다.

이제, 출력 노드에서 은닉 노드 방향으로 그래디언트를 전달합니다. 출력 노드와 연결된 가중치와 은닉 노드의 그래디언트를 곱한 값을 출력 노드의 그래디언트에 곱해줍니다. 예를 들어, 출력 노드와 은닉 노드 h1 사이의 가중치 w14에 대한 그래디언트는 다음과 같이 계산됩니다.

  • dL/dw14 = dL/dy * dy/dz4 * dz4/dw14
  • dy/dz4 = y * (1 - y) # 시그모이드 함수의 미분
  • dz4/dw14 = h1 # h1은 z4의 함수이므로 미분값은 1

따라서,

  • dL/dw14 = dL/dy * dy/dz4 * dz4/dw14 = 2(y - t) * y * (1 - y) * h1

마찬가지로, 출력 노드와 은닉 노드 h2, h3 사이의 가중치에 대한 그래디언트는 다음과 같이 계산할 수 있습니다.

  • dL/dw24 = dL/dy * dy/dz4 * dz4/dw24 = 2(y - t) * y * (1 - y) * h2
  • dL/dw34 = dL/dy * dy/dz4 * dz4/dw34 = 2(y - t) * y * (1 - y) * h3

이제, 은닉 노드에서 입력 노드 방향으로 그래디언트를 전달합니다. 은닉 노드와 출력 노드 사이의 가중치와 그래디언트를 곱한 값을 은닉 노드의 그래디언트에 곱해줍니다. 예를 들어, 은닉 노드 h1과 입력 노드 x1, x2 사이의 가중치 w11에 대한 그래디언트는 다음과 같이 계산됩니다.

  • dL/dw11 = dL/dh1 * dh1/dz
728x90