본자료는 머리털나고 처음으로 머신러닝을 공부하는 입장에서 정리한 머신러닝 스터디노트입니다.
- 오픈소스 강의를 들으면서 정리 및 요약한 자료입니다.
- 제가 이해한 내용을 중심으로 작성했기 때문에 개인적인 의견 및 오류가 있을수있습니다.
- 원본 강의는 항상 링크를 올립니다. 본강의와 함께 스터디하시는걸 추천드립니다.
머신러닝_기본_스터디 리스트 :
개요
강의자료
- ML lec 03 - Linear Regression의 cost 최소화 알고리즘의 원리 설명
- ML lab 03 - Linear Regression 의 cost 최소화의 TensorFlow 구현
강의요약
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
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 이용
기존 수동으로 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 를 알맞게 수정가능하다는것을 잊지말자