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

本文详细介绍了单层感知机模型的工作原理,包括激活函数的选择、损失函数的定义以及梯度计算过程。通过一个具体的例子展示了如何利用PyTorch进行模型的搭建和训练,并解释了参数更新的步骤。内容涵盖了输入、权重、偏置、误差计算及反向传播等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单层感知机模型

y=XW+by=∑xi∗wi+b y = XW + b \\ y = \sum x_i*w_i+ b y=XW+by=xiwi+b

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

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

随后,O01O_0^1O01与target值计算:Error(Loss)=∑(O01−target)2Error(Loss)=\sum(O_0^1-target)^2ErrorLoss=(O01target)2

梯度

Loss计算公式:
E=12(O01−t)2 E = \frac{1}{2}(O_0^1 - t)^2 E=21(O01t)2
这里引入了一个额外的12\frac{1}{2}21是为了与求导后的数2抵消掉。不会影响单调性的。
∂E∂wj0=(O0−t)∗O0∂wj0∂E∂wj0=(O0−t)σ(x01)∂wj0∂E∂wj0=(O0−t)σ(x0)(1−σ(x0))∂x01∂wj0 \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
求导之前需要先向右计算一次所有的变量值,这就是向前传播
∂x0∂wj0=∂∑wj0xj0∂wj0=xj0 \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∂wj0=(O0−t))O0(1−O0)xj0 \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]])

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值