머신러닝

3-7 집합계산 방식의 softmax XOR 논리 처리

coding art 2021. 7. 2. 17:33
728x90

XOR 논리를 NN(neural Network) 방식이 아닌 다소 다른 시각으로 집합계산 원리에 따라 퍼셉트론을 사용해 계산해 보도록 하자. 물론 하나의 퍼셉트론으로 XOR 논리 처리가 되지 않기 때문에 그 대안으로 XOR 논리를 그림에서처럼 2개의 부분집합으로 구성하였다. 이 두 부분 집합의 OR 연산을 하면 XOR 논리가 됨을 알 수 있으며 각각에 대해서 퍼셉트론 모델을 사용하여 학습이 가능하다는 점이 이미 밝혀졌다.

 

XOR 논리 문제를 Softmax를 사용해서도 확률적으로 계산해 보기로 한다. 물론 이 문제를 위에서와 같이 2개의 부분집합으로 나누지 않을 경우에 Softmax 계산은 단일 퍼셉트론과 마찬가지로 처리가 불가능하므로 퍼셉트론에서와 마찬가지로 XOR_1 XOR_2 경우로 나누어서 확률을 계산하기로 한다. XOR_1에서 (0, 0) (1, 1) 이면 클라스를 “0”으로 (1, 0)이면 클라스를 “1”로 설정한다. “0”“1”에 대한 one hot code 는 각각 “10” “01” 로 처리하기로 한다.

 

XOR_01 문제와 XOR_02 문제에 대한 Softmax 입력 데이터와 출력 데이터는 다음과 같이 주어지면 learning rate = 0.1, 학습횟수는 10,000회로 설정하여 계산한다.

softmax에 의해 3개의 입력 데이터를 가지는 XOR_01 문제와 XOR_02 문제를 성공적으로 계산하였다. 이 계산 결과에서 얻어진 확률 계산 결과나 또는 라벨링 결과를 OR 연산하면 [0 1 1 0] 이 됨을 쉽게 알 수 있다.

 

XOR 로직 문제를 계산함에 있어서 XOR_01 문제와 XOR_02 문제로 분리해 각각 단일 퍼셉트론을 적용하거나 softmax를 적용해 처리 한 후 OR 연산을 통해 합쳐서 정확한 결과가 얻어졌다. 이로서 NN이 아니면서도 XOR 논리계산이 가능한 두 번째 방법으로서 Softmax 기법이 제시되었다.

 

첨부된 파이선 코드를 다운로딩 후 콜론 “:” 으로 명령이 끝나는 부분에 다음에 그 다음 줄을 당겨 붙인 후 다시 엔터 작업을 하면 정확한 indentation 위치를 파악할 수 있다. indentation을 정확히 복구하여 실행해 보도록 하자.

 

#softmax_3data_XOR_logic_01.py

import tensorflow as tf
tf.set_random_seed(777) # for reproducibility

#x_data = [[ 0, 0 ], [ 1, 0], [ 0, 1], [ 1, 1] ]
x_data = [[ 0, 0 ], [ 0, 1], [ 1, 1] ]
y_data = [ [1, 0], [0, 1], [1, 0] ]

X = tf.placeholder("float", [None, 2])
Y = tf.placeholder("float", [None, 2])
nb_classes = 2

W = tf.Variable(tf.random_normal([2, nb_classes]), name='weight')
b = tf.Variable(tf.random_normal([nb_classes]), name='bias')

#hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)
hypothesis = tf.sigmoid(tf.matmul(X, W) + b)
#cost/loss
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) *
tf.log(1 - hypothesis))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
#Launch graph
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())

for step in range(10001): sess.run(optimizer, feed_dict={X: x_data, Y: y_data}) if step % 5000 == 0: print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data})) print('--------------') #Testing & One-hot encoding all = sess.run(hypothesis, feed_dict={ X: [[ 0.0, 0.0 ], [ 0.0, 1.0], [ 1.0, 1.0 ]]}) print(all, sess.run(tf.argmax(all, 1)))