神经网络入门:感知机#
课前测验#
1957年,康奈尔航空实验室的Frank Rosenblatt首次尝试实现类似现代神经网络的模型。这是一种名为“Mark-1”的硬件实现,设计用于识别简单的几何图形,例如三角形、正方形和圆形。
![]() |
![]() |
图片来源:维基百科
输入图像由20x20的光电池阵列表示,因此神经网络有400个输入和一个二进制输出。一个简单的网络包含一个神经元,也称为阈值逻辑单元。神经网络的权重类似于电位器,在训练阶段需要手动调整。
✅ 电位器是一种允许用户调整电路电阻的设备。
《纽约时报》当时对感知机的报道是:一种电子计算机的胚胎,[海军]期望它能够行走、说话、看见、写作、自我复制并意识到自己的存在。
感知机模型#
假设我们的模型有N个特征,那么输入向量将是一个大小为N的向量。感知机是一种二分类模型,即它可以区分两类输入数据。我们假设对于每个输入向量x,感知机的输出将是+1或-1,具体取决于类别。输出通过以下公式计算:
y(x) = f(wTx)
其中f是一个阶跃激活函数
训练感知机#
为了训练感知机,我们需要找到一个权重向量w,使得大多数值能够被正确分类,即使误差最小化。这个误差E通过感知机准则定义如下:
E(w) = -∑wTxiti
其中:
- 求和是在那些导致错误分类的训练数据点i上进行的
- xi是输入数据,ti对于负样本是-1,对于正样本是+1。
这个准则被视为权重w的函数,我们需要对其进行最小化。通常使用一种称为梯度下降的方法,我们从一些初始权重w(0)开始,然后在每一步根据以下公式更新权重:
w(t+1) = w(t) - η∇E(w)
这里η是所谓的学习率,∇E(w)表示E的梯度。计算梯度后,我们得到:
w(t+1) = w(t) + ∑ηxiti
Python中的算法如下:
def train(positive_examples, negative_examples, num_iterations = 100, eta = 1):
weights = [0,0,0] # Initialize weights (almost randomly :)
for i in range(num_iterations):
pos = random.choice(positive_examples)
neg = random.choice(negative_examples)
z = np.dot(pos, weights) # compute perceptron output
if z < 0: # positive example classified as negative
weights = weights + eta*weights.shape
z = np.dot(neg, weights)
if z >= 0: # negative example classified as positive
weights = weights - eta*weights.shape
return weights
总结#
在本课中,你学习了感知机,这是一种二分类模型,并了解了如何通过使用权重向量来训练它。
🚀 挑战#
如果你想尝试构建自己的感知机,可以试试Microsoft Learn上的这个实验,它使用了Azure ML设计器。
课后测验#
复习与自学#
要了解如何使用感知机解决一个简单问题以及实际问题,并继续学习,请查看感知机笔记本。
这里还有一篇有趣的关于感知机的文章。
作业#
在本课中,我们实现了一个用于二分类任务的感知机,并使用它来区分两个手写数字。在本实验中,你需要完全解决数字分类问题,即确定给定图像最可能对应的数字。

