본문 바로가기

Studying/Deep Learning

[딥러닝] tf.GradientTape(), gradient() 이해하기

처음 딥러닝을 공부할 때,

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)을 곱한 것을 기준으로 이동한다.

처음에는 이러면 적당한 작은 값이 계속 바뀌는 것인데 이상하다고 생각했다.
생각해보니,
기울기의 값이 크면 최소로 하는 값에서 더 멀기 떨어져 있다는 것이기 때문에 더 많이 이동해야 더 빨리 값을 찾을 수 있고,
기울기의 값이 작으면 최소로 하는 값에서 가깝기 때문에 더 조금씩 이동해야 정확한 값을 찾을 수 있어서 그런 것 같다.