原文出处:Introduction to Neural Networks: Perceptron 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。
神经网络入门:感知机
课前小测
最早做出接近现代神经网络的东西,是康奈尔航空实验室(Cornell Aeronautical Laboratory)的 Frank Rosenblatt,时间在 1957 年。那是一台硬件实现的机器,名叫 "Mark-1",设计目标是识别三角形、正方形、圆形这类基本几何图形。
原文此处有两张图:Rosenblatt 的肖像照和 Mark 1 感知机实物照(均来自 Wikipedia),纯文字版已删去。
输入图像由一块 20×20 的光电管阵列采集,所以这个神经网络有 400 个输入、1 个二值输出。简单网络里只有一个神经元,也叫阈值逻辑单元(threshold logic unit)。网络权重靠电位器(potentiometer)实现,训练阶段要人工去拧它们。
电位器是一种让用户调节电路电阻的装置。
《纽约时报》当时这样报道感知机:电子计算机的胚胎,[海军方面] 预计它将能够行走、说话、看、书写、自我复制,并意识到自己的存在。
感知机模型
假设模型有 N 个特征,输入向量就是一个 N 维向量。感知机(perceptron)是一个二分类(binary classification)模型,也就是说,它能把输入数据分成两类。我们假定:对每个输入向量 x,感知机的输出按类别取 +1 或 -1。输出按下式计算:
y(x) = f(wᵀx)
其中 f 是一个阶跃激活函数。原文此处是一张公式图片,写成文字即:当 x ≥ 0 时 f(x) = +1;当 x < 0 时 f(x) = -1。
训练感知机
训练感知机,就是要找到一组权重向量 w,让它把绝大多数样本分对,也就是让误差(error)最小。这个误差 E 由感知机判据(perceptron criterion)定义:
E(w) = -∑ wᵀxᵢtᵢ
其中:
- 求和只针对那些分类出错的训练样本 i
- xᵢ 是输入数据,tᵢ 取 -1 或 +1,分别对应负例和正例
这个判据是权重 w 的函数,我们要把它最小化。常用的办法是梯度下降(gradient descent):从某个初始权重 w⁽⁰⁾ 出发,每一步按下面的公式更新权重:
w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ - η∇E(w)
这里 η 叫学习率(learning rate),∇E(w) 是 E 的梯度(gradient)。算出梯度后,更新式化简为:
w⁽ᵗ⁺¹⁾ = w⁽ᵗ⁾ + ∑ ηxᵢtᵢ
用 Python 写出来是这样:
```python def train(positive_examples, negative_examples, num_iterations = 100, eta = 1):
weights = [0,0,0] # 初始化权重(差不多是随机 :))
for i in range(num_iterations):
pos = random.choice(positive_examples)
neg = random.choice(negative_examples)
z = np.dot(pos, weights) # 计算感知机输出
if z < 0: # 正例被分成了负类
weights = weights + eta*weights.shape
z = np.dot(neg, weights)
if z >= 0: # 负例被分成了正类
weights = weights - eta*weights.shape
return weights
```
小结
这一课我们认识了感知机:一种二分类模型,以及怎样用一个权重向量去训练它。
挑战
想亲手搭一个感知机的话,可以试试 Microsoft Learn 上的这个实验,它用的是 Azure ML 设计器。
课后小测
复习与自学
想看感知机怎么解决玩具问题、又怎么解决真实问题,继续往下学,去读 Perceptron 笔记本。
这里还有一篇讲感知机的有趣文章。
作业
本课实现了一个用于二分类任务的感知机,并用它在两个手写数字之间做分类。这次实验要求你把数字分类问题彻底解决:给一张图像,判断它最可能是哪个数字。