본문 바로가기

파이썬/머신러닝

[#E2]머신러닝의 첫 단계 LinearRegression 이란?

LinearRegression이란, Hypothesis 함수 W*x + b 에서 우리가 제공한 데이터 (X,Y) 를 이용하여 임의의 숫자 X를 대입하면 정확한 측정값 Y를 출력하게 만드는 변수 W 와 b를 구하는 과정입니다.

따라서 이는 곧 정확한 Hypothesis 함수를 구하는 과정으로 볼 수 있습니다.




위의 그래프에서 대각선 그래프는 Hypothesis 함수를 의미합니다. 우리가 제공한 데이터는 위의 그래프에서 각각의 점(x,y)로 표시되어 있습니다.


또 각각의 점들은 Hypothesis 그래프와 수직으로 선이 그어져 있습니다. 이는 곧 Hypothesis와 실제 데이터 Y 값의 차이로, COST를 의미합니다.


따라서 LinearRegression은 모든 데이터가 가진 COST를 최소화시키는 Hypothesis 그래프의 변수 W와 b를 구하는 작업입니다.

( W, b에 의해 그래프가 달라지므로 )


그런데 그래프에서 보면 대각선보다 아래에 있는 데이터의 경우 COST 값은 - (음수) 를 갖기 때문에, 편리하게끔 각 차이를 제곱한 것으로 평균을 구한 후 LinearRegression을 진행합니다.


제곱한 값은 항상 + (양수)를 갖기 때문입니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
import tensorflow as tf
 
x_train = [1,2,3]
y_train = [1,2,3]
 
= tf.Variable(tf.random_normal([1]), name="weight")
= tf.Variable(tf.random_normal([1]), name = "bias")

#(w * x + b) 
hypothesis = W*x_train + b
 
#(cost function : sigma, square)
cost = tf.reduce_mean(tf.square(hypothesis - y_train))
cs


소스에서 tf.square() 함수는 텐서플로우에 내장된 제곱을 해주는 함수이고, tf.reduce_mean() 함수는 마찬가지로 텐서플로우에 내장된 전체 평균을 구해주는 함수입니다.
여기서 1은 데이터 셋 개수를 나타냅니다.

따라서 cost는 변수 W에 대한 2차함수가 됩니다. ( 제곱하기 때문에 )


그래프에서 보다시피 W가 최소가 되는 지점이 Global cost minimum이며, 처음 LinearRegression 작업시 W 값은 랜덤으로 주어지는데 이를 Initial weight (Initial W) 라고 합니다.



1
= tf.Variable(tf.random_normal([1]), name="weight")
cs

tf.random_normal() 함수가 바로 그런 역할을 합니다.



따라서 우리가 Tensorflow에 작업을 요청하게 되면 스스로 W 값을 결정하게 되고, 우리가 제공한 데이터를 기반한 학습에 의해 점점 Global cost minimum에 도달하게 됩니다. 


여기서 검은 공이 가장 낮은 중심점으로 이동하는 보폭이 바로 learning rate라고 합니다. 여기에서는 기본값으로 0.01을 사용하도록 하고, 추후에 더 자세히 다루겠습니다.


따라서 이는 Gradient 처럼 작동한다고 하여 Gradient Descent Optimizer 라는 이름이 붙습니다. 이러한 작업은 Tensorflow에서 단 두 줄의 코드로 구현할 수 있습니다.



1
2
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)
cs

이제 LinearRegression을 위한 모든 작업이 끝났습니다. 남은 것은 학습을 위한 세션을 만들고 결과를 지켜보면 됩니다.


1
2
3
4
5
6
7
8
9
sess = tf.Session()
 
sess.run(tf.global_variables_initializer())
 
for step in range(2001):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(cost), sess.run(W), sess.run(b))
 
cs



주의할 점은 세션을 오픈 후 반드시 tf.global_variables_initializer()을 호출하여 변수를 initializing해야 합니다. 이것은 실제로 x 데이터에 [1,2,3]을, y데이터에 [1,2,3]을 지정해주는 역할을 합니다.


실행하면 이 작업은 실제로 2001번 반복되며 적합한 W와 b를 찾게 됩니다. 출력의 효율을 위하여 모든 출력이 아닌 작업회차가 20의 배수일 경우에만 출력합니다.


따라서 약 100번의 출력이 일어나며, W와 b는 0에 수렴하게 됩니다. 

즉, 우리가 찾은 Hypothesis W*x+b1*x+0 이 됩니다.



SOURCE CODE


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import tensorflow as tf
 
x_train = [1,2,3]
y_train = [1,2,3]
 
= tf.Variable(tf.random_normal([1]), name="weight")
= tf.Variable(tf.random_normal([1]), name = "bias")
 
#(w * x + b) 
hypothesis = W*x_train + b
 
#(cost function : sigma, square)
cost = tf.reduce_mean(tf.square(hypothesis - y_train))
 
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)
 
sess = tf.Session()
 
sess.run(tf.global_variables_initializer())
 
for step in range(2001):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(cost), sess.run(W), sess.run(b))
 
cs