使用 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 * input
  • bias += learning_rate * error

训练参数

  • Epoch: 对整个训练数据集进行一次完整的遍历。通常需要多个 epoch 才能使权重和偏置收敛到正确的值。
  • Learning Rate: 一个控制调整大小的乘数。较小的学习率是稳定的但缓慢,而较大的学习率可能导致过冲和不稳定。

通过数据归一化优化性能

数据归一化是在训练之前将输入值缩小到较小且一致的范围(例如 0 到 1)的过程。这对于两个原因至关重要:

  1. 稳定性: 大的输入值可能会导致权重更新时的剧烈波动,从而在训练期间产生“颠簸”效应。归一化确保了更平滑的收敛。
  2. 公平性: 当使用多个输入时,具有较大量级的特征(例如以千为单位的薪资)在数学上可能会压倒具有较小量级的特征(例如二进制的 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 逻辑是通过模型通过数据发现的,而不是由程序员硬编码的。

Sources