본문 바로가기

카테고리 없음

[tensorflow] tf.GradientTape.gradient() 계산 과정 보기

import tensorflow as tf
import numpy as np
rng = np.random

learning_rate = 0.01
training_steps = 1000
display_step = 50


# X = np.array([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,
#               7.042,10.791,5.313,7.997,5.654,9.27,3.1])
# Y = np.array([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,
#               2.827,3.465,1.65,2.904,2.42,2.94,1.3])
X = np.array([3.3,1])
Y = np.array([1.7,2])
W = tf.Variable(rng.random(), name = "weight")
b = tf.Variable(rng.random(), name = "bias")

def linear_regression(x):
    return W*x + b

def mean_square(y_pred, y_true):
    return tf.reduce_mean(tf.square(y_pred-y_true))

optimizer = tf.optimizers.SGD(learning_rate)

def run_optimization():
    with tf.GradientTape() as g:
        pred = linear_regression(X)
        loss = mean_square(pred,Y)
    gradients = g.gradient(loss, [W,b])
    print("\ngradient=", gradients,"\nloss=",loss, "\nW=", W, "\nb= ", b)
    optimizer.apply_gradients(zip(gradients,[W,b]))

for step in range(1, training_steps+1):
    run_optimization()

linear_regression하는 해당 코드에서 gradient가 어떻게 동작하는지 알아보았다.

gradients = g.gradient(loss, [W,b])를 보면

loss에 해당하는 함수를 W와 b에 대해서 각각 미분한 값임을 추측할수 있다. 이를 테스트 해보자

봐야할 포인트는

  1. reduce_mean에 파라미터를 한개만 넣어주면 해당 리스트의 평균값을 구해주는데 평균값을 구하는 함수가 미분에서 어떻게 처리 될지.
  2. 정말 W와 b에 대해서 미분한 값이 들어가는지 확인해 보아야 한다.

 

W와 b에 대해서 미분한 값이 들어가는지 확인하기 위해

X = np.array([3.3)]

Y = np.array([1.7])

위와 같이 세팅하였다. 출력은 아래와 같다.

첫번째로 실행된 run_optimization()함수의 출력부분이다.

loss = mean_square(pred,Y)인데 이는 loss = mean_square((W*X+b-Y)**2)이 된다. (linear_regression = W*x+b)

1*1모양의 input임으로 mean_square을 무시해주고

 

W에 대하여 미분하면 아래와 수식과 같이 되며

W에는 0.21318328 , b에는 0.78609025 ,X에는 3.3. Y에는 1.7값을 넣고 계산하면

gradient 첫번째 값에 해당하는 -1.388673이 정확히 나온다.

 

b에 대하여 미분하면 위의 수식에서 X만 1로 바뀌게 된다.

똑같이 W에는 0.21318328 , b에는 0.78609025 ,X에는 3.3. Y에는 1.7값을 넣고 계산하면

gradient 두번째 값에 해당하는 -0.42080998이 정확히 나온다.

 

reduce_mean은 미분할때 어떻게 처리되는가 확인하기 위해

X = np.array([3.3,1)]

Y = np.array([1.7,2])

위와 같이 세팅하고 확인해보면 출력은 아래와 같다.

처음실행될때 W와 b값은 랜덤이다.

 

W=0.73290884, b=0.436841, X=3.3. Y=1.7값으로 W에 대한 미분한 식을 계산한 값인 7.625905 값과

W=0.73290884, b=0.436841, X=1, Y=2값으로 했을때 계산한 값인 -1.660500을 더 한후 리스트 원소의 개수인 2로 나누어주면

gradient 첫번째 값에 해당하는 2.9828014값이 정확히 나온다.