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

소스 코드



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

Special Thanks



코드 제공: Watanabe

좋은 웹페이지 즐겨찾기