end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

pytorch for python の自動微分を試す

自動微分とは?

そもそも「自動微分」という用語すら知りませんでした。 微分には「数式微分」「数値微分」「自動部分」があり、 更に自動微分は「前進法 (ボトムアップ型、フォワードモード、狭義の自動微分)」 「後進法 (トップダウン型、リバースモード、高速自動微分)」がある。

前進法と後進法の詳細は、次のurlにあるpwcのページが分かりやすいように思えます。

https://www.pwc.com/jp/ja/knowledge/column/viewpoint/grc-column003.html

pytorchの自動微分

pytorchの自動微分は、後進法らしく backward() として実装されています。

#!/usr/local/python3/bin/python3
# -*- coding: utf-8 -*-
import torch
import torchvision
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import torchvision.transforms as transforms
import numpy as np
from matplotlib import pyplot as plt


def main():
    # tensor作成. x のみ、requires_grad=False で微分計算なしで作成.
    x = torch.tensor(1, requires_grad=False, dtype=torch.float32)
    w = torch.tensor(2, requires_grad=True,  dtype=torch.float32)
    b = torch.tensor(3, requires_grad=True,  dtype=torch.float32)
    
    # 関数?作成
    y = w * x + b    # y = 1 * 2 + 3
    
    print(y)
    
    # 勾配計算
    y.backward()

    # 勾配を確認
    print("x.grad:", x.grad) #xのみ微分計算なし
    print("w.grad:", w.grad)
    print("b.grad:", b.grad)

    
if __name__ == '__main__':
    main()

具体的には↑こう書くと、↓こう表示されます

$ ./foo.py 
tensor(5., grad_fn=<AddBackward0>)
x.grad: None
w.grad: tensor(1.)
b.grad: tensor(1.)

上記以外の自動微分については、次のurlが参考になります。

PyTorch (2) 自動微分 - 人工知能に関する断創録