머신 러닝이 단지 MNIST 수기 숫자 인식문제라든지 AND OR XOR 로직문제만 풀수 있는 것은 아니다. 이미 피타고라스와 유클리드 이래로 수많은 수학 문제를 풀기 위한 방법들이 수학책에 나타나 있지만 머신 러닝에 의한 해법은 다소 생소하게 느껴지기도 한다. 머신 러닝의 연혁을 조사해 보면 1960년대 말까지 많은 관심을 받았으나 1970년대부터 오랫동안 방치 되었다가 2000년대 들어서면서부터 IT 산업 발전과 함께 다시 재조명을 받게 되었다.
학습에 의해서 특정 문제들을 풀 수 있다는 논리에 바탕을 둔 머신 러닝을 사용하여 수학 문제를 풀기 위해서는 결국 수학 문제를 학습할 수 있도록 정식화를 해야 할 필요가 있다.
컴퓨터에서 실행되는 머신 러닝 코드가 학습할 수 있다는 의미는 주어진 데이터 세트들에 대해 일정한 패턴으로 따라할 수 있도록 hypothesis를 포함한 알고리듬을 부여할 수 있어야 한다.
3차함수 f(x)=ax3+bx2+cx+d 를 기술함에 있어 4개의 파라메터 a, b, c, d 가 필요하다. 이와 같은 3차 함수를 학습시키기 위해서 과연 몇 개의 좌표 데이터들이 필요한지는 아직 알려져 있지 않다. 다만 선형회귀에 있어서처럼 좌표 데이터 수가 적정 개수를 넘어 과잉인 상태로 늘어나도 머신 러닝에서는 아무런 문제가 되지는 않는다. 오히려 중요한 사실은 과연 최소한 몇 개의 좌표 데이터가 필요하며 이 데이터들을 어떻게 설정할지의 문제이다.
2차 방정식의 해를 구하는 과정에서 2개의 학습 데이터가 필요했다는 점에 착안하여 3차 함수에서는 3개의 학습 데이터를 사용하기로 하자.
a=1.0, b=2.0, c=-1.0, d=-2.0 인 3차 함수의 해를 구하도록 하자.
x 축의 [-2.5, 1.5] 구간에서 이 3차 함수는 그림과 같은 형상을 갖는다.
코드의 시작 부분에서 TensorFlow 와 그래프 작성을 위한 pylab를 설치한다.
pylab은 matplotlib 라이브러리의 특수한 부분으로서 함수식이 정의된 경우 편리하게 함수의 그래프를 작도할 수 있다.
3차 함수의 계수 a, b, c, d 의 값을 주자. 이어서 arrange 명령에 의해 x축 상의 구간 {-2.5, 2.3] 을 정의하고 그래프 작도를 위한 간격을 0.01 단위로 정한다.
작도하기 위한 3차함수 s를 설정하고 작도 명령 plot(s,t)를 실행한다. 아울러 x축, y축 라벨과 타이틀을 출력과 grid(True)에 의해 눈금을 표시하도록 설정한 후 show()에 의해서 화면에 출력한다.
앞서 정의된 3차 함수를 사용하여 3개의 학습 데이터를 준비한다.
3차함수의 x 축과의 만나는 점 즉 3차 방정식의 해를 구하기 위해서 3개의 해를 W1,W2,W3를 경사하강법에 의해 수렴시키기 위한 변수로 설정한다.
hypothesis 는 2차 방정식에서의 기법을 확장하여 아래와 같이 3차식 형태로 구성하자.
hypothesis = (x_train-W1)*(x_train-W2)*(x_train-W3)
cost 함수는 hypothesis 와 y_train 데이터와의 차이 값을 제곱하여 합한 후 평균값을 취하고 learning rate=0.01 로 두어 경사 하강법을 적용한다.
이와 같이 TensorFlow 정식화가 완료되었으면 Session 설정 후 실행하고 결과를 출력한다.
500회 학습 결과 cost 값이 10의 -9승 크기로 얻어졌고 W1, W2, W3 가 각각 –1.9999, 0.9999, -1.0000 으로 얻어졌다. 이로서 3개의 학습 데이터를 가지고 3차 함수의 해가 얻어질 수 있음이 확인되었다.
필자의 블로그에서 필요한 코드를 다운받아 실행해 보자.
http://blog.daum.net/ejleep1/684
#cubiceqn_regression_01.py