单层感知机模型讲解

下图为一个简单的单层感知机模型
单层感知机模型讲解
左侧为输入层,对于所有输入xxx,上标0表示第0层(即输入层),下标0~N表示有N+1个元素。对于中间的权重wijw_{ij}wij​,iii表示上一层的节点编号,jjj表示下一层的节点编号。后面紧跟着的分别是求和\sum∑,以及σ\sigmaσ函数。后面的E代表Error或者Loss,将输出值与t(target)进行对比

接下来我们推导一下单层感知机梯度公式

首先我们定义E(Loss)=12(O01t)2E(Loss)=\frac{1}{2}(O_0^1-t)^2E(Loss)=21​(O01​−t)2,这里额外的12\frac{1}{2}21​是为了方便抵消掉求导后的参数2,该值的设立不会改变结果的单调性,所以有没有都无所谓,但是为了方便,这里还是加上了

KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \frac{\nabl…
因为σ(x)x=σ(1σ)xx\frac{\nabla \sigma(x)}{\nabla x} = \sigma * (1-\sigma)\frac{\nabla x}{\nabla x}∇x∇σ(x)​=σ∗(1−σ)∇x∇x​

所以
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ (O^1_0 - t)\…
因此,Ewj0=(O01t)O01(1O01)xj0\frac{\nabla E}{\nabla w_{j0}} = (O^1_0 - t) O^1_0(1-O^1_0)x^0_j∇wj0​∇E​=(O01​−t)O01​(1−O01​)xj0​

由该结果可看出,LossLossLoss关于权重www的梯度仅与输出节点O01O^1_0O01​和输入节点的xxx有关

import torch
import torch.nn.functional as F
x = torch.randn(1, 10) # dim=2,len=10, x为[1,10]的tensor
w = torch.randn(1, 10, requires_grad=True) # w为[1,10]的tensor
o = torch.sigmoid(x@w.t()) # o为[1,1]的tensor
# [1,10]*[1,10]T => [1,10]*[10,1] => [1,1]

print("o:",o)

loss = F.mse_loss(input=o, target=torch.ones(1, 1))
# 将shapa为[1,1]的计算结果与全为1的[1,1]矩阵进行mse计算

print('loss:', loss)
print('loss shape:', loss.shape) # 得到的loss为标量

loss.backward()
print('w.grad:', w.grad)
单层感知机模型讲解单层感知机模型讲解 数学家是我理想 博客专家 发布了167 篇原创文章 · 获赞 162 · 访问量 12万+ 私信 关注
上一篇:02(c)多元无约束优化问题-牛顿法


下一篇:BP_fetch_mnist