back propagation

Back Propagation

loss?

?

f?g?y = f(x)?z = g(y)?zx?[frac{dz}{dx} = frac{dz}{dy} cdot frac{dy}{dx} = g'(y) cdot f'(x)]

f?g?y = f(x)?z = g(x)[frac{d(y+z)}{dx} = frac{dy}{dx} + frac{dz}{dx} = f'(x) + g'(x)]

?

?

? 1?y = f(x)?z = g(x)?L = u(y) + h(z) = u(f(x)) + h(g(x))?

y?z?[frac{dL}{dy} = frac{du(y)}{dy} = u'(y)][frac{dL}{dz} = frac{dh(z)}{dz} = h'(z)]

x?[frac{dL}{dx} = frac{d(u(y) + h(z))}{dx} = frac{du(y)}{dx} + frac{dh(z)}{dx} = frac{du(y)}{dy} cdot frac{df(x)}{dx} + frac{dh(z)}{dz} cdot frac{dg(x)}{dx} = u'(y) cdot f'(x) + h'(z) cdot g'(x)]

? grad_table?

? Torchbackward?

Module:backward(input, gradOutput, scale)?

input

gradOutput?

scale

updateGradInput?gradInput?accGradParameters?

1

Torch?

在求出前向传播和反向传播前要先确定参数和输入输出符号的表达形式

最普通的DNN就可以看做是一个多层感知机MLP,感知机的输出其实就是对输入的加权求和: ,再经过一个非线性激活函数

首先来定义权值矩阵W,按照下图规则, 表示的是第3层第2个神经元和第2层第4个神经元之间连线(连线就代表权重,可以看成是 的省略写法)。那么为什么不写成 呢,形式上是允许的,但是如果这样写的话,第3层神经元的输入就要通过 来计算,而前者只需要计算 ,省略了矩阵转置的额外工作量。

偏置项b的定义也是类似, 表示第2层第3个神经元的偏置。

再定义 分别表示第i层第j个神经元的输出和输入,并假设 是我们选择的激活函数。

对于第2层第1个节点的输出 有:

对于第3层第1个节点的输出 有:

一般化的,假设l-1层有m个神经元,对于 有:

也就是第l层第j个神经元的输入为与它相连的上一层每个神经元的输出加权求和后加上该神经元对应的偏置,该神经元所做的工作只是把这个结果做一个非线性激活。

当通过前向传播得到由任意一组随机参数W和b计算出的网络预测结果后,我们可以利用损失函数相对于每个参数的梯度来对他们进行修正。事实上神经网络的训练就是这样一个不停的前向-反向传播的过程,直到网络的预测能力达到我们的预期。

假设选择最简单的均方误差和作为损失函数:

下面就根据这个损失函数更新每一层的w,b

根据前向传播的公式,输出层L的输出

带入到损失函数中,有

根据复合函数链式求导法则,L层参数 的梯度容易求得:

显然,两式有一部分是重叠的,将这部分记做 ,

这一规律同样适用在非输出层的隐藏层L-1,L-2,...l,...1,我们只需要求出损失函数相对l层非激活输出 的导数,再根据前向传播公式 便可以轻易的求得

同样,根据链式求导法则,

至此,问题的关键转化成如何求解 ,既然是反向传播,在求第l层参数时, 都是已知的,还是根据链式求导法则:

显然,问题的关键在于求解 ,再根据前向传播公式,

(5)

猜你喜欢

发表回复

本站作者才能评论

评论列表(3条)

  • admin的头像
    admin 2026年03月21日

    我是方程号的签约作者“admin”

  • admin
    admin 2026年03月21日

    本文概览:Back Propagation loss??f?g?y = f(x)?z = g(y)?zx?[frac{dz}{dx} = frac{dz}{dy} cdot frac{...

  • admin
    用户032104 2026年03月21日

    文章不错《back propagation》内容很有帮助

联系我们:

邮件:方程号@gmail.com

工作时间:周一至周五,9:30-17:30,节假日休息

关注微信