使用 Python 从零开始构建感知器
感知器:神经网络的基础单元
感知器是最简单的可能的人工神经元,是所有现代神经网络的基础构建模块。它接收输入,应用权重和偏置,并根据结果是否超过特定阈值来产生二进制(是/否)输出。本质上,感知器是一个线性分类器,它通过根据错误迭代地调整参数来学习如何将数据分为两类。
感知器如何做出决策
感知器通过权衡信号来决定是否应该“触发”,从而模拟生物神经元。决策过程遵循特定的数学公式:
output = 1 if (weight * input + bias) > 0, else 0
决策函数的核心组件
- Input (x): 被评估的数据点。
- Weight (w): 决定了分配给特定输入的权重大小。在多输入系统中,不同的权重允许模型优先考虑某些因素而非其他因素。
- Bias (b): 一个移动决策边界的值。它允许模型即使在输入为零或理想边界不在原点时也能做出决策。
- Classifier: 组合公式
(weight * input + bias) > 0被称为决策函数。
决策边界与偏置的作用
决策边界是感知器将输出从 0 翻转为 1 的确切点。从数学上讲,这发生在 weight * input + bias = 0 的地方。解出输入,边界位于 -bias / weight。
为什么偏置至关重要
如果没有偏置,决策边界将永久固定在零。这意味着模型只能解决分类之间的分界线恰好在 0 的问题。
例如,如果一个模型正在训练以确定学生是否通过了考试(假设及格分数是 50),没有偏置的感知器将会失败。由于所有考试分数都是正数,正权重会将所有人标记为“通过”,而负权重会将所有人标记为“不及格”。偏置允许边界从零滑动到实际阈值(例如 50),从而使模型能够在这些任务中实现 100% 的准确率。
学习过程:训练、轮次与学习率
感知器通过在每次做出错误预测时调整其权重和偏置来学习。这个迭代过程被称为训练。
更新规则
当预测错误时,模型会计算误差 (result - prediction) 并向正确的方向推动参数:
weight += learning_rate * error * inputbias += learning_rate * error
训练参数
- Epoch: 对整个训练数据集进行一次完整的遍历。通常需要多个 epoch 才能使权重和偏置收敛到正确的值。
- Learning Rate: 一个控制调整大小的乘数。较小的学习率是稳定的但缓慢,而较大的学习率可能导致过冲和不稳定。
通过数据归一化优化性能
数据归一化是在训练之前将输入值缩小到较小且一致的范围(例如 0 到 1)的过程。这对于两个原因至关重要:
- 稳定性: 大的输入值可能会导致权重更新时的剧烈波动,从而在训练期间产生“颠簸”效应。归一化确保了更平滑的收敛。
- 公平性: 当使用多个输入时,具有较大量级的特征(例如以千为单位的薪资)在数学上可能会压倒具有较小量级的特征(例如二进制的 0 或 1),导致模型忽略较小但可能重要的特征。
Python 实现
以下是设计用于学习一个数字是正数还是负数的感知器的完整实现。
import random
learning_rate = 0.1
EPOCHS = 100
weight = random.uniform(-1, 1)
bias = random.uniform(-1, 1)
# Training data: positive numbers are True, negative numbers are False
data = [(i * 0.1, True) for i in range(1, 501)]
data += [(i * 0.1, False) for i in range(-500, 0)]
random.shuffle(data)
for epoch in range(EPOCHS):
for value, result in data:
prediction = (weight * value + bias) > 0
if prediction != result:
error = result - prediction # +1 or -1
weight += learning_rate * error * value
bias += learning_rate * error
decision_boundary = -bias / weight
print(f"weight = {weight:.3f}")
print(f"bias = {bias:.3f}")
print(f"decision boundary = {decision_boundary:.3f}")
技术视角与背景
虽然感知器在今天是一个简单的软件构造,但它在硬件和理论方面都有着深厚的根源。
"在机器学习的早期阶段... 像这样的网络通常是在硬件 [例如 ADALINE] 中实现的和训练的。如今,那个 'small brain' 可能会在面包板上使用运放 (op-amps) 构建而成。"
此外,感知器代表了从传统软件——依赖显式的 IF 语句——到机器学习的转变,即 IF 逻辑是通过模型通过数据发现的,而不是由程序员硬编码的。