什么是计算图

计算图是将计算过程以图形形式表示,用于描述方程,常用于微分计算。它包含节点(变量)和边(操作)。反向传播(BP)利用链式法则求解网络中变量的偏导数,通过计算图中的路径来实现。计算图在神经网络和自动微分中有重要应用。
部署运行你感兴趣的模型镜像

什么是图:

按照数据结构的定义,图由顶点集V(G)和边集E(G)组成,记为G=(V,E)。其中E(G)是边的有限集合,边是顶点的无序对(无向图)或有序对(有向图)。

对有向图来说,E(G)是有向边(也称弧(Arc))的有限集合,弧是顶点的有序对,记为<v,w>,v、w是顶点,v为弧尾(箭头根部),w为弧头(箭头处)。

对无向图来说,E(G)是边的有限集合,边是顶点的无序对,记为(v, w)或者(w, v),并且(v, w)=(w,v)。

例子:

  微信是有向图,因为你钓妹子不成功,妹子把你删了后仍然出现在你的好友列表里,只是再也接收不到你发的信息而已。

  QQ则是无向图,妹子把你删了之后,连带着会影响你的好友列表,从你的好友列表里面消失,从此你们各过各的,互不影响。

什么式计算图:

 计算图就是将计算过程图形化表示出来。是一种描述方程的“语言”,既然是图,则有节点(变量),边(操作(简单函数))。下面是个例子:

       

怎么用呢?

结合链式法则可以对给定计算图表示微分

 

经过逐级放大,x的变化传递到y,根据链式求导法则:

                               

另一个例子:

                 

复杂一些的例子:

如果求上图中z对x,y的偏导(偏微分),等于x, y到顶点z所有路径的微分的和。步骤如下:

1.计算每个边对应的微分,比如:

  

2.对于每条从z到y,x的路径,所有边的微分相乘求得该路径上的微分。

3.将该变量到z所有路径上的边乘积得到的微分相加.

从计算图数据流向的角度,相当于每个图中每个终端节点(代表自变量)的微小变化反馈给顶层节点的过程,所谓蝴蝶效应,这里可以类比为变元x,y对z引发的蝴蝶效应,所以,从这种角度来看,可以按照下图中颜色箭头标识的路径来理解。

当需要求多个变量的偏微分时,反向的模式(从根开始)更有效率
计算方法一样【本质是一样的,可以理解成,链式法则相乘的部分顺序颠倒】

下面的流程比较好理解,可以看成是正常的多元函数微分求导的过程。

就像是剥洋葱,简单的说,上上图标识的从里往外面剥(四维空间可能能办到 :) ),而上图则是正常的剥法,从外向里面剥.

计算图中,可能会出现同一个节点出现在图的不同位置的情况,比如,如下函数的计算图:

                             

x节点出现在了图结构的不同位置,对于这种的处理方式仍然是把他们当做不同的节点,不同的变量求微分处理。

BP的理解:

BP是Back Propagation的简称.

信号的传递关系如下公式描述:

$\begin{bmatrix} z^{l}_{1}\\ z^{l}_{2}\\ \vdots\\ z^{l}_{i} \end{bmatrix}=\begin{bmatrix} w^{l}_{11}& w^{l}_{12}& \cdots & w^{l}_{1j}\\ w^{l}_{21}& w^{l}_{22}& \cdots & w^{l}_{2j}\\ \vdots & \vdots & \ddots & \vdots \\ w^{l}_{i1}& w^{l}_{i2}& \cdots & w^{l}_{ij} \end{bmatrix}\begin{bmatrix} a^{l-1}_{1}\\ a^{l-1}_{2}\\ \vdots\\ a^{l-1}_{j} \end{bmatrix}+\begin{bmatrix} b^{l}_{1}\\ b^{l}_{2}\\ \vdots\\ b^{l}_{i} \end{bmatrix} \par \begin{bmatrix} a^{l}_{1}\\ a^{l}_{2}\\ \vdots\\ a^{l}_{i} \end{bmatrix}=\sigma (\begin{bmatrix} z^{l}_{1}\\ z^{l}_{2}\\ \vdots\\ z^{l}_{i} \end{bmatrix})=\begin{bmatrix} \sigma(z^{l}_{1})\\ \sigma(z^{l}_{2})\\ \vdots\\ \sigma(z^{l}_{i}) \end{bmatrix}\\$

其中\sigma是非线性函数,也叫激活函数。

Loss:损失函数

$\sigma$     :激活函数
$w_{ij}^{l}$  : l -1层的第j个节点 与 l层的第i个节点 的连接权重
$z_{i}^{l}​$    : 第l层的输入
$a_{j}^{l-1}​$:第l-1层的输出

$a_{j}^{l}​$:第l层的输出

前向传播递推公式:

\\ \vec{z^{1}}=W^{1}\vec{x}+\vec{b^{1}} \\ \vec{a^{1}}=\sigma (\vec{z^{1}})\\ \vec{z^{2}}=W^{2}\vec{a^{1}}+\vec{b^{2}} \\ \vec{a^{2}}=\sigma (\vec{z^{2}})\\ \cdots\cdots \\ \vec{z^{l-1}}=W^{l-1}\vec{a^{l-2}}+\vec{b^{l-1}} \\ \vec{a^{l-1}}=\sigma (\vec{z^{l-1}})\\

输入关系:

\left\{\begin{matrix} \vec{x}\: \: \: \: \: \: \: \: l=1\\ \vec{a}^{\, l-1}\: \: \: l>1\\ \end{matrix}\right.

第一层的输入是样本数据,后续中间层的输入是前层的输出向量。

Loss函数可以看成是对各个权重和偏置的多元函数:

Loss=f(W^1, W^2, W^3,\cdots,\vec{b}_1,\vec{b}_2,\vec{b}_3,\cdots)

则:

\\ \frac{\partial Loss}{\partial w^{l}_{ij}}=\frac{\partial Loss}{\partial z^{l}_{i}}\frac{\partial z^{l}_{i}}{\partial w^{l}_{ij}}=\frac{\partial Loss}{\partial a^{l}_{i}}\frac{\partial a^{l}_{i}}{\partial z^{l}_{i}}\frac{\partial z^{l}_{i}}{\partial w^{l}_{ij}}\\ \frac{\partial a^{l}_{i}}{\partial z^{l}_{i}}=\sigma'(z^{l}_{i})\\ \frac{\partial z^{l}_{i}}{\partial w^{l}_{ij}}=\left\{\begin{matrix} \vec{x}\: \: \: \: \: \: \: \: l=1\\ \vec{a}^{\, l-1}\: \: \: l>1\\ \end{matrix}\right.

您可能感兴趣的与本文相关的镜像

PyTorch 2.8

PyTorch 2.8

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值