머신 러닝은 주어진 데이터를 기반으로 모델을 더욱 좋게 만들려는 목적으로 학습을 합니다. 이를 위하여 비용함수를 정의하고 이를 최소로 하는 파라미터를 찾기 위하여 파라미터에 대한 미분이 가능한 비용함수를 선택합니다. 미적분은 직관적으로 이해할 수는 있지만 복잡한 모델들에 대한 미분을 직접 계산하는 것은 너무 힘들고 오류를 범할 수 있는 일입니다. 또한 합성함수 미분은 체인룰을 이용하여 하나의 손실 함수 미분을 여러개의 미분으로 나누어 계산할 수 있습니다. 텐서플로우에서는 이런 과정을 손쉽게 처리할 수 있도록 tensorflow.gradients 를 제공합니다. tensorflow.gradients 는 두개의 매개변수를 받습니다. 첫 번째 매개변수는 편미분을 하려는 대상 텐서이고 두 번째 매개변수는 편미분 변수에 해당하는 텐서입니다.
예를 들어
라는 함수를 x 에 대하여 미분하면
이 된다.
이를 그래프로 보면 아래와 같습니다.
위 함수를 tensorflow.gradients를 이용하여 미분값을 확인하겠습니다. 자동미분기능을 이용하여 비용함수의 미분값을 얻을 수 있고 다양한 머신러닝의 모델을 구현할 수 있습니다.
(코드) 자동미분 tensorflow.gradients 파이션 프로그램
import tensorflow as tf
import math
import numpy as np
# tape_gradient()는 자동 미분 기능을 수행합니다.
# 임의로 2x^2+1 라는 식을 세워보고, x에 대해 미분해보겠습니다.
xTensor = tf.Variable(2.)
def originF(x):
y = 2 * x**2 + 1
return y
# 이제 gradients를 출력하면 w에 대해 미분한 값이 저장된 것을 확인할 수 있습니다.
with tf.GradientTape() as tape:
y = originF(xTensor)
gradient = tape.gradient(y, [xTensor])
print(gradient)
# numpy의 linspace (start, end, num)를 이용해서 -4과 4사이에 100개의 값 생성
# 그래프로 확인
x = np.linspace(-4, 4, 100)
y = []
for itr in x:
y.append(originF(itr))
import matplotlib.pyplot as plt
plt.plot(x, y)
x = np.linspace(-4, 4, 100)
gradients = []
print(" itr| x| y| y'")
for i, itr in enumerate(x):
xTensor = tf.Variable(itr)
with tf.GradientTape() as tape:
y = originF(xTensor)
gradients.append(tape.gradient(y, [xTensor]))
if i % 10 == 0:
#print(type(gradients[i][0]))
print("{:4.2f}|{:4.2f}|{:4.2f}|{:4.2f}".format(itr, xTensor.numpy(), y, gradients[i][0].numpy()))
plt.plot(x, gradients)
plt.grid(True)
plt.text(-3, 30, r'$y = 2x^2 + 1$', fontdict={'size': 16, 'color': 'blue'})
plt.text(0, -5, r'$\acute y = 4x$', fontdict={'size': 16, 'color': 'orange'})
plt.show()
(결과) x 값에 따른 함수값과 미분값
itr| x| y| y'
-4.00|-4.00|33.00|-16.00
-3.19|-3.19|21.38|-12.77
-2.38|-2.38|12.37|-9.54
-1.58|-1.58|5.97|-6.30
-0.77|-0.77|2.18|-3.07
0.04|0.04|1.00|0.16
0.85|0.85|2.44|3.39
1.66|1.66|6.49|6.63
2.46|2.46|13.15|9.86
3.27|3.27|22.42|13.09
(참고) 자동미분과 그래디언트 테이프
www.tensorflow.org/guide/autodiff?hl=ko
자동 미분과 그래디언트 테이프 | TensorFlow Core
Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니다. 커뮤니티 번역 활동의 특성상 정확한 번역과 최신 내용을 반영하기 위해 노력함에도 불구하고 공식 영문 문서의 내용과 일치하지 않을 수
www.tensorflow.org