본문 바로가기
AI

DL : Deep Learning 개요 : 인공 신경망, Activation Function

by 월곡동로봇팔 2020. 3. 8.

1. Feed-Forward Neural Network

FFNN vs RNN


2. Fully-Connected Layer, Dense Layer

어떤 층의 모든 뉴런이 이전 층의 모든 뉴런과 연결되어있는 층을 전결합층이라고 한다.

위의 그림에서 FFNN에 해당한다.


3. 활성화 함수 (Activation Function)

(1) 활성화 함수의 특징 - 비선형 함수(Nonlinear function)

층을 계속 쌓는다고 가정해보겠습니다. 활성화 함수는 f(x)=Wx라고 가정합니다.
여기다가 은닉층을 두 개 추가한다고하면 출력층을 포함해서 y(x)=f(f(f(x))가 됩니다. 이를 식으로 표현하면 W×W×W×X입니다. 그런데 이는 잘 생각해보면 W의 세 제곱값을 k라고 정의해버리면 y(x)=kx와 같이 다시 표현이 가능합니다. 

즉, 선형 함수로는 은닉층을 여러번 추가하더라도 1회 추가한 것과 차이를 줄 수 없습니다.

(2) 계단 함수(Step function)

지금은 잘 사용하지 않지만, 완전 기본이 되는 함수.

(3) 시그모이드 함수(Sigmoid function)와 기울기 소실

import tensorflow as tf

x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)
y_data = np.array([[0], [1], [1], [0]], dtype=np.float32)

X = tf.placeholder(tf.float32, [None, 2])
Y = tf.placeholder(tf.float32, [None, 1])

W1 = tf.Variable(tf.random_normal([2, 10]), name='weight1')
b1 = tf.Variable(tf.random_normal([10]), name='bias1')
layer1 = tf.sigmoid(tf.matmul(X, W1) + b1)

W2 = tf.Variable(tf.random_normal([10, 10]), name='weight2')
b2 = tf.Variable(tf.random_normal([10]), name='bias2')
layer2 = tf.sigmoid(tf.matmul(layer1, W2) + b2)

W3 = tf.Variable(tf.random_normal([10, 10]), name='weight3')
b3 = tf.Variable(tf.random_normal([10]), name='bias3')
layer3 = tf.sigmoid(tf.matmul(layer2, W3) + b3)

W4 = tf.Variable(tf.random_normal([10, 1]), name='weight4')
b4 = tf.Variable(tf.random_normal([1]), name='bias4')
hypothesis = tf.sigmoid(tf.matmul(layer3, W4) + b4)

# cost/loss function
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

# Accuracy computation
# True if hypothesis>0.5 else False
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

위는 Activation Function을 sigmoid로 하는 Desne-Layer를 code로 구성한 것이다.

 

sigmoid를 activation function으로 한 model의 gradient vanishing

Activation Function을 sigmoid 함수로 할 경우, Dense-Layer에서는 Gradient-Vanishing 이 일어난다.

그 이유가 밑에 그림으로 나와있다.

Gradient Vanishing

학습하는 과정에서 기울기를 측정을 하는데. 총model의 기울기는 각 layer들의 기울기를 곱한 값이다.

근데 각 layer는 sigmoid로 이루어져있고, sigmoid는 빨간색 부분에서는 값이 0에 가깝다.

초록색 부분일지라도 이는 1을 넘지 않기 때문에 총 model의 기울기는 layer가 Deep 할 수록 0으로 수렴한다.

따라서 다음과 같이 Gradient Vanishing이 일어나는 것을 알 수 있다.

(4) Hyperbolic Tangent Function

Tanh Function

하이퍼볼릭탄젠트 함수도 -1과 1에 가까운 출력값을 출력할 때, 시그모이드 함수와 같은 문제가 발생합니다.

그러나 하이퍼볼릭탄젠트 함수의 경우에는 시그모이드 함수와는 달리 0을 중심으로 하고 있는데,

이때문에 시그모이드 함수와 비교하면 반환값의 변화폭이 더 큽니다.

그래서 시그모이드 함수보다는 기울기 소실 증상이 적은 편입니다. 그래서 은닉층에서 시그모이드 함수보다는 많이 사용됩니다.

 

(5) ReLu Function & Leaky ReLu

ReLu함수는 음수를 입력하면 0을 출력하고, 양수를 입력하면 입력값을 그대로 반환합니다.

ReLu 함수는 특정 양수값에 수렴하지 않으므로 깊은 신경망에서 시그모이드 함수보다 훨씬 더 잘 작동합니다.

뿐만 아니라, ReLu 함수는 시그모이드 함수와 하이퍼볼릭탄젠트 함수와 같이 어떤 연산이 필요한 것이 아니라 단순 임계값이므로 연산 속도도 빠릅니다.

하지만 여전히 문제점이 존재하는데, 입력값이 음수면 기울기도 0이 됩니다. 그리고 이 뉴런은 다시 회생하는 것이 매우 어렵습니다. 이 문제를 죽은 ReLu (dying ReLU)라고 합니다.

 

죽은 ReLu 보완하기 위해 ReLU의 변형 함수들이 등장하기 시작했습니다. 변형 함수는 여러 개가 있지만 여기서는 Leaky ReLU에 대해서만 소개합니다.

Leaky ReLU는 입력값이 음수일 경우에 0이 아니라 0.001과 같은 매우 작은 수를 반환하도록 되어있습니다.

수식은 f(x)=max(ax,x) 로 아주 간단합니다

위의 그래프에서는 새는 모습을 확실히 보여주기 위해 a를 0.1로 잡았습니다. 위와 같이 입력값이 음수라도 기울기가 0이 되지 않으면 ReLU는 죽지 않습니다.

 

(7) 소프트맥스 함수(Softamx function)

xx = np.arange(-5.0, 5.0, 0.1) # -5.0부터 5.0까지 0.1 간격 생성

y = np.exp(x) / np.sum(np.exp(x))

plt.plot(x, y)

plt.title('Softmax Function')

plt.show()

소프트맥스 함수는 시그모이드 함수처럼 출력층의 뉴런에서 주로 사용되는데, 시그모이드 함수가 두 가지 선택지 중 하나를 고르는 이진 분류 (Binary Classification) 문제에 사용된다면!

세 가지 이상의 (상호 배타적인) 선택지 중 하나를 고르는 다중 클래스 분류(MultiClass Classification) 문제에 주로 사용됩니다.

댓글