SW 개발

[스터디] 머신러닝 입문 - 04 : gradient descent

. . . 2018. 7. 5. 11:04
반응형

본자료는 머리털나고 처음으로 머신러닝을 공부하는 입장에서 정리한 머신러닝 스터디노트입니다.

  • 오픈소스 강의를 들으면서 정리 및 요약한 자료입니다.
  • 제가 이해한 내용을 중심으로 작성했기 때문에 개인적인 의견 및 오류가 있을수있습니다.
  • 원본 강의는 항상 링크를 올립니다. 본강의와 함께 스터디하시는걸 추천드립니다.

머신러닝_기본_스터디 리스트 :

개요

강의자료

강의요약

simplified hypothesis

일반적인 linear model

위의 모델값을 단순화 시키면 다음과 같다.

단순화 모델 (b부분을 없앰)

minimize

위의 식을 minimize 하면..

supervised data 를 위와같이 전달할경우…

W가 1일경우

cost 는 0 이다.

W가 0일경우

cost 는 4.67

W가 2일 경우

cost 는 4.67

W가 n일경우… 그래프

W값이 변화함에 따라 cost 값은 위와같이 변한다.

  • 1 일경우 가장작고 1에서 멀어질수록 해당 값이 커진다.

우리의 목표는 cost 가 최소화 하는 지점을 찾는것이다.

Gradient descent algorithm

경사를 따라 내려가는 알고리즘

  • cost 펑션을 minimize 하는 알고리즘이다.
  • 많은 minimize problem 에서 사용한다.
  • W와 b를 미니마이즈할수있다.

위의 그래프에서 각 점에서의 다음과 그래프에서의 기울기를 구할수있을것이다.

  • 미분을 사용

그래프의 기울기가 0 에 (혹은 가까울수록)이 가장 작은 값이다.

formal definition

일단 cost 함수의 최적화를 위해서는 해당시점에서의 기울기가 필요하다.

  • 기울기는 미분이다.
  • 미분을 쉽게 하기위해서 1/m 을 1/2m 으로 수정한다.

미분을 쉽게하기위해 약간의 변경

cost 함수의 미분

cost 함수의 미분화

위와같이 cost() 함수를 미분으로 표현할수 있다.

  • W := W … 의 표현은 W가 최소한으로 줄이겠다는 의미? - 어차피 편을 옮기면 0 으로 되니까 0에 가까워지란의미?

미분하는 과정

미분을 모두 수행하면 최종적으로 하이라이팅한 부분처럼 수식이 된다.

  • cost() 를 minimized 하는 함수다. -> gradient descent algorithm - W값을 변화시키면서 cost() 함수를 minimize 시킨다.

gradient descent algorithm

  • 위의 함수를 통해서 cost() 함수를 최적화 시킨다. - 일종의 학습과정이다.

convex function

위의 알고리즘을 w, b, cost 함수 를 3차원 으로 표현하면 다음과 같다.

  • A 부분과 B 부분을 생각해보자. - 즉.. 시작점에 따라서 A 루트로 최적화가 될수도 B 루트로 최적화가 될수도있다. - 잘못된 결과다.

convex function

제대로된 cost() minimize 는 다음과 같이 뜬다.

  • 위와같이 그래프가 그려진다면.. - 어느점에서 시작을 해도 결국은 한곳에서 최적화가 성공하게 된다.

linear regression 을 적용하기전에 cost() function 을 최적화 할때 위와같이 convex function 이 되는지 먼저 확인하고 학습을 시켜야한다.

실습

Lab-03-1 Minimizing Cost show graph

https://github.com/hunkim/DeepLearningZeroToAll/blob/master/ipynb/lab-03-1-minimizing_cost_show_graph.ipynb

import tensorflow as tf
import matplotlib.pyplot as plt
tf.set_random_seed(777) # for reproducibility
  • matplotlib : matlab 외부라이브러리 참조

X and Y data

데이터를 준다.

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

Variable

placeholder 로 W를 선언하고.

