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에 대해서 각각 미분한 값임을 추측할수 있다. 이를 테스트 해보자
봐야할 포인트는
- reduce_mean에 파라미터를 한개만 넣어주면 해당 리스트의 평균값을 구해주는데 평균값을 구하는 함수가 미분에서 어떻게 처리 될지.
- 정말 W와 b에 대해서 미분한 값이 들어가는지 확인해 보아야 한다.
W와 b에 대해서 미분한 값이 들어가는지 확인하기 위해
X = np.array([3.3)]
Y = np.array([1.7])
위와 같이 세팅하였다. 출력은 아래와 같다.
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=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값이 정확히 나온다.