神经网络入门:感知机#

课前测验#

1957年,康奈尔航空实验室的Frank Rosenblatt首次尝试实现类似现代神经网络的模型。这是一种名为“Mark-1”的硬件实现,设计用于识别简单的几何图形,例如三角形、正方形和圆形。

Frank Rosenblatt The Mark 1 Perceptron

图片来源:维基百科

输入图像由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设计器

课后测验#

复习与自学#

要了解如何使用感知机解决一个简单问题以及实际问题,并继续学习,请查看感知机笔记本。

这里还有一篇有趣的关于感知机的文章

作业#

在本课中,我们实现了一个用于二分类任务的感知机,并使用它来区分两个手写数字。在本实验中,你需要完全解决数字分类问题,即确定给定图像最可能对应的数字。