W = tf.placeholder(tf.float32)

Our Model

hypothesis / cost 를 선언한다. -> 그래프 구성

# Our hypothesis for linear model X * W
hypothesis = X * W
# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))
  • hypothesis = X * W : 간략화한 hypothesis 모델

- cost = tf.reduce_mean(tf.square(hypothesis - Y)) : cost 모델 선언

Prepare session

그래프에 데이터를 태우기 위해서 초기화..

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())

Get Cost

# Variables for plotting cost function
W_history = []
cost_history = []

for i in range(-30, 50):
  curr_W = i * 0.1

curr_cost = sess.run(cost, feed_dict={W: curr_W})
W_history.append(curr_W)
cost_history.append(curr_cost)
  • curr_cost = sess.run(cost, feed_dict={W: curr_W}) : cost 값들을 변화하는것을..
  • W_history.append(curr_W) /cost_history.append(curr_cost) : array 쪽에 저장하여 히스토리를 한번 보려고한다.

Show graph

그래프를 그린다.

# Show the cost function
plt.plot(W_history, cost_history)
plt.show()

위의 함수를 실행하면 다음과같다. (ipython 쪽 라이브러리를 사용해서 직접 그래프 그림)

gradient descent

W := W - [기울기값(미분한값)]

  • 현재의 좌표W 가 1 보다 클경우.. 기울기가 + - 1로 가야 하기때문에 W는 작아져야 한다. - 때문에 기울기 값을 빼줘야한다.
  • 현재의 좌표W 가 1 보다 작을경우.. 기울기가- - 1로 가야 하기때문에 W는 커져야 한다. - 때문에 기울기 값을 더한다.

gradient descent 표현

  • 위를 코드화 시키면 다음과같다.

learning_rate = 0.1
gradient = tf.reduce_mean((W * X - Y) * X)
descent = W - learning_rate * gradient
update = W.assign(descent)
W := W -> assign
update = W.assign(descent)

위의 총 코드는..

https://github.com/hunkim/DeepLearningZeroToAll/blob/master/ipynb/lab-03-2-minimizing_cost_gradient_update.ipynb

gradient descent 표현2 - 텐서플로의 api 이용

https://github.com/hunkim/DeepLearningZeroToAll/blob/master/ipynb/lab-03-3-minimizing_cost_tf_optimizer.ipynb

기존 수동으로 minimize cost 할때의 식을 직접구현하면.. 다음과같다.

learning_rate = 0.1
gradient = tf.reduce_mean((W * X - Y) * X)
descent = W - learning_rate * gradient
update = W.assign(descent)

하지만 위의 과정을 텐서플로에서는 다음과 같이 바로 api 로 사용가능하다.

# Minimize: Gradient Descent Magic
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train = optimizer.minimize(cost)
  • 미분을 하는 api 를 직접.

gradient descent 표현3 - 텐서플로의 api 이용2

https://github.com/hunkim/DeepLearningZeroToAll/blob/master/ipynb/lab-03-X-minimizing_cost_tf_gradient.ipynb

  • 텐서플로에서 api를 통해서 획득된 gradient 를 손보고싶을때가 있다.
  • 이럴때 다음과같이한다.
# Minimize: Gradient Descent Magic
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)
- # Get gradients
gvs = optimizer.compute_gradients(cost, [W])
# Optional: modify gradient if necessary
# gvs = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gvs]
# Apply gradients
apply_gradients = optimizer.apply_gradients(gvs)
  • gvs = optimizer.compute_gradients(cost, [W]) : 일단 optimize 한 값을 얻어오고
  • 얻은 gvs 를 수정한다.
  • apply_gradients = optimizer.apply_gradients(gvs) : 수정한 gvs 를 인자로 apply 한다.
  • 위의 예제는 gvs 를 apply_gradients() 의 인자로 바로 주므로 별다른 영향은 없다.
  • 하지만 gvs 를 알맞게 수정가능하다는것을 잊지말자
반응형