计算图与自动微分
1.自动微分概念
自动微分是利用链式法则来自动计算的一个复合函数的梯度
2.计算图
3.案例
\(f(x,w,b)=\frac{1}{e^{-wx+b}+1}\)
计算步骤
\(\frac{\partial f(x;w,b)}{\partial w}=\frac{\partial f(x;w,b)}{\partial h_6}\frac{\partial h_6}{\partial h_5}\frac{\partial h_5}{\partial h_4}\frac{\partial h_4}{\partial h_3}\frac{\partial h_3}{\partial h_2}\frac{\partial h_2}{\partial h_1}\frac{\partial h_1}{\partial w}\)
\(\frac{\partial f(x;w,b)}{\partial b}=\frac{\partial f(x;w,b)}{\partial h_6}\frac{\partial h_6}{\partial h_5}\frac{\partial h_5}{\partial h_4}\frac{\partial h_4}{\partial h_3}\frac{\partial h_3}{\partial h_2}\frac{\partial h_2}{\partial b}\)
当x=1,w=0,b=0时,可以得到
\(\frac{\partial f(x;w,b)}{\partial w}|_{x=1,w=0,b=0}\)
\(=\frac{\partial f(x;w,b)}{\partial h_6}\frac{\partial h_6}{\partial h_5}\frac{\partial h_5}{\partial h_4}\frac{\partial h_4}{\partial h_3}\frac{\partial h_3}{\partial h_2}\frac{\partial h_2}{\partial h_1}\frac{\partial h_1}{\partial w}\)
\(=1\times -0.25 \times 1 \times 1 \times -1 \times 1 \times 1\)
\(=0.25\)
4.前向模式和反向模式
\(\frac{\partial f(x;w,b)}{\partial w}=\frac{\partial f(x;w,b)}{\partial h_6}\frac{\partial h_6}{\partial h_5}\frac{\partial h_5}{\partial h_4}\frac{\partial h_4}{\partial h_3}\frac{\partial h_3}{\partial h_2}\frac{\partial h_2}{\partial h_1}\frac{\partial h_1}{\partial w}\)
\(\frac{\partial f(x;w,b)}{\partial b}=\frac{\partial f(x;w,b)}{\partial h_6}\frac{\partial h_6}{\partial h_5}\frac{\partial h_5}{\partial h_4}\frac{\partial h_4}{\partial h_3}\frac{\partial h_3}{\partial h_2}\frac{\partial h_2}{\partial b}\)
这个多项目乘法可以从后往前算,也可以从前往后算
如果参数与函数之间有多条路径,可以将这多条路径上的导数再进行相加,得到最终的梯度
5.Pytorch案例
点击查看代码
import torch
a = torch.tensor(2.0, requires_grad=True)
b = torch.tensor(1.0, requires_grad=True)
x = 2 * a + 3 * b
y = 5 * a * a + 3 * b * b * b
z = 2 * x + 3 * y
print("a:", a)
print("b:", b)
print("x:", x)
print("y:", y)
print("z:", z)
z.backward()
print("Gradient at a=2.0", a.grad)
---------
a: tensor(2., requires_grad=True)
b: tensor(1., requires_grad=True)
x: tensor(7., grad_fn=<AddBackward0>)
y: tensor(23., grad_fn=<AddBackward0>)
z: tensor(83., grad_fn=<AddBackward0>)
Gradient at a=2.0 tensor(64.)
6.自动微分反向传播模式下的前馈神经网络反向传播算法
前馈神经网络的训练过程可以分为以下三步
1.前向计算每一层的状态和激活值,直到最后一层
2.反向计算每一层的参数的偏导
3.更新参数
7.静态计算图,动态计算图
静态计算图是在编译时构建计算图,计算图构建好之后在程序运行时不能改变。
Theano和Tensorflow
动态计算图是在程序运行时动态构建。两种构建方式各有优缺点。
DyNet,Chainer和PyTorch
静态计算图在构建时可以进行优化,并行能力强,但灵活性比较差低。动态计算图则不容易优化,当不同输入的网络结构不一致时,难以并行计算,但是灵活性比较高。