머신러닝

3-1 OR 로직 머신 러닝

coding art 2021. 7. 2. 15:18
728x90

머신 러닝에 의한 OR 로직 classification 에 대해서 알아보자. 수학적인 OR 로직 문제를 생각하는 사람들이 있겠지만 머신 러닝에서 한가하게 수학 문제를 풀어야 할 이유는 없다. OR 로직은 2개의 입력 센서를 가지는 Rosenblatt의 퍼셉트론에서 2개의 라벨을 “+1”“-1”이 아닌 “1”“0” 으로 학습하는 경우로 보면 될 것이다.

 

한편 자동차 도난 경보장치에서는 각 도어마다 개폐 스위치가 설치되어 있어 도난 경보기 알람 해제 이전에 어느 도어 하나라도 열게 되면 OR 로직에 의해 출력이 발생하고 경보가 울리게 된다.

 

아두이노의 디지털 데이터 핀이나 라즈베리 파이의 GPIO 디지털 출력은 “0” “1” 또는 “ON“ ”OFF“ 또는 “LOW”“HIGH” 로 표현된다. 그림에서처럼 이러한 논리(LOGIC) 출력을 바탕으로 하는 OR 논리(LOGIC)를 고려해 보자.

 

OR 논리에서는 “0”“1”을 사용하여 입력 값 x1,x2가 주어지며 2개 중의 1개가 “1”이라면 출력 y“1” 이 된다. 이 표는 다음과 같이 좌표 평면으로 나타낼 수도 있다.

그림의 직각 좌표 평면에서 4개의 입력 값이 표현되어 있다. 이 그림에서 출력 값이 “0”이 되는 1개의 점과 출력 값이 “1”3개의 점은 가로지르는 직선 즉 hyperplane에 의해서 명확하게 분류 (classification)될 수 있음을 알 수 있다.

 

따라서 이 식별선 왼쪽의 영역은 논리 또는 라벨 값이 “0” 인 영역이며 그 오른 쪽은 “1”인 영역이 된다. 이러한 classifier를 학습에 의해 찾아낼 수 있도록 다음과 같이 입력벡터 X와 웨이트 백터 W를 정의하자.

X W를 사용하여 다음과 같이 선형의 hypothesis를 설정하자.

2개의 라벨 영역 “0” “1” 을 구별할 수 있는 Classifier를 찾아내기 위해 학습을 위한 TensorFlow 코드 데이터를 아래와 같이 준비하자.

 

x1_data = [ 0, 1, 0, 1]

x2_data = [ 0, 0, 1, 1]

y_data = [ 0, 1, 1, 1]

 

learning_rate 값은 0.005 로 설정한다. 이 값은 여러 번 학습을 시도해 보고 결정해도 무방하다. softmax라든지 Sigmoid 확률분포를 사용하는 접근법도 가능하겠지만 여기서는 제일 간단한 선형회귀법에서 사용했던 최소제곱법에 의한 cost함수를 사용해 보기로 한다.

계산은 아나콘다에서 해도 가능하겠지만 파이선 코딩이 가능한 라즈베리 파이 보드를 사용하기로 한다. 출력 결과가 좀 달라 보일지도 모르겠다.

 

cost 함수는 0.87에서 시작하여 4000번 학습 후 0.06 수준에 도달했다. 한편 라벨 값 [ 0, 1, 1, 1] 에 대한 실제 계산된 라벨 값은 [0.25, 0.75, 0.75, 1.25] 로 주어진다. 이때의 w1,w2 b 는 각각 0.502, 0.502 0.248 로 계산된다. 0.5 이하는 라벨 값 “0”, 0.5 이상은 라벨 값 “1” 로 간주된다.

4000회 학습에서 얻어진 결과를 종합하면 아래의 결과가 얻어진다.

독립변수 (x1,x2)의 함수인 hypothesis3차원 공간에서 나타낼 수 있으며, 그 값이 0.5 일 때와 0.75 일 때 라즈베리 파이 보드에 기본으로 설치되어 있는 매스매티카를 사용하여 다음과 같이 그래픽 처리하여 볼 수 있다. hypothesis 값에 주목하는 이유는 OR 로직 classification 문제도 결국 뉴럴 네트워크 학습과 관련되어 있기 때문에 threshold 값으로서 얼마가 적당한 것인지 확인이 필요하며 아울러 TTL이나 CMOS 로직과 어느 정도 그 범위가 맞아야 로직 게이트 집적회로 하드웨어 구현이 가능해진다.

만약에 hypothesis 의 값 0.5threshold 로 사용한다면 위 그림과 같이 상당히 왼쪽으로 치우친 hyperplane 이 결정된다. 반면에 hypothesis 값이 0.75 에 대해 결정되는 hyperplane x1,x2 사각 평면에서의 논리 값에 대한 거의 대각선에 가까운 classifier를 볼 수 있다. 머신 러닝 분야에서 01 사이의 값을 다루는 뉴럴 네트워크 계산에서 fire를 위한 threshild 값 설정에 유의하자.

 

이와 같이 3차원 그래픽 처리를 해 보면 쉽게 라벨 값 영역 “0”“1” 이 어떻게 분할되는지 될 것인지 쉽게 알아 볼 수 있다.

 

첨부된 파이선 코드를 실행해 보자.

 

#multi_variable_linear_regression_OR.py

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

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

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

#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')

b = tf.Variable(tf.random_normal([1]), name='bias')

hypothesis = x1 * w1 + x2 * w2 + b
print(hypothesis)

#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.005)
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(4001):
cost_val, hy_val, _ = sess.run([cost, hypothesis, train],
feed_dict={x1: x1_data, x2: x2_data, Y: y_data})
if step % 400 == 0:
print(step, cost_val, hy_val)