美文网首页
Pytorch-单一输出单层感知机的梯度求解

Pytorch-单一输出单层感知机的梯度求解

作者: 残剑天下论 | 来源:发表于2020-02-10 18:23 被阅读0次

1、首先声明一下图中的变量,

  • 最左侧灰色小球一列:

表示一个样本x^0(当然还可能有其他样本,例如x^{1}、x^{2}等);每个样本有n+1个维度,表示n+1个特征,分别是x_{0}^{0},x_{1}^{0},...,也是感知机的输入层,是第0层。

  • 中间的红色层:

第1层,是隐藏层。权重w的上标都是1,表示这些权重都是第1层的权重。权重的下标有两个值,表示是上一层的哪个神经元和当前层哪个神经元之间的权重连接,例如w_{20}^{1},表示该权重是上一层下标为2的神经元(显然是x_2^{0})与当前层(即第1层)下标为0的神经元(显然是x_0^{1})之间的权重连接。由于第1层只有一个神经元(即下标为0 的神经元),所以所有权重下标的第二个值都是0,表示这些权重都是连向第0个神经元的。

x_0^{1},表示第1层的第0个神经元。这个神经元的值是上一层所有神经元与第1层下标的第二个值为0的权重对应相乘并求和的结果。简单地说就是,图中的权重与第0层所有值对应相乘并求和的结果。

O_{0}^{1},是x_0^{1}经过sigmoid后的值。

  • 最右边的黑色t:

表示真实标签值

  • 紫色的E:

表示损失函数,计算O_{0}^{1}t之间的损失。

2、前向过程

x_{0}^{1} = x^{0}_{0} * w^{1}_{00} + x^{0}_{1} * w^{1}_{10} + ... + x^{0}_{i} * w^{1}_{i0} + ... + x^{0}_{n} * w^{1}_{n0} = \sum x^{0}_{i} * w^{1}_{i0},(1)

O^{1}_{0} = \sigma(x^{1}_{0}),(2)

\text{E} = \frac{1}{2} (O^{1}_{0} - t)^2,(3)

3、反向传播过程

\frac{\partial E}{\partial w_{j0}} = (O_0^{1} - t) \frac{\partial O_0^{1}}{\partial w_{j0}},(4)

\frac{\partial E}{\partial w_{j0}} = (O_0^{1} - t) \sigma (x_0^{1})(1 - \sigma (x_0^{1})) \frac{\partial x_0^{1}}{\partial w_{j0}}, (5)

\frac{\partial E}{\partial w_{j0}} = (O_0^{1} - t) \sigma (x_0^{1})(1 - \sigma (x_0^{1})) x_{j}^{0},(6)

其中,(6)中的值都是已知的,或者在前向传播中已计算过了,因此,导数求出。

import torch
import torch.nn.functional as F

x = torch.randn(1, 10)
w = torch.randn(1, 10, requires_grad=True)

y = torch.sigmoid(x @ w.t())

loss = F.mse_loss(y, torch.ones_like(y))
loss.backward()

w.grad

# ===========================
tensor([[ 7.6938e-03,  1.7396e-03,  3.2303e-03, -4.8457e-03, -4.2745e-05,
         -6.3924e-03,  1.3029e-03,  7.1305e-03, -3.3778e-03,  3.6352e-04]])

相关文章

网友评论

      本文标题:Pytorch-单一输出单层感知机的梯度求解

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