본문 바로가기

ComputerScience/Machine Learning

DeepLearning - 2. Deep Neural Networks

728x90
 

Deep Neural Networks

Explore and run machine learning code with Kaggle Notebooks | Using data from DL Course Data

www.kaggle.com

*Kaggle에서 제공하는 Deep Learning Tutorial을 학습하며 번역한 내용입니다.

Introduction

이번 장에서는 좀더 복잡한 관계를 학습하는 neural networks를 만들것이다. 핵심 아이디어는 modularity이다 간단한 functional units로부터 complex network를 만드는 것이다. linear function을 계산하는 linear unit들을 조합해서 복잡한 관계의 model을 만들어보자.

Layers

Neural networks는 neurons들을 layers로 조직한다. 공통 inputs를 가지는 linear units를 모으면 dense layer가 된다.

https://www.kaggle.com/ryanholbrook/deep-neural-networks

하나의 bias와 두개의 공통 inputs을 받는 두 linear units의 dense layer를 위 그림처럼 표시할 수 있다. neural network의 각 layer는 일종의 비교적 간단한 transformation을 수행한다고 볼 수 있다. 깊은 layers의 stack을 통해서 neural network는 inputs를 더 복잡한 방식으로 변화시킨다. 잘 학습된 neural network에서 각 layer는 solution과 가까워지는 계단인 것이다.

https://databricks.com/glossary/deep-learning

The Activation Function

위에서 살펴본 two dense layers는 사실 single dense layer보다 나을게 없다. dense layers 자체로는 line과 plane을 벗어날 수 없다. 즉 nonlinear fitting을 위해서서는 activation function이 필요하다. 

https://www.kaggle.com/ryanholbrook/deep-neural-networks

activation functions없이 neural networks만으로는 linear relationships만 학습할 수 있다.

activation function은 layer의 outputs에 적용되는 함수이다. 가장 평범한 activation function은 rectifier function, max(0,x)max(0,x)이다.

https://www.kaggle.com/ryanholbrook/deep-neural-networks

max(0,x)max(0,x)(rectifier function)을 그래프로 그려보면 위와 같다. 음수부분을 전부 0으로 만들어 버린다. 함수를 neuron의 output에 적용하면 data를 구부릴 수 있게 된다. 단순한 line을 벗어나게 되는 것이다. rectifier을 linear unit에 부착했을 때, 이를 rectified linear unit(ReLU)라고 한다.

https://www.kaggle.com/ryanholbrook/deep-neural-networks

ReLU activation을 적용한 linear unit의 output은 max(0, w * x + b)가 된다.

Stacking Dense Layers

이제 nonlinearity를 갖게 되었다. 이번엔 좀더 복잡하게 stack layers의 data data transformations을 살펴보자.

https://www.kaggle.com/ryanholbrook/deep-neural-networks

dense layers의 stack은 fully-connected network를 만든다.

output layer전의 layers를 hidden이라고 부른다. 왜냐하면 우리는 각 layer의 output을 직접적으로 보지 않기 때문이다.

final output layer를 보면 activation function이 없다. 즉 linear unit이라는 뜻이다 regression task에서는 임의의 수치값을 예측해야하기 때문에 그렇다. 반면 classification같은 task에서는 output에 activation function이 필요할 수 있다.

Building Sequential Models

위의 다이어그램을 바탕으로 실제로 sequential model을 만들어보자. sequential model은 layers list를 하나로 모아 연결시켜 준다. 첫번째 layer가 input을 받고 마지막 layer가 output을 만든다.

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    # the hidden ReLU layers
    layers.Dense(units=4, activation='relu', input_shape=[2]),
    layers.Dense(units=3, activation='relu'),
    # the linear output layer 
    layers.Dense(units=1),
])

모든 layer를 [layer, layer, layer, ..]처럼 list로 넘겨줘야한다. activation function을 더해주기 위해서는 activation='relu'를 인자로 넘겨주면 된다.

Exercise

stacking layers로 deep neural networks를 build해보자. hiddem layers에는 activation function을 더해주어 더 복잡한 non-linear relationships를 학습하도록 해보자.

