【pytorch16】MLP反向传播

链式法则回顾

在这里插入图片描述

多输出感知机的推导公式回顾

在这里插入图片描述

只与w相关的输出节点和输入节点有关

多层多输入感知机

扩展为多层感知机的话,意味着还有一些层(理解为隐藏层σ函数),暂且设置为xjx_{j}xj
在这里插入图片描述
对于xjx_{j}xj层如果把前面的层数和输入挡住的话就可以类似于一个单层的多输入感知机一样
在这里插入图片描述
逐步推导最终的loss对第二层wjkw_{jk}wjk的推导公式
在这里插入图片描述

OkkO^{k}_{k}Okktkt_{k}tk的线性组合换元成δkk\delta^{k}_{k}δkk,因此对于最终的输出层上面一共有k个节点的话,最终会有k个δk\delta^{k}δk,通过这个中间变量可以得到δk\delta^{k}δk的变量再乘一个输入OjO^{j}Oj,通过这两个相乘就可以得到一个损失对wjkw_{jk}wjk的梯度计算公式,看起来比原先的要简洁和清晰,所以单独取了一个名字

δk\delta^{k}δk可以通过前项计算得到,OkO^{k}Oktkt_{k}tk都是知道的,因此这一部分可以直接在前项计算的时候就把δk\delta^{k}δk求出来,再取上一层的OjO^{j}Oj的变量就可以直接得到矩阵数组(OjO^{j}Oj看做列向量,δk\delta^{k}δk为行向量),这个矩阵数组代表了这一层所有连接的梯度信息,通过这个矩阵可以直接更新梯度也就是wjkw_{jk}wjk
在这里插入图片描述
可以看出O的下标是w的行数,δ的下标是w的列数

现在我们希望得到最终层的loss对第一层的wijw_{ij}wij的推导公式
在这里插入图片描述
第二步,把偏微分可以写进求和符合,因为只有OkO_{k}Ok包含wijw_{ij}wij,可以把OkO_{k}Ok作为一个整体

第三步,继续把OkO_{k}Ok展开,OkO_{k}Okxkx_{k}xk经过激活函数得到的

第四步,使用链式法则

第五步,σ(xk)\sigma(x_{k})σ(xk)就是OkO_{k}Ok,把第四步的偏微分用链式法则展开,让xkx_{k}xk对中间变量OjO_{j}Oj偏导,再让OjO_{j}Ojwijw_{ij}wij偏导

第六步,xkx_{k}xk对具体的OjO_{j}Oj偏导而言,xkx_{k}xkOjwjkO_{j}w_{jk}Ojwjk的累加(此时j是一个范围属于[0到n]),只有当范围的j与具体的j相同时,偏导才存在为wjkw_{jk}wjk,看图的话只有一条线影响

第七步,由于wijw_{ij}wij与求和中的k变量无关,因此可以提前

第八步,σ(xj)\sigma(x_{j})σ(xj)就是OjO_{j}Oj同第四步和第五步,而xjx_{j}xjwijw_{ij}wij的偏微分(同第六步,xjx_{j}xj等于xi0wijx^{0}_{i}w_{ij}xi0wij的累加)只有当wijw_{ij}wij相等时偏导才存在为xi0x^{0}_{i}xi0,此处设置为OiO_{i}Oi

总结
在这里插入图片描述

δk\delta^{k}δk替换求和中线性组合部分,变成了三段表达式
在这里插入图片描述
在这里插入图片描述
δk\delta^{k}δk定义为从k层节点开始到最终的输出层的梯度传到的一个信息,这个信息是什么也不好说太复杂了,但是可以明确只要拿到了δk\delta^{k}δk的信息,这一层的任何节点的梯度信息就可以直接使用当前的O节点的输出乘以前面的所有信息δk\delta^{k}δk

同样对于中间层而言,也只需要得到上一层的输入和这一层δj\delta^{j}δj的信息就可以得到隐藏层的梯度信息

在这里插入图片描述
首先计算输出层的δk\delta^{k}δk以及输出层的更新的梯度信息,得到输出层以后计算导数第二层的δj\delta^{j}δj和梯度信息(wijw_{ij}wij的)
在这里插入图片描述
通过这种方式再可以计算倒数第三层的δi\delta^{i}δi和梯度信息就可以计算出所有层的偏微分的信息
在这里插入图片描述
得到这个梯度信息以后,可以直接使用链式法则以及梯度更新方式,更新权值,反复循环达到我们想要的一个程度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值