상세 컨텐츠

본문 제목

[Tensorflow]선형회귀분석(Linear Regression) 소스 구현

Artificial Intelligence

by [성운] 2019. 8. 3. 09:50

본문

이번 포스팅은 Tensorflow를 활용해 선형회귀분석을 구현하는 내용입니다. 선형회귀분석 이론을 공부하고 싶은 분들은  https://ynebula.tistory.com/15 를 참고 바랍니다.

 

소스 구현 환경

- Tensorflow

- Anaconda

 

선형회귀분석 소스 구현

선형회귀분석은 변수들 사이의 관계를 분석하는데 사용하는 통계학적 방법으로 독립변수 x와 상수항 b와 종속변수 y 사이의 관계를 모델링 하는 방법입니다독립변수가 하나일 경우 단순회귀라 하며여러 개일 경우 다중회귀라 합니다.

단순회귀 일반 해: y = W*x + b

다중회귀 일반 해: y = W1*x1 + W2*x2 + W3*x3 + b

y(예측값), w(기울기), bias(편차)

위 일반 해 중 단순회귀 형태로 되어있는 데이터를 잘 표현할 모델을 텐서플로 구현하는 방법에 대해서 알아보겠습니다

데이터 생성

데이터 생성

데이터를 생성하기 위해 정규화로 분포된 좌표 값을 생성하기 위해 numpy를 임포트합니다이 코드는 y = 0.1*x + 0.3 관계를 가지는 데이터를 생성하는데 random.normal() 함수를 사용하여 정규분포(normal distribution)로 변화를 주어 데이터를 분산되도록 하여 실제 데이터 유사하게 만듭니다이 함수식을 1000번 반복해서 1000개의 데이터를 만들어 list에 저장합니다.

x_data x의 데이터이며, y_data는 함수의 결과인 출려값을 담은 변수입니다두 변수 모두 리스트 형태이며데이터의 분포를 그래프로 확인하기 위해 matplotlib을 이용해 그래프를 그려 줍니다.

비용함수와 경사 하강법

다음은 입력 데이터 x_data로부터 출력 값 y를 추정(estimate)할 수 있는 학습모델을 훈련시키는 차례입니다실제 업무에서는 데이터의 분포를 분석해서 알아내지만우리는 이 데이터의 분포가 선형회귀 라는 것을 이미 알고 있습니다즉 두 개의 매개변수(w, b)로 모델을 표현할 수 있습니다이 데이터에 적합한 알고리즘이 y=w*x+b 와 같을 것입니다.

물론 사람은 직관적으로 데이터 분포를 보고 w 0.1, b 0.3에 근사한 값이어야 한다는 걸 알 수 있습니다그러나 컴퓨터는 이를 알 수 없습니다컴퓨터가 이를 확인하는 방법은 데이터 셋의 값들을 여러 번 반복을 하여 확인하여 데이터에 적합한 모델을 찾도록 합니다정확하고 많은 양의 데이터가 있을수록 더 정확한 모델을 만들 수 있습니다컴퓨터는 데이터 셋의 값들을 반복하여 적용하면서 매번 우리가 생성한 모델에서 추정한 값과 실제값의 차인 비용함수의 값이 최소가 되도록 W b값을 조정합니다.

비용함수를 구하는 방법으로는 평균제곱오차(MSE  mean square error)를 많이 사용합니다평균제곱오차는 실제 값과 추정 값 사이의 거리 값 제곱의 평균입니다제곱을 하는 이유는 음수와 양수가 합하면서 오차의 결과가 의도와는 다르게 작아지는 것을 방지하기 위해서 양으로 만듭니다.

경사하강법(grandient descent) 비용함수의 값을 최소화하는 최적화 알고리즘으로 일련의 매개변수로 된 함수가 주어지면 초기 시작점에서 함수의 값이 최소화되는 방향으로 매개변수를 변경하는 것을 반복적으로 수행하는 알고리즘입니다랜덤으로 설정된 매개변수(W b)의 초기 값에서 시작해서 W b에 대해서 편미분을 계산하며,비용함수가 최소가 되는 지점을 찾기 위해 함수의 기울기(gradient)의 반대 방향으로 움직입니다이를 반복적으로 수행하여 비용함수의 값이 최소화되는 지점이 되는 W b의 값을 찾아냅니다또한 경사하강법은 LMS의 특징상 양의 값을 만들기 위해 거리 값을 제곱합니다.

비용함수 및 경사하강법

Variable() run() 메서드에 의해 graph에 상태를 나타내어 집니다.

random_uniform() 메서드는 정규분로 구성된 난수를 반환합니다첫번째 매개변수는 배열의 shape으로 1개를 의미하며 두번째 매개변수 minval -1.0 세번째 매개변수 maxval 1.0으로 설정했습니다. minval는 이상의 개념으로 -1.0을 포함하고 maxval는 미만의 개념으로 1.0을 포함하지 않습니다여기서는 -1.0부터 1.0까지 난수 1개를 생성하라는 의미입니다.

y는 예측값으로 실제값(y_data)와 차이(비용함수)가 최소가 되는 w, b의 값을 구합니다. Learning rate의 값을 0.5로 설정하고 경사하강법을 수행하여 w b의 값을 구합니다.

이 코드를 실행하면 텐서플로가 내부 자료구조 안에 관련 데이터를 생성하고, train에 의해 optimizer가 구현되며 optimizer는 앞에서 정의한 비용함수에 경사하강법 알고리즘을 적용합니다.

데이터 학습

여기까지는 텐서플로 라이브러리를 호출하는 코드는 단지 내부 그래프 구조에 정보를 추가한 것일 뿐 텐서플로의 런타임은 아직 아무런 알고리즘도 실행하지 않습니다텐서플로는 Session() 함수를 통해 세션을 생성하고 프로그램을 Tensorflow 라이브러리와 연결이 됩니다텐서플로가 알고리즘을 실행하기 위해서는 Session을 생성하고 run 메서드에 train 매개변수를 넣어 호출해야 합니다또한 앞에서 선언한 변수를 initialize_all_varialbe() 메서드를 사용해서 먼저 초기화해야 합니다.

변수 초기화 및 Session 생성

Training - 학습

인공지능은 데이터를 반복적으로 학습해서 데이터에 맞는 알고리즘을 찾아냅니다.

데이터 학습

학습할 때 마다 w, b, 비용의 결과를 출력하였습니다학습을 할수록 비용의 값이 줄어드는걸 확인할 수 있습니다. matplotlib을 사용해서 결과를 그래프로 표현해 보겠습니다경사 하강법 알고리즘이 제대로 작동하는지 확인하는 좋은 방법은  반복마다 오차가 줄어드는지를 확인해보는 것입니다.

훈련 결과 Graph 표시

선형회귀 함수가 데이터를 잘 표현하고 있는 것을 확인할 수 있습니다.

이 예제의 오차함수는 두 개의 매개변수(W b)로 구성되어 있으므로 우리는 이를 2차원 공간에 표현할 수 있습니다. 2차원 공간의 각 점은 하나의 직선을 나타냅니다. 각 점에서 오차함숭의 높이는 직선에 대한 오차입니다. 어떤 직선들은 다른 직선보다 더 작은 오차를 가집니다. 텐서플로는 경사하강법 알고리즘을 수행할 때 이 평면의 한 지점에서 시작하여 더 작은 오차를 갖는 직선을 찾아 이동합니다.

 

감사합니다

 

[Reference]

텐서플로 첫걸음

관련글 더보기

댓글 영역