PyTorch로 기울기 이미지를 잡아라.

소개



이 기사는 후루카와 연구실 Workout calendar 9일째의 기사입니다. 본 기사는 후루카와 연구실의 학생이 학습의 일환으로서 쓴 것입니다.

Workout_calendar 고조되어 기쁩니다. 이번 주 금요일에 드디어 신입생의 투고가 시작됩니다!

이 기사의 목적



Pytorch의 자동 미분 기능을 사용하여 기울기 방법을 실현합니다!

[이것을 구현합니다]


최급강하법



그라디언트 방법으로 가장 간단한 방법입니다.

기울기 방법은 $n$다음 벡터 $\mathbf{x} = (x_1,x_2,...,x_n)$ 을 인수로 하는 맵 $f(\mathbf{x})$ 의 극값을 구하는 기법 중 하나 하나입니다.

반복, 학습을 반복하여 $\mathbf {x} $를 업데이트하십시오.
$ t $ 시간에 대한 학습 솔루션이 $\mathbf {x} ^ { (t)} $이면 가장 가파른 하강 방법은 다음과 같이 값을 업데이트합니다.
\begin{align}
\mathbf{x}^{(t+1)} &= \mathbf{x}^{(t)}-\eta \operatorname{grad} f\left(\mathbf{x}^{(t)}\right) \\ 
\\

 &=  \mathbf{x}^{(t)}-\eta \left[\begin{array}{c}{\frac{\partial f\left(\mathbf{x}^{(t)}\right)}{\partial x_{1}^{(t)}}} \\ {\frac{\partial f\left(\mathbf{x}^{(t)}\right)}{\partial x_{2}^{(t)}}} \\ {\frac{\partial f\left(\mathbf{x}^{(t)}\right)}{\partial x_{2}^{(k)}}} \\ ・\\ {\frac{\partial f\left(\mathbf{x}^{(t)}\right)}{\partial x_{n}^{(k)}}}\end{array}\right]

\end{align}

여기서 $\eta$는 스텝폭이다. 스텝폭이 커지면 갱신량은 커지지만 발산의 우려가 있다. 반대로 스텝폭이 너무 작으면 학습은 지연된다.

구현



이번에 사용할 매핑(함수): $$ E(\mathbf{x}) = x_1^2 + x_2^2$$

gradient_descent.py

n_epoch = 200 # 学習回数
eta = 0.01 # ステップ幅

x = torch.tensor([2.0,2.0],requires_grad=True) # (x_1, x_2)
A = torch.tensor([[1.0,0.0],[0.0,1.0]])

for epoch in range(n_epoch):
    quad = torch.einsum("i,ij,j",x,A,x) # f
    quad.backward() 
    with torch.no_grad(): 
        x = x - eta * x.grad
    x.requires_grad = True 


구현 메모



$\mathbf {x} $ : option에 requires_grad = True가 필요합니다.
$ quad $ : 편도 함수는 스칼라 값이어야합니다.

결과



파란색 매트는 이번 함수의 형태로, 검정색 $x$ 는 $t$ 시간 눈의 갱신하는 점입니다. 노란색 점선은 학습의 궤적이 되고 있습니다. mathbf {x} $의 구성 요소에서 세로축 (z)은 함수의 값입니다.


$ (x_1, x_2) = (2.0, 2.0) $을 초기 값으로 사용하여 함수의 최소값을 향하고 있음을 확인했습니다.


요약



다음은 이것과 이전에 언급 한 Nadaraya-Watson 추정의 구현을 결합하여 자신의 연구 기반 기술을 실현하려고합니다.

참고 페이지



Wiki

소스 코드



이번에도 Github과 Colab에 소스 코드를 올리고 있습니다.
뷰어로 움직이고 싶은 분은 좋으면 참조하십시오.

Special Thanks



코드 제공: Watanabe

좋은 웹페이지 즐겨찾기