320x100
320x100

퍼셉트론의 한계

- XOR과 같이 선형분리가 불가능한 상황에 대처할 수 없음

 : 이를 위한 해결법으로 Deep Learning 등장

 

 

Neural Network의 구성

- 가중치와 편향을 조정하는 방법

 : 경사 하강법 대신 backpropagation(역전파) 활용

 

 

오차역전파

- 수치미분(전진 하면서 미분하는 방식, 경사하강법)의 단점을 개선한 방법

 : 순전파와 역전파를 활용하여 미분을 효율적으로 계산

- 순전파

 : 입력노드에서 출력노드까지 가중치를 업데이트 하면서 활성화 함수를 통해 결과 값을 가져오는 과정

- 역전파

 : 입력노드의 방향으로 역방향으로 노드에 오차 값을 전송하여 가중치를 업데이트하는 과정

- ChainRule

 : 오차역전파의 기본 원리로써, 국소미분을 전달하는 원리

 : 국소미분 = 특정 한 노드에 대한 미분 값

=> 출력노드의 결과 값에서 나온 오차(기대 값과 결과 값의 차이)를 다시 입력층과 은닉층으로 보내

     가중치를 재 계산하여 오차를 줄이는 방법

 

 

신경망의 정확도를 높이기 위한 방법 

- 활성화 함수

 : ReLU

  = 깊고 넓은 신경망에 효과적인 알고리즘

  = 0보다 작으면 0으로 출력, 0보다 크면 입력 값 그대로 출력

 

- 가중치 초기화

 : xavier

  = RBM을 이용하여 초기값 설정

    (RBM = 2개의 계층으로 구성되어있는 신경망 / 비지도 학습 수행을 통해 가중치 구성)

  = 입력 값과 출력 값 사이의 난수를 선택해서 입력 값의 제곱근으로 나누는 방법

  = 현재 Tensorflow에 포함되어 있는 초기화 코드

=> W = np.random.randn(fan_in, fan_out)/np.sqrt(fan_in)

 

- 과적합(Overfitting) 해결

 : 드롭아웃

  = 임의로 뉴런(노드)을 삭제하는 방법

  = 학습할때만 이용 (테스트할때는 사용하지 않음)

 

            

 

 

 

텐서플로를 활용한 XOR 연산 모델

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# XOR data
x_data = tf.constant([
    [0,0],[0,1],[1,0],[1,1]], dtype=tf.float32)
y_data = tf.constant([
    [0],[1],[1],[0]], dtype=tf.float32)

# define model
model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(8,input_dim=2, activation='relu'),
    tf.keras.layers.Dense(1, activation='softmax')
])


# model compile
model.compile(optimizer='adam',
             loss='mean_squared_error',
             metrics=["accuracy"])
model.summary()

# model fit
hist=model.fit(x_data, y_data,
              validation_data=(x_data, y_data),
              verbose=2, batch_size=4, epochs=100,
              use_multiprocessing=True)

# model evaluate
model.evaluate(x_data, y_data, verbose=2, use_multiprocessing=True)

# Graph print
plt.figure(figsize=(8,4))
plt.subplot(1,2,1)
plt.plot(hist.history['loss'])
plt.title("Cost Graph")
plt.ylabel("cost")

plt.subplot(1,2,2)
plt.title("Performance Graph")
plt.ylabel("performance")
plt.plot(hist.history['accuracy'], 'b-', label="training accuracy")
plt.plot(hist.history['val_accuracy'], 'r:', label="validation accuracy")
plt.legend()
plt.tight_layout()
plt.show()
print()

- 정확도가 향상되지 않는 것을 보아서 잘못된 점이 존재하나, 추후 연구해볼 계획이다.

300x250
728x90