머신러닝

5-1 TensorFlow 머신 러닝 중학교 수학 2원1차 연립방정식의 풀이

coding art 2021. 7. 7. 17:02
728x90

파이선 코딩 초보자를 위한 텐서플로우∙OpenCV 머신 러닝 2차 개정판 발행

https://blog.daum.net/ejleep1/1175

 

파이선 코딩 초보자를 위한 텐서플로우∙OpenCV 머신 러닝 2차 개정판 하이퍼링크 목차 pdf 파일

본서는 10월 26일 교보문고 퍼플 POD 출판 신청하였습니다. 일정 기간 검토 후 출판 결정이 될 것이며 11월 초부터 주문 구입이 가능합니다. 참고로 책 목차에 따른 내용별 학습을 위한 코드는 이미

blog.daum.net

______________________________________________________________________________________________________________________________

 

머신러닝의 방법론은 즉 cost 함수를 구성하여 학습에 의해 최종 답을 구하는 과정이다. 하지만 머신 러닝에 의한 거의 대부분의 예제는 선형 회귀 또는 MNIST 문자인식 예제로 가득 차 있으며, 그밖에 관심을 가질만한 알기 쉬운 예제가 드물어 보인다.

 

여기서는 기존의 선형 회귀 문제나 문자 인식 예제와는 다른 중학교 수준의 수학 문제에 대해서 머신러닝이 어떻게 답을 구할 수 있는지 알아보자. 이미 거듭 거론 되었지만 머신 러닝에서 문제의 답을 구하는 과정은 우리가 알고 있는 방정식을 푸는 과정과는 판이하게 다르다는 점이다.

 

중등 수학 수준에서 다루는 21차 연립 방정식 예제는 분명히 4칙 연산을 적용해 방정식을 푸는 과정을 전제로 한다. 이러한 방법론은 컴퓨터를 사용하는 수치해석 방법에 의해 충분히 연립 방정식을 풀 수 있도록 구현되지만 머신 러닝에서는 반드시 적절한 cost 함수 구성이 가능해야하며 학습에 의해서만 답을 구할 수 있는 것이다.

 

여기에서는 머신 러닝 방식에 의해 21차 연립 방정식을 풀 수 있도록 기하학적인 아이디어로 cost 함수를 구성 하는 방법과 최소제곱법 (least square method)을 적용해 해를 구해보기로 한다.

(x,y)평면에서 1차 방정식 Ax+By+C=0 과 평면상의 1P (x0, y0) 와의 최소 거리 d는 그림에서처럼 주어진다. 따라서 21차 연립 방정식의 해는 (x,y) 평면상에서 2개의 서로 교차하는 직선의 교점을 구하는 문제가 된다.

 

그림에서처럼 P점에서 2 직선들과의 수직 거리는 d1d2 이며 P 점을 움직여 이 2개의 합이 0 이 되는 위치 좌표가 바로 2 직선의 교점이며 21차 연립 방정식의 해가 된다. 따라서 P점에서 2 직선들과의 수직 거리인 d1d2 의 제곱의 합을 cost 함수로 선택하여 그 값을 최소화 하도록 하자.

 

머신 러닝을 시작하기 위한 초기 조건은 1P (x0, y0) 의 값을 TensorFlow 의 난수 명령을 사용하여 임의의 값 즉 (W , b )에서 시작하기로 한다. 여기에서 사용하는 W b 는 선형회귀 분석에서 사용하는 weight W bias b 와는 개념이 다르며 단순하게 Wx 좌표 x0 이며 by 좌표 y0 로 보면 된다.

 

주어진 두 직선의 방정식에 대해서 즉 A, B, C, D, E,F 값이 주어진 조건하에서 다음과 같이 cost 함수를 구해보자.

d1d2의 제곱의 합이 위와 같이 표현되면 TensorFlow 모듈을 사용하는 linear regression 예제 코드를 간단하게 변경하여 사용할 수 있음을 알 수 있다. 다시 말하자면 선형회귀 분석에서 최소 제곱법을 적용했을 때와 유사하게 W b에 대해서 2차식 형태를 주기 때문이다.

 

linear regression 예제 코드에서 hypothesis cost 는 다음과 같이 코딩되었음에 착안하자.

여기서 x_train y_train 은 각각 리스트 데이터 구조를 가진다. 이 코딩을 참조하여 다음과 같이 코드 형태를 수정하자.

위의 A_train, B_train, C_train 은 다음과 같이 리스트 데이터 구조로 주어진다.

예제 1: A=1, B=1, C=-1 , D=-1, E=1, F=-1인 수치 예제를 다루어 보자. 이 문제는 다음과 같이 2개의 직선의 방정식을 의미한다. 연립하여 풀면 해는 ( 0.0, 1.0) 이 된다.

x + y 1 = 0,

-x + y 1 = 0

 

1/2 = 0.707 로 두면 리스트 데이터는 다음과 같이 A_train = [ 0.707, -0.707 ], B_train = [ 0.707, 0.707 ], C-train = [ 0.707, 0.707] 로 계산 된다.

 

코드 실행 결과는 다음과 같다. 주의할 점은 난수 발생이 그대 그때 다르기 때문에 최종 결과는 동일할지라도 수렴하는 과정은 다소 다를 수도 있음에 유의한다. 아울러 learning rate = 0.01 로 설정한다. 만약 여러번 코드를 실행해도 동일한 결과를 얻고 싶다면 코드 실행 때 마다 난수 발생이 항상 동일하게 유지될 수 있도록 TensorFlow에서 tf.set_random_seed(777) 명령을 사용하도록 한다.

 

라즈베리 파이 보드의 파이선 2.7을 사용해해서 얻은 아래의 결과는 500회 학습 계산에 따른 (W,b) 의 값을 100회 마다 출력해 보았다. cost 함수가 대단히 빠르게 0.0에 수렴하며 21차 연립 방정식의 해 (w, b)(0.0, 1.0)에 수렴함을 확인할 수 있다.

머신 러닝은 방정식의 해를 구하는 문제에 있어서도 우리가 알고 있는 방법으로 푸는 것이 아니라 항상 cost 함수를 구성하여 그 값이 최소화가 되도록 weight b 값을 찾아가는 방법을 사용한다는 점이다.

 

#linear_reg_2wn1chaeqn_01

 

예제 2: A=2, B=1, C=1 , D=1, E=2, F=-1인 수치 예제를 고려하자. 이 문제는 다음과 같이 2개의 직선의 방정식을 의미한다. 연립하여 풀면 해는 (-1.0, 1.0) 이 된다.

2x + y + 1 = 0,

x + 2y 1 = 0

 

1/5 = 0.447이며, 리스트 데이터는 다음과 같이 A_train = [ 0.894, 0.447 ], B_train = [ 0.447, 0.894 ], C-train = [ -0.447, 0.447] 로 설정 된다.

 

코드 실행 결과는 다음과 같다. 주의할 점은 코드 실행 때 마다 난수 발생이 항상 동일하게 유지될 수 있도록 TensorFlow에서 tf.set_random_seed(777) 명령을 사용하도록 하며 learning rate 0.05 로 설정한다. 앞서의 코드에서 학습 데이터와 learning rate를 수정하면 충분하다.

600회 학습 계산에 따른 (W,b) 의 값을 추적하여 100회 마다 표시해 보았다. 최종적인 (W,b)의 값은 (-1.0, 1.0) 임을 알 수 있다.

이와 같은 머신 러닝 기법은 21차 연립 방정식에서 31차 연립 방정식으로도 확장이 가능하다.