케이스윔의 개발 블로그

[Lec02] Linear Regression의 Hypothesis와 cost 설명 본문

모두를 위한 딥러닝

[Lec02] Linear Regression의 Hypothesis와 cost 설명

kswim 2018. 4. 26. 16:56

오늘은 두번째 강의을 들었다. 하루에 최소 하나씩 들으면 지루하지도 않고 재미있을 것 같다.

우선 복습을 해본다. '몇 시간을 공부했더니 성적이 몇 점이었다.' 와 같은 데이터로 학습을 하여서 학생의 성적을 예측하자! 이 학습은 0점과 100점 중에 예측을 하는 것이므로 Supervised learning 중에서 regression이다.

data를 통해서 training을 하면 학습된 모델이 생긴다. 이러한 모델을 사용한다는 것은 '시험 치기 전에 어떤 학생이 x시간 공부했는데 몇 점을 받을 수 있을까?'라고 묻는 것이다. 모델에 묻는다면 regression은 학습된 데이터를 보고 예측하고 답을 한다.


Regression(data)

 x

 1

 2

 2  

 3

위의 표와 같이 regression을 위한 데이터를 주면 이를 통해 그래프로 그려본다.  

(Linear) Hypothesis-> 세상에 많은 현상이 linear한 그래프로 표현할 수 있다. 따라서 어떤 데이터가 있다면 여기에 잘 맞는 선을 찾아야 하고, 선을 찾는 것이 학습하는 것이다.

(Linear) Hypothesis에 의한 식을 나타내보면 H(x) = Wx+b이다. 이 식을 통해 나타난 선 중에서 어떤 선이 가장 잘 나타낸 선인지를 판단하려면 주어진 데이터와의 거리를 계산하면 된다. 


cost function

: 주어진 training data와 얼마나 적합한지를 계산하는 함수, 이를 통해서 어떤 선이 가장 잘 나타낸 선인지를 판단할 수 있다.

H(x)-y로 표현할 수 있고 보통 (H(x)-y)의 제곱으로 사용해서 일정하게 차이를 보여줄 수 있다.


계산하려면 값의 수에 따라 다음과 같이 계산한다. 이 식을 통해 예측된 H(x[i])의 값과 실제값 y[i]의 차이의 정도를 구한다.

for i=0; i<=m(개수만큼 수행)

cost = 1/m((H(x[i])-y[i])의 합)->  여기서 y[i]는 실제값

* H(x)의 자리에 Wx+b를 넣으면 cost(W,b)에 대한 식이 된다.


Regression 학습에서의 Goal은 cost(W,b)를 최소화하는 것이다. W와 b의 값을 조정해서 최소가 되도록 한다. 



<Lab 2 간단한 Linear regression 구현하기>


1. 텐서플로 연산을 통해서 그래프를 만든다.

#학습할 데이터를 준다.

x_train = [1, 2, 3] 

y_train = [1, 2, 3]


#variable은 기존의 변수와 다른 node이고, 텐서플로가 사용하는 variable로 trainable 한 변수이다.

W = tf.Variable(tf.random_normal([1]), name='weight')

b = tf.Variable(tf.random_normal([1]), name='bias')

#여기서 [1]은 값이 하나인 1차원 shape를 주는 것이다.

hypothesis = x_train * W + b

#hypothesis node가 만들어졌다.

cost = tf.reduce_mean(tf.square(hypothesis  - y_train))

#윗줄을 통해서 cost 함수를 텐서플로로 옮긴 것이다.


#t = [1.,2.,3.,4.]

#tf.reduce_mean(t) == 2.5 ->reduce_mean()은 평균을 계산하는 함수이다.


GradientDesent(마술같은 부분..매직..)

optimize = tf.train.GradientDescentOptimizer(learning_rate=0.01)

train = optimizer.minimize(cost)

#cost를 최소화하라! -> 이 역할을 하는 node의 이름이 train이므로 실행시켜야 하는 것도 train node이다. 


2. Run/update graph and get results

#sess.run(op,feed_dict={x:x_data}) 


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)) 


위의 과정을 따라 해보면 다음과 같이 출력값이 나온다.


train을 실행시킨다는 것은 train node와 연결된 그래프를 실행시키는 것과 같다. 이를 통해 학습을 시키고, cost와 W, b의 값이 어떻게 되는지 확인을 할 수 있다. 학습이 진행될수록 cost가 0에 가까운 값으로 수렴하게 되고 W, b가 원하는 값으로 수렴하게 된다.


3. placeholder를 사용해서 학습시키는 방법

a = tf.placeholder(tf.float32)

b = tf.placeholder(tf.float32)

#shape=[Node] 로 아무 값이 들어와도 된다는 것을 정해둘 수 있다.


for step in range(2001):

cost_val, W_val, b_val, _(train에 들어갈 값은 필요 없다.) =

sess.run([cost, W, b, train], 

feed_dict={X:[1, 2, 3, 4, 5], Y:[2.1, 3.1, 4.1, 5.1, 6.1]})

if step % 20 == 0:

print(step, cost_val, W_val, b_val);


placeholder를 쓰는 이유는 우리가 만들어 놓은 Linear regression 모델에 대해 값을 따로 넘겨줄 수 있다. 


위의 과정을 통해서 직접 간단한 Linear Regression을 학습시켜볼 수 있다. 사실 기존의 y=ax+b의 꼴을 가지는 함수와 비슷한 것 같지만, optimizer을 통해서 스스로 학습해서 cost가 0에 가까운 값으로 수렴한다. 작은 데이터를 통해서 가장 가까운 선을 찾아낼 수 있다는 것이 신기하고, 좀 더 응용할 수 있도록 더 공부를 해봐야겠다.





Comments