PyTorch의 자동 미분을 사용하여 함수의 접선을 그려 보았습니다.

이 기사에서는, fastbook의 샘플 코드 04_mnist_basics.ipynb 를 베이스로 자신의 실험을 넣으면서, 다음과 같이 함수의 접선을 표시하는 코드를 써 보았습니다.


모듈 가져오기


plot_function()tensor() 등, 일부 fastbook의 툴 함수를 사용하고 있는 관계로, 샘플 코드에 따라, 다음과 같이 fast.ai 제공의 모듈을 임포트하고 있습니다. ( plot_function() 를 자작하면 보통 numpy matplotlib torch 에서 OK입니다)
!pip install -Uqq fastbook
import fastbook
fastbook.setup_book()

from fastai.vision.all import *
from fastbook import *

접선 방정식 구하기



먼저 접선 방정식을 구해야 합니다. 함수를 $f(x)$로 하고, $x=x_0$에서의 미분값을 $a$로 하고, $y_0 = f(x_0)$로 하고, 접선의 방정식을 $y=ax+b$로 하면, 그 접선은 $(x_0,y_0)$를 통과하기 때문에
\begin{align}
y_0 &= a x_0 + b\\
\therefore\ y &= y_0 + a(x - x_0) = a x + y_0 - a x_0\\
b &= y_0 - a x_0
\end{align}

됩니다. 다음 코드는 이 결과를 기반으로 접선 방정식을 찾는 함수입니다.
def tangent_line(f, x0:Tensor):
  y0 = f(x0)
  y0.backward()
  with torch.no_grad():
    a = x0.grad.clone()
    b = y0 - a*x0
  x0.grad.zero_()
  return lambda x : a*x + b
x0.grad.zero_() 는 텐서 변수의 미분값을 제로 클리어하기 위한 코드로, 이 tangent_line ( tangent_line )가 누적되기 때문입니다. 또, grad 로 하는 것은, 그렇지 않으면 a = x0.grad.clone()a 가 같은 메모리를 공유하는 것 같고, x_0.grad 를 호출했을 때에 x0.grad.zero_() 가 참조하는 값이 클리어 되기 (위해)때문에.

접선 그리기



다음 코드는 주어진 함수 a 의 지정된 x 좌표 f(x) 에서 접선을 그리는 함수입니다.
def plot_tangent_line(f, x, x_range=1.):
  xt = tensor(x).requires_grad_()
  tf = tangent_line(f, xt)
  with torch.no_grad():
    x_r = np.array( [x - x_range, x + x_range] )
    plot_function(f, 'x', 'f(x)', min=x_r[0], max=x_r[1])
    plt.scatter(xt, f(xt), color='red')
    plt.plot(x_r,tf(x_r))
    plt.show()
x 는 접선 방정식이고 tf 는 x 좌표의 드로잉 범위 x_r 입니다. 또한 [x-x_range, x+x_range]tensor는 fast.ai에서 제공하는 함수입니다. 그리고, 접선은 plot_function 그리고 묘화 하고 있습니다. 구체적으로는 plt.plot(x_r,tf(x_r))(x_r[0],tf(x_r[0])) 의 2점을 잇는 직선이 됩니다.

예를 들어 $f(x)=0.78x^2+sin(x)$ 의 $x=-0.75$ 에서 접선을 그리려면 다음을 수행합니다.
def f(x): return 0.78*x**2 + torch.sin(x)
plot_tangent_line(f, -.75)

다음 그림은 이것을 수행한 결과입니다.


관련 기사



fast.ai로 만드는 핸드메이드 슈퍼 간단한 필기 숫자 판별기
fastbook 샘플 코드 (02_production.ipynb)를 Google Colab에서 시도한 Part 1
PyTorch의 자동 미분을 사용하여 2 변수 함수의 접평면을 그려 보았습니다.

fast.ai 공식 페이지



Practical Deep Learning for Coders
Lesson 3 - Deep Learning for Coders (2020)
Lesson 4 - Deep Learning for Coders (2020)

좋은 웹페이지 즐겨찾기