PyTorch教程(十):单层感知机以及梯度更新

单层感知机模型

y = X W + b y = ∑ x i ∗ w i + b y = XW + b \\ y = \sum x_i*w_i+ b y=XW+by=xiwi+b

单层感知机模型的每一个输入节点 x i x_i xi和对应的权重 w i w_i wi相乘累加后,与bias相加,便得到了预测值。
在这里插入图片描述
我们使用sigmoid函数作为激活函数,通常使用符号 σ \sigma σ表示。
对于最左边的输入层的上标,也就是 x n 0 x_n^0 xn0中的0表示第0层,n表示第0层第n个元素节点。

w w w σ \sigma σ是1层, w i j 1 w^1_{ij} wij1表示第1层,i表示连接的上一层 x i x_i xij表示本层的第j个节点。因为上图中只有一层,所以j=0 x 0 1 x_0^1 x011表示第一层,0表示第一层的0号节点【这里讨论单层输出感知机,所以第一层只有一个节点】。 x 0 1 x_0^1 x01经过激活函数之后,有一个输出值 O 0 1 O_0^1 O01,其中1表示第一层,0表示第0号节点。

随后, O 0 1 O_0^1 O01与target值计算: E r r o r ( L o s s ) = ∑ ( O 0 1 − t a r g e t ) 2 Error(Loss)=\sum(O_0^1-target)^2 ErrorLoss=(O01target)2

梯度

Loss计算公式:
E = 1 2 ( O 0 1 − t ) 2 E = \frac{1}{2}(O_0^1 - t)^2 E=21(O01t)2
这里引入了一个额外的 1 2 \frac{1}{2} 21是为了与求导后的数2抵消掉。不会影响单调性的。
∂ E ∂ w j 0 = ( O 0 − t ) ∗ O 0 ∂ w j 0 ∂ E ∂ w j 0 = ( O 0 − t ) σ ( x 0 1 ) ∂ w j 0 ∂ E ∂ w j 0 = ( O 0 − t ) σ ( x 0 ) ( 1 − σ ( x 0 ) ) ∂ x 0 1 ∂ w j 0 \frac {\partial E}{\partial w_{j0}} =(O_0 - t)*\frac{O_0}{\partial w_{j0}} \\ \frac {\partial E}{\partial w_{j0}} = (O_0 - t)\frac{\sigma(x_0^1)}{\partial w_{j0}} \\ \frac {\partial E}{\partial w_{j0}} = (O_0 - t) \sigma(x_0)(1-\sigma(x_0))\frac{\partial x_0^1}{\partial w_{j0}} wj0E=(O0t)wj0O0wj0E=(O0t)wj0σ(x01)wj0E=(O0t)σ(x0)(1σ(x0))wj0x01
求导之前需要先向右计算一次所有的变量值,这就是向前传播
∂ x 0 ∂ w j 0 = ∂ ∑ w j 0 x j 0 ∂ w j 0 = x j 0 \frac {\partial x_0}{\partial w_{j0}}=\frac {\partial \sum w_{j0}x_j^0}{\partial w_{j0}} = x_j^0 wj0x0=wj0wj0xj0=xj0
因此上面的公式得到最终结果:
∂ E ∂ w j 0 = ( O 0 − t ) ) O 0 ( 1 − O 0 ) x j 0 \frac {\partial E}{\partial w_{j0}} =(O_0 - t))O_0(1-O_0)x_j^0 wj0E=(O0t))O0(1O0)xj0

方法实现

输入10个特征的x

x = torch.randn(1,10)
# tensor([[ 0.5817, -1.1089, -0.9756, -0.4556, -0.2144, -1.1662,  1.9232,  0.2331,
#         -1.2987, -0.4950]])
w = torch.randn(1,10,requires_grad = True)
# tensor([[-1.0490, -1.7553,  0.1665, -0.0458, -0.8664, -0.3328, -0.1398,  1.2416,
#          1.3097, -0.4996]], requires_grad=True)
o = torch.sigmoid(x@w.t())
# tensor([[0.5831]], grad_fn=<SigmoidBackward>)
loss = F.mse_loss(torch.ones(1,1),o)
# tensor(0.1738, grad_fn=<MseLossBackward>)
loss.backward()
w.grad
# tensor([[-0.1179,  0.2248,  0.1977,  0.0923,  0.0435,  0.2364, -0.3898, -0.0472,
#          0.2632,  0.1003]])

这样就得到了每一个 w w w的梯度,随后可以根据 w ′ = w − 0.001 ∗ ∇ w w' = w - 0.001 * \nabla w w=w0.001w来更新参数了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值