公式Tutorialに学ぶPyTorch①(Tutorialの全体像&Autograd)|DeepLearningの実装 #9

f:id:lib-arts:20190620151942p:plain

連載経緯は#1をご確認ください。

#1はKeras、#2~#7まではTensorFLow、#8からはPyTorchを取り扱っています。

#8ではPyTorchの概要やインストール、簡易実行について取り扱ったので、#9からは公式Tutorialの中身をより詳しく確認していければと思います。
以下目次になります。
1. PyTorchのチュートリアルの全体像
2. Autograd: Automatic Differentiationについて
3. まとめ


1. PyTorchのチュートリアルの全体像
1節ではまず手始めとしてPyTorchチュートリアルの全体像の把握を行います。

f:id:lib-arts:20190620171604p:plain

Welcome to PyTorch Tutorials — PyTorch Tutorials 1.1.0 documentation

PyTorchチュートリアルでは上記のように"Getting Started"として様々なコンテンツが用意されています。

なんとなくセオリーとして左上のものが良さそうということでまずは左上の"Deep Learning with PyTorch: A 60 Minute Blitz"を見ていきたいと思います。

f:id:lib-arts:20190620172813p:plain

Deep Learning with PyTorch: A 60 Minute Blitz — PyTorch Tutorials 1.1.0 documentation

"Deep Learning with PyTorch: A 60 Minute Blitz"の左上にある、"What is PyTorch?"につきましては前回確認ができたので、今回は右上の"Autograd: Automatic Differentiation"について2節で確認を行なっていきたいと思います。

Autograd: Automatic Differentiation — PyTorch Tutorials 1.1.0 documentation

また、"Deep Learning with PyTorch: A 60 Minute Blitz"以外のコンテンツを下記に列挙します。

Data Loading and Processing Tutorial
Learning PyTorch with Examples
Transfer Learning Tutorial
Deploying a Seq2Seq Model with the Hybrid Frontend
Saving and Loading Models
What is torch.nn really?

データのロード、転移学習、Seq2Seq、モデルの保存やロードなど、どれも"A 60 Minute Blitz"の後にやる方が良い内容に見えるので、一旦"Deep Learning with PyTorch: A 60 Minute Blitz"の内容を消化するのを目標にするのが良さそうです。
1節の目標である、PyTorchチュートリアルの全体像の把握は概ね行えたと思われるので、次の2節で"Autograd: Automatic Differentiation"について取り扱っていければと思います。


2. Autograd: Automatic Differentiationについて
2節ではAutogradについて取り扱います。実装を確認する前にまずは冒頭部で内容について見ていきます。

f:id:lib-arts:20190620174424p:plain

Autograd: Automatic Differentiation — PyTorch Tutorials 1.1.0 documentation

以下簡単に要約します。
要約:『PyTorchにおける全てのニューラルネットワークの中心はautogradパッケージです。まずはautogradについて確認し、最初のニューラルネットワークの学習に移っていきます。autogradパッケージは全てのTensorの操作に対し、自動微分(automatic differntiation)を可能にします。PyTorchはdefine-by-runのフレームワークで、誤差逆伝播(backprop)がコードがどのように動くかによって定義され、全ての繰り返し(iteration)でパラメータを学習していくことができます。いくつかの例を元にもっと詳しくこちらについて見ていきましょう。』

f:id:lib-arts:20190620175326p:plain
同様にその下のTensorの説明も重要そうなので、こちらも要約します。
要約:『"torch.Tensor"はパッケージの中核となるクラスです。クラスの属性(attribute)の"Tensor.requires"を"True"に設定することで、演算(operation)を追う(track)ことができます。計算が終わった後に"Tensor.backward()"を実行することで、全ての微分の値が自動的に計算されます。テンソル微分は"Tensor.grad"属性に蓄積されていきますが、detachメソッドでトラッキングをやめたりすることができます。また、"Tensor"クラスと同様に自動微分(autograd)の実装に重要なのが"Function"クラスです。』
説明が長くなるとイメージが湧きにくくなるので、一旦"Tensor"クラスに着目しながら話を進めていくということで良さそうです。まずは下記を実行してみましょう。

import torch

x = torch.ones(2, 2, requires_grad=True)
print(x)
print(type(x))

実行結果は下記のようになります。

f:id:lib-arts:20190620180651p:plain

type関数でxを見ることにより、<class 'torch.Tensor'>が出力され、xが"Tensor"クラスのインスタンスであることがわかります。またここで注意すべきは、概要の説明でも出てきた"requires_grad"にTrueを与えていることです。
次に、下記を実行しましょう。

y = x + 2
print(y)
print(y.grad_fn)

f:id:lib-arts:20190620181306p:plain
xを入力としてy=x+2として生成するyは属性"grad_fn"を持っています。これはyが演算の結果として生成されたためだとされています。

次にyにさらに演算を行いzを生成します。

z = y * y * 3
out = z.mean()

print(z, out)

f:id:lib-arts:20190620181704p:plain
yには3が入っているため、3×3×3で27がzの値となっています。そのため、z.mean()で平均を取っても27です。yと同様に演算の結果として生成されているため、属性としてgrad_fnを持っています。次に実際に微分の値を計算してみます。

out.backward()
print(x.grad)

f:id:lib-arts:20190620182947p:plain
結果としては全ての値が4.5となっています。結果の解釈としては、((x+2)^2)'=6(x+2)においてx=1を入れると18ですが、最後にz.mean()とすることで一つ一つのxの寄与が\frac{1}{4}となるので値が4.5になっています。
ここまででautogradについては概ね把握できたということで、今回はここまでとします。


3. まとめ
#9ではPyTorchチュートリアルの全体像の確認と、"Autograd: Automatic Differentiation"の確認を行いました。
#10では引き続き、"Deep Learning with PyTorch: A 60 Minute Blitz"よりNeural Networksについて取り扱えればと思います。