import tensorflow as tf

# Setup plotting
import matplotlib.pyplot as plt

plt.style.use('seaborn-whitegrid')
# Set Matplotlib defaults
plt.rc('figure', autolayout=True)
plt.rc('axes', labelweight='bold', labelsize='large',
       titleweight='bold', titlesize=18, titlepad=10)

# Setup feedback system
from learntools.core import binder
binder.bind(globals())
from learntools.deep_learning_intro.ex2 import *

이번에는 concrete dataset을 가지고 recipe에 따라 제조된 concrete의 compressive strength를 예측할 것이다. data set을 load해보자.

import pandas as pd

concrete = pd.read_csv('../input/dl-course-data/concrete.csv')
concrete.head()

https://www.kaggle.com/ryanholbrook/deep-neural-networks

CompressiveStrength열이 target이기 때문에 input = [8]이 된다.

# YOUR CODE HERE
input_shape = [8]

이제 keras모델을 정의해보자. 총 세개의 hidden layers가 있고 각 layer는 512개의 units로 구성되며 ReLU activation적용되어 있다. 물론 output layer는 하나의 유닛으로 되어있다.

from tensorflow import keras
from tensorflow.keras import layers

# YOUR CODE HERE
model = model = keras.Sequential([
    # the hidden ReLU layers
    layers.Dense(units=512, activation='relu', input_shape=[8]),
    layers.Dense(units=512, activation='relu'),
    layers.Dense(units=512, activation='relu'),
    # the linear output layer 
    layers.Dense(units=1),
])

위에서는 activation function을 Dense layer에 붙이기 위해 인자로 relu를 넘겨주었다. 하지만 때때로 Dense layer와 activation function사이에 다른 layer를 넣어야 할 때가 있을 것이다. 이런 상황에서는 다음 처럼 코드를 작성할 수 있다.

activation을 Activation Layer에서 따로 정의하는 것이다.

layers.Dense(units=8),

layers.Activation('relu')

이 코드는 아래 방식으로 작성한 코드와 완전 동일하다.

layers.Dense(units=8, activation='relu').

### YOUR CODE HERE: rewrite this to use activation layers
model = keras.Sequential([
    layers.Dense(32, activation='relu', input_shape=[8]),
    layers.Dense(32, activation='relu'),
    layers.Dense(1),
])

따라서 위의 코드를 아래처럼 작성할 수 있다. 각 Dense layer는 32개의 unit으로 구성되며 각 activation이 Activation Layer에 있다.

### YOUR CODE HERE: rewrite this to use activation layers
model = keras.Sequential([
    layers.Dense(32, input_shape=[8]),
    layers.Activation('relu'),
    layers.Dense(32),
    layers.Activation('relu'),
    layers.Dense(1),
])

Optional

relu activation의 다양한 변형이 있다. 'elu', 'selu', 'swish'등이 이에 속하는데 모두 keras에서 사용가능하다. 어떤 activation을 사용하냐에 따라 더 나은 수행 능력을 보여주기도 한다.

# YOUR CODE HERE: Change 'relu' to 'elu', 'selu', 'swish'... or something else
activation_layer = layers.Activation('elu')

x = tf.linspace(-3.0, 3.0, 100)
y = activation_layer(x) # once created, a layer is callable just like a function

plt.figure(dpi=100)
plt.plot(x, y)
plt.xlim(-3, 3)
plt.xlabel("Input")
plt.ylabel("Output")
plt.show()

elu activation을 사용하여 그래프를 살펴보자.

# YOUR CODE HERE: Change 'relu' to 'elu', 'selu', 'swish'... or something else
activation_layer = layers.Activation('relu')

x = tf.linspace(-3.0, 3.0, 100)
y = activation_layer(x) # once created, a layer is callable just like a function

plt.figure(dpi=100)
plt.plot(x, y)
plt.xlim(-3, 3)
plt.xlabel("Input")
plt.ylabel("Output")
plt.show()

relu를 사용하여 위에 결과와 차이를 관찰해보자.

728x90
반응형