본 게시글은 필자가 강의, 책 등을 통해 개인적으로 학습한 것으로
본문의 모든 정보는 출처를 기반으로 작성되었습니다.
ReLU는 Sigmoid가 복잡한 구조의 model(많은 Hidden Layer를 포함)에서
유발하는 Vanishing Gradient를 해결하기 위해 사용된 Activation Function이다.
이는 Sigmoid함수의 retrun값이 항상 0~1 사이에 있기 때문에 발생한다.
sigmoid를 사용한 Deep Neural Network에서
backpropagation을 통해 학습이 이루어 질 때,
sigmoid함수의 outputs들이 계속해서 곱해지기 때문에
Input Layer에 가까워질수록 편미분 값이
점점 작아지는 현상이 일어나는 것이다.
즉, 앞쪽(closer to Input Layer)에 위치한 입력값들과 학습의 최종 결과 사이에 영향력을
점점 작게, 결국 0에 가깝게 추산하는 오류가 발생하게 되는데 이것이 바로 Vanishing Gradient이다.
(수식으로 이해하기 위해서는 이 곳을 참고하자.)
ReLU
앞서 설명했듯 vanishing gradient는 sigmoid의 결과값이 항상 0~1사이에 존재하기 때문에 발생한다.
이를 해결한 ReLU func은 다음과 같다.
값들이 0~1 사이에서 제한되지 않고, 크기와 비례하여 증가하므로 backpropagation이
계속 진행되어도 vanishing gradient가 발생하지 않는다.
단, sigmoid를 대신하여 relu를 사용하는 경우,
우리가 원하는 최종값이 0 or 1이라는 것이며
마지막 Output Layer는 Sigmoid를 사용해야 함을 잊지 말자.
sigmoid func를 사용했던 XOR problem을 다중 layer로 구현하되
activation func을 하나는 기존에 사용했던 sigmoid를,
다른 하나는 relu를 사용해보았다.
또한 Tensorboard를 활용해서
서로 다른 model을 시각적으로 비교하기 위한 예제 코드로도 살펴보자.
전체코드
import tensorflow as tf
import numpy as np
import datetime
from tensorflow.keras.callbacks import ModelCheckpoint
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)
def train_model(ACTIVATION):
tf.model = tf.keras.Sequential()
tf.model.add(tf.keras.layers.Dense(units=10, input_dim=2, activation=ACTIVATION))
tf.model.add(tf.keras.layers.Dense(units=10, activation=ACTIVATION))
tf.model.add(tf.keras.layers.Dense(units=10, activation=ACTIVATION))
tf.model.add(tf.keras.layers.Dense(units=10, activation=ACTIVATION))
tf.model.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))
tf.model.compile(loss='binary_crossentropy', optimizer=tf.optimizers.Adam(lr=0.1), metrics=['accuracy'])
tf.model.summary()
log_dir = "logs/my_board/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)
tf.model.fit(x_data, y_data, epochs=500, callbacks=[tensorboard_callback])
train_model('sigmoid')
train_model('relu')
%load_ext tensorboard
%tensorboard --logdir logs
참고 문헌 및 자료
1. Sung Kim Youtube channel : https://www.youtube.com/channel/UCML9R2ol-l0Ab9OXoNnr7Lw
Sung Kim
컴퓨터 소프트웨어와 딥러닝, 영어등 다양한 재미있는 이야기들을 나누는 곳입니다.
www.youtube.com
2. Andrew Ng Coursera class : https://www.coursera.org/learn/machine-learning
3. 조태호(2017). 모두의 딥러닝. 서울: 길벗
'IT study > 모두를 위한 딥러닝' 카테고리의 다른 글
Drop out (0) | 2020.08.25 |
---|---|
Weight Initialization (0) | 2020.08.25 |
Tensorboard (0) | 2020.08.21 |
XOR Problem (0) | 2020.08.19 |
MNIST (0) | 2020.08.18 |