1957 年,康奈尔航空实验室的弗兰克-罗森布拉特(Frank Rosenblatt)首次尝试实现与现代神经网络类似的功能。这是一种名为 "Mark-1 "的硬件实现,旨在识别三角形、正方形和圆形等原始几何图形。
Images from Wikipedia
输入图像由 20x20 光电池阵列表示,因此神经网络有 400 个输入和一个二进制输出。一个简单的网络包含一个神经元,也称为阈值逻辑单元。神经网络的权重就像电位器,在训练阶段需要手动调整。
✅ 电位器是一种允许用户调节电路电阻的装置。
《纽约时报》当时对感知器进行了报道: *[海军]希望这种电子计算机的雏形能够行走、说话、看东西、写字、自我复制并意识到自己的存在。
假设我们的模型有 N 个特征,那么输入向量就是一个大小为 N 的向量。感知器是一个二元分类模型,即它可以区分输入数据的两个类别。我们假定,对于每个输入向量 x,感知器的输出都是+1或-1,具体取决于类别。输出的计算公式为
y(x) = f(wTx)
其中,f 是阶跃激活函数
要训练感知器,我们需要找到一个权重向量 w,它能正确地对大部分数值进行分类,即产生最小的误差。这个误差由感知器准则定义,其方式如下:
E(w) = -∑wTxiti
也就是:
- 对导致错误分类的训练数据点 i 求和
- xi s 为输入数据,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
在这一课中,你了解了二元分类模型感知器,以及如何使用权重向量来训练感知器。
如果你想建立自己的感知器,请尝试 this lab on Microsoft Learn 基于 Azure ML designer.
要了解我们如何使用感知器解决玩具问题和现实问题,并继续学习--请访问 Perceptron 笔记本。
这里还有一篇有趣的关于感知器的文章。
在本课中,我们为二进制分类任务实现了一个感知器,并用它对两个手写数字进行了分类。在本实验中,我们要求你完全解决数字分类问题,即确定哪个数字最有可能与给定图像相对应。