이번 포스팅은 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() 메서드를 사용해서 먼저 초기화해야 합니다.
인공지능은 데이터를 반복적으로 학습해서 데이터에 맞는 알고리즘을 찾아냅니다.
학습할 때 마다 w, b, 비용의 결과를 출력하였습니다. 학습을 할수록 비용의 값이 줄어드는걸 확인할 수 있습니다. matplotlib을 사용해서 결과를 그래프로 표현해 보겠습니다. 경사 하강법 알고리즘이 제대로 작동하는지 확인하는 좋은 방법은 매 반복마다 오차가 줄어드는지를 확인해보는 것입니다.
선형회귀 함수가 데이터를 잘 표현하고 있는 것을 확인할 수 있습니다.
이 예제의 오차함수는 두 개의 매개변수(W와 b)로 구성되어 있으므로 우리는 이를 2차원 공간에 표현할 수 있습니다. 이 2차원 공간의 각 점은 하나의 직선을 나타냅니다. 각 점에서 오차함숭의 높이는 직선에 대한 오차입니다. 어떤 직선들은 다른 직선보다 더 작은 오차를 가집니다. 텐서플로는 경사하강법 알고리즘을 수행할 때 이 평면의 한 지점에서 시작하여 더 작은 오차를 갖는 직선을 찾아 이동합니다.
감사합니다
[Reference]
텐서플로 첫걸음
[Deep Learning-딥러닝]Backpropagation (역전파) 및 Delta Rule을 이용한 가중치 조정 방법 소스 구현 - XOR 연산 (0) | 2019.08.07 |
---|---|
[Deep Learning-딥러닝]Backpropagation (역전파) 및 Delta Rule을 이용한 가중치 조정 방법 (2) | 2019.08.06 |
[Deep Learning-딥러닝]Solving XOR Problem with MLP (0) | 2019.08.04 |
[Tensorflow]기본 자료구조-텐서(Tensor) - Constant, Variable, Placeholer (0) | 2019.08.02 |
[Tensorflow]Tensorflow 소개 및 설치 방법 (0) | 2019.08.01 |
댓글 영역