기타/WWW

김성훈 딥러닝 3 - Linear Regression 의 cost 최소화 알고리듬

하늘이푸른오늘 2017. 11. 15. 21:09

Lec 03 - Linear Regression 의 cost 최소화 알고리듬의 원리

https://www.youtube.com/watch?v=TxIVr-nk1so

  • 복습 : 선형회귀분석 모델의 가설(Hypothesis)과 비용함수(Cost function)
  • 설명을 위해 H(x) = W(x)로 두고 진행
    • W=1 일때의 cost(W)는?
        • cost(W) = 1/3( (1x1 -1)^2 + (1x2 - 2)^2 + (1x3 -3)^2 ) =0
    • W=0 일때의 cost?
        • cost(W) = 1/3( (0x1 -1)^2 + (0x2 -2)^2 + (0x3 -3)^2 ) = 1/3 (1+4+9) = 4.67
    • W=2 일때... cost = 4.67... 많은 값에 대해 cost()의 그래프를 그리면

  • 널리 사용되는 알고리듬이 Gradient descent 알고리듬. (경사를 따라 내려가는 알고리듬)
    • cost 함수 최소화에 사용
    • 많은 minimization 문제에서 사용됨
    • 주어진 cost 함수 cost(W,b)에 대해, 이를 최소화시키는 W, b를 찾는 것.
    • 비용함수의 변수가 많은 일반적 경우 cost(w1, w2, ... wn) 에도 적용할 수 있다.
  • 이 알고리듬은 초기값이 무엇이든 수렴하는 장점이 있음.
  • 기울기는 편미분으로 구함
    • 즉, 한번 반복할 때마다, 아래와 같은 값으로 새로 바꿔 넣어줌. (여기에서 alpha 는 running rate)
    • 아래 그림에서 맨 아래에 있는 것이 Gradient Descent Algorithm

  • 비용함수가 아래와 같다면, 초기값에 따라 다른 해가 구해진다.

  • 하지만, Linear Regression 의 경우, cost 함수가 convex 이기때문에 초기값에 관계없이 해를 구할 수 있다.

  • Cost function을 설계할 때, convex 인지를 반드시 확인해야 한다. 확인할 수만 있다면 편하게 GDA를 사용할 수 있다.

Lab 03 - Linear Regression의 비용함수 최소화를 TensorFlow로 구현하기

  • 이번에 사용한 Hypothesis
    • $H(x) = W \cdot x \\
      cost(W) = {1 \over m} \sum_{i=1}^m (Wx^{(i)} - y^{(i)} )^2 $
  • 먼저 cost 함수를 그려보자.

import tensorflow as tf
import matplotlib.pyplot as plt

X = [1, 2, 3]
Y = [1, 2, 3]

#W 를 변경시켜가면서 확인
W = tf.placeholder(tf.float32)

# H(x) = W.x 로 둔 상태임
hypothesis = X * W
cost = tf.reduce_mean(tf.square(hypothesis - Y))

#세션 시작
sess = tf.Session()
sess.run(tf.global_variables_initializer())

#cost function을 그리기 위한 변수
W_val =[]
cost_val =[]

for i in range(-30,50) :
    feed_W = i * 0.1
    curr_cost, curr_W = sess.run([cost, W], feed_dict = {W : feed_W})
    W_val.append(curr_W)
    cost_val.append(curr_cost)

# cost 함수를그리기
plt.plot(W_val, cost_val)
plt.show()

  • 그 결과는 아래와 같음 W=1 일때 cost가 최소가 된다. 즉,"경사면따라 내려가기" 알고리듬을 적용하기 좋은 모양.

  • Gradient Descent를 자세히 살펴보자.
    • 수식 : $ W := W - \alpha {1 \over m} \sum_{i=1}^m ( W x^{(i)} - y^{(i)} ) x^{(i)} $

learning_rate = 0.1                               # $ \alpha $
gradient = tf.reduce_mean((W*X - Y) *X )  # cost 함수의 미분 : $ {1 \over m} \sum_{i=1}^m ( W x^{(i)} - y^{(i)} ) x^{(i)} $
descent = W - learning_rate * gradient
update = W.assign(descent)                   # tf는 직접 = 로 대입할 수 없어, assign을 사용

  • 아래는 Gradient Descent를 수동으로 갱신시키는 방법임.
    • learning_rate = 0.1 부터 4줄이 해당부분임.

                 

위의 GradientDescent는 간단하게 미분가능하지만, 그렇지 않은 것들도 많다. 그냥 Optimizer를 사용하면 미분하지 않고서도 해결해준다. 즉, 아래는 위의 식과 동일

optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.1)
train = optimizer.minimize(cost)

  • Optional.... 계산된 Gradient를 "약간" 변경시킨 뒤 다시 적용시키는 방법...
    • optimizer.compute_gradients()
    • optimizer.apply_gradients()
  • 오른쪽 결과에서 2,3 번째 값과, 네번째 값이 동일함을 알 수 있다.