처음 딥러닝을 공부할 때,
x_data = [1,2,3,4,5]
y_data = [1,2,3,4,5]
W = tf.Variable(2.0)
b = tf.Variable(0.5)
with tf.GradientTape() as tape:
hypothesis = W * x_data + b #hypothesis
cost = tf.reduce_mean(tf.square(hypothesis - y_data)) #cost
W_grad, b_grad = tape.gradient(cost, [W, b]) #W_grad = 25.0, b_grad = 7.0
W.assign_sub(learning_rate * W_grad)
b.assign_sub(learning_rate * b_grad)
이 부분이 나오는데 실제로 함수가 어떻게 동작하는 지 알아본다.
개념은 cost에 대한 2차함수 그래프의 한 점에서 도함수(기울기)를 구해서 이 기울기가 최소(=0)인 값을 구하는 것이다.
위 코드상의 with 에서 W_grad와 b_grad는 미분해서 기울기를 구하는 것이다.
- hypothesis
$$ H(x) = Wx + b $$ - cost
$$ cost(H)=\frac { 1 }{ m } \sum _{i=1}^{m}{ { (H{ x }^{ i }-y^{ i } })^{ 2 } } $$
로 정의가 된 것이고 W와 b에 대해서 미분한 값을 구하는 것이다.
m은 x_data와 y_data의 길이는 5로 하고,
W와 b에 대한 값으로 cost 함수를 다시 써보면
- hypothesis
$$ cost(W,b) =\frac{1}{5} ((W+b-1)^{2} + (2W+b-2)^{2} + (3W+b-3)^{2} + (2W+b-4)^{2} + (2W+b-5)^{2} ) $$
가 된다.
w_grad 는 b=0.5를 넣은 뒤, W에 대한 도함수를 구하고 W에 2.0을 넣었을 때의 값이고,
b_grad 는 W=2.0을 넣은 뒤, b에 대한 도함수를 구하고 b에 0.5를 넣었을 떄의 값이다.
간단히 구할 수 있는 b에 대한 도함수를 구하면
$$cost(b) = \frac{1}{5} (b+1)^{2} + (b+2)^{2} + (b+3)^{2} + (b+4)^{2} + (b+5)^{2} ) $$
$$cost\prime(b) = \frac{1}{5} 2(b+1) + 2(b+2) + 2(b+3) + 2(b+4) + 2(b+5) ) $$
$$cost\prime(b) = \frac{1}{5} (10b + 30) $$
$$cost\prime(b) = 2b + 6 $$
이므로 b = 0.5 이면 7이 나온다.
마찬가지로 과정은 생략하고 W에 대해 도함수를 구하면
$$cost\prime(W) = 22W -19 $$
가 나오고 W = 2.0을 넣어주면 25 가 나온다.
추가로, gradient descent에서는 cost함수를 최소로 하는 값을 찾기 위해 learning rate를 적당히 작은 값인 0.01로 하는 데
코드 상에서 도함수의 값에 learning rate(0.01)을 곱한 것을 기준으로 이동한다.
처음에는 이러면 적당한 작은 값이 계속 바뀌는 것인데 이상하다고 생각했다.
생각해보니,
기울기의 값이 크면 최소로 하는 값에서 더 멀기 떨어져 있다는 것이기 때문에 더 많이 이동해야 더 빨리 값을 찾을 수 있고,
기울기의 값이 작으면 최소로 하는 값에서 가깝기 때문에 더 조금씩 이동해야 정확한 값을 찾을 수 있어서 그런 것 같다.
'Studying > Deep Learning' 카테고리의 다른 글
[모두를 위한 딥러닝] 7일차 (0) | 2017.04.03 |
---|---|
[모두를 위한 딥러닝] 6일차 (0) | 2017.04.02 |
[모두를 위한 딥러닝] 5일차 (0) | 2017.03.27 |
[모두를 위한 딥러닝] 4일차 (0) | 2017.03.27 |
[모두를 위한 딥러닝] 3일차 (0) | 2017.03.24 |