3-8 집합계산 방식의 Softmax XOR 논리 처리

in #kr6 years ago

noname01.png

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회로 설정하여 계산한다.

noname02.png

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)))
Sort:  

전공이 문과쪽이지만 가끔은 숫자가 참 아름답다는 생각이 듭니다. ^^
무슨 말인지 잘 모르지만 어쨌든 코딩은 처음인데 알차게 보고 갑니다.
계속 좋은 포스팅 부탁드립니다 ~

Congratulations @codingart! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

Award for the number of upvotes

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard:

SteemitBoard Ranking update - Steem Power, Followers and Following added

Support SteemitBoard's project! Vote for its witness and get one more award!

Coin Marketplace

STEEM 0.18
TRX 0.15
JST 0.028
BTC 62928.79
ETH 2465.26
USDT 1.00
SBD 2.55