【pytorch16】MLP反向传播
链式法则回顾
多输出感知机的推导公式回顾
只与w相关的输出节点和输入节点有关
多层多输入感知机
扩展为多层感知机的话,意味着还有一些层(理解为隐藏层σ函数),暂且设置为
x
j
x_{j}
xj层
对于
x
j
x_{j}
xj层如果把前面的层数和输入挡住的话就可以类似于一个单层的多输入感知机一样
逐步推导最终的loss对第二层
w
j
k
w_{jk}
wjk的推导公式
把 O k k O^{k}_{k} Okk与 t k t_{k} tk的线性组合换元成 δ k k \delta^{k}_{k} δkk,因此对于最终的输出层上面一共有k个节点的话,最终会有k个 δ k \delta^{k} δk,通过这个中间变量可以得到 δ k \delta^{k} δk的变量再乘一个输入 O j O^{j} Oj,通过这两个相乘就可以得到一个损失对 w j k w_{jk} wjk的梯度计算公式,看起来比原先的要简洁和清晰,所以单独取了一个名字
δ
k
\delta^{k}
δk可以通过前项计算得到,
O
k
O^{k}
Ok和
t
k
t_{k}
tk都是知道的,因此这一部分可以直接在前项计算的时候就把
δ
k
\delta^{k}
δk求出来,再取上一层的
O
j
O^{j}
Oj的变量就可以直接得到矩阵数组(
O
j
O^{j}
Oj看做列向量,
δ
k
\delta^{k}
δk为行向量),这个矩阵数组代表了这一层所有连接的梯度信息,通过这个矩阵可以直接更新梯度也就是
w
j
k
w_{jk}
wjk
可以看出O的下标是w的行数,δ的下标是w的列数
现在我们希望得到最终层的loss对第一层的
w
i
j
w_{ij}
wij的推导公式
第二步,把偏微分可以写进求和符合,因为只有
O
k
O_{k}
Ok包含
w
i
j
w_{ij}
wij,可以把
O
k
O_{k}
Ok作为一个整体
第三步,继续把 O k O_{k} Ok展开, O k O_{k} Ok是 x k x_{k} xk经过激活函数得到的
第四步,使用链式法则
第五步, σ ( x k ) \sigma(x_{k}) σ(xk)就是 O k O_{k} Ok,把第四步的偏微分用链式法则展开,让 x k x_{k} xk对中间变量 O j O_{j} Oj偏导,再让 O j O_{j} Oj对 w i j w_{ij} wij偏导
第六步, x k x_{k} xk对具体的 O j O_{j} Oj偏导而言, x k x_{k} xk是 O j w j k O_{j}w_{jk} Ojwjk的累加(此时j是一个范围属于[0到n]),只有当范围的j与具体的j相同时,偏导才存在为 w j k w_{jk} wjk,看图的话只有一条线影响
第七步,由于 w i j w_{ij} wij与求和中的k变量无关,因此可以提前
第八步, σ ( x j ) \sigma(x_{j}) σ(xj)就是 O j O_{j} Oj同第四步和第五步,而 x j x_{j} xj对 w i j w_{ij} wij的偏微分(同第六步, x j x_{j} xj等于 x i 0 w i j x^{0}_{i}w_{ij} xi0wij的累加)只有当 w i j w_{ij} wij相等时偏导才存在为 x i 0 x^{0}_{i} xi0,此处设置为 O i O_{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和梯度信息(
w
i
j
w_{ij}
wij的)
通过这种方式再可以计算倒数第三层的
δ
i
\delta^{i}
δi和梯度信息就可以计算出所有层的偏微分的信息
得到这个梯度信息以后,可以直接使用链式法则以及梯度更新方式,更新权值,反复循环达到我们想要的一个程度
原文地址:https://blog.csdn.net/qq_45291280/article/details/140201118
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!