# Tensorflow : Linear Regression
Hypothesis and Cost function can be defined like
Then, How we write this through 'Tensorflow' code?
우선 Tensorflow의 동작 원리에 대한 그림을 다시한번 살펴보면,
위 그림은 Tensorflow에서 Placeholder 방식을 적용한 후 그래프를 그리는 과정을 보인다.
Tensorflow는 기본적으로 'Session'이라는 구조를 이용하여 데이터 플로우 그래프를 그린다.
여기서 말하는 데이터 플로우 그래프는 말 그대로 '데이터의 흐름을 표현한 그래프'를 의미하는데, 이는 Tensorflow의 데이터 표현 방식이 결국은 '그래프' 기반임을 나타내고 있다.
(그래프에 대한 설명은 이곳에서 자세히 확인할 수 있다)
다시 위로 올라가서 번호 순서에 따른 Tensorflow의 동작 과정을 다시 살펴보자
(물론 Linear Regression에 대한 설명도 포함한다)
1. Build Graph using TensorFlow operations
H(x)는 Hypothesis를 나타내는 용어로, 1차원 함수(Wx + b)를 통해 만들어진 '가정' 값을 의미한다. 실제 값인 y값들로부터 데이터의 분포도를 확인하기 위하여 만들어낸 추측값을 나타낸다.
위의 예제에서는 x값의 train(training set을 의미한다)을 [1, 2, 3]으로, y값의 train을 [1, 2, 3]으로 표기하였다.
Cost function의 궁극적인 목표는 x,y 값의 쌍과 우리가 만들어내는 가정(Hypothesis, H(x))의 차이가 가장 적은 H(x)를 만들어내는 W와 b의 값을 알아내는 것이다. 실질적으로는 b 보다 W 값을 알아내는 것에 집중한다.
위의 예제에서 우리는 tf.Variable(tf.random_normal([1]), name=' ') 함수를 볼 수 있다. 이 함수는 Tensorflow에서 주어진 파라미터 값의 업데이트와 유지를 위해 사용된다. 내부에 있는 tf.random_normal([1])은 1차원, 즉 한칸짜리 배열을 생성하라는 의미라고 보면 된다.
한가지 중요한 점은, 아래에서도 다룰 예정이지만, tf.Variable로 파라미터 값을 위한 변수를 생성한 후에는 해당 변수를 '초기화' 해줘야 한다는 것 이다.
초기화는 간단하게 다음과 같이 설정할 수 있다.
tf.global_variables_initializer()
이건 밑에서 조금 더 자세히 살펴보도록 하고, W와 b 각각을 tf.Variable을 이용하여 변수로 지정한 후 hypothesis 공식을 적어주도록 한다. 여기서 말하는 hypothesis가 H(x)라고 보면 된다.
hypothesis = x_train * W + b
그런데 왜 W * x_train 이라고 적지 않고 x_train * W 라고 적는지 궁금하지 않는가? 이것은 Matrix의 곱셈 계산법칙 때문이다. 자세한 내용은 이곳(행렬곱셈)을 참조하자.
이렇게 만들어진 hypothesis를 이용해서 cost(W,b)를 구해야 한다. cost 함수를 단계별로 나누어보면 다음과 같다.
- H(x) - y를 구하고
- 위에서 구한 값을 제곱하고
- 제곱하여 나온 결과 값을 총 m번 반복하면서 더해주고
- 더한 값의 평균 값을 구한다.
단계로 나누면 꽤 까다로워 보여도, 우리 대단한 Tensorflow에서는 '아주 깔끔한 함수'를 우리가 사용할 수 있도록 해준다. 바로 tf.reduce_mean이다. 이것은 내부 파라미터 값을 하나씩 더하고 이를 평균 내는 기능을 갖는다.
그런데 자세히보면 내부에 tf.square 함수도 존재하는 것을 볼 수 있다. Tensorflow는 말 그대로 머신 러닝을 위해 만들어진 도구라고 봐도 무방할 정도로 '머신러닝에 사용할 수 있는 다양한 함수들'을 제공한다. tf.squae는 파라미터로 전달된 값을 제곱하는 기능을 갖는다.
우리가 궁극적으로 사용해야 하는 Linear Regression, 즉 Gradient Descent 알고리즘 또한 친절하게도 Tensorflow에 모두 적용되어 있다. tf.train.GradientDescentOptimizer 함수 내부에는 우리가 learning rate 값을 정할 수 있다. 이 부분이 헷갈린다면 Gradient Descent 부분을 다시한번 살펴보도록 하자. (정리하자면 이동하는 범위를 의미한다)
마지막으로 Gradient Descent 결과값을 minimize 함으로써 전체적인 Cost function 계산을 마무리 할 수 있다.
2. Run/Update graph and get results
이하 내용은 생략한다. 이전 포스트에서 자세하게 다루었기 때문이다.
물론 이 내용들을 Placeholder를 이용하여 구현할 수도 있다.
실제로는 변수를 그대로 할당하기보다 placeholder를 이용하는 경우가 더 많다고 한다.
위의 소스 코드를 보면 대충 이해가 될 것이라고 판단한다.
tf.placeholder를 이용하여 변수를 담을 수 있는 틀을 만들고, 이후에 feed_dict 함수를 이용하여 값을 동적으로 할당하여 변수에 담을 수 있도록 한다.
값은 하나씩만 추가할 수도 있고, 위의 예제처럼 다수의 값을 설정할 수도 있다.
댓글
댓글 쓰기