PyTorch의 자동 미분을 사용하여 함수의 접선을 그려 보았습니다.
모듈 가져오기
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)
Reference
이 문제에 관하여(PyTorch의 자동 미분을 사용하여 함수의 접선을 그려 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kumagorou/items/6081d9cf15024c839103텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)