상세 컨텐츠

본문 제목

[딥러닝] DNN: 정의, 순전파&역전파, 활성화함수, 기울기소실문제

멋사 AISCOOL 7기 Python/INPUT

by dundunee 2022. 12. 8. 16:49

본문

Deep Learning

인공지능 스스로 일정 범주의 데이터를 바탕으로 공통된 특징을 도출하고, 그 특징으로 예측값을 출력함.

: 머신러닝과의 가장 큰 차이점은 머신러닝은 사람이 특징을 추출하고 예측하지만, 딥러닝은 인공지능이 특징을 추출하고 예측한다는 인간의 개입여부가 가장 큰 차이점이다.

 

📍 ANN의 문제점

🛠️ 초기의 인공신경망 Perceptron

사람의 신경망을 모방했다. 각 노드의 가중치와 입력치를 곱한 것을 모두 합한 값이 활성함수에 의해 판단되는데, 그 값이 임계치보다 크면 뉴런이 활성화되고 결과값으로 1을 출력한다

하지만 단층이기 때문에 XOR(AND OR)연산이 불가능하다 → 단층을 다층 구조로 변경했다.

따라서 입력층-은닉층-출력층으로만 이뤄졌던 인공신경망은 입력층 - 은닉층 - 은닉층 - ... - 출력층으로 구성되게되었다.

 

🤔 학습 데이터에 따른 과적합 문제

사전훈련(제한 볼츠만 머신, RBM)을 통해 과적합을 방지한다

  • 제한 볼츠만 머신(또는 RBM)이란 층간 연결을 없앤 형태로 순방향 신경망의 각 층을 효과적으로 사전훈련시킨다.

🤔 학습 시간이 너무 느리다

그래픽 카드의 발전으로(GPU, CUDA)학습시간이 빠르게 개선됐다


1️⃣ 딥러닝의 연산: 순전파와 역전파

✏️ 순전파(Forward Propagation)

 인공신경망의 입력층에서 출력층 방향으로 예측값의 연산이 진행되는 과정을 말한다. 입력값은 입력층, 은닉층을 지나며 각 층에서 가중치와 함께 연산되며, 출력층에서 모든 연산을 마친 예측값을 도출한다.

✏️ 역전파(Back Propagation)

 순전파와 반대로 출력층에서 입력층으로 계산하면서 가중치를 업데이트하는 과정을 말한다. 역전파를 통해 가중치 비율을 조정하여 오차 감소를 진행하고, 다시 순전파로 진행함으로써 오차 감소 확인이 가능하다. → 즉 역전파를 하는 이유는 검산하기 위함이다.

이는 다층 퍼셉트론 학습에 사용되는 통계적 기법으로, 출력층에서 제시한 값이 실제 원하는 값에 가까워지도록 학습하기 위해 통계적 방법에 의한 오차 역전법을 사용하게 된다.

이때 오차역전법은 동일한 입력층에 대해 원하는 값이 출력되도록 미분을 통해 각각의 가중치를 조정하는 방법을 사용하게되며, 속도는 느리지만 안정적인 결과를 얻을 수 있다는 장점이 있다.

👉 epoch와 이어짐


2️⃣ 활성화함수(Activation Function)

💡 정의

활성화함수는 은닉층과 출력층의 뉴런에서 출력값을 결정하는 함수로 가중치를 생성한다. 입력값들의 수학적 선형결합을 다양한 형태의 비선형 또는 선형 결합으로 변환하는 역할을 한다.

$y = f(w*x + b)$ 의 형태로 식이 완성되며 한글로 풀어보면,

