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로 구현하기
- matplotlib 설치하기 -> http://matplotlib.org/users/installing.html 에서 확인.
- python -mpip install -U matplotlib 으로 설치하면 모든 dependency가 해결됨
- 이번에 사용한 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 번째 값과, 네번째 값이 동일함을 알 수 있다.