머신러닝

5-4 2차 방정식 TensorFlow 머신 러닝

coding art 2021. 7. 7. 20:31
728x90

인공지능 기술의 중추중의 하나인 머신 러닝은 NN(Neural Network)을 이용하면 MNIST 수기 숫자를 거의 100%에 가깝게 인식할 수도 있다. OpenCV 에서는 Haarcascade 라이브러리 모듈을 이용하여 사람의 얼굴을 인식할 수도 있었으며 hue 값을 사용하여 색상이 있는 공을 인식하는 것도 가능하다. 그밖에도 Deep Learning 에 의해 이세돌과의 바둑경쟁에서도 승리했다.

 

이처럼 영리한 머신 러닝이 왜 사람이면 누구나 중학교에서 배우는 2차방정식을 풀었다는 얘기가 없을까? 그 원인은 머신 러닝으로 하여금 학습하는 방법과 hypothesis 만드는 법 교육을 시키지 않아서 아닐까 한다. 머신 러닝 자체가 특별한 지능이 있어서 학습하지 않은 내용까지도 창의적으로 처리할 수는 없을 것이다.

 

21차 연립방정식을 푸는 방법은 이미 선을 보였다. 하지만 우리가 아는 2차 방정식의 해법은 21차 연립방정식과 판이하게 다르다는 점을 알고 있다. 어쨋든 머신러닝의 방법론은 cost 함수 구성을 통해 학습과정에 의해 최종 답을 구하는 과정으로서 과연 기초수학의 범위에 포함되는 2차 방정식의 해법까지도 적용될 수 있는지 여부가 검토될 것이다.

 

머신 러닝이 2차 방정식을 풀게 하려면 머신 러닝의 학습 방법에 맞춰 데이터를 주고 적절한 hypothesis를 가르쳐 주어야 할 것이다.

 

2차 함수

를 기술함에 있어 3개의 파라메터 a, b, c 가 필요하다. 이와 같은 2차 함수를 학습시키기 위해서 과연 몇 개의 좌표 데이터들이 필요한지는 아직 알려져 있지 않다. 다만 선형회귀에 있어서처럼 좌표 데이터 수가 2개를 넘어 과잉인 상태로 늘어나도 머신 러닝에서는 아무런 문제가 되지는 않는다. 오히려 중요한 사실은 과연 최소한 몇 개의 좌표 데이터가 필요하며 이 데이터들을 어떻게 설정할지의 문제이다.

만약 이차함수의 일차 항 계수가 b = 0 이라면 이 2차 함수는 y축에 대칭이 되며 결국 a c 값이 정해되면 2차함수가 결정되는 것이다. 2개의 상수 a c를 결정해 줄 수 있는 2개의 좌표 데이터로 최소한의 학습이 가능하다는 것을 이해할 수 있다.

 

간단한 2차 함수

해는 x = +1 이거나 x = -1 이다. 이와 같이 2개의 실근을 가지는 2차 방정식의 해는 논리상 OR 형태로 표현됨에 유의하자.

# 대칭형태의 학습 데이터 사용

2차 함수를 대상으로 그림과 같이 3가지 경우에 대해서 대칭성을 가지도록 x 좌표와 y 좌표 값을 계산하여 학습용 리스트 데이터를 구성한다.

 

1) 대칭인 3개의 좌표로 학습하는 경우

x_train = [-4.0, 0.0, 4.0]

y_train = [15.0, -1.0, 15.0]

 

2) 대칭인 2개의 좌표로 학습하는 경우

x_train = [-4.0, 4.0]

y_train = [15.0, 15.0]

 

3) 대칭인 2개의 좌표로 학습하는 경우

x_train = [0.0, 4.0]

y_train = [-1.0, 15.0]

 

3가지 경우 중에서 1)번을 우선적으로 고려하자. 이미 학습을 위한 x_train 데이터와 y_train 데이터는 주어졌다.

 

아래에 기술된 기존의 선형회귀 파이선 코드를 약간 수정하여 이용하도록 한다.

 

텐서플로우 변수 웨이트 W 와 바이아스 b는 선형회귀 문제의 W b 와는 아무런 상관이 없으며 여기서는 단순히 2차 방정식의 2개의 해로서 각각 W b 로 두기로 한다. b 라는 표현이 혼란스럽다면, W bW1 W2 로 바꾸어 표현하는 것도 좋을 듯하다.

 

학습 데이터 x_train 을 사용하여 아래와 같이 hypothesis를 구성하자.

 

hypothesis = (x_train-W1)*(x_train-W2)

 

여기서 2개의 실근을 가지는 2차 방정식의 해가 논리적으로 OR 형태임과 유사하게 이 곱하기 형태의 hypothesisOR 형태로서 선형(linear)이 아닌 2차식(quadratic) 형태이다. hypothesis를 풀어서 전개하면 W1W2, W1, W2 항들을 가지게 된다. 하지만, 이 형태는 선형회귀(linear regression) 문제에서 hypothesis W b 1차 항으로 포함된 즉 hypothesis = x_train*W + b 와는 사뭇 다르게 2차항(quadratic)에 해당하는 W1W2 항이 포함되어 있다는 점을 지적해둔다.

 

