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