見出し画像

PyTorch (3) - Step-by-Step Tutorial 前半

PyTorch を学び始めたが、分かりやすいtutorialを見つけたのが↓

前半の部分をフォローしてみる。

1. A Simple Regression Problem

簡単な回帰問題

もっとも簡単な回帰の問題設定 y = a + bx + (epsilon) で、a=1 & b=2とし、NN(PyTorch)が正しいaとbを見つけられるか?

[1] a =1, b = 2とし、ランダムシード42(必ずあとで再現できるように)からデータを100個作る。その内、80をtrain(訓練)用に、残り20をvalidation(検証)用とする。

画像1

[2][3] tutorialサイトの Fig. 1 同様に plotしてみる。

画像2

2. Gradient Descent 

勾配降下

Step 1. 損失(loss)を求める

損失としてMSE (Mean Square Error, 平均二乗誤差) を求める。¥hat{y}がpredictionなので a+bxと書ける。

Step 2. 勾配(gradient)を求める

求めたい値、aとbで微分(derivative)をとる。bにはx_iがかかっているので、bで微分した方にはx_iがつくことに注意。

画像5

Step 3. パラメタの更新

parameters aとbの勾配に'learning rate'のファクターをかけた分を引き、a&bを更新する(求める)。

画像6

Step 4. 繰り返し

[4] 上記1~3をloopで(例では1000回)繰り返す → モデルの訓練。

3. Linear Regression in Numpy

線形回帰

[4] yhatが、予測値なのでエラーは y_train - yhatとなり、numpyのMSEはその二乗.mean()で求められる。上記Step2でaとbの微分を表し、Step3でaとbを更新している。

画像3

[5] 上の1000回loop後の結果をsklearnのregressionの結果と比較。

画像4

4. PyTorch

[6] torchのライブラリを読み、さっきのx_train, y_trainをtorchのtensorとしてinitialize。それぞれのデータのtypeをprintして確認。

画像7

[7] #First のrequires_grad=True でPyTorch にgradientを計算してほしいと伝える。#Second & # Thirdは私の(GPUが使えない)環境では必要なし。以下のdeviceはcpu。

画像8

画像9

5. Autograd

torchでの勾配の求め方

[9] 前回のようにtorchのautogradで自動的に微分を行い、gradientを求める。上記 Step1, 2 を思い出すと、gradientの前には、lossとしてMSEを求めたので、backward() (後退)という関数を使う。zero_() で累積されるgradientをresetする。
最後のa,bは、tensor([1.0235], requires_grad=True) tensor([1.9690], requires_grad=True)となり、[4][5]のoutputとconsistent。

# FIRST and SECOND ATTEMPTでは、よくやる間違いを書いて、THRIDのno_grad()でtensorに対する単純な計算を行うように指示している。

メモ:zero_のような_(underscore)で終わる全てのメソッドは、その場で変更を行なっている。

画像10

6. Dynamic Computation Graph

ここでグラフを書くためのtoolをinstallする。pipのあとcondaもしないとエラーがでた。

$ pip install torchviz
$ conda install python-graphviz

tutorialによる、各Box色の説明は;

  青:parameterとして使用されるtensorに対応。ここではtorchに求めて欲しい、 a と b。
グレー:勾配計算テンソルまたはその依存関係を含むPythonのoperation。
  緑:グレーと同じ。ただし、勾配の計算の開始点であることを除く(backward()がグラフの視覚化に使用される変数から呼び出されると仮定し)。

画像11

画像12


この記事が気に入ったらサポートをしてみませんか?