$출력값 = 활성화함수(가중치(weight) * 입력값 + 편향(bias)$ 로 이뤄진다.

이때 (w*x + b)는 벡터곱과 합으로 이뤄져 있음을 기억해야 한다.

🛠️ 시그모이드(Sigmoid)

  • S자형 곡선 또는 시그모이드곡선을 갖는 수학함수로 로지스틱함수라고도 한다.
  • 출력값은 0~1사이의 값을 갖는다
  • 모델링에 필요한 시간이 줄어드나, 미분의 범위가 짧아 정보가 손실되는 Gradient Vanishing 문제가 발생하기도 한다.
    • 즉 일정범위를 벗어나면 기울기가 0이 되는 것
  • 주로 로지스틱 회귀나, 딥러닝 이진분류에 사용된다.
x = np.arange(-10, 10, 0.1) #-10~10까지 0.1간격으로 값 생성하기
plt.plot(x, tf.keras.activations.sigmoid(x), linestyle='--', label="sigmoid") 
plt.axvline(0)
plt.legend()

🛠️ tanh - 하이퍼볼릭탄젠트 함수

  • 쌍곡선 함수 중 하나로, 삼각함수와 유사한 성질을 갖고 있으며, 표준 쌍곡선을 매개변수로 표시할 때 나오는 함수이다.
  • Sigmoid대체로 사용될 수 있는 활성화함수이다. → 비슷한 s자형태를 띈다
    • 단 시그모이드보다 출력범위가 더 넓고, 경사면이 큰 범위가 더 크기 때문에 더 빠르게 수렴하여 학습 성능이 높아진다.
  • 출력값은 -1~1사이의 값을 갖는다
  • 데이터를 0중심으로 위치시키는 효과가 있기 때문에 다음 층의 학습이 더 쉽게 이뤄진다
  • 하지만 시그모이드와 마찬가지로 미분범위가 짦아 Gradient Vanishing문제가 발생한다.
x = np.arange(-10, 10, 0.1) #-10~10까지 0.1간격으로 값 생성하기
plt.plot(x, tf.keras.activations.tanh(x), linestyle='--', label="tanh") 
plt.axvline(0)
plt.legend()

 

💡 기울기소실(Gradient Vanishing)

  • 깊은 인공 신경망을 학습할 때 역전파과정에서 입력층으로 갈수록 기울기가 점차 작아지는 현상을 말한다.
  • 입력층에 가까운 층들에서 가중치들이 업데이트가 제대로 되지 않으면 결국 최적의 모델을 찾을 수 없게 된다.
  • 시그모이드함수와 tanh함수에서는 입력값이 일정범위를 벗어나게 되면 기울기가 0이 되는 문제가 발생한다 → 함수의 특성상 기울기가 0이되면 어떠한 입력값이 들어오더라도 출력값이 같아지게되는 문제가 발생한다.
  • 다만 이진분류의 경우 출력값이 0 또는 1이기때문에 상관없다. 그래서 이진분류에서 활성화함수는 대부분 시그모이드를 사용하게 된다.

💡 기울기폭주(Gradient Exploding)

  • 반대의 경우로 기울기가 점차 커지더니 결국 가중치들이 비정상적으로 큰 값이 되면서 결국 발산되기도 하며 순환 신경망(RNN)에서 쉽게 발생한다

🤔 가중치들을 업데이트한다?

→ 예측값이 실제값에 더 가까워지도록하게 한다를 의미한다?

 

 

🛠️ 렐루(Relu)

  • 기울기소실(Gradient Vanishing)을 해결하는 방법은 ReLU나 Leaky ReLU를 사용하는 것이다.
  • ReLU함수는 정류 선형 유닛(Rectified Linear Unit)에 대한 선형함수를 개선한 버전이다.
  • 출력값의 범위는 입력값이 0보다 작으면 0으로 출력하며, 0보다 크면 입력값 그대로 출력한다.
  • 기울기소실문제를 해결하며, 미분이 간편해져서(그래프가 선형형태이기 때문) 학습속도가 빨라지지만 입력값이 0보다 작으면 0을 출력하는 Dying ReLU문제가 발생하기도 한다.
x = np.arange(-10, 10, 0.1) #-10~10까지 0.1간격으로 값 생성하기
plt.plot(x, tf.keras.activations.relu(x), linestyle='--', label="relu") 
plt.axvline(0)
plt.legend()

 

 

🛠️ 리키렐루(Leaky Relu)

  • ReLU의 Dying ReLU문데를 해결하기위해 나온 ReLU의 변형함수이다.
  • 입력값이 0보다 작을 경우에도 0이 아니라 0.01과 같은 매우 작은 수를 반환해줌으로써 Dying ReLU문제를 해결한다
  • 입력값이 0보다 클 경우에는 입력값 그대로를 출력한다.

출처: 위키백과

 

🛠️ swish

x = np.arange(-10, 10, 0.1) #-10~10까지 0.1간격으로 값 생성하기
plt.plot(x, tf.keras.activations.swish(x), linestyle='--', label="swish") 
plt.axvline(0)
plt.legend()

 

 

🛠️ selu

x = np.arange(-10, 10, 0.1) #-10~10까지 0.1간격으로 값 생성하기
plt.plot(x, tf.keras.activations.selu(x), linestyle='--', label="selu") 
plt.axvline(0)
plt.legend()

관련글 더보기