본문 바로가기
DeepLearning Framework & Coding/Tensorflow 1.X

[코드로 이해하는 딥러닝 11] - Deep Neural Network/XOR

by 노마드공학자 2020. 12. 24.

[코드로 이해하는 딥러닝 0] - 글연재에 앞서 https://limitsinx.tistory.com/27

[코드로 이해하는 딥러닝 1] - Tensorflow 시작 https://limitsinx.tistory.com/28 

[코드로 이해하는 딥러닝 2] - Tensorflow 변수선언 https://limitsinx.tistory.com/29

[코드로 이해하는 딥러닝 3] - Tensorflow placeholder변수 https://limitsinx.tistory.com/30

[코드로 이해하는 딥러닝 4] - 선형회귀(Linear Regression) https://limitsinx.tistory.com/31

[코드로 이해하는 딥러닝 5] - 다중선형회귀(Multiple Linear Regression) https://limitsinx.tistory.com/32

[코드로 이해하는 딥러닝 6] - 회귀(Regression)에 대한 다른 접근 https://limitsinx.tistory.com/33

[코드로 이해하는 딥러닝 7] - .txt(.csv)파일 불러오기 https://limitsinx.tistory.com/34

[코드로 이해하는 딥러닝 8] - Logistic Regression(sigmoid) https://limitsinx.tistory.com/35

[코드로 이해하는 딥러닝 9] - Softmax Regression(multiple classification) https://limitsinx.tistory.com/36

[코드로 이해하는 딥러닝 10] - MNIST 데이터 분류/One hot encoding https://limitsinx.tistory.com/37

 

※이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다

 

 

출처 : stackoverflow https://stackoverflow.com/questions/9600888/single-perceptron-non-linear-evaluating-function

인공지능은 1990년대까지 침체기에 들어섰었습니다.

 

이제까지 저희가 정리해온 코드들은 모두 Single Layer Perceptron으로 input layer 다음 바로 output layer가 나오는 경우죠

 

즉, Y=WX+b라는 선형식으로 cassification을 하는것인데.. 이런 선형식으로 위의 Exclusive OR은 어떻게 구분할수있을까.. 라는 문제에 직면하게 됩니다.

 

출처 : https://mylearningsinaiml.wordpress.com/what-is-dl/

즉, 위의 별과 동그라미를 직선 한개로 어떻게 구별해낼 수 있을까요?

 

없습니다...

이때문에 이것을 해결하기 위해서는 Single layer가 아닌 Multiple layer를 사용해야한다! 라고 주장하신분이 토론토대학교의 제프리힌튼 교수님이십니다.

 

single layer perceptron

 

즉, 기존에는 이렇게 Single Layer Perceptron으로 진행하던것을,

 

multi layer perceptron

이렇게 Hidden layer를 중간에 두어, 깊이를 깊게한번 만들어보자!해서 만들어진것이 Deep Neural Network입니다.

 

Deep Neural Network(이하 DNN)을 통해 XOR문제가 어떻게 해결되었는지 코드로 확인해보겠습니다.

 

[코드 전문]

import tensorflow.compat.v1 as tf

tf.disable_v2_behavior()

import numpy as np

 

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)

Y=tf.placeholder(tf.float32)

#layer 1

W1=tf.Variable(tf.random_normal([2,10]), name='weight1'#input x:2, output : layer1(~=size of x) : 2

b1=tf.Variable(tf.random_normal([10]), name='bias1')

layer1 = tf.sigmoid(tf.matmul(X,W1)+b1)

 

#layer 2

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)

 

#layer 3

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)

 

#layer 4

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 = -tf.reduce_mean(Y*tf.log(hypothesis) + (1-Y)*tf.log(1-hypothesis))

train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

 

predicted = tf.cast(hypothesis>0.5dtype = tf.float32)

accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted,Y), dtype = tf.float32))

 

#Launch graph

#with tf.Session() as sess : 

sess = tf.Session()

sess.run(tf.global_variables_initializer())

 

for step in range(10001) : 

    sess.run(train, feed_dict = {X:x_data, Y:y_data})

    if step%1000 == 0 :

        print(step, sess.run(cost, feed_dict = {X: x_data, Y:y_data}), sess.run(W2))

 

#acurracy report

h,c,a = sess.run([hypothesis, predicted, accuracy], feed_dict = {X:x_data, Y:y_data})

print("\nhypothesis: ",h, "\nCorrect : ",c, "\nAccuracy :",a)



[코드 분석-1]

x_data, y_data는 XOR(Exclusive OR)대로 지정해줍니다.

여기까지는 기존과 다른 특이사항이 없습니다.

 

[코드 분석-2]

여기서 부터 기존과 다른 차이점이 생기는데요

기존에는 Weighting과 bias를 1개만 선언해주었지만, 이번에는 4개를 종류를 다르게 선언해주었습니다.

 

즉, Hidden layer가 4개인 Deep Neural Network 구조인것입니다.

 

★중요한점 1

 DNN의 깊이를 얼마나 Deep하게 할지, Wide하게 할지를 본인이 선택할 수 있습니다.

깊이는 Layer의 갯수를 늘려가면되는것인데요, Wide 하다는것은 

w3=tf.Variable(tf.random_normal([10,10]),name='weight3') 부분을보시면 확인하실 수 있습니다.

 

input으로 들어오는건 [0,1], [1,1] ... 이렇게 x_data값이 2개씩 들어오죠

그런데 w3의 weighting갯수는 무려 10개입니다!!

 

학습해야하는 데이터는 2개지만, 10개로 특징을 spread시켜서 보겠다!! 이런뜻입니다.

 

★중요한점 2

w1,w2,w3,w4의 사이즈는 각각

 

[2,10], [10,10], [10,10], [10,1] 입니다.

 

이게 아주 중요한데요!

input layer는 2개가 들어오기 때문에 첫 레이어의 input을 2로 적어준것이며, output은 1개가 되도록 하는것이 기본 프레임입니다.

이건 직관적으로 확인하실수 있으실텐데요

 

더불어, 이전 layer의 output 갯수다음 layer의 input 갯수가 맞아야합니다!

 

이부분들만 캐치를 정확하게 해주신다면 이하 나머지 부분은 기존의 Single Layer 머신러닝과 동일합니다!

 

 

[코드 분석-3]

Sigmoid로 학습하는 코드입니다.

기존글에서 깊게 다루었기에 자세한 설명은 스킵하겠습니다.

 

[결과값(10000번학습)]

10001번 학습한 결과

Hypothesis를 보면 정확하게 0,1,1,0을 찾아내는 모습을 확인할 수 있습니다.

 

Summary

 

Deep Neural Network를 통해, Exclusive OR문제를 해결하였다는 것은 크게 의미있는것이 아닙니다.

ExclusiveOR은 상징적인 의미일뿐! 이것이 진정 의미하는 바는

 

 

"비선형 문제도 DNN을 통해서라면 해결할 수 있겠구나?"

 

 

라는 일말의 희망을 얻게 되었다는것입니다! 세상은 선형,비선형 두개로 구분이 되어있죠

비선형문제만 모두 해결가능하다면, 세상은 DNN으로 모두 풀이가 가능하다는 뜻이되는것입니다!

 

따라서 XOR은 그자체로 의미가있는것이아니라, 비선형성을 담고 있는 문제였다는것이 핵심이였고,

 

DNN을 통해 이것을 해결해보았습니다.

댓글