W1=tf.Variable(tf.random_normal([1],name=’weight1’)

W2=tf.Variable(tf.random_normal([1],name=’weight2’)

 

이러한 사례에 있어서 초기에 난수로 설정되는 weight1 weight2를 도입한다는 사실은 그림에서 2개의 같은 점을 지나는 2차 함수 그래프들에서 볼 수 있듯이 경사하강법을 사용하여 학습 데이터를 만족하면서 그래프와 학습 출력 값의 최소자승 오차가 0이 되는 최종적으로 W1 W2 값을 찾아내게 된다.

hypothesis를 사용하여 아래와 같이 cost 함수를 구성하도록 하자.

cost 함수는 아래와 같이 코딩 된다.

 

cost = tf.reduce_mean(tf.square(hypothesis-y_train))

 

라즈베리 파이 보드에서 learning rate = 0.01 로 두고 경사하강법을 적용하여 100회 학습하면 빨리 수렴하여 아래의 결과가 얻어진다. 결국 해는 +1 1 임을 알 수 있다.

결국 3개의 학습 데이터를 사용하여 최소 제곱법에 의해서 해를 구하였다. 하지만 이 2차 방정식에 의한 이차 함수의 형태가 y축에 대칭적이므로 3개의 데이터는 과잉으로 볼 수 있다.

즉 대칭성을 감안 2개의 학습 데이터를 사용하드라도 2차 함수를 기술하는데 충분할 것이다. 따라서 2개의 데이터를 사용하는 2)번과 3)번을 계속해서 고려해 보자.

 

2) 대칭인 2개의 좌표로 학습하는 경우

x_train = [-4.0, 4.0]

y_train = [15.0, 15.0]

3) 대칭인 2개의 좌표로 학습하는 경우

x_train = [0.0, 4.0]

y_train = [-1.0, 15.0]

앞의 2 경우와 비교하며 cost 값의 크기를 맞추기 위해서 학습 횟수를 200회로 증가시킨 결과이며 거의 동일한 해를 주고 있다.

# 비대칭형의 학습 데이터 사용

대칭성이 없는 학습 데이터를 적용해 보기로 한다. 학습 데이터는 아래와 같이 설정한다.

 

4) 대칭성이 없는 2개의 학습 데이터 사용

x_train=[0.5, 2.0]

y_train=[-0.75, 3.0]

cost 함수 값이

정도로 줄어들 때가지 학습 횟수를 400으로 조금 증가시켰으며, 만족 스러운 정밀도의 해가 얻어졌다.대칭성이 없는 학습 데이터를 적용해 보기로 한다. 학습 데이터는 아래와 같이 설정한다.

 

4) 대칭성이 없는 2개의 학습 데이터 사용

x_train=[0.5, 2.0]

y_train=[-0.75, 3.0]

cost 함수 값이

정도로 줄어들 때가지 학습 횟수를 400으로 조금 증가시켰으며, 만족 스러운 정밀도의 해가 얻어졌다.

5) 대칭성이 없는 2개의 학습 데이터 사용

x_train=[1.5, 2.5]

y_train=[1.25, 5.25]

이 데이터는 좌표 값이 2차 방정식의 해인 -1 +1의 바깥 범위에 속해 있는 특징에 유의한다.

cost 함수 값이

정도로 줄어들 때까지 학습 횟수가 50회면 충분하며, 만족스러운 정밀도의 해가 얻어졌다.

# 결론

5가지 경우의 학습 방법을 간단히 요약해 보면 3개의 데이터를 사용해도 무방하나 2개의 학습 데이타를 사용해도 만족스러울 정도의 해가 얻어졌으며 특히 2개의 하습 데이타가 2차방정식의 해 중에서 큰 값보다 바깥에 위치한 2개의 데이터를 사용하여 학습시켰을 때 보더 적은 학습횟수로 정밀한 해를 구할 수 있었다.

 

연습문제: x_train = [2.5, 3.5]를 사용하여 즉 5)번 방법을 사용 y=x*x 4.0 의 해를 구하여라. learning rate = 0.01, 1000회 학습 횟수 사용.

머신 러닝으로 하여금 2차 방정식을 처리하도록 하기 위해서는 2개의 웨이트 W1 W2 를 사용하여 2차식 형태의 hypothesis를 사용하여 성공적으로 해를 구하였다. 2차 방정식을 머신러닝으로 하여금 학습시키기 위해서 대칭적인 데이터 세트와 비대칭적인 데이터 세트를 사용하였으며 서로 다른 2개의 데이터를 사용하면 충분한 것으로 결론을 내릴 수 있다.

 

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

#quadraticeqn_regression_01.py

 

import tensorflow as tf

x_train = [-4.0, 0.0, 4.0]
y_train = [15.0,-1.0, 15.0]

W1 = tf.Variable(tf.random_normal([1]), name='weight1')
W2 = tf.Variable(tf.random_normal([1]), name='weight2')

hypothesis = (x_train - W1) * (x_train - W2)

cost = tf.reduce_mean(tf.square(hypothesis - y_train))

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)

sess = tf.Session()
sess.run(tf.global_variables_initializer())


for step in range(201):
    sess.run(train)
    if step % 50 == 0:
        print(step, sess.run(cost), sess.run(W1), sess.run(W2))