3-8 복소수 폴(Pole)기법에 의한 비선형 Hypothesis 유도와 XOR 머신러닝 -I

in #kr5 years ago (edited)

noname01.png

XOR 논리 머신 러닝 학습은 linear regression 형태의 hypothesis를 사용하여 학습이 불가능하다는 점이 Minsky의 저서 Perceptron(1969) 에 의해 잘 알려져 있다. 실제 cost 함수 계산에 따르면 웨이트 업데이트가 불가능하며 바이아스 값이 0.5로 고정되어 학습계산이 불가능해져 unique 한 폴 값이 존재하지 않는다는 것을 알 수 있다. 따라서 단일 폴에 하나를 추가한 두 개의 폴을 사용하여 복소수 평면상에서 특정한 order(차수)의 pole들을 가지는 유리형(meromorphic)함수 f(z)를 설정하여 이로부터 XOR 논리 계산을 위한 Hypothesis 함수를 유도해 보도록 하자.
두 개의 폴을 가지는 유리형 복소수 함수 f(z)를 아래와 같이 가정하자.

noname02.png

이 식에 도입된 웨이트들과 바이아스들은 머신 러닝 시작 단계에서 random number 생성에 의해 초기화 되며 구성된 cost 함수에 대하여 경사하강법을 적용한 학습에 의해 최종적으로 unique 하게 결정될 것이다. 이 때 각각의 폴 값들은 noname03.png가 된다.

XOR 논리 입력 조건은 평면에서 4개의 점들로 표시된다. (1,0), (0,1) 의 2개 점 데이타에 대한 class “1” 또는 “HIGH”로 부여되며 반면에 2개의 점 데이터(0,0), (1,1)은 class “0” 또는 “LOW”가 부여된다.

noname04.png

하지만 하나의 classification 직선을 사용하여 이 2 종류의 class를 분리 식별하기 위한 hyperplane 설정이 불가능하다는 점을 직관적으로 알 수 있다.

복소수함수 f(z)를 적분하여 h(z) 로 두자.

noname05.png

적분 하한 C 는 복소수 함수 noname06.png가 실수 값 1.0 이 되는 복소수 평면상에서의 특정 곡선을 나타낸다. 이 복소수 함수 H(z) 으로부터 머신 러닝을 위한 hypothesis를 구성해 보자.

noname07.png

복소수 함수 H(z) 와 그 공액 복소수를 사용하여 다음과 같이 실수부와 허수부 를 구성하지.

noname08.png

noname09.png

(3)식과 (4)식을 선형적으로 결합하여 hypothesis를 구성하자.

noname10.png

임의의 α값을 시험해 볼 수 있으나 여기서는 α=1.0일 때를 고려해 보자.
learning rate = 0.1, 학습 횟수 1000회 일 때에 OR 논리 머신 러닝 계산 결과를 다음과 같이 표로 요약해 보자.
10e-4 이하는 0.0 버림으로 처리하였다.
noname11.png

웨이트 값들과 바이아스 값들을 사용하여 폴 값을 계산해 보자.

noname12.png

머신 러닝 계산 과정에서 매번 코드 실행 시 마다 학습 끝에 얻어지는 hypothesis 값은 [0.0 1.0 1.0 0.0]으로 동일한 반면에 초기 웨이트 값들과 바이아스 값들은 random number 를 사용하여 초기화 하므로 항상 변동되는 값을 보여 준다. 다음 편에서 그래픽 처리한 결과를 가시적으로 살펴보도록 한다.

#secondorder_regression_XOR_pole_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_uniform([1]), name='weight1')
w2 = tf.Variable(tf.random_uniform([1]), name='weight2')
w3 = tf.Variable(tf.random_uniform([1]), name='weight3')
w4 = tf.Variable(tf.random_uniform([1]), name='weight4')
b1 = tf.Variable(tf.random_uniform([1]), name='bias1')
b2 = tf.Variable(tf.random_uniform([1]), name='bias2')

#one more bias added
#hypothesis = (x1 * w1 + b1)*(x1 * w3+ b2 ) - w2 * w4 *x2 x2
alpha = 1.0
re = (x1 * w1 + b1)
(x1 * w3+ b2 ) + w2 * w4 *x2 *x2
im = (x1 * w1 + b1) x2 * w4 + (x1 * w3 + b2) * x2 * w2
hypothesis = re + alpha
im
#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.1)
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(5001):
cost_val, hy_val, _ = sess.run([cost, hypothesis, train],
feed_dict={x1: x1_data,x2: x2_data, Y: y_data})
if step % 1000 == 0:
print(step, cost_val, hy_val,sess.run(w1),sess.run(w2),sess.run(w3),sess.run(w4),sess.run(b1),sess.run(b2))

마나마인로고.png

Sort:  

저는 코박봇 입니다.
보팅하고 갑니다 :) 좋은 글 감사합니다.

감사합니다

Coin Marketplace

STEEM 0.27
TRX 0.13
JST 0.032
BTC 62656.62
ETH 2941.90
USDT 1.00
SBD 3.59