3-10 Softmax AND 로직 머신 러닝 hypothesis surface 3차원 그래픽 Visualization
백문이 불여 일견이라 복잡하고 상세히 설명보다는 3차원 그래픽 비쥬얼라이제이션을 통해 Softmax hypothesis 확률 분포 곡면을 관찰해 본다면 Softmax 에 대해 그동안 가져왔던 불투명했던 면을 일거에 깨우칠 수 있으리라 기대한다.
다음의 수치 예제를 통해서 Softmax를 완벽하게 이해하는 계기로 삼도록 하자. 다음의 수치 계산 결과는 AND 로직 계산 결과이다. learning rate = 0.1에 반복학습 횟수를 고의적으로 100회에 한정했다. 반복학습 횟수가 500회를 상회하면 계산되는 확률 값이 거의 1.0 과 0.0 에 가까워 수작업으로 계산해 보기 어렵게 된다. 하지만 100회 계산 결과지만 result를 보면 아울러 hypothesis 값을 보면 threshold = 0.5로 볼 때에 충분히 AND 로직을 시사하고 있음을 알 수 있다.
다음은 위 결과를 표로 정리해 놓은 것이다.
AND 로직을 Softmax 기법으로 계산하기 위한 데이터로서 다음 그림을 참고하여 4개의 데이터 (0,0), (1,0), (0,1) a 및 (1,1) 을 리스트 형태로 코딩하여 입력한다. 여기서 “0”과 “1”은 논리 값 즉 “LOW”와 “HIGH”를 뜻하지만 분리선(Classifier)를 찾아내기 위한 좌표값으로 봐도 무방하다.
머신 러닝 학습에 의해 얻어진 웨이트 벡터와 바이아스 벡터를 사용하여 각 좌표 별로 2개의 성분을 가지는 one hot code 라벨 값 성분들의 확률 값을 계산하자. one hot code 라벨 값의 2 성분들은 결국 확률이므로 그 합은 1.0 이 되어야 한다. 이론 적으로는 (1,0)과 (0,1) 이 나와야 하지만 현재 반복학습 횟수가 대단히 적으므로 그 합이 1.0 이면서 어느 한쪽이 0.5 이상이라면 Sigmoid 함수에서처럼 그 쪽을 “HIGH” 또는 “1” 로 판정을 내릴 수 있다.
웨이트 벡터와 바이아스 벡터의 소수이하 자리수가 너무 길어 소수이하 둘째자리까지 반올림하여 취하였다.
이 값들을 사용하여 구체적으로 Softmax 확률 함수의 식을 써보자. 두 확률 성분을 합하면 1.0 이 됨을 쉽게 확인할 수 있다.
그림의 softmax(xi) 확률 정의 식을 참조하여 다음과 같이 분자의 엑스포넨셜 항을 계산하자.
계산된 값을 사용하여 각각의 입력 좌표에서의 라벨 값 확률 성분들을 계산해 보자.
평면상에서 정의 되는 AND 로직 문제를 최종적으로 계산된 확률 값을 대상으로 수치적으로 threshold = 0.5 상회하는지 하회하는지 판단하면 된다. 반면에 Softmax 확률 함수의 식은 변수의 함수이므로 3차원 공간상에서 threshold 면과 함께 다음과 같이 그래픽에 의한 비쥬얼라이제이션도 가능하다. 즉 두 개의 이벽 변수를 갖는 로직들에 대해서는 두 개의 라벨 값 확률 변수를 가지므로 3차원적으로 비쥬얼라이제이션에 의한 확인이 유일하게 가능하다. 엑스포넨셜 함수 사용에 따라 나타나는 곡면이 상당히 복잡할 것으로 예상했으나 오히려 상당히 매끈하면서도 평탄한 특성을 보여 준다.
첨부된 파이선 코드를 실행해 보자. 단 session = tf.Session() 이하 영역에서 indentation 이 무너진 부분을 반드시 복구하여 실행하기 바란다
#softmax_AND_logic_01.py
#Softmax Classifier
from matplotlib import pyplot as plt
import numpy as np
import tensorflow as tf
tf.set_random_seed(777) # for reproducibility
x_data = [[ 0, 0 ], [ 1, 0], [ 0, 1], [ 1, 1] ]
y_data = [ [1, 0], [1, 0], [1, 0],[0, 1] ]
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.nn.softmax(tf.matmul(X, W) + b)
#cost/loss
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
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(101):
sess.run(optimizer, feed_dict={X: x_data, Y: y_data})
if step % 10 == 0:
print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run(W),sess.run(b))
#Testing & One-hot encoding
all = sess.run(hypothesis, feed_dict={
X: [[ 0.0, 0.0 ],[ 1.0, 0.0], [ 0.0, 1.0 ], [ 1.0, 1.0 ]]})
print(all, sess.run(tf.argmax(all, 1)))
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