본문 바로가기

Theory/DeepLearning

Tensorflow의 GradientTape을 이용한 미분

오랜만에 텐서플로우 이야기를 하네요. 뭐 사실 크게 중요하다기 보다는 최근 어떤 자료를 만들다가 이 부분을 추가했는데 그걸 블로그에도 공개하면 좋겠다는 생각이 든것 뿐이랍니다. 오늘은 먼저 Tensorflow의 GradientTape을 이용해서 미분하는 간단한 방법과 또 더 나가서 chain rule을 적용할때 얼마나 편한지도 보여드릴까합니다.

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

일단~ import 하구요~ 어떤아이를 대상으로 하는지

t = np.arange(0, 5, 0.01)
plt.plot(t, (t-1)*(t-4))
plt.grid()
plt.show()

보면~

이렇게 생긴 아이 입니다.~ 이차함수.^^.

x = tf.Variable(2.5)

x라는 변수는 2.5의 값을 넣고 텐서로 선언하구요. 

with tf.GradientTape() as tape:
    y = (x-1)*(x-4)

그리고 GradientTape을 선언해서 y를 위 그림에 있는 이차함수로 표현해 둡니다. 이렇게 GradientTape을 사용하면 됩니다.

x는 2.5라고 했으니, gradient 함수에 y를 x에 대해 미분한 값(x=2.5지점에서)을 물어보면 0이라고 답이 나옵니다. x=0일때가 꼭지점(약간 유식해 보이는 효과로는 극점)이니까 미분한 값이 0이겠죠~

이제 조금 더 진도를 나가 보도록 하겠습니다. 혹시 미분에서 chain rule이라고 아시나요?

저렇게 x는 2t이고 y는 x의 제곱이라고 하면 저 함수는 합성이 되어서 위 그림처럼 계산할 수 있습니다. 합성이 좀 복잡하면 어렵겠지요. 아무튼 저렇게 함수를 합성할 수 있는데, 미분을 할 때는 꼭 저렇게 합치지 않아도 됩니다.

y를 t에 관해 미분하고 싶다면, dx라는 것을 넣어서 미분 표현식을 확장할 수 있습니다. 이게 chain rule입니다. t가 2일때를 계산하면 저렇게 dx/dt 따로, dy/dx 따로 구한 후 그냥 곱하기만 하면 되는거죠~

t = tf.Variable(2.0)

with tf.GradientTape(persistent=True) as tape:
    x = 2*t
    y = x**2

x와 y를 위와 같이 표현 할 수 있습니다. 이때 persitent라는 옵션은 GradientTape을 여러번 사용할 수 있도록 합니다.

이렇게 손으로 계산한 것과 같은 결과가 나타나는 것을 알 수 있습니다.^^.

반응형