计算图与自动微分

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

静态计算图在构建时可以进行优化,并行能力强,但灵活性比较差低。动态计算图则不容易优化,当不同输入的网络结构不一致时,难以并行计算,但是灵活性比较高。

posted @ 2022-01-08 09:54  筷点雪糕侠  阅读(324)  评论(0编辑  收藏  举报