如图1所示的逻辑与的真值表,其输出只有0和1两种。感知机作为神经网络(深度学习)的起源的算法,功能上与之类似。
▲图1
感知机接收多个输入信号,输出一个信号。这里所说的“信号”可以想象成电流或水管中的水那样具备“流动性”的东西。水管中的水可多可少。但是,和实际的水流不同的是,感知机的信号只有“流/不流”(1/0)两种取值。在本文中,0对应“不传递信号”,1对应“传递信号”。
▲图2
图2是一个接收两个输入信号的感知机的例子。 是输入信号, 是输出信号, 是权重。图中的圆圈称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重 。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号 表示。总结起来,就是
感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用,就像水管的阀门。也就是说,权重越大,对应该权重的信号的重要性就越高。
下面考虑用感知机来表示逻辑与。需要做的就是确定能满足图1的真值表的 的值。那么,设定什么样的值才能制作出满足图1的条件的感知机呢? 时,可以满足图1的条件。此外,当取 或者 时,同样也满足与门的条件。设定这样的参数后,仅当 和 同时为1时,信号的加权总和才会超过给定的阈值 。
用python实现逻辑与
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1*w1 + x2*w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
这里决定感知机参数的并不是计算机,而是我们人。我们看着真值表“训练数据”,人工想到了参数的值。而机器学习的课题就是将这个决定参数值的工作交由计算机自动进行。学习是确定合适的参数的过程,而人要做的是思考感知机的构造(模型),并把训练数据交给计算机。
现在考虑一个一维位移分布。此处,位移 是通过坐标 的线性变换获得的,即 ,可使用以下代码:
model = torch.nn.Linear(1, 1) 模型参数可以通过以下方式设置:
model.weight.data = torch.tensor([[w]])
model.bias.data = torch.tensor([b]) 在区间 内采样位移,并使用一维公式计算应变 和应力 :
其中 。
import torch
import matplotlib.pyplot as plt
from torch.autograd import grad
w = 200.0E-6 #权重和偏置
b = 1.0
model = torch.nn.Linear(1, 1) #定义一个线性模型:输入维度1,输出维度1
#覆盖随机初始化的权重。默认情况下,Linear层的权重和偏置是随机初始化的。这里直接将其设置为预定义的w和b
model.weight.data = torch.tensor([[w]])
model.bias.data = torch.tensor([b])
nx = 5 # 生成5个等间距的点
# 在区间 [−1,1] 上生成 5 个点。requires_grad=True启用自动微分,后续可以计算这些点的导数。
# unsqueeze(1):将形状从 (5,) 转换为 (5, 1),以匹配线性模型的输入维度。
x = torch.linspace(-1, 1, nx, requires_grad=True).unsqueeze(1)
d = model(x) # d是模型对输入x的输出,即d=wx+b。
dd_dx = grad(d, x, torch.ones_like(x), create_graph=True, retain_graph=True)[0]
# grad(d, x, ...):计算 d 对 x 的梯度(导数)。
# torch.ones_like(x):梯度的初始值(全 1)。
# create_graph=True:保留计算图,允许进一步求导。
# retain_graph=True:防止计算图被释放(通常用于多次求导)。
# dd_dx 是 $ \frac{dd}{dx} = w $(因为 $ d = wx + b $,导数为 w)。
# eps = dd_dx:将导数赋值给 eps(应变)。
eps = dd_dx
E = 210000.0
sig = E * eps #计算应力
fig, ax = plt.subplots(1, 3, figsize=(15, 5))
ax[0].plot(x.detach(), d.detach(), "k")
ax[0].set_title("$u$")
ax[1].plot(x.detach(), eps.detach(), "k")
ax[1].set_title("$ε$")
ax[2].plot(x.detach(), sig.detach(), "k")
ax[2].set_title("$σ$")
fig.tight_layout()
plt.show()
数值输出验证
| = w = 200×10⁻⁶ | ||
| = 210000 × 200e-6 = 42 |