ディープラーニングについてディープにラーニング。

思いっきり、自分が学んだことのアウトプットしていきますが、何分初心者。もし何かアドバイス等頂けましたら幸いです!

f:id:kawam0t0:20191210220816j:plain



本日もPytorch…

今回から少し難しくなってきた…

Pytorchでは、もちろん全てPytorch.Tensorクラスでテンソルを扱う(多次元行列)
Numpyだとarrayですね。


勾配をトラックするのか、勾配を取得するのか、など、色々な話が出てきた。

そこで、改めて、勾配とはをアウトプット…

勾配とは

テキストで説明すると…むずいので、図も交える
f:id:kawam0t0:20191210221145p:plain

ある店舗の予測売上を考えてみよう。図の中の表している文字は下記の通り…

y = 予測売上
x1 = 天気
x2 = 時間
w1 = 天気にあえて邪魔を加える(重み)
w2 = 時間にあえて邪魔を加える(重み)

式で表すと、 y = x1 ×w1 + x2 × w1


さて、ここで、天気が売上にどれだけ影響しているのか?
時間がどれだけ売上に影響しているのか?を知りたかったとする。
その場合に、このw1 w2の邪魔度を時には大きくしたり、小さくしたりして、
予測売上がどれだけ変わるのか?を計算する。
この、どれだけ変わったか?の差分勾配と呼ぶ。

読み方からして初めはぴんと来なかったのですが、やっと理解できました。

そして、
この、どれだけ影響しているのか?の計算方法をちゃんと保持しておきましょうねって
機能を付けますか?つけないっすか?のスイッチボタン的なやつが
requires_grad = True(しないならFalse) だ。

こいつはとても便利。

import torch

x = torch.ones(2 , 2 , requires_grad = True) -> tensor([[1., 1.], [1., 1.]], requires_grad=True)

これでOK。
Trueにすることで、自動微分対象になり、なおかつ
後々に出てくるgrad.fn_とかも使えて、計算式を保持してくれるようになる。


y = x.add(2) -> tensor([[3., 3.], [3., 3.]], grad_fn=)

y.grad.fn_ ->
↑ちゃんと計算式を保持している証拠

z = y * y* 3 -> tensor([[27., 27.], [27., 27.]], grad_fn=)

ただし!気を付けなければいけないのが、デフォルトはFalseであるということ。

a = torch.ones(2 ,2) -> tensor([[1., 1.], [1., 1.]])

a.requires_grad -> False

a.requires_grad_(True) -> tensor([[0.2171, 0.1498], [0.0853, 0.4407]], requires_grad=True)