美文网首页
Pytorch-反向传播

Pytorch-反向传播

作者: 残剑天下论 | 来源:发表于2020-02-11 14:58 被阅读0次

在以前的章节中介绍多输出单层感知机的求导:

  • j的取值为0,1,..., n;k的取值为0, 1, ..., m;

  • \frac{\partial E}{\partial w_{jk}}只与O_kt_k以及x_j^0有关;

  • 通过该公式可以计算出所有的导数\frac{\partial E}{\partial w_{(j=\{0, ..., n\})(k=\{0, ..., m\})}};

  • 我们就假定w^1_{jk}是属于第一层x^1的权重;

接下来讨论多层感知机的反向传播过程:

  • 我们可以轻易求出K层所有的权重w_{jk}^{K}的导数

我们可以将J层的输出O^{J}_{i}当作多输出单层感知机中的输入层,这样根据如下公式\frac{\partial E }{\partial w_{jk}^K } = (O_k - t_k)O_k(1 - O_k)O_j^{J},轻易求出K层所有的权重w_{jk}^{K}的导数。

\delta _{k}^{K} = (O_k - t_k)O_k(1 - O_k),则有
\frac{\partial E }{\partial w_{jk}^K } = \delta _{k}^KO_j^{J} , (1)

  • 接着求J层所有的权重w_{ij}^{J}的导数

E = \frac{1}{2} \sum_{k=0}^{m} (O^K_{k} - t_k)^2,(2)

\frac{\partial E}{\partial w_{ij}^{J}} = \sum_{k=0}^{m} (O^K_{k} - t_k) \frac{\partial O^K_{k}}{\partial w_{ij}^{J}} ,(3)

\frac{\partial E}{\partial w_{ij}^{J}} = \sum_{k=0}^{m} (O^K_{k} - t_k) \frac{\partial O^K_{k}}{\partial x^K_{k}} \frac{\partial x^K_{k}}{\partial w_{ij}^{J}} = \sum_{k=0}^{m} (O^K_{k} - t_k) \sigma (x^K_{k}) (1 - \sigma (x^K_{k})) \frac{\partial x^K_{k}}{\partial w_{ij}^{J}} ,(4)

\frac{\partial E}{\partial w_{ij}^{J}} = \sum_{k=0}^{m} (O^K_{k} - t_k) O^K_{k} (1 - O^K_{k})\frac{\partial x^K_{k}}{\partial w_{ij}^{J}} ,(5)
对于式(5),前向传播可计算出\sigma (x^K_{k}) = O^K_{k}

\frac{\partial E}{\partial w_{ij}^{J}} = \sum_{k=0}^{m} (O^K_{k} - t_k) O^K_{k} (1 - O^K_{k}) \frac{\partial x^K_{k}}{\partial O^J_{j}} \frac{\partial O^J_{j}}{\partial w_{ij}^{J}},(6)

\frac{\partial E}{\partial w_{ij}^{J}} = \sum_{k=0}^{m} (O^K_{k} - t_k) O^K_{k} (1 - O^K_{k}) w^K_{jk} \frac{\partial O^J_{j}}{\partial w_{ij}^{J}},(7)

\frac{\partial E}{\partial w_{ij}^{J}} = \frac{\partial O^J_{j}}{\partial w_{ij}^{J}} \sum_{k=0}^{m} (O^K_{k} - t_k) O^K_{k} (1 - O^K_{k}) w^K_{jk} ,(8)

对于式(8),\frac{\partial O^J_{j}}{\partial w_{ij}^{J}} = \frac{\partial O^J_{j}}{\partial x^J_{j}} \frac{\partial x^J_{j}}{\partial w_{ij}^{J}} = O^J_{j}(1 - O^{J}_j)x_i^{0}

所以有,
\frac{\partial E}{\partial w_{ij}^{J}} = x_i^{0} O^J_{j}(1 - O^{J}_j)\sum_{k=0}^{m} (O^K_{k} - t_k) O^K_{k} (1 - O^K_{k}) w^K_{jk} ,(9)

对于式(9),显然其中的x_i^{0}表示J层前一层的输出,可以更通用的表示为O_i^{I}

则有,

\frac{\partial E}{\partial w_{ij}^{J} } = O_i^{I} O^J_{j}(1 - O^{J}_j)\sum_{k=0}^{m} (O^K_{k} - t_k) O^K_{k} (1 - O^K_{k}) w^K_{jk} ,(10)

\delta _{k}^{K} = (O_k - t_k)O_k(1 - O_k)带入(10),则有

\frac{\partial E}{\partial w_{ij}^{J} } = O_i^{I} O^J_{j}(1 - O^{J}_j)\sum_{k=0}^{m} \delta _{k}^{K} w^K_{jk} ,(11)

在式(11)中可以看出,J层的权重求导,与J层前一层的输出、J层的输出、J层后一层的输出、J层的权重有关。依次类推,便可以从后往前,计算出所有层的权重导数。

反向传播总结

  • 反向传播,从输出层权重开始,从后往前计算权重的导数;

  • 输出层的权重导数:

对于输出层的每一个节点k \in K,有

\frac{\partial E}{\partial w_{jk}} = O_j \delta_{k}

其中,\delta_{k} = O_k (1 - O_k) (O_k - t_k)

  • 隐藏层的权重导数:

对于隐藏层的一个节点j \in J,有

\frac{\partial E}{\partial w_{ij}} = O_i \delta_{j}

其中,\delta_{j} = O_j (1 - O_j) \sum_{k=0}^{m} \delta _{k} w_{jk}

相关文章

网友评论

      本文标题:Pytorch-反向传播

      本文链接:https://www.haomeiwen.com/subject/xfmqfhtx.html