머신러닝

3-12 Quadratic Hypothesis에 의한 XOR 논리 처리

coding art 2021. 7. 2. 19:57
728x90

2종류의 출력 결과를 주는 2차 다항식 기법을 개선하기 위해서 다음과 같이 hypothesis 설정을 quadratic 형태로 변경 설정해 보기로 하자.

편향(바이어스) 추가 모델과 2차 다항식 및 3차 다항식 모델에서는 하나의 웨이트 벡터와 2개의 바이아스 b1, b2를 사용하였으나 이번에는 웨이트 벡터 하나를 추가하여 W1, W2, b1, b2를 사용하기로 한다. NN(neural network)에서 입력 단에 은닉층(hidden layer) 추가 연결에 따라 2개의 웨이트 값들이 추가되어 총 4개의 웨이트들이 사용된다는 점에서 유사성이 있으나 이 hypothesis 기법은 입력 단에서 웨이트 계산과 아울러 직접 하나의 값을 출력한다는 점에서 완전히 다른 방법임에 유의하자.

 

편향(바이어스)만 추가한 모델과 동일한 조건으로 계산한 결과 0, 1, 1, 0 에 성공적으로 수렴하는 결과를 보여 준다.

물론 웨이트 벡터와 바이아스 벡터 초기치 설정에서 난수를 사용하기 때문에 웨이트 벡터들의 성분 값은 항상 동일한 것은 아니다. 즉 계산 시 마다 변동된 웨이트 벡터 값들이 얻어진다고 해도 결과적으로 hypothesis [0, 1, 1, 0]을 만족하므로 학습에서 얻어진 W1, W2, b1, b2 값을 사용하여 hypothesis를 그래픽 처리해서 살펴보도록 하자.

여기서 소수 이하는 3번째 자리에서 반올림 처리하였다.

앞의 그림에서 hypothesis 곡면을 관찰해 보면 (0,0) (1,1)hypothesis threshold = 0.5 아래쪽이며 (0,1) (1,0) hypothesis = 0.5 위쪽임을 쉽게 알 수 있다.

NN의 경우와 quadratic hypothesis를 사용하는 경우와 비교를 위해 네트워크로 표현해 보자. quadratic hypothesis 를 사용하는 경우 아예 sigmoid 처리 layer가 없어도 되며 반복 학습 횟수도 비교할 수 없을 정도로 작아 대단히 효율적임을 알 수 있다.

 

#quadratic_leastsquare_XOR_01.py

import tensorflow as tf
#tf.set_random_seed(777)  

x1_data = [0., 1., 0., 1.]
x2_data = [0.,0.,1.,1.]
y_data = [0., 1., 1., 0.]

#placeholders for a tensor that will be always fed.
x1 = tf.placeholder(tf.float32)
x2 = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

w1 = tf.Variable(tf.random_normal([1]), name='weight1')
w2 = tf.Variable(tf.random_normal([1]), name='weight2')
w3 = tf.Variable(tf.random_normal([1]), name='weight3')
w4 = tf.Variable(tf.random_normal([1]), name='weight4')

b1 = tf.Variable(tf.random_normal([1]), name='bias1')
b2 = tf.Variable(tf.random_normal([1]), name='bias2')

hypothesis = (x1 * w1 + x2 * w2 + b1)*(x1 * w3 + x2 * w4 + b2)

#cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))

#Minimize. Need a very small learning rate for this data set
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.05)
train = optimizer.minimize(cost)

#Launch the graph in a session.
sess = tf.Session()
#Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())

for step in range(1001):
    cost_val, hy_val, _ = sess.run([cost, hypothesis, train],
                                   feed_dict={x1: x1_data,x2: x2_data, Y: y_data})
    if step % 100 == 0:
        print(step, cost_val, hy_val, sess.run(w1),sess.run(w2),sess.run(b1),sess.run(w3),sess.run(w4),sess.run(b2))